1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/framework/test/browser_toolbox_options.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,219 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +let doc = null, toolbox = null, panelWin = null, modifiedPrefs = []; 1.8 + 1.9 +function test() { 1.10 + waitForExplicitFinish(); 1.11 + 1.12 + const URL = "data:text/html;charset=utf8,test for dynamically registering and unregistering tools"; 1.13 + Task.spawn(function* () { 1.14 + let { target } = yield addTab(URL); 1.15 + let toolbox = yield gDevTools.showToolbox(target); 1.16 + yield testSelectTool(toolbox); 1.17 + yield testOptionsShortcut(); 1.18 + yield testOptions(); 1.19 + yield testToggleTools(); 1.20 + }).then(cleanup, errorHandler); 1.21 +} 1.22 + 1.23 +function testSelectTool(aToolbox) { 1.24 + let deferred = promise.defer(); 1.25 + 1.26 + toolbox = aToolbox; 1.27 + doc = toolbox.doc; 1.28 + toolbox.once("options-selected", () => { 1.29 + ok(true, "Toolbox selected via selectTool method"); 1.30 + deferred.resolve(); 1.31 + }); 1.32 + toolbox.selectTool("options"); 1.33 + 1.34 + return deferred.promise; 1.35 +} 1.36 + 1.37 +function testOptionsShortcut() { 1.38 + let deferred = promise.defer(); 1.39 + 1.40 + toolbox.selectTool("webconsole") 1.41 + .then(() => synthesizeKeyFromKeyTag("toolbox-options-key", doc)) 1.42 + .then(() => { 1.43 + ok(true, "Toolbox selected via shortcut key"); 1.44 + deferred.resolve(); 1.45 + }); 1.46 + 1.47 + return deferred.promise; 1.48 +} 1.49 + 1.50 +function testOptions() { 1.51 + let tool = toolbox.getPanel("options"); 1.52 + panelWin = tool.panelWin; 1.53 + let prefNodes = tool.panelDoc.querySelectorAll("checkbox[data-pref]"); 1.54 + 1.55 + // Store modified pref names so that they can be cleared on error. 1.56 + for (let node of prefNodes) { 1.57 + let pref = node.getAttribute("data-pref"); 1.58 + modifiedPrefs.push(pref); 1.59 + } 1.60 + 1.61 + // Test each options pref 1.62 + let p = promise.resolve(); 1.63 + for (let node of prefNodes) { 1.64 + let prefValue = Services.prefs.getBoolPref(node.getAttribute("data-pref")); 1.65 + p = p.then(testMouseClick.bind(null, node, prefValue)); 1.66 + } 1.67 + // Do again with opposite values to reset prefs 1.68 + for (let node of prefNodes) { 1.69 + let prefValue = !Services.prefs.getBoolPref(node.getAttribute("data-pref")); 1.70 + p = p.then(testMouseClick.bind(null, node, prefValue)); 1.71 + } 1.72 + 1.73 + return p; 1.74 +} 1.75 + 1.76 +function testMouseClick(node, prefValue) { 1.77 + let deferred = promise.defer(); 1.78 + 1.79 + let pref = node.getAttribute("data-pref"); 1.80 + gDevTools.once("pref-changed", (event, data) => { 1.81 + if (data.pref == pref) { 1.82 + ok(true, "Correct pref was changed"); 1.83 + is(data.oldValue, prefValue, "Previous value is correct"); 1.84 + is(data.newValue, !prefValue, "New value is correct"); 1.85 + } else { 1.86 + ok(false, "Pref " + pref + " was not changed correctly"); 1.87 + } 1.88 + deferred.resolve(); 1.89 + }); 1.90 + 1.91 + node.scrollIntoView(); 1.92 + 1.93 + // We use executeSoon here to ensure that the element is in view and 1.94 + // clickable. 1.95 + executeSoon(function() { 1.96 + info("Click event synthesized for pref " + pref); 1.97 + EventUtils.synthesizeMouseAtCenter(node, {}, panelWin); 1.98 + }); 1.99 + 1.100 + return deferred.promise; 1.101 +} 1.102 + 1.103 +function testToggleTools() { 1.104 + let toolNodes = panelWin.document.querySelectorAll("#default-tools-box > checkbox:not([unsupported])"); 1.105 + let enabledTools = Array.prototype.filter.call(toolNodes, node => node.checked); 1.106 + 1.107 + let toggleableTools = gDevTools.getDefaultTools().filter(tool => tool.visibilityswitch); 1.108 + for (let node of toolNodes) { 1.109 + let id = node.getAttribute("id"); 1.110 + ok (toggleableTools.some(tool => tool.id === id), 1.111 + "There should be a toggle checkbox for: " + id); 1.112 + } 1.113 + 1.114 + // Store modified pref names so that they can be cleared on error. 1.115 + for (let tool of toggleableTools) { 1.116 + let pref = tool.visibilityswitch; 1.117 + modifiedPrefs.push(pref); 1.118 + } 1.119 + 1.120 + // Toggle each tool 1.121 + let p = promise.resolve(); 1.122 + for (let node of toolNodes) { 1.123 + p = p.then(toggleTool.bind(null, node)); 1.124 + } 1.125 + // Toggle again to reset tool enablement state 1.126 + for (let node of toolNodes) { 1.127 + p = p.then(toggleTool.bind(null, node)); 1.128 + } 1.129 + 1.130 + // Test that a tool can still be added when no tabs are present: 1.131 + // Disable all tools 1.132 + for (let node of enabledTools) { 1.133 + p = p.then(toggleTool.bind(null, node)); 1.134 + } 1.135 + // Re-enable the tools which are enabled by default 1.136 + for (let node of enabledTools) { 1.137 + p = p.then(toggleTool.bind(null, node)); 1.138 + } 1.139 + 1.140 + // Toggle first, middle, and last tools to ensure that toolbox tabs are 1.141 + // inserted in order 1.142 + let firstTool = toolNodes[0], 1.143 + middleTool = toolNodes[(toolNodes.length / 2) | 0], 1.144 + lastTool = toolNodes[toolNodes.length - 1]; 1.145 + 1.146 + p = p.then(toggleTool.bind(null, firstTool)) 1.147 + .then(toggleTool.bind(null, firstTool)) 1.148 + .then(toggleTool.bind(null, middleTool)) 1.149 + .then(toggleTool.bind(null, middleTool)) 1.150 + .then(toggleTool.bind(null, lastTool)) 1.151 + .then(toggleTool.bind(null, lastTool)); 1.152 + 1.153 + return p; 1.154 +} 1.155 + 1.156 +function toggleTool(node) { 1.157 + let deferred = promise.defer(); 1.158 + 1.159 + let toolId = node.getAttribute("id"); 1.160 + if (node.checked) { 1.161 + gDevTools.once("tool-unregistered", checkUnregistered.bind(null, toolId, deferred)); 1.162 + } else { 1.163 + gDevTools.once("tool-registered", checkRegistered.bind(null, toolId, deferred)); 1.164 + } 1.165 + node.scrollIntoView(); 1.166 + EventUtils.synthesizeMouseAtCenter(node, {}, panelWin); 1.167 + 1.168 + return deferred.promise; 1.169 +} 1.170 + 1.171 +function checkUnregistered(toolId, deferred, event, data) { 1.172 + if (data.id == toolId) { 1.173 + ok(true, "Correct tool removed"); 1.174 + // checking tab on the toolbox 1.175 + ok(!doc.getElementById("toolbox-tab-" + toolId), "Tab removed for " + toolId); 1.176 + } else { 1.177 + ok(false, "Something went wrong, " + toolId + " was not unregistered"); 1.178 + } 1.179 + deferred.resolve(); 1.180 +} 1.181 + 1.182 +function checkRegistered(toolId, deferred, event, data) { 1.183 + if (data == toolId) { 1.184 + ok(true, "Correct tool added back"); 1.185 + // checking tab on the toolbox 1.186 + let radio = doc.getElementById("toolbox-tab-" + toolId); 1.187 + ok(radio, "Tab added back for " + toolId); 1.188 + if (radio.previousSibling) { 1.189 + ok(+radio.getAttribute("ordinal") >= 1.190 + +radio.previousSibling.getAttribute("ordinal"), 1.191 + "Inserted tab's ordinal is greater than equal to its previous tab." + 1.192 + "Expected " + radio.getAttribute("ordinal") + " >= " + 1.193 + radio.previousSibling.getAttribute("ordinal")); 1.194 + } 1.195 + if (radio.nextSibling) { 1.196 + ok(+radio.getAttribute("ordinal") < 1.197 + +radio.nextSibling.getAttribute("ordinal"), 1.198 + "Inserted tab's ordinal is less than its next tab. Expected " + 1.199 + radio.getAttribute("ordinal") + " < " + 1.200 + radio.nextSibling.getAttribute("ordinal")); 1.201 + } 1.202 + } else { 1.203 + ok(false, "Something went wrong, " + toolId + " was not registered"); 1.204 + } 1.205 + deferred.resolve(); 1.206 +} 1.207 + 1.208 +function cleanup() { 1.209 + toolbox.destroy().then(function() { 1.210 + gBrowser.removeCurrentTab(); 1.211 + for (let pref of modifiedPrefs) { 1.212 + Services.prefs.clearUserPref(pref); 1.213 + } 1.214 + toolbox = doc = panelWin = modifiedPrefs = null; 1.215 + finish(); 1.216 + }); 1.217 +} 1.218 + 1.219 +function errorHandler(error) { 1.220 + ok(false, "Unexpected error: " + error); 1.221 + cleanup(); 1.222 +}