Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
/**
* This tests the behaviour of moving pending tabs to a new window. These
* pending tabs have yet to be restored and should be restored upon opening
* in the new window. This test covers moving a single pending tab at once
* as well as multiple tabs at the same time (using tab multiselection).
*/
add_task(async function test_movePendingTabToNewWindow() {
const TEST_URIS = [
];
await SpecialPowers.pushPrefEnv({
set: [["browser.sessionstore.restore_on_demand", true]],
});
let state = {
windows: [
{
tabs: [
{ entries: [{ url: TEST_URIS[0], triggeringPrincipal_base64 }] },
{ entries: [{ url: TEST_URIS[1], triggeringPrincipal_base64 }] },
{ entries: [{ url: TEST_URIS[2], triggeringPrincipal_base64 }] },
{ entries: [{ url: TEST_URIS[3], triggeringPrincipal_base64 }] },
],
selected: 4,
},
],
};
await promiseBrowserState(state);
is(
gBrowser.visibleTabs.length,
4,
"Three tabs are visible to start the test"
);
let tabToSelect = gBrowser.visibleTabs[1];
ok(tabToSelect.hasAttribute("pending"), "Tab should be pending");
gBrowser.addRangeToMultiSelectedTabs(gBrowser.selectedTab, tabToSelect);
ok(!gBrowser.visibleTabs[0].multiselected, "First tab not multiselected");
ok(gBrowser.visibleTabs[1].multiselected, "Second tab multiselected");
ok(gBrowser.visibleTabs[2].multiselected, "Third tab multiselected");
ok(gBrowser.visibleTabs[3].multiselected, "Fourth tab multiselected");
let promiseNewWindow = BrowserTestUtils.waitForNewWindow();
gBrowser.replaceTabsWithWindow(tabToSelect);
info("Waiting for new window");
let newWindow = await promiseNewWindow;
isnot(newWindow, gBrowser.ownerGlobal, "Tab moved to new window");
let newWindowTabs = newWindow.gBrowser.visibleTabs;
await TestUtils.waitForCondition(() => {
return (
newWindowTabs.length == 3 &&
newWindowTabs[0].linkedBrowser.currentURI.spec == TEST_URIS[1] &&
newWindowTabs[1].linkedBrowser.currentURI.spec == TEST_URIS[2] &&
newWindowTabs[2].linkedBrowser.currentURI.spec == TEST_URIS[3]
);
}, "Wait for all three tabs to move to new window and load");
is(newWindowTabs.length, 3, "Three tabs should be in new window");
is(
newWindowTabs[0].linkedBrowser.currentURI.spec,
TEST_URIS[1],
"Second tab moved"
);
is(
newWindowTabs[1].linkedBrowser.currentURI.spec,
TEST_URIS[2],
"Third tab moved"
);
is(
newWindowTabs[2].linkedBrowser.currentURI.spec,
TEST_URIS[3],
"Fourth tab moved"
);
ok(
newWindowTabs[0].hasAttribute("pending"),
"First tab in new window should still be pending"
);
ok(
newWindowTabs[1].hasAttribute("pending"),
"Second tab in new window should still be pending"
);
newWindow.gBrowser.clearMultiSelectedTabs();
ok(
newWindowTabs.every(t => !t.multiselected),
"No multiselection should be present"
);
promiseNewWindow = BrowserTestUtils.waitForNewWindow();
newWindow.gBrowser.replaceTabsWithWindow(newWindowTabs[0]);
info("Waiting for second new window");
let secondNewWindow = await promiseNewWindow;
await TestUtils.waitForCondition(
() =>
secondNewWindow.gBrowser.selectedBrowser.currentURI.spec == TEST_URIS[1],
"Wait until the URI is updated"
);
is(
secondNewWindow.gBrowser.visibleTabs.length,
1,
"Only one tab in second new window"
);
is(
secondNewWindow.gBrowser.selectedBrowser.currentURI.spec,
TEST_URIS[1],
"First tab moved"
);
await BrowserTestUtils.closeWindow(secondNewWindow);
await BrowserTestUtils.closeWindow(newWindow);
});