toolkit/content/tests/widgets/window_menubar.xul

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:774bfdf2e4d4
1 <?xml version="1.0"?>
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
3
4 <!-- the condition in the focus event handler is because pressing Tab
5 unfocuses and refocuses the window on Windows -->
6
7 <window title="Popup Tests"
8 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
9
10 <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
11 <script type="application/javascript" src="popup_shared.js"></script>
12
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 -->
18
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>
80
81 <script class="testbody" type="application/javascript">
82 <![CDATA[
83
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);
91
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 }
101
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 }
112
113 return [ "DOMMenuBarInactive menubar", "DOMMenuItemInactive filemenu" ];
114 }
115
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 },
164
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 },
708
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 },
762
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 }
793
794 ];
795
796 ]]>
797 </script>
798
799 </window>

mercurial