|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 let doc = null, toolbox = null, panelWin = null, modifiedPrefs = []; |
|
5 |
|
6 function test() { |
|
7 waitForExplicitFinish(); |
|
8 |
|
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 } |
|
19 |
|
20 function testSelectTool(aToolbox) { |
|
21 let deferred = promise.defer(); |
|
22 |
|
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"); |
|
30 |
|
31 return deferred.promise; |
|
32 } |
|
33 |
|
34 function testOptionsShortcut() { |
|
35 let deferred = promise.defer(); |
|
36 |
|
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 }); |
|
43 |
|
44 return deferred.promise; |
|
45 } |
|
46 |
|
47 function testOptions() { |
|
48 let tool = toolbox.getPanel("options"); |
|
49 panelWin = tool.panelWin; |
|
50 let prefNodes = tool.panelDoc.querySelectorAll("checkbox[data-pref]"); |
|
51 |
|
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 } |
|
57 |
|
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 } |
|
69 |
|
70 return p; |
|
71 } |
|
72 |
|
73 function testMouseClick(node, prefValue) { |
|
74 let deferred = promise.defer(); |
|
75 |
|
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 }); |
|
87 |
|
88 node.scrollIntoView(); |
|
89 |
|
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 }); |
|
96 |
|
97 return deferred.promise; |
|
98 } |
|
99 |
|
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); |
|
103 |
|
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 } |
|
110 |
|
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 } |
|
116 |
|
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 } |
|
126 |
|
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 } |
|
136 |
|
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]; |
|
142 |
|
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)); |
|
149 |
|
150 return p; |
|
151 } |
|
152 |
|
153 function toggleTool(node) { |
|
154 let deferred = promise.defer(); |
|
155 |
|
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); |
|
164 |
|
165 return deferred.promise; |
|
166 } |
|
167 |
|
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 } |
|
178 |
|
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 } |
|
204 |
|
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 } |
|
215 |
|
216 function errorHandler(error) { |
|
217 ok(false, "Unexpected error: " + error); |
|
218 cleanup(); |
|
219 } |