|
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> |