forked from mirrors/gecko-dev
And have it mirror in the parent process more automatically. The docShellIsActive setter in the browser-custom-element side needs to be there rather than in the usual DidSet() calls because the AsyncTabSwitcher code relies on getting an exact amount of notifications as response to that specific setter. Not pretty, but... BrowserChild no longer sets IsActive() on the docshell itself for OOP iframes. This fixes bug 1679521. PresShell activeness is used to throttle rAF as well, which handles OOP iframes nicely as well. Differential Revision: https://phabricator.services.mozilla.com/D96072
267 lines
8.1 KiB
JavaScript
267 lines
8.1 KiB
JavaScript
// Test for bug 343515 - Need API for tabbrowsers to tell docshells they're visible/hidden
|
|
|
|
// Globals
|
|
var testPath = "http://mochi.test:8888/browser/docshell/test/navigation/";
|
|
var ctx = {};
|
|
|
|
add_task(async function() {
|
|
// Step 1.
|
|
|
|
// Get a handle on the initial tab
|
|
ctx.tab0 = gBrowser.selectedTab;
|
|
ctx.tab0Browser = gBrowser.getBrowserForTab(ctx.tab0);
|
|
|
|
await BrowserTestUtils.waitForCondition(
|
|
() => ctx.tab0Browser.docShellIsActive,
|
|
"Timed out waiting for initial tab to be active."
|
|
);
|
|
|
|
// Open a New Tab
|
|
ctx.tab1 = BrowserTestUtils.addTab(gBrowser, testPath + "bug343515_pg1.html");
|
|
ctx.tab1Browser = gBrowser.getBrowserForTab(ctx.tab1);
|
|
await BrowserTestUtils.browserLoaded(ctx.tab1Browser);
|
|
|
|
// Step 2.
|
|
is(
|
|
testPath + "bug343515_pg1.html",
|
|
ctx.tab1Browser.currentURI.spec,
|
|
"Got expected tab 1 url in step 2"
|
|
);
|
|
|
|
// Our current tab should still be active
|
|
ok(ctx.tab0Browser.docShellIsActive, "Tab 0 should still be active");
|
|
ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should not be active");
|
|
|
|
// Switch to tab 1
|
|
await BrowserTestUtils.switchTab(gBrowser, ctx.tab1);
|
|
|
|
// Tab 1 should now be active
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
|
|
|
|
// Open another tab
|
|
ctx.tab2 = BrowserTestUtils.addTab(gBrowser, testPath + "bug343515_pg2.html");
|
|
ctx.tab2Browser = gBrowser.getBrowserForTab(ctx.tab2);
|
|
|
|
await BrowserTestUtils.browserLoaded(ctx.tab2Browser);
|
|
|
|
// Step 3.
|
|
is(
|
|
testPath + "bug343515_pg2.html",
|
|
ctx.tab2Browser.currentURI.spec,
|
|
"Got expected tab 2 url in step 3"
|
|
);
|
|
|
|
// Tab 0 should be inactive, Tab 1 should be active
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
|
|
|
|
// Tab 2's window _and_ its iframes should be inactive
|
|
ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
|
|
|
|
await SpecialPowers.spawn(ctx.tab2Browser, [], async function() {
|
|
Assert.equal(content.frames.length, 2, "Tab 2 should have 2 iframes");
|
|
for (var i = 0; i < content.frames.length; i++) {
|
|
info("step 3, frame " + i + " info: " + content.frames[i].location);
|
|
let bc = content.frames[i].browsingContext;
|
|
Assert.ok(!bc.isActive, `Tab2 iframe ${i} should be inactive`);
|
|
}
|
|
});
|
|
|
|
// Navigate tab 2 to a different page
|
|
BrowserTestUtils.loadURI(ctx.tab2Browser, testPath + "bug343515_pg3.html");
|
|
|
|
await BrowserTestUtils.browserLoaded(ctx.tab2Browser);
|
|
|
|
// Step 4.
|
|
|
|
async function checkTab2Active(outerExpected) {
|
|
await SpecialPowers.spawn(ctx.tab2Browser, [outerExpected], async function(
|
|
expected
|
|
) {
|
|
function isActive(aWindow) {
|
|
var docshell = aWindow.docShell;
|
|
info(`checking ${docshell.browsingContext.id}`);
|
|
return docshell.browsingContext.isActive;
|
|
}
|
|
|
|
let active = expected ? "active" : "inactive";
|
|
Assert.equal(content.frames.length, 2, "Tab 2 should have 2 iframes");
|
|
for (var i = 0; i < content.frames.length; i++) {
|
|
info("step 4, frame " + i + " info: " + content.frames[i].location);
|
|
}
|
|
Assert.equal(
|
|
content.frames[0].frames.length,
|
|
1,
|
|
"Tab 2 iframe 0 should have 1 iframes"
|
|
);
|
|
Assert.equal(
|
|
isActive(content.frames[0]),
|
|
expected,
|
|
`Tab2 iframe 0 should be ${active}`
|
|
);
|
|
Assert.equal(
|
|
isActive(content.frames[0].frames[0]),
|
|
expected,
|
|
`Tab2 iframe 0 subiframe 0 should be ${active}`
|
|
);
|
|
Assert.equal(
|
|
isActive(content.frames[1]),
|
|
expected,
|
|
`Tab2 iframe 1 should be ${active}`
|
|
);
|
|
});
|
|
}
|
|
|
|
is(
|
|
testPath + "bug343515_pg3.html",
|
|
ctx.tab2Browser.currentURI.spec,
|
|
"Got expected tab 2 url in step 4"
|
|
);
|
|
|
|
// Tab 0 should be inactive, Tab 1 should be active
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
|
|
|
|
// Tab2 and all descendants should be inactive
|
|
await checkTab2Active(false);
|
|
|
|
// Switch to Tab 2
|
|
await BrowserTestUtils.switchTab(gBrowser, ctx.tab2);
|
|
|
|
// Check everything
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should be inactive");
|
|
ok(ctx.tab2Browser.docShellIsActive, "Tab 2 should be active");
|
|
|
|
await checkTab2Active(true);
|
|
|
|
// Go back
|
|
let backDone = BrowserTestUtils.waitForContentEvent(
|
|
ctx.tab2Browser,
|
|
"pageshow"
|
|
);
|
|
ctx.tab2Browser.goBack();
|
|
await backDone;
|
|
|
|
// Step 5.
|
|
|
|
// Check everything
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(!ctx.tab1Browser.docShellIsActive, "Tab 1 should be inactive");
|
|
ok(ctx.tab2Browser.docShellIsActive, "Tab 2 should be active");
|
|
is(
|
|
testPath + "bug343515_pg2.html",
|
|
ctx.tab2Browser.currentURI.spec,
|
|
"Got expected tab 2 url in step 5"
|
|
);
|
|
|
|
await SpecialPowers.spawn(ctx.tab2Browser, [], async function() {
|
|
for (var i = 0; i < content.frames.length; i++) {
|
|
let bc = content.frames[i].browsingContext;
|
|
Assert.ok(bc.isActive, `Tab2 iframe ${i} should be active`);
|
|
}
|
|
});
|
|
|
|
// Switch to tab 1
|
|
await BrowserTestUtils.switchTab(gBrowser, ctx.tab1);
|
|
|
|
// Navigate to page 3
|
|
BrowserTestUtils.loadURI(ctx.tab1Browser, testPath + "bug343515_pg3.html");
|
|
|
|
await BrowserTestUtils.browserLoaded(ctx.tab1Browser);
|
|
|
|
// Step 6.
|
|
|
|
// Check everything
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
|
|
is(
|
|
testPath + "bug343515_pg3.html",
|
|
ctx.tab1Browser.currentURI.spec,
|
|
"Got expected tab 1 url in step 6"
|
|
);
|
|
|
|
await SpecialPowers.spawn(ctx.tab1Browser, [], async function() {
|
|
function isActive(aWindow) {
|
|
var docshell = aWindow.docShell;
|
|
info(`checking ${docshell.browsingContext.id}`);
|
|
return docshell.browsingContext.isActive;
|
|
}
|
|
|
|
Assert.ok(isActive(content.frames[0]), "Tab1 iframe 0 should be active");
|
|
Assert.ok(
|
|
isActive(content.frames[0].frames[0]),
|
|
"Tab1 iframe 0 subiframe 0 should be active"
|
|
);
|
|
Assert.ok(isActive(content.frames[1]), "Tab1 iframe 1 should be active");
|
|
});
|
|
|
|
ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
|
|
|
|
await SpecialPowers.spawn(ctx.tab2Browser, [], async function() {
|
|
for (var i = 0; i < content.frames.length; i++) {
|
|
let bc = content.frames[i].browsingContext;
|
|
Assert.ok(!bc.isActive, `Tab2 iframe ${i} should be inactive`);
|
|
}
|
|
});
|
|
|
|
// Go forward on tab 2
|
|
let forwardDone = BrowserTestUtils.waitForContentEvent(
|
|
ctx.tab2Browser,
|
|
"pageshow"
|
|
);
|
|
ctx.tab2Browser.goForward();
|
|
await forwardDone;
|
|
|
|
// Step 7.
|
|
|
|
async function checkBrowser(browser, outerTabNum, outerActive) {
|
|
let data = { tabNum: outerTabNum, active: outerActive };
|
|
await SpecialPowers.spawn(browser, [data], async function({
|
|
tabNum,
|
|
active,
|
|
}) {
|
|
function isActive(aWindow) {
|
|
var docshell = aWindow.docShell;
|
|
info(`checking ${docshell.browsingContext.id}`);
|
|
return docshell.browsingContext.isActive;
|
|
}
|
|
|
|
let activestr = active ? "active" : "inactive";
|
|
Assert.equal(
|
|
isActive(content.frames[0]),
|
|
active,
|
|
`Tab${tabNum} iframe 0 should be ${activestr}`
|
|
);
|
|
Assert.equal(
|
|
isActive(content.frames[0].frames[0]),
|
|
active,
|
|
`Tab${tabNum} iframe 0 subiframe 0 should be ${activestr}`
|
|
);
|
|
Assert.equal(
|
|
isActive(content.frames[1]),
|
|
active,
|
|
`Tab${tabNum} iframe 1 should be ${activestr}`
|
|
);
|
|
});
|
|
}
|
|
|
|
// Check everything
|
|
ok(!ctx.tab0Browser.docShellIsActive, "Tab 0 should be inactive");
|
|
ok(ctx.tab1Browser.docShellIsActive, "Tab 1 should be active");
|
|
is(
|
|
testPath + "bug343515_pg3.html",
|
|
ctx.tab2Browser.currentURI.spec,
|
|
"Got expected tab 2 url in step 7"
|
|
);
|
|
|
|
await checkBrowser(ctx.tab1Browser, 1, true);
|
|
|
|
ok(!ctx.tab2Browser.docShellIsActive, "Tab 2 should be inactive");
|
|
await checkBrowser(ctx.tab2Browser, 2, false);
|
|
|
|
// Close the tabs we made
|
|
BrowserTestUtils.removeTab(ctx.tab1);
|
|
BrowserTestUtils.removeTab(ctx.tab2);
|
|
});
|