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