toolkit/content/tests/widgets/window_menubar.xul

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <?xml version="1.0"?>
     2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
     4 <!-- the condition in the focus event handler is because pressing Tab
     5      unfocuses and refocuses the window on Windows -->
     7 <window title="Popup Tests"
     8   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    10   <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
    11   <script type="application/javascript" src="popup_shared.js"></script>
    13 <!--
    14   Need to investigate these tests a bit more. Some of the accessibility events
    15   are firing multiple times or in different orders in different circumstances.
    16   Note that this was also the case before bug 279703.
    17   -->
    19 <hbox style="margin-left: 275px; margin-top: 275px;">
    20 <menubar id="menubar">
    21   <menu id="filemenu" label="File" accesskey="F">
    22     <menupopup id="filepopup">
    23       <menuitem id="item1" label="Open" accesskey="O"/>
    24       <menuitem id="item2" label="Save" accesskey="S"/>
    25       <menuitem id="item3" label="Close" accesskey="C"/>
    26     </menupopup>
    27   </menu>
    28   <menu id="secretmenu" label="Secret Menu" accesskey="S" disabled="true">
    29     <menupopup>
    30       <menuitem label="Secret Command" accesskey="S"/>
    31     </menupopup>
    32   </menu>
    33   <menu id="editmenu" label="Edit" accesskey="E">
    34     <menupopup id="editpopup">
    35       <menuitem id="cut" label="Cut" accesskey="t" disabled="true"/>
    36       <menuitem id="copy" label="Copy" accesskey="C"/>
    37       <menuitem id="paste" label="Paste" accesskey="P"/>
    38     </menupopup>
    39   </menu>
    40   <menu id="viewmenu" label="View" accesskey="V">
    41     <menupopup id="viewpopup">
    42       <menu id="toolbar" label="Toolbar" accesskey="T">
    43         <menupopup id="toolbarpopup">
    44           <menuitem id="navigation" label="Navigation" accesskey="N" disabled="true"/>
    45           <menuitem label="Bookmarks" accesskey="B" disabled="true"/>
    46         </menupopup>
    47       </menu>
    48       <menuitem label="Status Bar" accesskey="S"/>
    49       <menu label="Sidebar" accesskey="d">
    50         <menupopup>
    51           <menuitem label="Bookmarks" accesskey="B"/>
    52           <menuitem label="History" accesskey="H"/>
    53         </menupopup>
    54       </menu>
    55     </menupopup>
    56   </menu>
    57   <menu id="helpmenu" label="Help" accesskey="H">
    58     <menupopup id="helppopup" >
    59       <label value="Unselectable"/>
    60       <menuitem id="contents" label="Contents" accesskey="C"/>
    61       <menuitem label="More Info" accesskey="I"/>
    62       <menuitem id="amenu" label="A Menu" accesskey="M"/>
    63       <menuitem label="Another Menu"/>
    64       <menuitem id="one" label="One"/>
    65       <menu id="only" label="Only Menu">
    66         <menupopup>
    67           <menuitem label="Test Submenu"/>
    68         </menupopup>
    69       </menu>
    70       <menuitem label="Second Menu"/>
    71       <menuitem id="other" disabled="true" label="Other Menu"/>
    72       <menuitem id="third" label="Third Menu"/>
    73       <menuitem label="One Other Menu"/>
    74       <label value="Unselectable"/>
    75       <menuitem id="about" label="About" accesskey="A"/>
    76     </menupopup>
    77   </menu>
    78 </menubar>
    79 </hbox>
    81 <script class="testbody" type="application/javascript">
    82 <![CDATA[
    84 window.opener.SimpleTest.waitForFocus(function () {
    85   gFilePopup = document.getElementById("filepopup");
    86   var filemenu = document.getElementById("filemenu");
    87   filemenu.focus();
    88   is(filemenu.openedWithKey, false, "initial openedWithKey");
    89   startPopupTests(popupTests);
    90 }, window);
    92 // On Linux, the first menu opens when F10 is pressed, but on other platforms
    93 // the menubar is focused but no menu is opened. This means that different events
    94 // fire.
    95 function pressF10Events()
    96 {
    97   return navigator.platform.indexOf("Linux") >= 0 ?
    98     [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu", "popupshowing filepopup", "DOMMenuItemActive item1", "popupshown filepopup"] :
    99     [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ];
   100 }
   102 function closeAfterF10Events(extraInactive)
   103 {
   104   if (navigator.platform.indexOf("Linux") >= 0) {
   105     var events = [ "popuphiding filepopup", "popuphidden filepopup", "DOMMenuItemInactive item1",
   106                    "DOMMenuInactive filepopup", "DOMMenuBarInactive menubar",
   107                    "DOMMenuItemInactive filemenu" ];
   108     if (extraInactive)
   109       events.push("DOMMenuItemInactive filemenu");
   110     return events;
   111   }
   113   return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ];
   114 }
   116 var popupTests = [
   117 {
   118   testname: "press on menu",
   119   events: [ "popupshowing filepopup", "DOMMenuBarActive menubar",
   120             "DOMMenuItemActive filemenu", "popupshown filepopup" ],
   121   test: function() { synthesizeMouse(document.getElementById("filemenu"), 8, 8, { }); },
   122   result: function (testname) {
   123     checkActive(gFilePopup, "", testname);
   124     checkOpen("filemenu", testname);
   125     is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   126   }
   127 },
   128 {
   129   // check that pressing cursor down while there is no selection
   130   // highlights the first item
   131   testname: "cursor down no selection",
   132   events: [ "DOMMenuItemActive item1" ],
   133   test: function() { sendKey("DOWN"); },
   134   result: function(testname) { checkActive(gFilePopup, "item1", testname); }
   135 },
   136 {
   137   // check that pressing cursor up wraps and highlights the last item
   138   testname: "cursor up wrap",
   139   events: [ "DOMMenuItemInactive item1", "DOMMenuItemActive item3" ],
   140   test: function() { sendKey("UP"); },
   141   result: function(testname) { checkActive(gFilePopup, "item3", testname); }
   142 },
   143 {
   144   // check that pressing cursor down wraps and highlights the first item
   145   testname: "cursor down wrap",
   146   events: [ "DOMMenuItemInactive item3", "DOMMenuItemActive item1" ],
   147   test: function() { sendKey("DOWN"); },
   148   result: function(testname) { checkActive(gFilePopup, "item1", testname); }
   149 },
   150 {
   151   // check that pressing cursor down highlights the second item
   152   testname: "cursor down",
   153   events: [ "DOMMenuItemInactive item1", "DOMMenuItemActive item2" ],
   154   test: function() { sendKey("DOWN"); },
   155   result: function(testname) { checkActive(gFilePopup, "item2", testname); }
   156 },
   157 {
   158   // check that pressing cursor up highlights the second item
   159   testname: "cursor up",
   160   events: [ "DOMMenuItemInactive item2", "DOMMenuItemActive item1" ],
   161   test: function() { sendKey("UP"); },
   162   result: function(testname) { checkActive(gFilePopup, "item1", testname); }
   163 },
   165 {
   166   // cursor right should skip the disabled menu and move to the edit menu
   167   testname: "cursor right skip disabled",
   168   events: function() {
   169     var elist = [
   170       // the file menu gets deactivated, the file menu gets hidden, then
   171       // the edit menu is activated
   172       "DOMMenuItemInactive filemenu", "DOMMenuItemActive editmenu",
   173       "popuphiding filepopup", "popuphidden filepopup",
   174       // the popupshowing event gets fired when showing the edit menu.
   175       // The item from the file menu doesn't get deactivated until the
   176       // next item needs to be selected
   177       "popupshowing editpopup", "DOMMenuItemInactive item1",
   178       // not sure why the menu inactivated event is firing so late
   179       "DOMMenuInactive filepopup"
   180     ];
   181     // finally, the first item is activated and popupshown is fired.
   182     // On Windows, don't skip disabled items.
   183     if (navigator.platform.indexOf("Win") == 0)
   184       elist.push("DOMMenuItemActive cut");
   185     else
   186       elist.push("DOMMenuItemActive copy");
   187     elist.push("popupshown editpopup");
   188     return elist;
   189   },
   190   test: function() { sendKey("RIGHT"); },
   191   result: function(testname) {
   192     var expected = (navigator.platform.indexOf("Win") == 0) ? "cut" : "copy";
   193     checkActive(document.getElementById("editpopup"), expected, testname);
   194     checkClosed("filemenu", testname);
   195     checkOpen("editmenu", testname);
   196     is(document.getElementById("editmenu").openedWithKey, false, testname + " openedWithKey");
   197   }
   198 },
   199 {
   200   // on Windows, a disabled item is selected, so pressing RETURN should close
   201   // the menu but not fire a command event
   202   testname: "enter on disabled",
   203   events: function() {
   204     if (navigator.platform.indexOf("Win") == 0)
   205       return [ "popuphiding editpopup", "popuphidden editpopup",
   206                "DOMMenuItemInactive cut", "DOMMenuInactive editpopup",
   207                "DOMMenuBarInactive menubar",
   208                "DOMMenuItemInactive editmenu", "DOMMenuItemInactive editmenu" ];
   209     else
   210       return [ "DOMMenuItemInactive copy", "DOMMenuInactive editpopup",
   211                "DOMMenuBarInactive menubar",
   212                "DOMMenuItemInactive editmenu", "DOMMenuItemInactive editmenu",
   213                "command copy", "popuphiding editpopup", "popuphidden editpopup",
   214                "DOMMenuItemInactive copy" ];
   215   },
   216   test: function() { sendKey("RETURN"); },
   217   result: function(testname) {
   218     checkClosed("editmenu", testname);
   219     is(document.getElementById("editmenu").openedWithKey, false, testname + " openedWithKey");
   220   }
   221 },
   222 {
   223   // pressing Alt + a key should open the corresponding menu
   224   testname: "open with accelerator",
   225   events: function() {
   226     return [ "DOMMenuBarActive menubar",
   227              "popupshowing viewpopup", "DOMMenuItemActive viewmenu",
   228              "DOMMenuItemActive toolbar", "popupshown viewpopup" ];
   229   },
   230   test: function() { synthesizeKey("V", { altKey: true }); },
   231   result: function(testname) {
   232     checkOpen("viewmenu", testname);
   233     is(document.getElementById("viewmenu").openedWithKey, true, testname + " openedWithKey");
   234   }
   235 },
   236 {
   237   // open the submenu with the cursor right key
   238   testname: "open submenu with cursor right",
   239   events: function() {
   240     // on Windows, the disabled 'navigation' item can stll be highlihted
   241     if (navigator.platform.indexOf("Win") == 0)
   242       return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation",
   243                "popupshown toolbarpopup" ];
   244     else
   245       return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ];
   246   },
   247   test: function() { sendKey("RIGHT"); },
   248   result: function(testname) {
   249     checkOpen("viewmenu", testname);
   250     checkOpen("toolbar", testname);
   251   }
   252 },
   253 {
   254   // close the submenu with the cursor left key
   255   testname: "close submenu with cursor left",
   256   events: function() {
   257     if (navigator.platform.indexOf("Win") == 0)
   258       return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   259                "DOMMenuItemInactive navigation", "DOMMenuInactive toolbarpopup",
   260                "DOMMenuItemActive toolbar" ];
   261     else
   262       return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   263                "DOMMenuInactive toolbarpopup",
   264                "DOMMenuItemActive toolbar" ];
   265   },
   266   test: function() { sendKey("LEFT"); },
   267   result: function(testname) {
   268     checkOpen("viewmenu", testname);
   269     checkClosed("toolbar", testname);
   270   }
   271 },
   272 {
   273   // open the submenu with the enter key
   274   testname: "open submenu with enter",
   275   events: function() {
   276     // on Windows, the disabled 'navigation' item can stll be highlighted
   277     if (navigator.platform.indexOf("Win") == 0)
   278       return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation",
   279                "popupshown toolbarpopup" ];
   280     else
   281       return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ];
   282   },
   283   test: function() { sendKey("RETURN"); },
   284   result: function(testname) {
   285     checkOpen("viewmenu", testname);
   286     checkOpen("toolbar", testname);
   287   },
   288 },
   289 {
   290   // close the submenu with the escape key
   291   testname: "close submenu with escape",
   292   events: function() {
   293     if (navigator.platform.indexOf("Win") == 0)
   294       return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   295                "DOMMenuItemInactive navigation", "DOMMenuInactive toolbarpopup",
   296                "DOMMenuItemActive toolbar" ];
   297     else
   298       return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   299                "DOMMenuInactive toolbarpopup",
   300                "DOMMenuItemActive toolbar" ];
   301   },
   302   test: function() { sendKey("ESCAPE"); },
   303   result: function(testname) {
   304     checkOpen("viewmenu", testname);
   305     checkClosed("toolbar", testname);
   306   },
   307 },
   308 {
   309   // open the submenu with the enter key again
   310   testname: "open submenu with enter again",
   311   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   312   events: function() {
   313     // on Windows, the disabled 'navigation' item can stll be highlighted
   314     if (navigator.platform.indexOf("Win") == 0)
   315       return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation",
   316                "popupshown toolbarpopup" ];
   317     else
   318       return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ];
   319   },
   320   test: function() { sendKey("RETURN"); },
   321   result: function(testname) {
   322     checkOpen("viewmenu", testname);
   323     checkOpen("toolbar", testname);
   324   },
   325 },
   326 {
   327   // while a submenu is open, switch to the next toplevel menu with the cursor right key
   328   testname: "while a submenu is open, switch to the next menu with the cursor right",
   329   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   330   events: [ "DOMMenuItemInactive viewmenu", "DOMMenuItemActive helpmenu",
   331             "popuphiding toolbarpopup", "popuphidden toolbarpopup",
   332             "popuphiding viewpopup", "popuphidden viewpopup",
   333             "popupshowing helppopup", "DOMMenuItemInactive navigation",
   334             "DOMMenuInactive toolbarpopup", "DOMMenuItemInactive toolbar",
   335             "DOMMenuInactive viewpopup", "DOMMenuItemActive contents",
   336             "popupshown helppopup" ],
   337   test: function() { sendKey("RIGHT"); },
   338   result: function(testname) {
   339     checkOpen("helpmenu", testname);
   340     checkClosed("toolbar", testname);
   341     checkClosed("viewmenu", testname);
   342   }
   343 },
   344 {
   345   // close the main menu with the escape key
   346   testname: "close menubar menu with escape",
   347   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   348   events: [ "popuphiding helppopup", "popuphidden helppopup",
   349             "DOMMenuItemInactive contents", "DOMMenuInactive helppopup",
   350             "DOMMenuBarInactive menubar", "DOMMenuItemInactive helpmenu" ],
   351   test: function() { sendKey("ESCAPE"); },
   352   result: function(testname) { checkClosed("viewmenu", testname); },
   353 },
   354 {
   355   // close the main menu with the escape key
   356   testname: "close menubar menu with escape",
   357   condition: function() { return (navigator.platform.indexOf("Win") != 0) },
   358   events: [ "popuphiding viewpopup", "popuphidden viewpopup",
   359             "DOMMenuItemInactive toolbar", "DOMMenuInactive viewpopup",
   360             "DOMMenuBarInactive menubar",
   361             "DOMMenuItemInactive viewmenu" ],
   362   test: function() { sendKey("ESCAPE"); },
   363   result: function(testname) { checkClosed("viewmenu", testname); },
   364 },
   365 {
   366   // Pressing Alt should highlight the first menu but not open it,
   367   // but it should be ignored if the alt keydown event is consumed.
   368   testname: "alt shouldn't activate menubar if keydown event is consumed",
   369   test: function() {
   370     document.addEventListener("keydown", function (aEvent) {
   371       document.removeEventListener("keydown", arguments.callee, true);
   372       aEvent.preventDefault();
   373     }, true);
   374     sendKey("ALT");
   375   },
   376   result: function(testname) {
   377     ok(!document.getElementById("filemenu").openedWithKey, testname);
   378     checkClosed("filemenu", testname);
   379   },
   380 },
   381 {
   382   // Pressing Alt should highlight the first menu but not open it,
   383   // but it should be ignored if the alt keyup event is consumed.
   384   testname: "alt shouldn't activate menubar if keyup event is consumed",
   385   test: function() {
   386     document.addEventListener("keyup", function (aEvent) {
   387       document.removeEventListener("keyup", arguments.callee, true);
   388       aEvent.preventDefault();
   389     }, true);
   390     sendKey("ALT");
   391   },
   392   result: function(testname) {
   393     ok(!document.getElementById("filemenu").openedWithKey, testname);
   394     checkClosed("filemenu", testname);
   395   },
   396 },
   397 {
   398   // Pressing Alt should highlight the first menu but not open it.
   399   testname: "alt to activate menubar",
   400   events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ],
   401   test: function() { sendKey("ALT"); },
   402   result: function(testname) {
   403     is(document.getElementById("filemenu").openedWithKey, true, testname + " openedWithKey");
   404     checkClosed("filemenu", testname);
   405   },
   406 },
   407 {
   408   // pressing cursor left should select the previous menu but not open it
   409   testname: "cursor left on active menubar",
   410   events: [ "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu" ],
   411   test: function() { sendKey("LEFT"); },
   412   result: function(testname) { checkClosed("helpmenu", testname); },
   413 },
   414 {
   415   // pressing cursor right should select the previous menu but not open it
   416   testname: "cursor right on active menubar",
   417   events: [ "DOMMenuItemInactive helpmenu", "DOMMenuItemActive filemenu" ],
   418   test: function() { sendKey("RIGHT"); },
   419   result: function(testname) { checkClosed("filemenu", testname); },
   420 },
   421 {
   422   // pressing a character should act as an accelerator and open the menu
   423   testname: "accelerator on active menubar",
   424   events: [ "popupshowing helppopup",
   425             "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu",
   426             "DOMMenuItemActive contents", "popupshown helppopup" ],
   427   test: function() { sendChar("h"); },
   428   result: function(testname) {
   429     checkOpen("helpmenu", testname);
   430     is(document.getElementById("helpmenu").openedWithKey, true, testname + " openedWithKey");
   431   },
   432 },
   433 {
   434   // check that pressing cursor up skips non menuitems
   435   testname: "cursor up wrap",
   436   events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive about" ],
   437   test: function() { sendKey("UP"); },
   438   result: function(testname) { }
   439 },
   440 {
   441   // check that pressing cursor down skips non menuitems
   442   testname: "cursor down wrap",
   443   events: [ "DOMMenuItemInactive about", "DOMMenuItemActive contents" ],
   444   test: function() { sendKey("DOWN"); },
   445   result: function(testname) { }
   446 },
   447 {
   448   // check that pressing a menuitem's accelerator selects it
   449   testname: "menuitem accelerator",
   450   events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive amenu",
   451             "DOMMenuItemInactive amenu", "DOMMenuInactive helppopup",
   452             "DOMMenuBarInactive menubar", "DOMMenuItemInactive helpmenu",
   453             "DOMMenuItemInactive helpmenu",
   454             "command amenu", "popuphiding helppopup", "popuphidden helppopup",
   455             "DOMMenuItemInactive amenu",
   456            ],
   457   test: function() { sendChar("m"); },
   458   result: function(testname) { checkClosed("helpmenu", testname); }
   459 },
   460 {
   461   // pressing F10 should highlight the first menu. On Linux, the menu is opened.
   462   testname: "F10 to activate menubar",
   463   events: pressF10Events(),
   464   test: function() { sendKey("F10"); },
   465   result: function(testname) {
   466     is(document.getElementById("filemenu").openedWithKey, true, testname + " openedWithKey");
   467     if (navigator.platform.indexOf("Linux") >= 0)
   468       checkOpen("filemenu", testname);
   469     else
   470       checkClosed("filemenu", testname);
   471   },
   472 },
   473 {
   474   // pressing cursor left then down should open a menu
   475   testname: "cursor down on menu",
   476   events: (navigator.platform.indexOf("Linux") >= 0) ?
   477             [  "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu",
   478                // This is in a different order than the
   479                // "accelerator on active menubar" because menus opened from a
   480                // shortcut key are fired asynchronously
   481                "popuphiding filepopup", "popuphidden filepopup",
   482                "popupshowing helppopup", "DOMMenuItemInactive item1",
   483                "DOMMenuItemActive item2", "DOMMenuItemInactive item2",
   484                "DOMMenuInactive filepopup", "DOMMenuItemActive contents",
   485                "popupshown helppopup" ] :
   486             [ "popupshowing helppopup", "DOMMenuItemInactive filemenu",
   487               "DOMMenuItemActive helpmenu",
   488               // This is in a different order than the
   489               // "accelerator on active menubar" because menus opened from a
   490               // shortcut key are fired asynchronously
   491               "DOMMenuItemActive contents", "popupshown helppopup" ],
   492   test: function() { sendKey("LEFT"); sendKey("DOWN"); },
   493   result: function(testname) {
   494     is(document.getElementById("helpmenu").openedWithKey, true, testname + " openedWithKey");
   495   }
   496 },
   497 {
   498   // pressing a letter that doesn't correspond to an accelerator. The menu
   499   // should not close because there is more than one item corresponding to
   500   // that letter
   501   testname: "menuitem with no accelerator",
   502   events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive one" ],
   503   test: function() { sendChar("o"); },
   504   result: function(testname) { checkOpen("helpmenu", testname); }
   505 },
   506 {
   507   // pressing the letter again should select the next one that starts with
   508   // that letter
   509   testname: "menuitem with no accelerator again",
   510   events: [ "DOMMenuItemInactive one", "DOMMenuItemActive only" ],
   511   test: function() { sendChar("o"); },
   512   result: function(testname) {
   513     // 'only' is a menu but it should not be open
   514     checkOpen("helpmenu", testname);
   515     checkClosed("only", testname);
   516   }
   517 },
   518 {
   519   // pressing the letter again when the next item is disabled should still
   520   // select the disabled item
   521   testname: "menuitem with no accelerator disabled",
   522   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   523   events: [ "DOMMenuItemInactive only", "DOMMenuItemActive other" ],
   524   test: function() { sendChar("o"); },
   525   result: function(testname) { }
   526 },
   527 {
   528   // when only one menuitem starting with that letter exists, it should be
   529   // selected and the menu closed
   530   testname: "menuitem with no accelerator single",
   531   events: function() {
   532     var elist = [ "DOMMenuItemInactive other", "DOMMenuItemActive third",
   533                   "DOMMenuItemInactive third", "DOMMenuInactive helppopup",
   534                   "DOMMenuBarInactive menubar",
   535                   "DOMMenuItemInactive helpmenu",
   536                   "DOMMenuItemInactive helpmenu",
   537                   "command third", "popuphiding helppopup",
   538                   "popuphidden helppopup", "DOMMenuItemInactive third",
   539                 ];
   540     if (navigator.platform.indexOf("Win") == -1)
   541       elist[0] = "DOMMenuItemInactive only";
   542     return elist;
   543   },
   544   test: function() { sendChar("t"); },
   545   result: function(testname) { checkClosed("helpmenu", testname); }
   546 },
   547 {
   548   // pressing F10 should highlight the first menu but not open it
   549   testname: "F10 to activate menubar again",
   550   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   551   events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ],
   552   test: function() { sendKey("F10"); },
   553   result: function(testname) { checkClosed("filemenu", testname); },
   554 },
   555 {
   556   // pressing an accelerator for a disabled item should deactivate the menubar
   557   testname: "accelerator for disabled menu",
   558   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   559   events: [ "DOMMenuItemInactive filemenu", "DOMMenuBarInactive menubar" ],
   560   test: function() { sendChar("s"); },
   561   result: function(testname) {
   562     checkClosed("secretmenu", testname);
   563     is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   564   },
   565 },
   566 {
   567   testname: "press on disabled menu",
   568   test: function() {
   569     synthesizeMouse(document.getElementById("secretmenu"), 8, 8, { });
   570   },
   571   result: function (testname) {
   572     checkClosed("secretmenu", testname);
   573   }
   574 },
   575 {
   576   testname: "press on second menu with shift",
   577   events: [ "popupshowing editpopup", "DOMMenuBarActive menubar",
   578             "DOMMenuItemActive editmenu", "popupshown editpopup" ],
   579   test: function() {
   580     synthesizeMouse(document.getElementById("editmenu"), 8, 8, { shiftKey : true });
   581   },
   582   result: function (testname) {
   583     checkOpen("editmenu", testname);
   584     checkActive(document.getElementById("menubar"), "editmenu", testname);
   585   }
   586 },
   587 {
   588   testname: "press on disabled menuitem",
   589   test: function() {
   590     synthesizeMouse(document.getElementById("cut"), 8, 8, { });
   591   },
   592   result: function (testname) {
   593     checkOpen("editmenu", testname);
   594   }
   595 },
   596 {
   597   testname: "press on menuitem",
   598   events: [ "DOMMenuInactive editpopup",
   599             "DOMMenuBarInactive menubar",
   600             "DOMMenuItemInactive editmenu",
   601             "DOMMenuItemInactive editmenu",
   602             "command copy", "popuphiding editpopup", "popuphidden editpopup",
   603             "DOMMenuItemInactive copy",
   604            ],
   605   test: function() {
   606     synthesizeMouse(document.getElementById("copy"), 8, 8, { });
   607   },
   608   result: function (testname) {
   609     checkClosed("editmenu", testname);
   610   }
   611 },
   612 {
   613   // this test ensures that the menu can still be opened by clicking after selecting
   614   // a menuitem from the menu. See bug 399350.
   615   testname: "press on menu after menuitem selected",
   616   events: [ "popupshowing editpopup", "DOMMenuBarActive menubar",
   617             "DOMMenuItemActive editmenu", "popupshown editpopup" ],
   618   test: function() { synthesizeMouse(document.getElementById("editmenu"), 8, 8, { }); },
   619   result: function (testname) {
   620     checkActive(document.getElementById("editpopup"), "", testname);
   621     checkOpen("editmenu", testname);
   622   }
   623 },
   624 {  // try selecting a different command
   625   testname: "press on menuitem again",
   626   events: [ "DOMMenuInactive editpopup",
   627             "DOMMenuBarInactive menubar",
   628             "DOMMenuItemInactive editmenu",
   629             "DOMMenuItemInactive editmenu",
   630             "command paste", "popuphiding editpopup", "popuphidden editpopup",
   631             "DOMMenuItemInactive paste",
   632            ],
   633   test: function() {
   634     synthesizeMouse(document.getElementById("paste"), 8, 8, { });
   635   },
   636   result: function (testname) {
   637     checkClosed("editmenu", testname);
   638   }
   639 },
   640 {
   641   testname: "F10 to activate menubar for tab deactivation",
   642   events: pressF10Events(),
   643   test: function() { sendKey("F10"); },
   644 },
   645 {
   646   testname: "Deactivate menubar with tab key",
   647   events: closeAfterF10Events(true),
   648   test: function() { sendKey("TAB"); },
   649   result: function(testname) {
   650     is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   651   }
   652 },
   653 {
   654   testname: "F10 to activate menubar for escape deactivation",
   655   events: pressF10Events(),
   656   test: function() { sendKey("F10"); },
   657 },
   658 {
   659   testname: "Deactivate menubar with escape key",
   660   events: closeAfterF10Events(false),
   661   test: function() { sendKey("ESCAPE"); },
   662   result: function(testname) {
   663     is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   664   }
   665 },
   666 {
   667   testname: "F10 to activate menubar for f10 deactivation",
   668   events: pressF10Events(),
   669   test: function() { sendKey("F10"); },
   670 },
   671 {
   672   testname: "Deactivate menubar with f10 key",
   673   events: closeAfterF10Events(true),
   674   test: function() { sendKey("F10"); },
   675   result: function(testname) {
   676     is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   677   }
   678 },
   679 {
   680   testname: "F10 to activate menubar for alt deactivation",
   681   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   682   events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ],
   683   test: function() { sendKey("F10"); },
   684 },
   685 {
   686   testname: "Deactivate menubar with alt key",
   687   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   688   events: [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu"  ],
   689   test: function() { sendKey("ALT"); },
   690   result: function(testname) {
   691     is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey");
   692   }
   693 },
   694 {
   695   testname: "Don't activate menubar with mousedown during alt key auto-repeat",
   696   test: function() {
   697     synthesizeKey("VK_ALT", { type: "keydown" });
   698     synthesizeMouse(document.getElementById("menubar"), 8, -30, { type: "mousedown", altKey: true });
   699     synthesizeKey("VK_ALT", { type: "keydown" });
   700     synthesizeMouse(document.getElementById("menubar"), 8, -30, { type: "mouseup", altKey: true });
   701     synthesizeKey("VK_ALT", { type: "keydown" });
   702     synthesizeKey("VK_ALT", { type: "keyup" });
   703   },
   704   result: function (testname) {
   705     checkActive(document.getElementById("menubar"), "", testname);
   706   }
   707 },
   709 // Fllowing 4 tests are a test of bug 616797, don't insert any new tests
   710 // between them.
   711 {
   712   testname: "Open file menu by accelerator",
   713   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   714   events: function() {
   715     return [ "DOMMenuBarActive menubar", "popupshowing filepopup",
   716              "DOMMenuItemActive filemenu", "DOMMenuItemActive item1",
   717              "popupshown filepopup" ];
   718   },
   719   test: function() {
   720     synthesizeKey("VK_ALT", { type: "keydown" });
   721     synthesizeKey("F", { altKey: true });
   722     synthesizeKey("VK_ALT", { type: "keyup" });
   723   }
   724 },
   725 {
   726   testname: "Close file menu by click at outside of popup menu",
   727   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   728   events: function() {
   729     return [ "popuphiding filepopup", "popuphidden filepopup",
   730              "DOMMenuItemInactive item1", "DOMMenuInactive filepopup",
   731              "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu",
   732              "DOMMenuItemInactive filemenu" ];
   733   },
   734   test: function() {
   735     // XXX hidePopup() causes DOMMenuItemInactive event to be fired twice.
   736     document.getElementById("filepopup").hidePopup();
   737   }
   738 },
   739 {
   740   testname: "Alt keydown set focus the menubar",
   741   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   742   events: function() {
   743     return [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ];
   744   },
   745   test: function() {
   746     sendKey("ALT");
   747   },
   748   result: function (testname) {
   749     checkClosed("filemenu", testname);
   750   }
   751 },
   752 {
   753   testname: "unset focus the menubar",
   754   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   755   events: function() {
   756     return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ];
   757   },
   758   test: function() {
   759     sendKey("ALT");
   760   }
   761 },
   763 // bug 625151
   764 {
   765   testname: "Alt key state before deactivating the window shouldn't prevent " +
   766             "next Alt key handling",
   767   condition: function() { return (navigator.platform.indexOf("Win") == 0) },
   768   events: function() {
   769     return [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ];
   770   },
   771   test: function() {
   772     synthesizeKey("VK_ALT", { type: "keydown" });
   773     synthesizeKey("VK_TAB", { type: "keydown" }); // cancels the Alt key
   774     var thisWindow = window;
   775     var newWindow =
   776       window.open("data:text/html,", "_blank", "width=100,height=100");
   777     newWindow.addEventListener("focus", function () {
   778       newWindow.removeEventListener("focus", arguments.callee, false);
   779       thisWindow.addEventListener("focus", function () {
   780         thisWindow.removeEventListener("focus", arguments.callee, false);
   781         setTimeout(function () {
   782           sendKey("ALT", thisWindow);
   783         }, 0);
   784       }, false);
   785       newWindow.close();
   786       thisWindow.focus();
   787       // Note that our window dispatches a hacky key event if IMM is installed
   788       // on the system during focus change only if Alt key is pressed.
   789       synthesizeKey("`", { type: "keypress" }, thisWindow);
   790     }, false);
   791   }
   792 }
   794 ];
   796 ]]>
   797 </script>
   799 </window>

mercurial