fune/browser/base/content/test/general/browser_tabs_isActive.js
Emilio Cobos Álvarez 3987c781d0 Bug 1635914 - Move active flag handling explicitly to BrowsingContext. r=nika
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
2020-12-11 15:43:19 +00:00

235 lines
6.1 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable mozilla/no-arbitrary-setTimeout */
// Test for the docshell active state of local and remote browsers.
const kTestPage =
"http://example.org/browser/browser/base/content/test/general/dummy_page.html";
function promiseNewTabSwitched() {
return new Promise(resolve => {
gBrowser.addEventListener(
"TabSwitchDone",
function() {
executeSoon(resolve);
},
{ once: true }
);
});
}
function getParentTabState(aTab) {
return aTab.linkedBrowser.docShellIsActive;
}
function getChildTabState(aTab) {
return ContentTask.spawn(
aTab.linkedBrowser,
null,
() => content.browsingContext.isActive
);
}
function checkState(parentSide, childSide, value, message) {
is(parentSide, value, message + " (parent side)");
is(childSide, value, message + " (child side)");
}
function waitForMs(aMs) {
return new Promise(resolve => {
setTimeout(done, aMs);
function done() {
resolve(true);
}
});
}
add_task(async function() {
let url = kTestPage;
let originalTab = gBrowser.selectedTab; // test tab
let newTab = BrowserTestUtils.addTab(gBrowser, url, { skipAnimation: true });
let parentSide, childSide;
// new tab added but not selected checks
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
false,
"newly added " + url + " tab is not active"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(parentSide, childSide, true, "original tab is active initially");
// select the newly added tab and wait for TabSwitchDone event
let tabSwitchedPromise = promiseNewTabSwitched();
gBrowser.selectedTab = newTab;
await tabSwitchedPromise;
if (Services.appinfo.browserTabsRemoteAutostart) {
ok(
newTab.linkedBrowser.isRemoteBrowser,
"for testing we need a remote tab"
);
}
// check active state of both tabs
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
true,
"newly added " + url + " tab is active after selection"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(
parentSide,
childSide,
false,
"original tab is not active while unselected"
);
// switch back to the original test tab and wait for TabSwitchDone event
tabSwitchedPromise = promiseNewTabSwitched();
gBrowser.selectedTab = originalTab;
await tabSwitchedPromise;
// check active state of both tabs
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
false,
"newly added " + url + " tab is not active after switch back"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(
parentSide,
childSide,
true,
"original tab is active again after switch back"
);
// switch to the new tab and wait for TabSwitchDone event
tabSwitchedPromise = promiseNewTabSwitched();
gBrowser.selectedTab = newTab;
await tabSwitchedPromise;
// check active state of both tabs
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
true,
"newly added " + url + " tab is not active after switch back"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(
parentSide,
childSide,
false,
"original tab is active again after switch back"
);
gBrowser.removeTab(newTab);
});
add_task(async function() {
let url = "about:about";
let originalTab = gBrowser.selectedTab; // test tab
let newTab = BrowserTestUtils.addTab(gBrowser, url, { skipAnimation: true });
let parentSide, childSide;
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
false,
"newly added " + url + " tab is not active"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(parentSide, childSide, true, "original tab is active initially");
let tabSwitchedPromise = promiseNewTabSwitched();
gBrowser.selectedTab = newTab;
await tabSwitchedPromise;
if (Services.appinfo.browserTabsRemoteAutostart) {
ok(
!newTab.linkedBrowser.isRemoteBrowser,
"for testing we need a local tab"
);
}
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
true,
"newly added " + url + " tab is active after selection"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(
parentSide,
childSide,
false,
"original tab is not active while unselected"
);
tabSwitchedPromise = promiseNewTabSwitched();
gBrowser.selectedTab = originalTab;
await tabSwitchedPromise;
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
false,
"newly added " + url + " tab is not active after switch back"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(
parentSide,
childSide,
true,
"original tab is active again after switch back"
);
tabSwitchedPromise = promiseNewTabSwitched();
gBrowser.selectedTab = newTab;
await tabSwitchedPromise;
parentSide = getParentTabState(newTab);
childSide = await getChildTabState(newTab);
checkState(
parentSide,
childSide,
true,
"newly added " + url + " tab is not active after switch back"
);
parentSide = getParentTabState(originalTab);
childSide = await getChildTabState(originalTab);
checkState(
parentSide,
childSide,
false,
"original tab is active again after switch back"
);
gBrowser.removeTab(newTab);
});