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.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
4 let doc = null, toolbox = null, panelWin = null, modifiedPrefs = [];
6 function test() {
7 waitForExplicitFinish();
9 const URL = "data:text/html;charset=utf8,test for dynamically registering and unregistering tools";
10 Task.spawn(function* () {
11 let { target } = yield addTab(URL);
12 let toolbox = yield gDevTools.showToolbox(target);
13 yield testSelectTool(toolbox);
14 yield testOptionsShortcut();
15 yield testOptions();
16 yield testToggleTools();
17 }).then(cleanup, errorHandler);
18 }
20 function testSelectTool(aToolbox) {
21 let deferred = promise.defer();
23 toolbox = aToolbox;
24 doc = toolbox.doc;
25 toolbox.once("options-selected", () => {
26 ok(true, "Toolbox selected via selectTool method");
27 deferred.resolve();
28 });
29 toolbox.selectTool("options");
31 return deferred.promise;
32 }
34 function testOptionsShortcut() {
35 let deferred = promise.defer();
37 toolbox.selectTool("webconsole")
38 .then(() => synthesizeKeyFromKeyTag("toolbox-options-key", doc))
39 .then(() => {
40 ok(true, "Toolbox selected via shortcut key");
41 deferred.resolve();
42 });
44 return deferred.promise;
45 }
47 function testOptions() {
48 let tool = toolbox.getPanel("options");
49 panelWin = tool.panelWin;
50 let prefNodes = tool.panelDoc.querySelectorAll("checkbox[data-pref]");
52 // Store modified pref names so that they can be cleared on error.
53 for (let node of prefNodes) {
54 let pref = node.getAttribute("data-pref");
55 modifiedPrefs.push(pref);
56 }
58 // Test each options pref
59 let p = promise.resolve();
60 for (let node of prefNodes) {
61 let prefValue = Services.prefs.getBoolPref(node.getAttribute("data-pref"));
62 p = p.then(testMouseClick.bind(null, node, prefValue));
63 }
64 // Do again with opposite values to reset prefs
65 for (let node of prefNodes) {
66 let prefValue = !Services.prefs.getBoolPref(node.getAttribute("data-pref"));
67 p = p.then(testMouseClick.bind(null, node, prefValue));
68 }
70 return p;
71 }
73 function testMouseClick(node, prefValue) {
74 let deferred = promise.defer();
76 let pref = node.getAttribute("data-pref");
77 gDevTools.once("pref-changed", (event, data) => {
78 if (data.pref == pref) {
79 ok(true, "Correct pref was changed");
80 is(data.oldValue, prefValue, "Previous value is correct");
81 is(data.newValue, !prefValue, "New value is correct");
82 } else {
83 ok(false, "Pref " + pref + " was not changed correctly");
84 }
85 deferred.resolve();
86 });
88 node.scrollIntoView();
90 // We use executeSoon here to ensure that the element is in view and
91 // clickable.
92 executeSoon(function() {
93 info("Click event synthesized for pref " + pref);
94 EventUtils.synthesizeMouseAtCenter(node, {}, panelWin);
95 });
97 return deferred.promise;
98 }
100 function testToggleTools() {
101 let toolNodes = panelWin.document.querySelectorAll("#default-tools-box > checkbox:not([unsupported])");
102 let enabledTools = Array.prototype.filter.call(toolNodes, node => node.checked);
104 let toggleableTools = gDevTools.getDefaultTools().filter(tool => tool.visibilityswitch);
105 for (let node of toolNodes) {
106 let id = node.getAttribute("id");
107 ok (toggleableTools.some(tool => tool.id === id),
108 "There should be a toggle checkbox for: " + id);
109 }
111 // Store modified pref names so that they can be cleared on error.
112 for (let tool of toggleableTools) {
113 let pref = tool.visibilityswitch;
114 modifiedPrefs.push(pref);
115 }
117 // Toggle each tool
118 let p = promise.resolve();
119 for (let node of toolNodes) {
120 p = p.then(toggleTool.bind(null, node));
121 }
122 // Toggle again to reset tool enablement state
123 for (let node of toolNodes) {
124 p = p.then(toggleTool.bind(null, node));
125 }
127 // Test that a tool can still be added when no tabs are present:
128 // Disable all tools
129 for (let node of enabledTools) {
130 p = p.then(toggleTool.bind(null, node));
131 }
132 // Re-enable the tools which are enabled by default
133 for (let node of enabledTools) {
134 p = p.then(toggleTool.bind(null, node));
135 }
137 // Toggle first, middle, and last tools to ensure that toolbox tabs are
138 // inserted in order
139 let firstTool = toolNodes[0],
140 middleTool = toolNodes[(toolNodes.length / 2) | 0],
141 lastTool = toolNodes[toolNodes.length - 1];
143 p = p.then(toggleTool.bind(null, firstTool))
144 .then(toggleTool.bind(null, firstTool))
145 .then(toggleTool.bind(null, middleTool))
146 .then(toggleTool.bind(null, middleTool))
147 .then(toggleTool.bind(null, lastTool))
148 .then(toggleTool.bind(null, lastTool));
150 return p;
151 }
153 function toggleTool(node) {
154 let deferred = promise.defer();
156 let toolId = node.getAttribute("id");
157 if (node.checked) {
158 gDevTools.once("tool-unregistered", checkUnregistered.bind(null, toolId, deferred));
159 } else {
160 gDevTools.once("tool-registered", checkRegistered.bind(null, toolId, deferred));
161 }
162 node.scrollIntoView();
163 EventUtils.synthesizeMouseAtCenter(node, {}, panelWin);
165 return deferred.promise;
166 }
168 function checkUnregistered(toolId, deferred, event, data) {
169 if (data.id == toolId) {
170 ok(true, "Correct tool removed");
171 // checking tab on the toolbox
172 ok(!doc.getElementById("toolbox-tab-" + toolId), "Tab removed for " + toolId);
173 } else {
174 ok(false, "Something went wrong, " + toolId + " was not unregistered");
175 }
176 deferred.resolve();
177 }
179 function checkRegistered(toolId, deferred, event, data) {
180 if (data == toolId) {
181 ok(true, "Correct tool added back");
182 // checking tab on the toolbox
183 let radio = doc.getElementById("toolbox-tab-" + toolId);
184 ok(radio, "Tab added back for " + toolId);
185 if (radio.previousSibling) {
186 ok(+radio.getAttribute("ordinal") >=
187 +radio.previousSibling.getAttribute("ordinal"),
188 "Inserted tab's ordinal is greater than equal to its previous tab." +
189 "Expected " + radio.getAttribute("ordinal") + " >= " +
190 radio.previousSibling.getAttribute("ordinal"));
191 }
192 if (radio.nextSibling) {
193 ok(+radio.getAttribute("ordinal") <
194 +radio.nextSibling.getAttribute("ordinal"),
195 "Inserted tab's ordinal is less than its next tab. Expected " +
196 radio.getAttribute("ordinal") + " < " +
197 radio.nextSibling.getAttribute("ordinal"));
198 }
199 } else {
200 ok(false, "Something went wrong, " + toolId + " was not registered");
201 }
202 deferred.resolve();
203 }
205 function cleanup() {
206 toolbox.destroy().then(function() {
207 gBrowser.removeCurrentTab();
208 for (let pref of modifiedPrefs) {
209 Services.prefs.clearUserPref(pref);
210 }
211 toolbox = doc = panelWin = modifiedPrefs = null;
212 finish();
213 });
214 }
216 function errorHandler(error) {
217 ok(false, "Unexpected error: " + error);
218 cleanup();
219 }