|
1 <?xml version="1.0"?> |
|
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> |
|
3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" |
|
4 type="text/css"?> |
|
5 |
|
6 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
|
7 title="menu tree and events"> |
|
8 |
|
9 <script type="application/javascript" |
|
10 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" /> |
|
11 <script type="application/javascript" |
|
12 src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> |
|
13 |
|
14 <script type="application/javascript" |
|
15 src="../common.js" /> |
|
16 <script type="application/javascript" |
|
17 src="../events.js" /> |
|
18 <script type="application/javascript" |
|
19 src="../role.js" /> |
|
20 |
|
21 <script type="application/javascript"> |
|
22 <![CDATA[ |
|
23 |
|
24 function openMenu(aID, aTree) |
|
25 { |
|
26 this.eventSeq = [ |
|
27 new invokerChecker(EVENT_MENUPOPUP_START, getNode(aID)) |
|
28 ]; |
|
29 |
|
30 this.invoke = function openMenu_invoke() |
|
31 { |
|
32 var button = getNode("button"); |
|
33 getNode(aID).openPopup(button, "after_start", 0, 0, true, false); |
|
34 } |
|
35 |
|
36 this.finalCheck = function openMenu_finalCheck(aEvent) |
|
37 { |
|
38 testAccessibleTree(aID, aTree); |
|
39 } |
|
40 |
|
41 this.getID = function openMenu_getID() |
|
42 { |
|
43 return "open menu " + prettyName(aID); |
|
44 } |
|
45 } |
|
46 |
|
47 function selectNextMenuItem(aID) |
|
48 { |
|
49 this.eventSeq = [ |
|
50 new invokerChecker(EVENT_FOCUS, getNode(aID)) |
|
51 ]; |
|
52 |
|
53 this.invoke = function selectMenuItem_invoke() |
|
54 { |
|
55 synthesizeKey("VK_DOWN", { }); |
|
56 } |
|
57 |
|
58 this.getID = function selectMenuItem_getID() |
|
59 { |
|
60 return "select menuitem " + prettyName(aID); |
|
61 } |
|
62 } |
|
63 |
|
64 function openSubMenu(aSubMenuID, aItemID, aMenuID, aTree) |
|
65 { |
|
66 this.eventSeq = [ |
|
67 new invokerChecker(EVENT_FOCUS, getNode(aItemID)), |
|
68 ]; |
|
69 |
|
70 this.invoke = function openSubMenu_invoke() |
|
71 { |
|
72 synthesizeKey("VK_RETURN", { }); |
|
73 } |
|
74 |
|
75 this.finalCheck = function openSubMenu_finalCheck(aEvent) |
|
76 { |
|
77 testAccessibleTree(aMenuID, aTree); |
|
78 } |
|
79 |
|
80 this.getID = function openSubMenu_getID() |
|
81 { |
|
82 return "open submenu " + prettyName(aSubMenuID) + " focusing item " + prettyName(aItemID); |
|
83 } |
|
84 } |
|
85 |
|
86 function closeSubMenu(aSubMenuID, aItemID) |
|
87 { |
|
88 this.eventSeq = [ |
|
89 new invokerChecker(EVENT_FOCUS, getNode(aItemID)), |
|
90 ]; |
|
91 |
|
92 this.invoke = function closeSubMenu_invoke() |
|
93 { |
|
94 synthesizeKey("VK_ESCAPE", { }); |
|
95 } |
|
96 |
|
97 this.getID = function closeSubMenu_getID() |
|
98 { |
|
99 return "close submenu " + prettyName(aSubMenuID) + " focusing item " + prettyName(aItemID); |
|
100 } |
|
101 } |
|
102 |
|
103 function closeMenu(aID) |
|
104 { |
|
105 this.eventSeq = [ |
|
106 new invokerChecker(EVENT_MENUPOPUP_END, getNode(aID)) |
|
107 ]; |
|
108 |
|
109 this.invoke = function closeMenu_invoke() |
|
110 { |
|
111 synthesizeKey("VK_ESCAPE", { }); |
|
112 } |
|
113 |
|
114 this.getID = function closeMenu_getID() |
|
115 { |
|
116 return "close menu " + prettyName(aID); |
|
117 } |
|
118 } |
|
119 |
|
120 //gA11yEventDumpID = "eventdump"; |
|
121 //gA11yEventDumpToConsole = true; |
|
122 |
|
123 var gQueue = null; |
|
124 var gContextTree = {}; |
|
125 |
|
126 // Linux and Windows menu trees discrepancy: bug 527646. |
|
127 |
|
128 /** |
|
129 * Return the context menu tree before submenus were open. |
|
130 */ |
|
131 function getMenuTree1() |
|
132 { |
|
133 if (LINUX || SOLARIS) { |
|
134 var tree = { |
|
135 role: ROLE_MENUPOPUP, |
|
136 children: [ |
|
137 { |
|
138 name: "item0", |
|
139 role: ROLE_MENUITEM, |
|
140 children: [] |
|
141 }, |
|
142 { |
|
143 name: "item1", |
|
144 role: ROLE_MENUITEM, |
|
145 children: [] |
|
146 }, |
|
147 { |
|
148 name: "item2", |
|
149 role: ROLE_PARENT_MENUITEM, |
|
150 children: [ ] |
|
151 } |
|
152 ] |
|
153 }; |
|
154 return tree; |
|
155 } |
|
156 |
|
157 // Windows |
|
158 var tree = { |
|
159 role: ROLE_MENUPOPUP, |
|
160 children: [ |
|
161 { |
|
162 name: "item0", |
|
163 role: ROLE_MENUITEM, |
|
164 children: [] |
|
165 }, |
|
166 { |
|
167 name: "item1", |
|
168 role: ROLE_MENUITEM, |
|
169 children: [] |
|
170 }, |
|
171 { |
|
172 name: "item2", |
|
173 role: ROLE_PARENT_MENUITEM, |
|
174 children: [ |
|
175 { |
|
176 name: "item2", |
|
177 role: ROLE_MENUPOPUP, |
|
178 children: [ ] |
|
179 } |
|
180 ] |
|
181 } |
|
182 ] |
|
183 }; |
|
184 return tree; |
|
185 } |
|
186 |
|
187 /** |
|
188 * Return context menu tree when submenu was open. |
|
189 */ |
|
190 function getMenuTree2() |
|
191 { |
|
192 var tree = getMenuTree1(); |
|
193 if (LINUX || SOLARIS) { |
|
194 var submenuTree = |
|
195 { |
|
196 name: "item2.0", |
|
197 role: ROLE_PARENT_MENUITEM, |
|
198 children: [ ] |
|
199 }; |
|
200 tree.children[2].children.push(submenuTree); |
|
201 return tree; |
|
202 } |
|
203 |
|
204 // Windows |
|
205 var submenuTree = |
|
206 { |
|
207 name: "item2.0", |
|
208 role: ROLE_PARENT_MENUITEM, |
|
209 children: [ |
|
210 { |
|
211 name: "item2.0", |
|
212 role: ROLE_MENUPOPUP, |
|
213 children: [ ] |
|
214 } |
|
215 ] |
|
216 }; |
|
217 |
|
218 tree.children[2].children[0].children.push(submenuTree); |
|
219 return tree; |
|
220 } |
|
221 |
|
222 /** |
|
223 * Return context menu tree when subsub menu was open. |
|
224 */ |
|
225 function getMenuTree3() |
|
226 { |
|
227 var tree = getMenuTree2(); |
|
228 var subsubmenuTree = |
|
229 { |
|
230 name: "item2.0.0", |
|
231 role: ROLE_MENUITEM, |
|
232 children: [] |
|
233 }; |
|
234 |
|
235 if (LINUX || SOLARIS) |
|
236 tree.children[2].children[0].children.push(subsubmenuTree); |
|
237 else |
|
238 tree.children[2].children[0].children[0].children[0].children.push(subsubmenuTree); |
|
239 |
|
240 return tree; |
|
241 } |
|
242 |
|
243 |
|
244 function doTests() |
|
245 { |
|
246 gQueue = new eventQueue(); |
|
247 |
|
248 // Check initial empty tree |
|
249 testAccessibleTree("context", { MENUPOPUP: [] }); |
|
250 |
|
251 // Open context menu and check that menu item accesibles are created. |
|
252 gQueue.push(new openMenu("context", getMenuTree1())); |
|
253 |
|
254 // Select items and check focus event on them. |
|
255 gQueue.push(new selectNextMenuItem("item0")); |
|
256 gQueue.push(new selectNextMenuItem("item1")); |
|
257 gQueue.push(new selectNextMenuItem("item2")); |
|
258 |
|
259 // Open sub menu and check menu accessible tree and focus event. |
|
260 gQueue.push(new openSubMenu("submenu2", "item2.0", |
|
261 "context", getMenuTree2())); |
|
262 gQueue.push(new openSubMenu("submenu2.0", "item2.0.0", |
|
263 "context", getMenuTree3())); |
|
264 |
|
265 // Close submenus and check that focus goes to parent. |
|
266 gQueue.push(new closeSubMenu("submenu2.0", "item2.0")); |
|
267 gQueue.push(new closeSubMenu("submenu2", "item2")); |
|
268 |
|
269 gQueue.push(new closeMenu("context")); |
|
270 |
|
271 gQueue.invoke(); // Will call SimpleTest.finish(); |
|
272 } |
|
273 |
|
274 SimpleTest.waitForExplicitFinish(); |
|
275 addA11yLoadEvent(doTests); |
|
276 ]]> |
|
277 </script> |
|
278 |
|
279 <hbox flex="1" style="overflow: auto;"> |
|
280 <body xmlns="http://www.w3.org/1999/xhtml"> |
|
281 <a target="_blank" |
|
282 href="https://bugzilla.mozilla.org/show_bug.cgi?id=630194" |
|
283 title="Update accessible tree when opening the menu popup"> |
|
284 Mozilla Bug 630194 |
|
285 </a> |
|
286 <a target="_blank" |
|
287 href="https://bugzilla.mozilla.org/show_bug.cgi?id=630486" |
|
288 title="Don't force accessible creation for popup children."> |
|
289 Mozilla Bug 630486 |
|
290 </a> |
|
291 <p id="display"></p> |
|
292 <div id="content" style="display: none"> |
|
293 </div> |
|
294 <pre id="test"> |
|
295 </pre> |
|
296 </body> |
|
297 |
|
298 <vbox flex="1"> |
|
299 |
|
300 <menupopup id="context"> |
|
301 <menuitem id="item0" label="item0"/> |
|
302 <menuitem id="item1" label="item1"/> |
|
303 <menu id="item2" label="item2"> |
|
304 <menupopup id="submenu2"> |
|
305 <menu id="item2.0" label="item2.0"> |
|
306 <menupopup id="submenu2.0"> |
|
307 <menuitem id="item2.0.0" label="item2.0.0"/> |
|
308 </menupopup> |
|
309 </menu> |
|
310 </menupopup> |
|
311 </menu> |
|
312 </menupopup> |
|
313 |
|
314 <button context="context" id="button">btn</button> |
|
315 |
|
316 <vbox id="eventdump" role="log"/> |
|
317 </vbox> |
|
318 </hbox> |
|
319 </window> |