michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Make sure that the debugger attaches to the right tab when multiple windows michael@0: * are open. michael@0: */ michael@0: michael@0: const TAB1_URL = EXAMPLE_URL + "doc_script-switching-01.html"; michael@0: const TAB2_URL = EXAMPLE_URL + "doc_script-switching-02.html"; michael@0: michael@0: let gNewTab, gNewWindow; michael@0: let gClient; michael@0: michael@0: function test() { michael@0: if (!DebuggerServer.initialized) { michael@0: DebuggerServer.init(() => true); michael@0: DebuggerServer.addBrowserActors(); michael@0: } michael@0: michael@0: let transport = DebuggerServer.connectPipe(); michael@0: gClient = new DebuggerClient(transport); michael@0: gClient.connect((aType, aTraits) => { michael@0: is(aType, "browser", michael@0: "Root actor should identify itself as a browser."); michael@0: michael@0: promise.resolve(null) michael@0: .then(() => addTab(TAB1_URL)) michael@0: .then(testFirstTab) michael@0: .then(() => addWindow(TAB2_URL)) michael@0: .then(testNewWindow) michael@0: .then(testFocusFirst) michael@0: .then(testRemoveTab) michael@0: .then(closeConnection) michael@0: .then(finish) michael@0: .then(null, aError => { michael@0: ok(false, "Got an error: " + aError.message + "\n" + aError.stack); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function testFirstTab(aTab) { michael@0: let deferred = promise.defer(); michael@0: michael@0: gNewTab = aTab; michael@0: ok(!!gNewTab, "Second tab created."); michael@0: michael@0: gClient.listTabs(aResponse => { michael@0: let tabActor = aResponse.tabs.filter(aGrip => aGrip.url == TAB1_URL).pop(); michael@0: ok(tabActor, michael@0: "Should find a tab actor for the first tab."); michael@0: michael@0: is(aResponse.selected, 1, michael@0: "The first tab is selected."); michael@0: michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function testNewWindow(aWindow) { michael@0: let deferred = promise.defer(); michael@0: michael@0: gNewWindow = aWindow; michael@0: ok(!!gNewWindow, "Second window created."); michael@0: michael@0: gNewWindow.focus(); michael@0: michael@0: let topWindow = Services.wm.getMostRecentWindow("navigator:browser"); michael@0: is(topWindow, gNewWindow, michael@0: "The second window is on top."); michael@0: michael@0: let isActive = promise.defer(); michael@0: let isLoaded = promise.defer(); michael@0: michael@0: promise.all([isActive.promise, isLoaded.promise]).then(() => { michael@0: gNewWindow.BrowserChromeTest.runWhenReady(() => { michael@0: gClient.listTabs(aResponse => { michael@0: is(aResponse.selected, 2, michael@0: "The second tab is selected."); michael@0: michael@0: deferred.resolve(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: let focusManager = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager); michael@0: if (focusManager.activeWindow != gNewWindow) { michael@0: gNewWindow.addEventListener("activate", function onActivate(aEvent) { michael@0: if (aEvent.target != gNewWindow) { michael@0: return; michael@0: } michael@0: gNewWindow.removeEventListener("activate", onActivate, true); michael@0: isActive.resolve(); michael@0: }, true); michael@0: } else { michael@0: isActive.resolve(); michael@0: } michael@0: michael@0: let contentLocation = gNewWindow.content.location.href; michael@0: if (contentLocation != TAB2_URL) { michael@0: gNewWindow.document.addEventListener("load", function onLoad(aEvent) { michael@0: if (aEvent.target.documentURI != TAB2_URL) { michael@0: return; michael@0: } michael@0: gNewWindow.document.removeEventListener("load", onLoad, true); michael@0: isLoaded.resolve(); michael@0: }, true); michael@0: } else { michael@0: isLoaded.resolve(); michael@0: } michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function testFocusFirst() { michael@0: let deferred = promise.defer(); michael@0: michael@0: once(window.content, "focus").then(() => { michael@0: let topWindow = Services.wm.getMostRecentWindow("navigator:browser"); michael@0: is(top, getDOMWindow(window), michael@0: "The first window is on top."); michael@0: michael@0: gClient.listTabs(aResponse => { michael@0: is(aResponse.selected, 1, michael@0: "The first tab is selected after focusing on it."); michael@0: michael@0: deferred.resolve(); michael@0: }); michael@0: }); michael@0: michael@0: window.content.focus(); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function testRemoveTab() { michael@0: let deferred = promise.defer(); michael@0: michael@0: gNewWindow.close(); michael@0: michael@0: // give it time to close michael@0: executeSoon(function() { continue_remove_tab(deferred) }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function continue_remove_tab(deferred) michael@0: { michael@0: removeTab(gNewTab); michael@0: michael@0: gClient.listTabs(aResponse => { michael@0: // Verify that tabs are no longer included in listTabs. michael@0: let foundTab1 = aResponse.tabs.some(aGrip => aGrip.url == TAB1_URL); michael@0: let foundTab2 = aResponse.tabs.some(aGrip => aGrip.url == TAB2_URL); michael@0: ok(!foundTab1, "Tab1 should be gone."); michael@0: ok(!foundTab2, "Tab2 should be gone."); michael@0: michael@0: is(aResponse.selected, 0, michael@0: "The original tab is selected."); michael@0: michael@0: deferred.resolve(); michael@0: }); michael@0: } michael@0: michael@0: function closeConnection() { michael@0: let deferred = promise.defer(); michael@0: gClient.close(deferred.resolve); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: registerCleanupFunction(function() { michael@0: gNewTab = null; michael@0: gNewWindow = null; michael@0: gClient = null; michael@0: });