1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/tests/mochitest/treeupdate/test_contextmenu.xul Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,319 @@ 1.4 +<?xml version="1.0"?> 1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> 1.6 +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" 1.7 + type="text/css"?> 1.8 + 1.9 +<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 1.10 + title="menu tree and events"> 1.11 + 1.12 + <script type="application/javascript" 1.13 + src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" /> 1.14 + <script type="application/javascript" 1.15 + src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> 1.16 + 1.17 + <script type="application/javascript" 1.18 + src="../common.js" /> 1.19 + <script type="application/javascript" 1.20 + src="../events.js" /> 1.21 + <script type="application/javascript" 1.22 + src="../role.js" /> 1.23 + 1.24 + <script type="application/javascript"> 1.25 + <![CDATA[ 1.26 + 1.27 + function openMenu(aID, aTree) 1.28 + { 1.29 + this.eventSeq = [ 1.30 + new invokerChecker(EVENT_MENUPOPUP_START, getNode(aID)) 1.31 + ]; 1.32 + 1.33 + this.invoke = function openMenu_invoke() 1.34 + { 1.35 + var button = getNode("button"); 1.36 + getNode(aID).openPopup(button, "after_start", 0, 0, true, false); 1.37 + } 1.38 + 1.39 + this.finalCheck = function openMenu_finalCheck(aEvent) 1.40 + { 1.41 + testAccessibleTree(aID, aTree); 1.42 + } 1.43 + 1.44 + this.getID = function openMenu_getID() 1.45 + { 1.46 + return "open menu " + prettyName(aID); 1.47 + } 1.48 + } 1.49 + 1.50 + function selectNextMenuItem(aID) 1.51 + { 1.52 + this.eventSeq = [ 1.53 + new invokerChecker(EVENT_FOCUS, getNode(aID)) 1.54 + ]; 1.55 + 1.56 + this.invoke = function selectMenuItem_invoke() 1.57 + { 1.58 + synthesizeKey("VK_DOWN", { }); 1.59 + } 1.60 + 1.61 + this.getID = function selectMenuItem_getID() 1.62 + { 1.63 + return "select menuitem " + prettyName(aID); 1.64 + } 1.65 + } 1.66 + 1.67 + function openSubMenu(aSubMenuID, aItemID, aMenuID, aTree) 1.68 + { 1.69 + this.eventSeq = [ 1.70 + new invokerChecker(EVENT_FOCUS, getNode(aItemID)), 1.71 + ]; 1.72 + 1.73 + this.invoke = function openSubMenu_invoke() 1.74 + { 1.75 + synthesizeKey("VK_RETURN", { }); 1.76 + } 1.77 + 1.78 + this.finalCheck = function openSubMenu_finalCheck(aEvent) 1.79 + { 1.80 + testAccessibleTree(aMenuID, aTree); 1.81 + } 1.82 + 1.83 + this.getID = function openSubMenu_getID() 1.84 + { 1.85 + return "open submenu " + prettyName(aSubMenuID) + " focusing item " + prettyName(aItemID); 1.86 + } 1.87 + } 1.88 + 1.89 + function closeSubMenu(aSubMenuID, aItemID) 1.90 + { 1.91 + this.eventSeq = [ 1.92 + new invokerChecker(EVENT_FOCUS, getNode(aItemID)), 1.93 + ]; 1.94 + 1.95 + this.invoke = function closeSubMenu_invoke() 1.96 + { 1.97 + synthesizeKey("VK_ESCAPE", { }); 1.98 + } 1.99 + 1.100 + this.getID = function closeSubMenu_getID() 1.101 + { 1.102 + return "close submenu " + prettyName(aSubMenuID) + " focusing item " + prettyName(aItemID); 1.103 + } 1.104 + } 1.105 + 1.106 + function closeMenu(aID) 1.107 + { 1.108 + this.eventSeq = [ 1.109 + new invokerChecker(EVENT_MENUPOPUP_END, getNode(aID)) 1.110 + ]; 1.111 + 1.112 + this.invoke = function closeMenu_invoke() 1.113 + { 1.114 + synthesizeKey("VK_ESCAPE", { }); 1.115 + } 1.116 + 1.117 + this.getID = function closeMenu_getID() 1.118 + { 1.119 + return "close menu " + prettyName(aID); 1.120 + } 1.121 + } 1.122 + 1.123 + //gA11yEventDumpID = "eventdump"; 1.124 + //gA11yEventDumpToConsole = true; 1.125 + 1.126 + var gQueue = null; 1.127 + var gContextTree = {}; 1.128 + 1.129 + // Linux and Windows menu trees discrepancy: bug 527646. 1.130 + 1.131 + /** 1.132 + * Return the context menu tree before submenus were open. 1.133 + */ 1.134 + function getMenuTree1() 1.135 + { 1.136 + if (LINUX || SOLARIS) { 1.137 + var tree = { 1.138 + role: ROLE_MENUPOPUP, 1.139 + children: [ 1.140 + { 1.141 + name: "item0", 1.142 + role: ROLE_MENUITEM, 1.143 + children: [] 1.144 + }, 1.145 + { 1.146 + name: "item1", 1.147 + role: ROLE_MENUITEM, 1.148 + children: [] 1.149 + }, 1.150 + { 1.151 + name: "item2", 1.152 + role: ROLE_PARENT_MENUITEM, 1.153 + children: [ ] 1.154 + } 1.155 + ] 1.156 + }; 1.157 + return tree; 1.158 + } 1.159 + 1.160 + // Windows 1.161 + var tree = { 1.162 + role: ROLE_MENUPOPUP, 1.163 + children: [ 1.164 + { 1.165 + name: "item0", 1.166 + role: ROLE_MENUITEM, 1.167 + children: [] 1.168 + }, 1.169 + { 1.170 + name: "item1", 1.171 + role: ROLE_MENUITEM, 1.172 + children: [] 1.173 + }, 1.174 + { 1.175 + name: "item2", 1.176 + role: ROLE_PARENT_MENUITEM, 1.177 + children: [ 1.178 + { 1.179 + name: "item2", 1.180 + role: ROLE_MENUPOPUP, 1.181 + children: [ ] 1.182 + } 1.183 + ] 1.184 + } 1.185 + ] 1.186 + }; 1.187 + return tree; 1.188 + } 1.189 + 1.190 + /** 1.191 + * Return context menu tree when submenu was open. 1.192 + */ 1.193 + function getMenuTree2() 1.194 + { 1.195 + var tree = getMenuTree1(); 1.196 + if (LINUX || SOLARIS) { 1.197 + var submenuTree = 1.198 + { 1.199 + name: "item2.0", 1.200 + role: ROLE_PARENT_MENUITEM, 1.201 + children: [ ] 1.202 + }; 1.203 + tree.children[2].children.push(submenuTree); 1.204 + return tree; 1.205 + } 1.206 + 1.207 + // Windows 1.208 + var submenuTree = 1.209 + { 1.210 + name: "item2.0", 1.211 + role: ROLE_PARENT_MENUITEM, 1.212 + children: [ 1.213 + { 1.214 + name: "item2.0", 1.215 + role: ROLE_MENUPOPUP, 1.216 + children: [ ] 1.217 + } 1.218 + ] 1.219 + }; 1.220 + 1.221 + tree.children[2].children[0].children.push(submenuTree); 1.222 + return tree; 1.223 + } 1.224 + 1.225 + /** 1.226 + * Return context menu tree when subsub menu was open. 1.227 + */ 1.228 + function getMenuTree3() 1.229 + { 1.230 + var tree = getMenuTree2(); 1.231 + var subsubmenuTree = 1.232 + { 1.233 + name: "item2.0.0", 1.234 + role: ROLE_MENUITEM, 1.235 + children: [] 1.236 + }; 1.237 + 1.238 + if (LINUX || SOLARIS) 1.239 + tree.children[2].children[0].children.push(subsubmenuTree); 1.240 + else 1.241 + tree.children[2].children[0].children[0].children[0].children.push(subsubmenuTree); 1.242 + 1.243 + return tree; 1.244 + } 1.245 + 1.246 + 1.247 + function doTests() 1.248 + { 1.249 + gQueue = new eventQueue(); 1.250 + 1.251 + // Check initial empty tree 1.252 + testAccessibleTree("context", { MENUPOPUP: [] }); 1.253 + 1.254 + // Open context menu and check that menu item accesibles are created. 1.255 + gQueue.push(new openMenu("context", getMenuTree1())); 1.256 + 1.257 + // Select items and check focus event on them. 1.258 + gQueue.push(new selectNextMenuItem("item0")); 1.259 + gQueue.push(new selectNextMenuItem("item1")); 1.260 + gQueue.push(new selectNextMenuItem("item2")); 1.261 + 1.262 + // Open sub menu and check menu accessible tree and focus event. 1.263 + gQueue.push(new openSubMenu("submenu2", "item2.0", 1.264 + "context", getMenuTree2())); 1.265 + gQueue.push(new openSubMenu("submenu2.0", "item2.0.0", 1.266 + "context", getMenuTree3())); 1.267 + 1.268 + // Close submenus and check that focus goes to parent. 1.269 + gQueue.push(new closeSubMenu("submenu2.0", "item2.0")); 1.270 + gQueue.push(new closeSubMenu("submenu2", "item2")); 1.271 + 1.272 + gQueue.push(new closeMenu("context")); 1.273 + 1.274 + gQueue.invoke(); // Will call SimpleTest.finish(); 1.275 + } 1.276 + 1.277 + SimpleTest.waitForExplicitFinish(); 1.278 + addA11yLoadEvent(doTests); 1.279 + ]]> 1.280 + </script> 1.281 + 1.282 + <hbox flex="1" style="overflow: auto;"> 1.283 + <body xmlns="http://www.w3.org/1999/xhtml"> 1.284 + <a target="_blank" 1.285 + href="https://bugzilla.mozilla.org/show_bug.cgi?id=630194" 1.286 + title="Update accessible tree when opening the menu popup"> 1.287 + Mozilla Bug 630194 1.288 + </a> 1.289 + <a target="_blank" 1.290 + href="https://bugzilla.mozilla.org/show_bug.cgi?id=630486" 1.291 + title="Don't force accessible creation for popup children."> 1.292 + Mozilla Bug 630486 1.293 + </a> 1.294 + <p id="display"></p> 1.295 + <div id="content" style="display: none"> 1.296 + </div> 1.297 + <pre id="test"> 1.298 + </pre> 1.299 + </body> 1.300 + 1.301 + <vbox flex="1"> 1.302 + 1.303 + <menupopup id="context"> 1.304 + <menuitem id="item0" label="item0"/> 1.305 + <menuitem id="item1" label="item1"/> 1.306 + <menu id="item2" label="item2"> 1.307 + <menupopup id="submenu2"> 1.308 + <menu id="item2.0" label="item2.0"> 1.309 + <menupopup id="submenu2.0"> 1.310 + <menuitem id="item2.0.0" label="item2.0.0"/> 1.311 + </menupopup> 1.312 + </menu> 1.313 + </menupopup> 1.314 + </menu> 1.315 + </menupopup> 1.316 + 1.317 + <button context="context" id="button">btn</button> 1.318 + 1.319 + <vbox id="eventdump" role="log"/> 1.320 + </vbox> 1.321 + </hbox> 1.322 +</window>