accessible/tests/mochitest/treeupdate/test_contextmenu.xul

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:33c53fffd6aa
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>

mercurial