Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
michael@0 | 1 | <?xml version="1.0"?> |
michael@0 | 2 | |
michael@0 | 3 | <?xml-stylesheet href="chrome://global/skin" type="text/css"?> |
michael@0 | 4 | |
michael@0 | 5 | <window id="StandaloneNativeMenuWindow" |
michael@0 | 6 | xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
michael@0 | 7 | width="300" |
michael@0 | 8 | height="300" |
michael@0 | 9 | onload="onLoad();" |
michael@0 | 10 | title="nsIStandaloneNativeMenu Test"> |
michael@0 | 11 | |
michael@0 | 12 | <command id="cmd_FooItem0" oncommand="executedCommandID = 'cmd_FooItem0';"/> |
michael@0 | 13 | <command id="cmd_FooItem1" oncommand="executedCommandID = 'cmd_FooItem1';"/> |
michael@0 | 14 | <command id="cmd_BarItem0" oncommand="executedCommandID = 'cmd_BarItem0';"/> |
michael@0 | 15 | <command id="cmd_BarItem1" oncommand="executedCommandID = 'cmd_BarItem1';"/> |
michael@0 | 16 | <command id="cmd_NewItem0" oncommand="executedCommandID = 'cmd_NewItem0';"/> |
michael@0 | 17 | <command id="cmd_NewItem1" oncommand="executedCommandID = 'cmd_NewItem1';"/> |
michael@0 | 18 | <command id="cmd_NewItem2" oncommand="executedCommandID = 'cmd_NewItem2';"/> |
michael@0 | 19 | <command id="cmd_NewItem3" oncommand="executedCommandID = 'cmd_NewItem3';"/> |
michael@0 | 20 | <command id="cmd_NewItem4" oncommand="executedCommandID = 'cmd_NewItem4';"/> |
michael@0 | 21 | <command id="cmd_NewItem5" oncommand="executedCommandID = 'cmd_NewItem5';"/> |
michael@0 | 22 | |
michael@0 | 23 | <!-- We do not modify any menus or menu items defined here in testing. These |
michael@0 | 24 | serve as a baseline structure for us to test after other modifications. |
michael@0 | 25 | We add children to the menubar defined here and test by modifying those |
michael@0 | 26 | children. --> |
michael@0 | 27 | <popupset> |
michael@0 | 28 | <menupopup id="standalonenativemenu"> |
michael@0 | 29 | <menu id="foo" label="Foo"> |
michael@0 | 30 | <menupopup> |
michael@0 | 31 | <menuitem label="FooItem0" command="cmd_FooItem0"/> |
michael@0 | 32 | <menuitem label="FooItem1" command="cmd_FooItem1"/> |
michael@0 | 33 | <menuseparator/> |
michael@0 | 34 | <menu label="Bar"> |
michael@0 | 35 | <menupopup> |
michael@0 | 36 | <menuitem label="BarItem0" command="cmd_BarItem0"/> |
michael@0 | 37 | <menuitem label="BarItem1" command="cmd_BarItem1"/> |
michael@0 | 38 | </menupopup> |
michael@0 | 39 | </menu> |
michael@0 | 40 | </menupopup> |
michael@0 | 41 | </menu> |
michael@0 | 42 | </menupopup> |
michael@0 | 43 | </popupset> |
michael@0 | 44 | |
michael@0 | 45 | <script type="application/javascript"><![CDATA[ |
michael@0 | 46 | |
michael@0 | 47 | function ok(condition, message) { |
michael@0 | 48 | window.opener.wrappedJSObject.SimpleTest.ok(condition, message); |
michael@0 | 49 | } |
michael@0 | 50 | |
michael@0 | 51 | function todo(condition, message) { |
michael@0 | 52 | window.opener.wrappedJSObject.SimpleTest.todo(condition, message); |
michael@0 | 53 | } |
michael@0 | 54 | |
michael@0 | 55 | function onTestsFinished() { |
michael@0 | 56 | window.close(); |
michael@0 | 57 | window.opener.wrappedJSObject.SimpleTest.finish(); |
michael@0 | 58 | } |
michael@0 | 59 | |
michael@0 | 60 | var executedCommandID = ""; |
michael@0 | 61 | |
michael@0 | 62 | function testItem(menu, location, targetID) { |
michael@0 | 63 | var correctCommandHandler = false; |
michael@0 | 64 | try { |
michael@0 | 65 | menu.menuWillOpen(); |
michael@0 | 66 | menu.activateNativeMenuItemAt(location); |
michael@0 | 67 | correctCommandHandler = executedCommandID == targetID; |
michael@0 | 68 | } |
michael@0 | 69 | catch (e) { |
michael@0 | 70 | dump(e + "\n"); |
michael@0 | 71 | } |
michael@0 | 72 | finally { |
michael@0 | 73 | executedCommandID = ""; |
michael@0 | 74 | return correctCommandHandler; |
michael@0 | 75 | } |
michael@0 | 76 | } |
michael@0 | 77 | |
michael@0 | 78 | var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; |
michael@0 | 79 | |
michael@0 | 80 | function createXULMenuPopup() { |
michael@0 | 81 | return document.createElementNS(XUL_NS, "menupopup"); |
michael@0 | 82 | } |
michael@0 | 83 | |
michael@0 | 84 | function createXULMenu(aLabel) { |
michael@0 | 85 | var item = document.createElementNS(XUL_NS, "menu"); |
michael@0 | 86 | item.setAttribute("label", aLabel); |
michael@0 | 87 | return item; |
michael@0 | 88 | } |
michael@0 | 89 | |
michael@0 | 90 | function createXULMenuItem(aLabel, aCommandId) { |
michael@0 | 91 | var item = document.createElementNS(XUL_NS, "menuitem"); |
michael@0 | 92 | item.setAttribute("label", aLabel); |
michael@0 | 93 | item.setAttribute("command", aCommandId); |
michael@0 | 94 | return item; |
michael@0 | 95 | } |
michael@0 | 96 | |
michael@0 | 97 | function runBaseMenuTests(menu) { |
michael@0 | 98 | menu.forceUpdateNativeMenuAt("0|3"); |
michael@0 | 99 | return testItem(menu, "0|0", "cmd_FooItem0") && |
michael@0 | 100 | testItem(menu, "0|1", "cmd_FooItem1") && |
michael@0 | 101 | testItem(menu, "0|3|0", "cmd_BarItem0") && |
michael@0 | 102 | testItem(menu, "0|3|1", "cmd_BarItem1"); |
michael@0 | 103 | } |
michael@0 | 104 | |
michael@0 | 105 | function onLoad() { |
michael@0 | 106 | var _delayedOnLoad = function() { |
michael@0 | 107 | var Cc = Components.classes; |
michael@0 | 108 | var Ci = Components.interfaces; |
michael@0 | 109 | |
michael@0 | 110 | var menuNode = document.getElementById("standalonenativemenu"); |
michael@0 | 111 | var menu; |
michael@0 | 112 | try { |
michael@0 | 113 | menu = Cc["@mozilla.org/widget/standalonenativemenu;1"].createInstance(Ci.nsIStandaloneNativeMenu); |
michael@0 | 114 | menu.init(menuNode); |
michael@0 | 115 | } catch (e) { |
michael@0 | 116 | ok(false, "Create nsIStandaloneNativeMenu instance"); |
michael@0 | 117 | onTestsFinished(); |
michael@0 | 118 | return; |
michael@0 | 119 | } |
michael@0 | 120 | |
michael@0 | 121 | // First let's run the base menu tests. |
michael@0 | 122 | ok(runBaseMenuTests(menu), "base tests #1"); |
michael@0 | 123 | |
michael@0 | 124 | // Set up some nodes that we'll use. |
michael@0 | 125 | //var menubarNode = document.getElementById("nativemenubar"); |
michael@0 | 126 | var newMenu0 = createXULMenu("NewMenu0"); |
michael@0 | 127 | var newMenu1 = createXULMenu("NewMenu1"); |
michael@0 | 128 | var newMenuPopup0 = createXULMenuPopup(); |
michael@0 | 129 | var newMenuPopup1 = createXULMenuPopup(); |
michael@0 | 130 | var newMenuItem0 = createXULMenuItem("NewMenuItem0", "cmd_NewItem0"); |
michael@0 | 131 | var newMenuItem1 = createXULMenuItem("NewMenuItem1", "cmd_NewItem1"); |
michael@0 | 132 | var newMenuItem2 = createXULMenuItem("NewMenuItem2", "cmd_NewItem2"); |
michael@0 | 133 | var newMenuItem3 = createXULMenuItem("NewMenuItem3", "cmd_NewItem3"); |
michael@0 | 134 | var newMenuItem4 = createXULMenuItem("NewMenuItem4", "cmd_NewItem4"); |
michael@0 | 135 | var newMenuItem5 = createXULMenuItem("NewMenuItem5", "cmd_NewItem5"); |
michael@0 | 136 | |
michael@0 | 137 | // Create another submenu with hierarchy via DOM manipulation. |
michael@0 | 138 | // ****************** |
michael@0 | 139 | // * Foo * NewMenu0 * <- Menu bar |
michael@0 | 140 | // ****************** |
michael@0 | 141 | // **************** |
michael@0 | 142 | // * NewMenuItem0 * <- NewMenu0 submenu |
michael@0 | 143 | // **************** |
michael@0 | 144 | // * NewMenuItem1 * |
michael@0 | 145 | // **************** |
michael@0 | 146 | // * NewMenuItem2 * |
michael@0 | 147 | // ******************************* |
michael@0 | 148 | // * NewMenu1 > * NewMenuItem3 * <- NewMenu1 submenu |
michael@0 | 149 | // ******************************* |
michael@0 | 150 | // * NewMenuItem4 * |
michael@0 | 151 | // **************** |
michael@0 | 152 | // * NewMenuItem5 * |
michael@0 | 153 | // **************** |
michael@0 | 154 | newMenu0.appendChild(newMenuPopup0); |
michael@0 | 155 | newMenuPopup0.appendChild(newMenuItem0); |
michael@0 | 156 | newMenuPopup0.appendChild(newMenuItem1); |
michael@0 | 157 | newMenuPopup0.appendChild(newMenuItem2); |
michael@0 | 158 | newMenuPopup0.appendChild(newMenu1); |
michael@0 | 159 | newMenu1.appendChild(newMenuPopup1); |
michael@0 | 160 | newMenuPopup1.appendChild(newMenuItem3); |
michael@0 | 161 | newMenuPopup1.appendChild(newMenuItem4); |
michael@0 | 162 | newMenuPopup1.appendChild(newMenuItem5); |
michael@0 | 163 | //XXX - we have to append the menu to the top-level of the menu bar |
michael@0 | 164 | // only after constructing it. If we append before construction, it is |
michael@0 | 165 | // invalid because it has no children and we don't validate it if we add |
michael@0 | 166 | // children later. |
michael@0 | 167 | menuNode.appendChild(newMenu0); |
michael@0 | 168 | menu.forceUpdateNativeMenuAt("1|3"); |
michael@0 | 169 | // Run basic tests again. |
michael@0 | 170 | ok(runBaseMenuTests(menu), "base tests #2"); |
michael@0 | 171 | |
michael@0 | 172 | // Error strings. |
michael@0 | 173 | var sa = "Command handler(s) should have activated"; |
michael@0 | 174 | var sna = "Command handler(s) should not have activated"; |
michael@0 | 175 | |
michael@0 | 176 | // Test middle items. |
michael@0 | 177 | ok(testItem(menu, "1|1", "cmd_NewItem1"), "#1:" + sa); |
michael@0 | 178 | ok(testItem(menu, "1|3|1", "cmd_NewItem4"), "#2:" + sa); |
michael@0 | 179 | |
michael@0 | 180 | // Hide newMenu0. |
michael@0 | 181 | newMenu0.setAttribute("hidden", "true"); |
michael@0 | 182 | ok(runBaseMenuTests(menu), "base tests #3: " + sa); // the base menu should still be unhidden |
michael@0 | 183 | ok(!testItem(menu, "1|0", ""), "#3:" + sna); |
michael@0 | 184 | ok(!testItem(menu, "1|1", ""), "#4:" + sna); |
michael@0 | 185 | ok(!testItem(menu, "1|2", ""), "#5:" + sna); |
michael@0 | 186 | ok(!testItem(menu, "1|3|0", ""), "#6:" + sna); |
michael@0 | 187 | ok(!testItem(menu, "1|3|1", ""), "#7:" + sna); |
michael@0 | 188 | ok(!testItem(menu, "1|3|2", ""), "#8:" + sna); |
michael@0 | 189 | |
michael@0 | 190 | // Show newMenu0. |
michael@0 | 191 | newMenu0.setAttribute("hidden", "false"); |
michael@0 | 192 | menu.forceUpdateNativeMenuAt("1|3"); |
michael@0 | 193 | ok(runBaseMenuTests(menu), "base tests #4:" + sa); |
michael@0 | 194 | ok(testItem(menu, "1|0", "cmd_NewItem0"), "#9:" + sa); |
michael@0 | 195 | ok(testItem(menu, "1|1", "cmd_NewItem1"), "#10:" + sa); |
michael@0 | 196 | ok(testItem(menu, "1|2", "cmd_NewItem2"), "#11:" + sa); |
michael@0 | 197 | ok(testItem(menu, "1|3|0", "cmd_NewItem3"), "#12:" + sa); |
michael@0 | 198 | ok(testItem(menu, "1|3|1", "cmd_NewItem4"), "#13:" + sa); |
michael@0 | 199 | ok(testItem(menu, "1|3|2", "cmd_NewItem5"), "#14:" + sa); |
michael@0 | 200 | |
michael@0 | 201 | // Hide items. |
michael@0 | 202 | newMenuItem1.setAttribute("hidden", "true"); |
michael@0 | 203 | newMenuItem4.setAttribute("hidden", "true"); |
michael@0 | 204 | menu.forceUpdateNativeMenuAt("1|2"); |
michael@0 | 205 | ok(runBaseMenuTests(menu), "base tests #5:" + sa); |
michael@0 | 206 | ok(testItem(menu, "1|0", "cmd_NewItem0"), "#15:" + sa); |
michael@0 | 207 | ok(testItem(menu, "1|1", "cmd_NewItem2"), "#16:" + sa); |
michael@0 | 208 | ok(!testItem(menu, "1|2", ""), "#17:" + sna); |
michael@0 | 209 | ok(testItem(menu, "1|2|0", "cmd_NewItem3"), "#18:" + sa); |
michael@0 | 210 | ok(testItem(menu, "1|2|1", "cmd_NewItem5"), "#19:" + sa); |
michael@0 | 211 | ok(!testItem(menu, "1|2|2", ""), "#20:" + sna); |
michael@0 | 212 | |
michael@0 | 213 | // Show items. |
michael@0 | 214 | newMenuItem1.setAttribute("hidden", "false"); |
michael@0 | 215 | newMenuItem4.setAttribute("hidden", "false"); |
michael@0 | 216 | //forceUpdateNativeMenuAt("1|3"); |
michael@0 | 217 | ok(runBaseMenuTests(menu), "base tests #6:" + sa); |
michael@0 | 218 | ok(testItem(menu, "1|0", "cmd_NewItem0"), "#21:" + sa); |
michael@0 | 219 | ok(testItem(menu, "1|1", "cmd_NewItem1"), "#22:" + sa); |
michael@0 | 220 | ok(testItem(menu, "1|2", "cmd_NewItem2"), "#23:" + sa); |
michael@0 | 221 | ok(testItem(menu, "1|3|0", "cmd_NewItem3"), "#24:" + sa); |
michael@0 | 222 | ok(testItem(menu, "1|3|1", "cmd_NewItem4"), "#25:" + sa); |
michael@0 | 223 | ok(testItem(menu, "1|3|2", "cmd_NewItem5"), "#26:" + sa); |
michael@0 | 224 | |
michael@0 | 225 | // At this point in the tests the state of the menus has been returned |
michael@0 | 226 | // to the originally diagramed state. |
michael@0 | 227 | |
michael@0 | 228 | // Remove menu. |
michael@0 | 229 | menuNode.removeChild(newMenu0); |
michael@0 | 230 | ok(runBaseMenuTests(menu), "base tests #7:" + sa); |
michael@0 | 231 | ok(!testItem(menu, "1|0", ""), "#27:" + sna); |
michael@0 | 232 | ok(!testItem(menu, "1|1", ""), "#28:" + sna); |
michael@0 | 233 | ok(!testItem(menu, "1|2", ""), "#29:" + sna); |
michael@0 | 234 | ok(!testItem(menu, "1|3|0", ""), "#30:" + sna); |
michael@0 | 235 | ok(!testItem(menu, "1|3|1", ""), "#31:" + sna); |
michael@0 | 236 | ok(!testItem(menu, "1|3|2", ""), "#32:" + sna); |
michael@0 | 237 | // return state to original diagramed state |
michael@0 | 238 | menuNode.appendChild(newMenu0); |
michael@0 | 239 | |
michael@0 | 240 | // Test for bug 447042, make sure that adding a menu node with no children |
michael@0 | 241 | // to the menu bar and then adding another menu node with children works. |
michael@0 | 242 | // Menus with no children don't get their native menu items shown and that |
michael@0 | 243 | // caused internal arrays to get out of sync and an append crashed. |
michael@0 | 244 | var tmpMenu0 = createXULMenu("tmpMenu0"); |
michael@0 | 245 | menuNode.removeChild(newMenu0); |
michael@0 | 246 | menuNode.appendChild(tmpMenu0); |
michael@0 | 247 | menuNode.appendChild(newMenu0); |
michael@0 | 248 | menu.forceUpdateNativeMenuAt("1|3"); |
michael@0 | 249 | //todo(runBaseMenuTests(menu), "base tests #8"); |
michael@0 | 250 | todo(testItem(menu, "1|0", "cmd_NewItem0"), "#33:" +sa); |
michael@0 | 251 | todo(testItem(menu, "1|1", "cmd_NewItem1"), "#34:" +sa); |
michael@0 | 252 | todo(testItem(menu, "1|2", "cmd_NewItem2"), "#35:" +sa); |
michael@0 | 253 | todo(testItem(menu, "1|3|0", "cmd_NewItem3"), "#36:" +sa); |
michael@0 | 254 | todo(testItem(menu, "1|3|1", "cmd_NewItem4"), "#37:" +sa); |
michael@0 | 255 | todo(testItem(menu, "1|3|2", "cmd_NewItem5"), "#38:" +sa); |
michael@0 | 256 | // return state to original diagramed state |
michael@0 | 257 | menuNode.removeChild(tmpMenu0); |
michael@0 | 258 | delete tmpMenu0; |
michael@0 | 259 | |
michael@0 | 260 | // This test is basically a crash test for bug 433858. |
michael@0 | 261 | newMenuItem1.setAttribute("hidden", "true"); |
michael@0 | 262 | newMenuItem2.setAttribute("hidden", "true"); |
michael@0 | 263 | newMenu1.setAttribute("hidden", "true"); |
michael@0 | 264 | menu.forceUpdateNativeMenuAt("1"); |
michael@0 | 265 | newMenuItem1.setAttribute("hidden", "false"); |
michael@0 | 266 | newMenuItem2.setAttribute("hidden", "false"); |
michael@0 | 267 | newMenu1.setAttribute("hidden", "false"); |
michael@0 | 268 | menu.forceUpdateNativeMenuAt("1"); |
michael@0 | 269 | |
michael@0 | 270 | onTestsFinished(); |
michael@0 | 271 | } |
michael@0 | 272 | |
michael@0 | 273 | setTimeout(_delayedOnLoad, 1000); |
michael@0 | 274 | } |
michael@0 | 275 | |
michael@0 | 276 | ]]></script> |
michael@0 | 277 | </window> |