accessible/tests/mochitest/events/test_aria_menu.html

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     1 <html>
     3 <head>
     4   <title>ARIA menu events testing</title>
     6   <link rel="stylesheet" type="text/css"
     7         href="chrome://mochikit/content/tests/SimpleTest/test.css" />
     9   <script type="application/javascript"
    10           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
    11   <script type="application/javascript"
    12           src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
    14   <script type="application/javascript"
    15           src="../common.js"></script>
    16   <script type="application/javascript"
    17           src="../role.js"></script>
    18   <script type="application/javascript"
    19           src="../states.js"></script>
    20   <script type="application/javascript"
    21           src="../events.js"></script>
    23   <script type="application/javascript">
    24     const kViaDisplayStyle = 0;
    25     const kViaVisibilityStyle = 1;
    27     function focusMenu(aMenuBarID, aMenuID, aActiveMenuBarID)
    28     {
    29       this.eventSeq = [];
    31       if (aActiveMenuBarID) {
    32         this.eventSeq.push(new invokerChecker(EVENT_MENU_END,
    33                                               getNode(aActiveMenuBarID)));
    34       }
    36       this.eventSeq.push(new invokerChecker(EVENT_MENU_START, getNode(aMenuBarID)));
    37       this.eventSeq.push(new invokerChecker(EVENT_FOCUS, getNode(aMenuID)));
    39       this.invoke = function focusMenu_invoke()
    40       {
    41         getNode(aMenuID).focus();
    42       }
    44       this.getID = function focusMenu_getID()
    45       {
    46         return "focus menu '" + aMenuID + "'";
    47       }
    48     }
    50     function showMenu(aMenuID, aParentMenuID, aHow)
    51     {
    52       this.menuNode = getNode(aMenuID);
    54       this.eventSeq = [
    55         new invokerChecker(EVENT_SHOW, this.menuNode),
    56         new invokerChecker(EVENT_MENUPOPUP_START, this.menuNode),
    57         new invokerChecker(EVENT_REORDER, getNode(aParentMenuID))
    58       ];
    60       this.invoke = function showMenu_invoke()
    61       {
    62         if (aHow == kViaDisplayStyle)
    63           this.menuNode.style.display = "block";
    64         else
    65           this.menuNode.style.visibility = "visible";
    66       };
    68       this.getID = function showMenu_getID()
    69       {
    70         return "Show ARIA menu '" + aMenuID + "' by " +
    71           (aHow == kViaDisplayStyle ? "display" : "visibility") +
    72           " style tricks";
    73       };
    74     }
    76     function closeMenu(aMenuID, aParentMenuID, aHow)
    77     {
    78       this.menuNode = getNode(aMenuID);
    79       this.menu = null;
    81       this.eventSeq = [
    82         new invokerChecker(EVENT_MENUPOPUP_END, getMenu, this),
    83         new invokerChecker(EVENT_HIDE, getMenu, this),
    84         new invokerChecker(EVENT_REORDER, getNode(aParentMenuID))
    85       ];
    87       this.invoke = function closeMenu_invoke()
    88       {
    89         // Store menu accessible reference while menu is still open.
    90         this.menu = getAccessible(this.menuNode);
    92         // Hide menu.
    93         if (aHow == kViaDisplayStyle)
    94           this.menuNode.style.display = "none";
    95         else
    96           this.menuNode.style.visibility = "hidden";
    97       }
    99       this.getID = function closeMenu_getID()
   100       {
   101         return "Close ARIA menu " + aMenuID + " by " +
   102           (aHow == kViaDisplayStyle ? "display" : "visibility") +
   103           " style tricks";
   104       }
   106       function getMenu(aThisObj)
   107       {
   108         return aThisObj.menu;
   109       }
   110     }
   112     function focusInsideMenu(aMenuID, aMenuBarID)
   113     {
   114       this.eventSeq = [
   115         new invokerChecker(EVENT_FOCUS, getNode(aMenuID))
   116       ];
   118       this.unexpectedEventSeq = [
   119         new invokerChecker(EVENT_MENU_END, getNode(aMenuBarID))
   120       ];
   122       this.invoke = function focusInsideMenu_invoke()
   123       {
   124         getNode(aMenuID).focus();
   125       }
   127       this.getID = function focusInsideMenu_getID()
   128       {
   129         return "focus menu '" + aMenuID + "'";
   130       }
   131     }
   133     function blurMenu(aMenuBarID)
   134     {
   135       var eventSeq = [
   136         new invokerChecker(EVENT_MENU_END, getNode(aMenuBarID)),
   137         new invokerChecker(EVENT_FOCUS, getNode("outsidemenu"))
   138       ];
   140       this.__proto__ = new synthClick("outsidemenu", eventSeq);
   142       this.getID = function blurMenu_getID()
   143       {
   144         return "blur menu";
   145       }
   146     }
   148     ////////////////////////////////////////////////////////////////////////////
   149     // Do tests
   151     var gQueue = null;
   153     //gA11yEventDumpToConsole = true; // debuging
   155     function doTests()
   156     {
   157       gQueue = new eventQueue();
   159       gQueue.push(new focusMenu("menubar2", "menu-help"));
   160       gQueue.push(new focusMenu("menubar", "menu-file", "menubar2"));
   161       gQueue.push(new showMenu("menupopup-file", "menu-file", kViaDisplayStyle));
   162       gQueue.push(new closeMenu("menupopup-file", "menu-file", kViaDisplayStyle));
   163       gQueue.push(new showMenu("menupopup-edit", "menu-edit", kViaVisibilityStyle));
   164       gQueue.push(new closeMenu("menupopup-edit", "menu-edit", kViaVisibilityStyle));
   165       gQueue.push(new focusInsideMenu("menu-edit", "menubar"));
   166       gQueue.push(new blurMenu("menubar"));
   168       gQueue.push(new focusMenu("menubar3", "mb3-mi-outside"));
   169       gQueue.push(new showMenu("mb4-menu", document, kViaDisplayStyle));
   170       gQueue.push(new focusMenu("menubar4", "mb4-item1"));
   171       gQueue.push(new focusMenu("menubar5", "mb5-mi"));
   173       gQueue.push(new synthFocus("mi6"));
   175       gQueue.invoke(); // Will call SimpleTest.finish();
   176     }
   178     SimpleTest.waitForExplicitFinish();
   179     addA11yLoadEvent(doTests);
   180   </script>
   181 </head>
   183 <body>
   185   <a target="_blank"
   186      href="https://bugzilla.mozilla.org/show_bug.cgi?id=606207"
   187      title="Dojo dropdown buttons are broken">
   188     Bug 606207
   189   </a>
   190   <a target="_blank"
   191      href="https://bugzilla.mozilla.org/show_bug.cgi?id=614829"
   192      title="Menupopup end event isn't fired for ARIA menus">
   193     Bug 614829
   194   </a>
   195   <a target="_blank"
   196      href="https://bugzilla.mozilla.org/show_bug.cgi?id=615189"
   197      title="Clean up FireAccessibleFocusEvent">
   198     Bug 615189
   199   </a>
   200   <a target="_blank"
   201      href="https://bugzilla.mozilla.org/show_bug.cgi?id=673958"
   202      title="Rework accessible focus handling">
   203     Bug 673958
   204   </a>
   205   <a target="_blank"
   206      href="https://bugzilla.mozilla.org/show_bug.cgi?id=933322"
   207      title="menustart/end events are missing when aria-owns makes a menu hierarchy">
   208     Bug 933322
   209   </a>
   210   <a target="_blank"
   211      href="https://bugzilla.mozilla.org/show_bug.cgi?id=934460"
   212      title="menustart/end events may be missed when top level menuitem is focused">
   213     Bug 934460
   214   </a>
   215   <a target="_blank"
   216      href="https://bugzilla.mozilla.org/show_bug.cgi?id=970005"
   217      title="infinite long loop in a11y:FocusManager::ProcessFocusEvent">
   218     Bug 970005
   219   </a>
   221   <p id="display"></p>
   222   <div id="content" style="display: none"></div>
   223   <pre id="test">
   224   </pre>
   226   <div id="menubar" role="menubar">
   227     <div id="menu-file" role="menuitem" tabindex="0">
   228       File
   229       <div id="menupopup-file" role="menu" style="display: none;">
   230         <div id="menuitem-newtab" role="menuitem" tabindex="0">New Tab</div>
   231         <div id="menuitem-newwindow" role="menuitem" tabindex="0">New Window</div>
   232       </div>
   233     </div>
   234     <div id="menu-edit" role="menuitem" tabindex="0">
   235       Edit
   236       <div id="menupopup-edit" role="menu" style="visibility: hidden;">
   237         <div id="menuitem-undo" role="menuitem" tabindex="0">Undo</div>
   238         <div id="menuitem-redo" role="menuitem" tabindex="0">Redo</div>
   239       </div>
   240     </div>
   241   </div>
   242   <div id="menubar2" role="menubar">
   243     <div id="menu-help" role="menuitem" tabindex="0">
   244       Help
   245       <div id="menupopup-help" role="menu" style="display: none;">
   246         <div id="menuitem-about" role="menuitem" tabindex="0">About</div>
   247       </div>
   248     </div>
   249   </div>
   250   <div tabindex="0" id="outsidemenu">outsidemenu</div>
   252   <!-- aria-owns relations -->
   253   <div id="menubar3" role="menubar" aria-owns="mb3-mi-outside"></div>
   254   <div id="mb3-mi-outside" role="menuitem" tabindex="0">Outside</div>
   256   <div id="menubar4" role="menubar">
   257     <div role="menuitem" aria-haspopup="true" aria-owns="mb4-menu">Item</div>
   258   </div>
   259   <div id="mb4-menu" role="menu" style="display:none;">
   260     <div role="menuitem" id="mb4-item1" tabindex="0">Item 1.1</div>
   261     <div role="menuitem" tabindex="0">Item 1.2</div>
   262   </div>
   264   <!-- focus top-level menu item having haspopup -->
   265   <div id="menubar5" role="menubar">
   266     <div role="menuitem" aria-haspopup="true" id="mb5-mi" tabindex="0">
   267       Item
   268       <div role="menu" style="display:none;">
   269         <div role="menuitem" tabindex="0">Item 1.1</div>
   270         <div role="menuitem" tabindex="0">Item 1.2</div>
   271       </div>
   272     </div>
   273   </div>
   275   <!-- other aria-owns relations -->
   276   <div id="mi6" tabindex="0" role="menuitem">aria-owned item</div>
   277   <div aria-owns="mi6">Obla</div>
   279   <div id="eventdump"></div>
   281 </body>
   282 </html>

mercurial