1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/debugger/test/browser_dbg_multiple-windows.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,176 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +/** 1.8 + * Make sure that the debugger attaches to the right tab when multiple windows 1.9 + * are open. 1.10 + */ 1.11 + 1.12 +const TAB1_URL = EXAMPLE_URL + "doc_script-switching-01.html"; 1.13 +const TAB2_URL = EXAMPLE_URL + "doc_script-switching-02.html"; 1.14 + 1.15 +let gNewTab, gNewWindow; 1.16 +let gClient; 1.17 + 1.18 +function test() { 1.19 + if (!DebuggerServer.initialized) { 1.20 + DebuggerServer.init(() => true); 1.21 + DebuggerServer.addBrowserActors(); 1.22 + } 1.23 + 1.24 + let transport = DebuggerServer.connectPipe(); 1.25 + gClient = new DebuggerClient(transport); 1.26 + gClient.connect((aType, aTraits) => { 1.27 + is(aType, "browser", 1.28 + "Root actor should identify itself as a browser."); 1.29 + 1.30 + promise.resolve(null) 1.31 + .then(() => addTab(TAB1_URL)) 1.32 + .then(testFirstTab) 1.33 + .then(() => addWindow(TAB2_URL)) 1.34 + .then(testNewWindow) 1.35 + .then(testFocusFirst) 1.36 + .then(testRemoveTab) 1.37 + .then(closeConnection) 1.38 + .then(finish) 1.39 + .then(null, aError => { 1.40 + ok(false, "Got an error: " + aError.message + "\n" + aError.stack); 1.41 + }); 1.42 + }); 1.43 +} 1.44 + 1.45 +function testFirstTab(aTab) { 1.46 + let deferred = promise.defer(); 1.47 + 1.48 + gNewTab = aTab; 1.49 + ok(!!gNewTab, "Second tab created."); 1.50 + 1.51 + gClient.listTabs(aResponse => { 1.52 + let tabActor = aResponse.tabs.filter(aGrip => aGrip.url == TAB1_URL).pop(); 1.53 + ok(tabActor, 1.54 + "Should find a tab actor for the first tab."); 1.55 + 1.56 + is(aResponse.selected, 1, 1.57 + "The first tab is selected."); 1.58 + 1.59 + deferred.resolve(); 1.60 + }); 1.61 + 1.62 + return deferred.promise; 1.63 +} 1.64 + 1.65 +function testNewWindow(aWindow) { 1.66 + let deferred = promise.defer(); 1.67 + 1.68 + gNewWindow = aWindow; 1.69 + ok(!!gNewWindow, "Second window created."); 1.70 + 1.71 + gNewWindow.focus(); 1.72 + 1.73 + let topWindow = Services.wm.getMostRecentWindow("navigator:browser"); 1.74 + is(topWindow, gNewWindow, 1.75 + "The second window is on top."); 1.76 + 1.77 + let isActive = promise.defer(); 1.78 + let isLoaded = promise.defer(); 1.79 + 1.80 + promise.all([isActive.promise, isLoaded.promise]).then(() => { 1.81 + gNewWindow.BrowserChromeTest.runWhenReady(() => { 1.82 + gClient.listTabs(aResponse => { 1.83 + is(aResponse.selected, 2, 1.84 + "The second tab is selected."); 1.85 + 1.86 + deferred.resolve(); 1.87 + }); 1.88 + }); 1.89 + }); 1.90 + 1.91 + let focusManager = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager); 1.92 + if (focusManager.activeWindow != gNewWindow) { 1.93 + gNewWindow.addEventListener("activate", function onActivate(aEvent) { 1.94 + if (aEvent.target != gNewWindow) { 1.95 + return; 1.96 + } 1.97 + gNewWindow.removeEventListener("activate", onActivate, true); 1.98 + isActive.resolve(); 1.99 + }, true); 1.100 + } else { 1.101 + isActive.resolve(); 1.102 + } 1.103 + 1.104 + let contentLocation = gNewWindow.content.location.href; 1.105 + if (contentLocation != TAB2_URL) { 1.106 + gNewWindow.document.addEventListener("load", function onLoad(aEvent) { 1.107 + if (aEvent.target.documentURI != TAB2_URL) { 1.108 + return; 1.109 + } 1.110 + gNewWindow.document.removeEventListener("load", onLoad, true); 1.111 + isLoaded.resolve(); 1.112 + }, true); 1.113 + } else { 1.114 + isLoaded.resolve(); 1.115 + } 1.116 + 1.117 + return deferred.promise; 1.118 +} 1.119 + 1.120 +function testFocusFirst() { 1.121 + let deferred = promise.defer(); 1.122 + 1.123 + once(window.content, "focus").then(() => { 1.124 + let topWindow = Services.wm.getMostRecentWindow("navigator:browser"); 1.125 + is(top, getDOMWindow(window), 1.126 + "The first window is on top."); 1.127 + 1.128 + gClient.listTabs(aResponse => { 1.129 + is(aResponse.selected, 1, 1.130 + "The first tab is selected after focusing on it."); 1.131 + 1.132 + deferred.resolve(); 1.133 + }); 1.134 + }); 1.135 + 1.136 + window.content.focus(); 1.137 + 1.138 + return deferred.promise; 1.139 +} 1.140 + 1.141 +function testRemoveTab() { 1.142 + let deferred = promise.defer(); 1.143 + 1.144 + gNewWindow.close(); 1.145 + 1.146 + // give it time to close 1.147 + executeSoon(function() { continue_remove_tab(deferred) }); 1.148 + return deferred.promise; 1.149 +} 1.150 + 1.151 +function continue_remove_tab(deferred) 1.152 +{ 1.153 + removeTab(gNewTab); 1.154 + 1.155 + gClient.listTabs(aResponse => { 1.156 + // Verify that tabs are no longer included in listTabs. 1.157 + let foundTab1 = aResponse.tabs.some(aGrip => aGrip.url == TAB1_URL); 1.158 + let foundTab2 = aResponse.tabs.some(aGrip => aGrip.url == TAB2_URL); 1.159 + ok(!foundTab1, "Tab1 should be gone."); 1.160 + ok(!foundTab2, "Tab2 should be gone."); 1.161 + 1.162 + is(aResponse.selected, 0, 1.163 + "The original tab is selected."); 1.164 + 1.165 + deferred.resolve(); 1.166 + }); 1.167 +} 1.168 + 1.169 +function closeConnection() { 1.170 + let deferred = promise.defer(); 1.171 + gClient.close(deferred.resolve); 1.172 + return deferred.promise; 1.173 +} 1.174 + 1.175 +registerCleanupFunction(function() { 1.176 + gNewTab = null; 1.177 + gNewWindow = null; 1.178 + gClient = null; 1.179 +});