1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/content/tests/widgets/window_menubar.xul Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,799 @@ 1.4 +<?xml version="1.0"?> 1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> 1.6 + 1.7 +<!-- the condition in the focus event handler is because pressing Tab 1.8 + unfocuses and refocuses the window on Windows --> 1.9 + 1.10 +<window title="Popup Tests" 1.11 + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 1.12 + 1.13 + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script> 1.14 + <script type="application/javascript" src="popup_shared.js"></script> 1.15 + 1.16 +<!-- 1.17 + Need to investigate these tests a bit more. Some of the accessibility events 1.18 + are firing multiple times or in different orders in different circumstances. 1.19 + Note that this was also the case before bug 279703. 1.20 + --> 1.21 + 1.22 +<hbox style="margin-left: 275px; margin-top: 275px;"> 1.23 +<menubar id="menubar"> 1.24 + <menu id="filemenu" label="File" accesskey="F"> 1.25 + <menupopup id="filepopup"> 1.26 + <menuitem id="item1" label="Open" accesskey="O"/> 1.27 + <menuitem id="item2" label="Save" accesskey="S"/> 1.28 + <menuitem id="item3" label="Close" accesskey="C"/> 1.29 + </menupopup> 1.30 + </menu> 1.31 + <menu id="secretmenu" label="Secret Menu" accesskey="S" disabled="true"> 1.32 + <menupopup> 1.33 + <menuitem label="Secret Command" accesskey="S"/> 1.34 + </menupopup> 1.35 + </menu> 1.36 + <menu id="editmenu" label="Edit" accesskey="E"> 1.37 + <menupopup id="editpopup"> 1.38 + <menuitem id="cut" label="Cut" accesskey="t" disabled="true"/> 1.39 + <menuitem id="copy" label="Copy" accesskey="C"/> 1.40 + <menuitem id="paste" label="Paste" accesskey="P"/> 1.41 + </menupopup> 1.42 + </menu> 1.43 + <menu id="viewmenu" label="View" accesskey="V"> 1.44 + <menupopup id="viewpopup"> 1.45 + <menu id="toolbar" label="Toolbar" accesskey="T"> 1.46 + <menupopup id="toolbarpopup"> 1.47 + <menuitem id="navigation" label="Navigation" accesskey="N" disabled="true"/> 1.48 + <menuitem label="Bookmarks" accesskey="B" disabled="true"/> 1.49 + </menupopup> 1.50 + </menu> 1.51 + <menuitem label="Status Bar" accesskey="S"/> 1.52 + <menu label="Sidebar" accesskey="d"> 1.53 + <menupopup> 1.54 + <menuitem label="Bookmarks" accesskey="B"/> 1.55 + <menuitem label="History" accesskey="H"/> 1.56 + </menupopup> 1.57 + </menu> 1.58 + </menupopup> 1.59 + </menu> 1.60 + <menu id="helpmenu" label="Help" accesskey="H"> 1.61 + <menupopup id="helppopup" > 1.62 + <label value="Unselectable"/> 1.63 + <menuitem id="contents" label="Contents" accesskey="C"/> 1.64 + <menuitem label="More Info" accesskey="I"/> 1.65 + <menuitem id="amenu" label="A Menu" accesskey="M"/> 1.66 + <menuitem label="Another Menu"/> 1.67 + <menuitem id="one" label="One"/> 1.68 + <menu id="only" label="Only Menu"> 1.69 + <menupopup> 1.70 + <menuitem label="Test Submenu"/> 1.71 + </menupopup> 1.72 + </menu> 1.73 + <menuitem label="Second Menu"/> 1.74 + <menuitem id="other" disabled="true" label="Other Menu"/> 1.75 + <menuitem id="third" label="Third Menu"/> 1.76 + <menuitem label="One Other Menu"/> 1.77 + <label value="Unselectable"/> 1.78 + <menuitem id="about" label="About" accesskey="A"/> 1.79 + </menupopup> 1.80 + </menu> 1.81 +</menubar> 1.82 +</hbox> 1.83 + 1.84 +<script class="testbody" type="application/javascript"> 1.85 +<![CDATA[ 1.86 + 1.87 +window.opener.SimpleTest.waitForFocus(function () { 1.88 + gFilePopup = document.getElementById("filepopup"); 1.89 + var filemenu = document.getElementById("filemenu"); 1.90 + filemenu.focus(); 1.91 + is(filemenu.openedWithKey, false, "initial openedWithKey"); 1.92 + startPopupTests(popupTests); 1.93 +}, window); 1.94 + 1.95 +// On Linux, the first menu opens when F10 is pressed, but on other platforms 1.96 +// the menubar is focused but no menu is opened. This means that different events 1.97 +// fire. 1.98 +function pressF10Events() 1.99 +{ 1.100 + return navigator.platform.indexOf("Linux") >= 0 ? 1.101 + [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu", "popupshowing filepopup", "DOMMenuItemActive item1", "popupshown filepopup"] : 1.102 + [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ]; 1.103 +} 1.104 + 1.105 +function closeAfterF10Events(extraInactive) 1.106 +{ 1.107 + if (navigator.platform.indexOf("Linux") >= 0) { 1.108 + var events = [ "popuphiding filepopup", "popuphidden filepopup", "DOMMenuItemInactive item1", 1.109 + "DOMMenuInactive filepopup", "DOMMenuBarInactive menubar", 1.110 + "DOMMenuItemInactive filemenu" ]; 1.111 + if (extraInactive) 1.112 + events.push("DOMMenuItemInactive filemenu"); 1.113 + return events; 1.114 + } 1.115 + 1.116 + return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ]; 1.117 +} 1.118 + 1.119 +var popupTests = [ 1.120 +{ 1.121 + testname: "press on menu", 1.122 + events: [ "popupshowing filepopup", "DOMMenuBarActive menubar", 1.123 + "DOMMenuItemActive filemenu", "popupshown filepopup" ], 1.124 + test: function() { synthesizeMouse(document.getElementById("filemenu"), 8, 8, { }); }, 1.125 + result: function (testname) { 1.126 + checkActive(gFilePopup, "", testname); 1.127 + checkOpen("filemenu", testname); 1.128 + is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey"); 1.129 + } 1.130 +}, 1.131 +{ 1.132 + // check that pressing cursor down while there is no selection 1.133 + // highlights the first item 1.134 + testname: "cursor down no selection", 1.135 + events: [ "DOMMenuItemActive item1" ], 1.136 + test: function() { sendKey("DOWN"); }, 1.137 + result: function(testname) { checkActive(gFilePopup, "item1", testname); } 1.138 +}, 1.139 +{ 1.140 + // check that pressing cursor up wraps and highlights the last item 1.141 + testname: "cursor up wrap", 1.142 + events: [ "DOMMenuItemInactive item1", "DOMMenuItemActive item3" ], 1.143 + test: function() { sendKey("UP"); }, 1.144 + result: function(testname) { checkActive(gFilePopup, "item3", testname); } 1.145 +}, 1.146 +{ 1.147 + // check that pressing cursor down wraps and highlights the first item 1.148 + testname: "cursor down wrap", 1.149 + events: [ "DOMMenuItemInactive item3", "DOMMenuItemActive item1" ], 1.150 + test: function() { sendKey("DOWN"); }, 1.151 + result: function(testname) { checkActive(gFilePopup, "item1", testname); } 1.152 +}, 1.153 +{ 1.154 + // check that pressing cursor down highlights the second item 1.155 + testname: "cursor down", 1.156 + events: [ "DOMMenuItemInactive item1", "DOMMenuItemActive item2" ], 1.157 + test: function() { sendKey("DOWN"); }, 1.158 + result: function(testname) { checkActive(gFilePopup, "item2", testname); } 1.159 +}, 1.160 +{ 1.161 + // check that pressing cursor up highlights the second item 1.162 + testname: "cursor up", 1.163 + events: [ "DOMMenuItemInactive item2", "DOMMenuItemActive item1" ], 1.164 + test: function() { sendKey("UP"); }, 1.165 + result: function(testname) { checkActive(gFilePopup, "item1", testname); } 1.166 +}, 1.167 + 1.168 +{ 1.169 + // cursor right should skip the disabled menu and move to the edit menu 1.170 + testname: "cursor right skip disabled", 1.171 + events: function() { 1.172 + var elist = [ 1.173 + // the file menu gets deactivated, the file menu gets hidden, then 1.174 + // the edit menu is activated 1.175 + "DOMMenuItemInactive filemenu", "DOMMenuItemActive editmenu", 1.176 + "popuphiding filepopup", "popuphidden filepopup", 1.177 + // the popupshowing event gets fired when showing the edit menu. 1.178 + // The item from the file menu doesn't get deactivated until the 1.179 + // next item needs to be selected 1.180 + "popupshowing editpopup", "DOMMenuItemInactive item1", 1.181 + // not sure why the menu inactivated event is firing so late 1.182 + "DOMMenuInactive filepopup" 1.183 + ]; 1.184 + // finally, the first item is activated and popupshown is fired. 1.185 + // On Windows, don't skip disabled items. 1.186 + if (navigator.platform.indexOf("Win") == 0) 1.187 + elist.push("DOMMenuItemActive cut"); 1.188 + else 1.189 + elist.push("DOMMenuItemActive copy"); 1.190 + elist.push("popupshown editpopup"); 1.191 + return elist; 1.192 + }, 1.193 + test: function() { sendKey("RIGHT"); }, 1.194 + result: function(testname) { 1.195 + var expected = (navigator.platform.indexOf("Win") == 0) ? "cut" : "copy"; 1.196 + checkActive(document.getElementById("editpopup"), expected, testname); 1.197 + checkClosed("filemenu", testname); 1.198 + checkOpen("editmenu", testname); 1.199 + is(document.getElementById("editmenu").openedWithKey, false, testname + " openedWithKey"); 1.200 + } 1.201 +}, 1.202 +{ 1.203 + // on Windows, a disabled item is selected, so pressing RETURN should close 1.204 + // the menu but not fire a command event 1.205 + testname: "enter on disabled", 1.206 + events: function() { 1.207 + if (navigator.platform.indexOf("Win") == 0) 1.208 + return [ "popuphiding editpopup", "popuphidden editpopup", 1.209 + "DOMMenuItemInactive cut", "DOMMenuInactive editpopup", 1.210 + "DOMMenuBarInactive menubar", 1.211 + "DOMMenuItemInactive editmenu", "DOMMenuItemInactive editmenu" ]; 1.212 + else 1.213 + return [ "DOMMenuItemInactive copy", "DOMMenuInactive editpopup", 1.214 + "DOMMenuBarInactive menubar", 1.215 + "DOMMenuItemInactive editmenu", "DOMMenuItemInactive editmenu", 1.216 + "command copy", "popuphiding editpopup", "popuphidden editpopup", 1.217 + "DOMMenuItemInactive copy" ]; 1.218 + }, 1.219 + test: function() { sendKey("RETURN"); }, 1.220 + result: function(testname) { 1.221 + checkClosed("editmenu", testname); 1.222 + is(document.getElementById("editmenu").openedWithKey, false, testname + " openedWithKey"); 1.223 + } 1.224 +}, 1.225 +{ 1.226 + // pressing Alt + a key should open the corresponding menu 1.227 + testname: "open with accelerator", 1.228 + events: function() { 1.229 + return [ "DOMMenuBarActive menubar", 1.230 + "popupshowing viewpopup", "DOMMenuItemActive viewmenu", 1.231 + "DOMMenuItemActive toolbar", "popupshown viewpopup" ]; 1.232 + }, 1.233 + test: function() { synthesizeKey("V", { altKey: true }); }, 1.234 + result: function(testname) { 1.235 + checkOpen("viewmenu", testname); 1.236 + is(document.getElementById("viewmenu").openedWithKey, true, testname + " openedWithKey"); 1.237 + } 1.238 +}, 1.239 +{ 1.240 + // open the submenu with the cursor right key 1.241 + testname: "open submenu with cursor right", 1.242 + events: function() { 1.243 + // on Windows, the disabled 'navigation' item can stll be highlihted 1.244 + if (navigator.platform.indexOf("Win") == 0) 1.245 + return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation", 1.246 + "popupshown toolbarpopup" ]; 1.247 + else 1.248 + return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ]; 1.249 + }, 1.250 + test: function() { sendKey("RIGHT"); }, 1.251 + result: function(testname) { 1.252 + checkOpen("viewmenu", testname); 1.253 + checkOpen("toolbar", testname); 1.254 + } 1.255 +}, 1.256 +{ 1.257 + // close the submenu with the cursor left key 1.258 + testname: "close submenu with cursor left", 1.259 + events: function() { 1.260 + if (navigator.platform.indexOf("Win") == 0) 1.261 + return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup", 1.262 + "DOMMenuItemInactive navigation", "DOMMenuInactive toolbarpopup", 1.263 + "DOMMenuItemActive toolbar" ]; 1.264 + else 1.265 + return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup", 1.266 + "DOMMenuInactive toolbarpopup", 1.267 + "DOMMenuItemActive toolbar" ]; 1.268 + }, 1.269 + test: function() { sendKey("LEFT"); }, 1.270 + result: function(testname) { 1.271 + checkOpen("viewmenu", testname); 1.272 + checkClosed("toolbar", testname); 1.273 + } 1.274 +}, 1.275 +{ 1.276 + // open the submenu with the enter key 1.277 + testname: "open submenu with enter", 1.278 + events: function() { 1.279 + // on Windows, the disabled 'navigation' item can stll be highlighted 1.280 + if (navigator.platform.indexOf("Win") == 0) 1.281 + return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation", 1.282 + "popupshown toolbarpopup" ]; 1.283 + else 1.284 + return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ]; 1.285 + }, 1.286 + test: function() { sendKey("RETURN"); }, 1.287 + result: function(testname) { 1.288 + checkOpen("viewmenu", testname); 1.289 + checkOpen("toolbar", testname); 1.290 + }, 1.291 +}, 1.292 +{ 1.293 + // close the submenu with the escape key 1.294 + testname: "close submenu with escape", 1.295 + events: function() { 1.296 + if (navigator.platform.indexOf("Win") == 0) 1.297 + return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup", 1.298 + "DOMMenuItemInactive navigation", "DOMMenuInactive toolbarpopup", 1.299 + "DOMMenuItemActive toolbar" ]; 1.300 + else 1.301 + return [ "popuphiding toolbarpopup", "popuphidden toolbarpopup", 1.302 + "DOMMenuInactive toolbarpopup", 1.303 + "DOMMenuItemActive toolbar" ]; 1.304 + }, 1.305 + test: function() { sendKey("ESCAPE"); }, 1.306 + result: function(testname) { 1.307 + checkOpen("viewmenu", testname); 1.308 + checkClosed("toolbar", testname); 1.309 + }, 1.310 +}, 1.311 +{ 1.312 + // open the submenu with the enter key again 1.313 + testname: "open submenu with enter again", 1.314 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.315 + events: function() { 1.316 + // on Windows, the disabled 'navigation' item can stll be highlighted 1.317 + if (navigator.platform.indexOf("Win") == 0) 1.318 + return [ "popupshowing toolbarpopup", "DOMMenuItemActive navigation", 1.319 + "popupshown toolbarpopup" ]; 1.320 + else 1.321 + return [ "popupshowing toolbarpopup", "popupshown toolbarpopup" ]; 1.322 + }, 1.323 + test: function() { sendKey("RETURN"); }, 1.324 + result: function(testname) { 1.325 + checkOpen("viewmenu", testname); 1.326 + checkOpen("toolbar", testname); 1.327 + }, 1.328 +}, 1.329 +{ 1.330 + // while a submenu is open, switch to the next toplevel menu with the cursor right key 1.331 + testname: "while a submenu is open, switch to the next menu with the cursor right", 1.332 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.333 + events: [ "DOMMenuItemInactive viewmenu", "DOMMenuItemActive helpmenu", 1.334 + "popuphiding toolbarpopup", "popuphidden toolbarpopup", 1.335 + "popuphiding viewpopup", "popuphidden viewpopup", 1.336 + "popupshowing helppopup", "DOMMenuItemInactive navigation", 1.337 + "DOMMenuInactive toolbarpopup", "DOMMenuItemInactive toolbar", 1.338 + "DOMMenuInactive viewpopup", "DOMMenuItemActive contents", 1.339 + "popupshown helppopup" ], 1.340 + test: function() { sendKey("RIGHT"); }, 1.341 + result: function(testname) { 1.342 + checkOpen("helpmenu", testname); 1.343 + checkClosed("toolbar", testname); 1.344 + checkClosed("viewmenu", testname); 1.345 + } 1.346 +}, 1.347 +{ 1.348 + // close the main menu with the escape key 1.349 + testname: "close menubar menu with escape", 1.350 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.351 + events: [ "popuphiding helppopup", "popuphidden helppopup", 1.352 + "DOMMenuItemInactive contents", "DOMMenuInactive helppopup", 1.353 + "DOMMenuBarInactive menubar", "DOMMenuItemInactive helpmenu" ], 1.354 + test: function() { sendKey("ESCAPE"); }, 1.355 + result: function(testname) { checkClosed("viewmenu", testname); }, 1.356 +}, 1.357 +{ 1.358 + // close the main menu with the escape key 1.359 + testname: "close menubar menu with escape", 1.360 + condition: function() { return (navigator.platform.indexOf("Win") != 0) }, 1.361 + events: [ "popuphiding viewpopup", "popuphidden viewpopup", 1.362 + "DOMMenuItemInactive toolbar", "DOMMenuInactive viewpopup", 1.363 + "DOMMenuBarInactive menubar", 1.364 + "DOMMenuItemInactive viewmenu" ], 1.365 + test: function() { sendKey("ESCAPE"); }, 1.366 + result: function(testname) { checkClosed("viewmenu", testname); }, 1.367 +}, 1.368 +{ 1.369 + // Pressing Alt should highlight the first menu but not open it, 1.370 + // but it should be ignored if the alt keydown event is consumed. 1.371 + testname: "alt shouldn't activate menubar if keydown event is consumed", 1.372 + test: function() { 1.373 + document.addEventListener("keydown", function (aEvent) { 1.374 + document.removeEventListener("keydown", arguments.callee, true); 1.375 + aEvent.preventDefault(); 1.376 + }, true); 1.377 + sendKey("ALT"); 1.378 + }, 1.379 + result: function(testname) { 1.380 + ok(!document.getElementById("filemenu").openedWithKey, testname); 1.381 + checkClosed("filemenu", testname); 1.382 + }, 1.383 +}, 1.384 +{ 1.385 + // Pressing Alt should highlight the first menu but not open it, 1.386 + // but it should be ignored if the alt keyup event is consumed. 1.387 + testname: "alt shouldn't activate menubar if keyup event is consumed", 1.388 + test: function() { 1.389 + document.addEventListener("keyup", function (aEvent) { 1.390 + document.removeEventListener("keyup", arguments.callee, true); 1.391 + aEvent.preventDefault(); 1.392 + }, true); 1.393 + sendKey("ALT"); 1.394 + }, 1.395 + result: function(testname) { 1.396 + ok(!document.getElementById("filemenu").openedWithKey, testname); 1.397 + checkClosed("filemenu", testname); 1.398 + }, 1.399 +}, 1.400 +{ 1.401 + // Pressing Alt should highlight the first menu but not open it. 1.402 + testname: "alt to activate menubar", 1.403 + events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ], 1.404 + test: function() { sendKey("ALT"); }, 1.405 + result: function(testname) { 1.406 + is(document.getElementById("filemenu").openedWithKey, true, testname + " openedWithKey"); 1.407 + checkClosed("filemenu", testname); 1.408 + }, 1.409 +}, 1.410 +{ 1.411 + // pressing cursor left should select the previous menu but not open it 1.412 + testname: "cursor left on active menubar", 1.413 + events: [ "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu" ], 1.414 + test: function() { sendKey("LEFT"); }, 1.415 + result: function(testname) { checkClosed("helpmenu", testname); }, 1.416 +}, 1.417 +{ 1.418 + // pressing cursor right should select the previous menu but not open it 1.419 + testname: "cursor right on active menubar", 1.420 + events: [ "DOMMenuItemInactive helpmenu", "DOMMenuItemActive filemenu" ], 1.421 + test: function() { sendKey("RIGHT"); }, 1.422 + result: function(testname) { checkClosed("filemenu", testname); }, 1.423 +}, 1.424 +{ 1.425 + // pressing a character should act as an accelerator and open the menu 1.426 + testname: "accelerator on active menubar", 1.427 + events: [ "popupshowing helppopup", 1.428 + "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu", 1.429 + "DOMMenuItemActive contents", "popupshown helppopup" ], 1.430 + test: function() { sendChar("h"); }, 1.431 + result: function(testname) { 1.432 + checkOpen("helpmenu", testname); 1.433 + is(document.getElementById("helpmenu").openedWithKey, true, testname + " openedWithKey"); 1.434 + }, 1.435 +}, 1.436 +{ 1.437 + // check that pressing cursor up skips non menuitems 1.438 + testname: "cursor up wrap", 1.439 + events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive about" ], 1.440 + test: function() { sendKey("UP"); }, 1.441 + result: function(testname) { } 1.442 +}, 1.443 +{ 1.444 + // check that pressing cursor down skips non menuitems 1.445 + testname: "cursor down wrap", 1.446 + events: [ "DOMMenuItemInactive about", "DOMMenuItemActive contents" ], 1.447 + test: function() { sendKey("DOWN"); }, 1.448 + result: function(testname) { } 1.449 +}, 1.450 +{ 1.451 + // check that pressing a menuitem's accelerator selects it 1.452 + testname: "menuitem accelerator", 1.453 + events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive amenu", 1.454 + "DOMMenuItemInactive amenu", "DOMMenuInactive helppopup", 1.455 + "DOMMenuBarInactive menubar", "DOMMenuItemInactive helpmenu", 1.456 + "DOMMenuItemInactive helpmenu", 1.457 + "command amenu", "popuphiding helppopup", "popuphidden helppopup", 1.458 + "DOMMenuItemInactive amenu", 1.459 + ], 1.460 + test: function() { sendChar("m"); }, 1.461 + result: function(testname) { checkClosed("helpmenu", testname); } 1.462 +}, 1.463 +{ 1.464 + // pressing F10 should highlight the first menu. On Linux, the menu is opened. 1.465 + testname: "F10 to activate menubar", 1.466 + events: pressF10Events(), 1.467 + test: function() { sendKey("F10"); }, 1.468 + result: function(testname) { 1.469 + is(document.getElementById("filemenu").openedWithKey, true, testname + " openedWithKey"); 1.470 + if (navigator.platform.indexOf("Linux") >= 0) 1.471 + checkOpen("filemenu", testname); 1.472 + else 1.473 + checkClosed("filemenu", testname); 1.474 + }, 1.475 +}, 1.476 +{ 1.477 + // pressing cursor left then down should open a menu 1.478 + testname: "cursor down on menu", 1.479 + events: (navigator.platform.indexOf("Linux") >= 0) ? 1.480 + [ "DOMMenuItemInactive filemenu", "DOMMenuItemActive helpmenu", 1.481 + // This is in a different order than the 1.482 + // "accelerator on active menubar" because menus opened from a 1.483 + // shortcut key are fired asynchronously 1.484 + "popuphiding filepopup", "popuphidden filepopup", 1.485 + "popupshowing helppopup", "DOMMenuItemInactive item1", 1.486 + "DOMMenuItemActive item2", "DOMMenuItemInactive item2", 1.487 + "DOMMenuInactive filepopup", "DOMMenuItemActive contents", 1.488 + "popupshown helppopup" ] : 1.489 + [ "popupshowing helppopup", "DOMMenuItemInactive filemenu", 1.490 + "DOMMenuItemActive helpmenu", 1.491 + // This is in a different order than the 1.492 + // "accelerator on active menubar" because menus opened from a 1.493 + // shortcut key are fired asynchronously 1.494 + "DOMMenuItemActive contents", "popupshown helppopup" ], 1.495 + test: function() { sendKey("LEFT"); sendKey("DOWN"); }, 1.496 + result: function(testname) { 1.497 + is(document.getElementById("helpmenu").openedWithKey, true, testname + " openedWithKey"); 1.498 + } 1.499 +}, 1.500 +{ 1.501 + // pressing a letter that doesn't correspond to an accelerator. The menu 1.502 + // should not close because there is more than one item corresponding to 1.503 + // that letter 1.504 + testname: "menuitem with no accelerator", 1.505 + events: [ "DOMMenuItemInactive contents", "DOMMenuItemActive one" ], 1.506 + test: function() { sendChar("o"); }, 1.507 + result: function(testname) { checkOpen("helpmenu", testname); } 1.508 +}, 1.509 +{ 1.510 + // pressing the letter again should select the next one that starts with 1.511 + // that letter 1.512 + testname: "menuitem with no accelerator again", 1.513 + events: [ "DOMMenuItemInactive one", "DOMMenuItemActive only" ], 1.514 + test: function() { sendChar("o"); }, 1.515 + result: function(testname) { 1.516 + // 'only' is a menu but it should not be open 1.517 + checkOpen("helpmenu", testname); 1.518 + checkClosed("only", testname); 1.519 + } 1.520 +}, 1.521 +{ 1.522 + // pressing the letter again when the next item is disabled should still 1.523 + // select the disabled item 1.524 + testname: "menuitem with no accelerator disabled", 1.525 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.526 + events: [ "DOMMenuItemInactive only", "DOMMenuItemActive other" ], 1.527 + test: function() { sendChar("o"); }, 1.528 + result: function(testname) { } 1.529 +}, 1.530 +{ 1.531 + // when only one menuitem starting with that letter exists, it should be 1.532 + // selected and the menu closed 1.533 + testname: "menuitem with no accelerator single", 1.534 + events: function() { 1.535 + var elist = [ "DOMMenuItemInactive other", "DOMMenuItemActive third", 1.536 + "DOMMenuItemInactive third", "DOMMenuInactive helppopup", 1.537 + "DOMMenuBarInactive menubar", 1.538 + "DOMMenuItemInactive helpmenu", 1.539 + "DOMMenuItemInactive helpmenu", 1.540 + "command third", "popuphiding helppopup", 1.541 + "popuphidden helppopup", "DOMMenuItemInactive third", 1.542 + ]; 1.543 + if (navigator.platform.indexOf("Win") == -1) 1.544 + elist[0] = "DOMMenuItemInactive only"; 1.545 + return elist; 1.546 + }, 1.547 + test: function() { sendChar("t"); }, 1.548 + result: function(testname) { checkClosed("helpmenu", testname); } 1.549 +}, 1.550 +{ 1.551 + // pressing F10 should highlight the first menu but not open it 1.552 + testname: "F10 to activate menubar again", 1.553 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.554 + events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ], 1.555 + test: function() { sendKey("F10"); }, 1.556 + result: function(testname) { checkClosed("filemenu", testname); }, 1.557 +}, 1.558 +{ 1.559 + // pressing an accelerator for a disabled item should deactivate the menubar 1.560 + testname: "accelerator for disabled menu", 1.561 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.562 + events: [ "DOMMenuItemInactive filemenu", "DOMMenuBarInactive menubar" ], 1.563 + test: function() { sendChar("s"); }, 1.564 + result: function(testname) { 1.565 + checkClosed("secretmenu", testname); 1.566 + is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey"); 1.567 + }, 1.568 +}, 1.569 +{ 1.570 + testname: "press on disabled menu", 1.571 + test: function() { 1.572 + synthesizeMouse(document.getElementById("secretmenu"), 8, 8, { }); 1.573 + }, 1.574 + result: function (testname) { 1.575 + checkClosed("secretmenu", testname); 1.576 + } 1.577 +}, 1.578 +{ 1.579 + testname: "press on second menu with shift", 1.580 + events: [ "popupshowing editpopup", "DOMMenuBarActive menubar", 1.581 + "DOMMenuItemActive editmenu", "popupshown editpopup" ], 1.582 + test: function() { 1.583 + synthesizeMouse(document.getElementById("editmenu"), 8, 8, { shiftKey : true }); 1.584 + }, 1.585 + result: function (testname) { 1.586 + checkOpen("editmenu", testname); 1.587 + checkActive(document.getElementById("menubar"), "editmenu", testname); 1.588 + } 1.589 +}, 1.590 +{ 1.591 + testname: "press on disabled menuitem", 1.592 + test: function() { 1.593 + synthesizeMouse(document.getElementById("cut"), 8, 8, { }); 1.594 + }, 1.595 + result: function (testname) { 1.596 + checkOpen("editmenu", testname); 1.597 + } 1.598 +}, 1.599 +{ 1.600 + testname: "press on menuitem", 1.601 + events: [ "DOMMenuInactive editpopup", 1.602 + "DOMMenuBarInactive menubar", 1.603 + "DOMMenuItemInactive editmenu", 1.604 + "DOMMenuItemInactive editmenu", 1.605 + "command copy", "popuphiding editpopup", "popuphidden editpopup", 1.606 + "DOMMenuItemInactive copy", 1.607 + ], 1.608 + test: function() { 1.609 + synthesizeMouse(document.getElementById("copy"), 8, 8, { }); 1.610 + }, 1.611 + result: function (testname) { 1.612 + checkClosed("editmenu", testname); 1.613 + } 1.614 +}, 1.615 +{ 1.616 + // this test ensures that the menu can still be opened by clicking after selecting 1.617 + // a menuitem from the menu. See bug 399350. 1.618 + testname: "press on menu after menuitem selected", 1.619 + events: [ "popupshowing editpopup", "DOMMenuBarActive menubar", 1.620 + "DOMMenuItemActive editmenu", "popupshown editpopup" ], 1.621 + test: function() { synthesizeMouse(document.getElementById("editmenu"), 8, 8, { }); }, 1.622 + result: function (testname) { 1.623 + checkActive(document.getElementById("editpopup"), "", testname); 1.624 + checkOpen("editmenu", testname); 1.625 + } 1.626 +}, 1.627 +{ // try selecting a different command 1.628 + testname: "press on menuitem again", 1.629 + events: [ "DOMMenuInactive editpopup", 1.630 + "DOMMenuBarInactive menubar", 1.631 + "DOMMenuItemInactive editmenu", 1.632 + "DOMMenuItemInactive editmenu", 1.633 + "command paste", "popuphiding editpopup", "popuphidden editpopup", 1.634 + "DOMMenuItemInactive paste", 1.635 + ], 1.636 + test: function() { 1.637 + synthesizeMouse(document.getElementById("paste"), 8, 8, { }); 1.638 + }, 1.639 + result: function (testname) { 1.640 + checkClosed("editmenu", testname); 1.641 + } 1.642 +}, 1.643 +{ 1.644 + testname: "F10 to activate menubar for tab deactivation", 1.645 + events: pressF10Events(), 1.646 + test: function() { sendKey("F10"); }, 1.647 +}, 1.648 +{ 1.649 + testname: "Deactivate menubar with tab key", 1.650 + events: closeAfterF10Events(true), 1.651 + test: function() { sendKey("TAB"); }, 1.652 + result: function(testname) { 1.653 + is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey"); 1.654 + } 1.655 +}, 1.656 +{ 1.657 + testname: "F10 to activate menubar for escape deactivation", 1.658 + events: pressF10Events(), 1.659 + test: function() { sendKey("F10"); }, 1.660 +}, 1.661 +{ 1.662 + testname: "Deactivate menubar with escape key", 1.663 + events: closeAfterF10Events(false), 1.664 + test: function() { sendKey("ESCAPE"); }, 1.665 + result: function(testname) { 1.666 + is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey"); 1.667 + } 1.668 +}, 1.669 +{ 1.670 + testname: "F10 to activate menubar for f10 deactivation", 1.671 + events: pressF10Events(), 1.672 + test: function() { sendKey("F10"); }, 1.673 +}, 1.674 +{ 1.675 + testname: "Deactivate menubar with f10 key", 1.676 + events: closeAfterF10Events(true), 1.677 + test: function() { sendKey("F10"); }, 1.678 + result: function(testname) { 1.679 + is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey"); 1.680 + } 1.681 +}, 1.682 +{ 1.683 + testname: "F10 to activate menubar for alt deactivation", 1.684 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.685 + events: [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ], 1.686 + test: function() { sendKey("F10"); }, 1.687 +}, 1.688 +{ 1.689 + testname: "Deactivate menubar with alt key", 1.690 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.691 + events: [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ], 1.692 + test: function() { sendKey("ALT"); }, 1.693 + result: function(testname) { 1.694 + is(document.getElementById("filemenu").openedWithKey, false, testname + " openedWithKey"); 1.695 + } 1.696 +}, 1.697 +{ 1.698 + testname: "Don't activate menubar with mousedown during alt key auto-repeat", 1.699 + test: function() { 1.700 + synthesizeKey("VK_ALT", { type: "keydown" }); 1.701 + synthesizeMouse(document.getElementById("menubar"), 8, -30, { type: "mousedown", altKey: true }); 1.702 + synthesizeKey("VK_ALT", { type: "keydown" }); 1.703 + synthesizeMouse(document.getElementById("menubar"), 8, -30, { type: "mouseup", altKey: true }); 1.704 + synthesizeKey("VK_ALT", { type: "keydown" }); 1.705 + synthesizeKey("VK_ALT", { type: "keyup" }); 1.706 + }, 1.707 + result: function (testname) { 1.708 + checkActive(document.getElementById("menubar"), "", testname); 1.709 + } 1.710 +}, 1.711 + 1.712 +// Fllowing 4 tests are a test of bug 616797, don't insert any new tests 1.713 +// between them. 1.714 +{ 1.715 + testname: "Open file menu by accelerator", 1.716 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.717 + events: function() { 1.718 + return [ "DOMMenuBarActive menubar", "popupshowing filepopup", 1.719 + "DOMMenuItemActive filemenu", "DOMMenuItemActive item1", 1.720 + "popupshown filepopup" ]; 1.721 + }, 1.722 + test: function() { 1.723 + synthesizeKey("VK_ALT", { type: "keydown" }); 1.724 + synthesizeKey("F", { altKey: true }); 1.725 + synthesizeKey("VK_ALT", { type: "keyup" }); 1.726 + } 1.727 +}, 1.728 +{ 1.729 + testname: "Close file menu by click at outside of popup menu", 1.730 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.731 + events: function() { 1.732 + return [ "popuphiding filepopup", "popuphidden filepopup", 1.733 + "DOMMenuItemInactive item1", "DOMMenuInactive filepopup", 1.734 + "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu", 1.735 + "DOMMenuItemInactive filemenu" ]; 1.736 + }, 1.737 + test: function() { 1.738 + // XXX hidePopup() causes DOMMenuItemInactive event to be fired twice. 1.739 + document.getElementById("filepopup").hidePopup(); 1.740 + } 1.741 +}, 1.742 +{ 1.743 + testname: "Alt keydown set focus the menubar", 1.744 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.745 + events: function() { 1.746 + return [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ]; 1.747 + }, 1.748 + test: function() { 1.749 + sendKey("ALT"); 1.750 + }, 1.751 + result: function (testname) { 1.752 + checkClosed("filemenu", testname); 1.753 + } 1.754 +}, 1.755 +{ 1.756 + testname: "unset focus the menubar", 1.757 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.758 + events: function() { 1.759 + return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ]; 1.760 + }, 1.761 + test: function() { 1.762 + sendKey("ALT"); 1.763 + } 1.764 +}, 1.765 + 1.766 +// bug 625151 1.767 +{ 1.768 + testname: "Alt key state before deactivating the window shouldn't prevent " + 1.769 + "next Alt key handling", 1.770 + condition: function() { return (navigator.platform.indexOf("Win") == 0) }, 1.771 + events: function() { 1.772 + return [ "DOMMenuBarActive menubar", "DOMMenuItemActive filemenu" ]; 1.773 + }, 1.774 + test: function() { 1.775 + synthesizeKey("VK_ALT", { type: "keydown" }); 1.776 + synthesizeKey("VK_TAB", { type: "keydown" }); // cancels the Alt key 1.777 + var thisWindow = window; 1.778 + var newWindow = 1.779 + window.open("data:text/html,", "_blank", "width=100,height=100"); 1.780 + newWindow.addEventListener("focus", function () { 1.781 + newWindow.removeEventListener("focus", arguments.callee, false); 1.782 + thisWindow.addEventListener("focus", function () { 1.783 + thisWindow.removeEventListener("focus", arguments.callee, false); 1.784 + setTimeout(function () { 1.785 + sendKey("ALT", thisWindow); 1.786 + }, 0); 1.787 + }, false); 1.788 + newWindow.close(); 1.789 + thisWindow.focus(); 1.790 + // Note that our window dispatches a hacky key event if IMM is installed 1.791 + // on the system during focus change only if Alt key is pressed. 1.792 + synthesizeKey("`", { type: "keypress" }, thisWindow); 1.793 + }, false); 1.794 + } 1.795 +} 1.796 + 1.797 +]; 1.798 + 1.799 +]]> 1.800 +</script> 1.801 + 1.802 +</window>