The change in CanonicalBrowsingContext.cpp was provided by Nika. Differential Revision: https://phabricator.services.mozilla.com/D270799
113 lines
3.2 KiB
JavaScript
113 lines
3.2 KiB
JavaScript
"use strict";
|
|
|
|
// Test browsing-context-active-change notification which is fired on the parent process
|
|
// to know when a BrowsingContext becomes visible/hidden.
|
|
|
|
function observeTopic(aTopic) {
|
|
return new Promise(resolve => {
|
|
function observer(subject, topic) {
|
|
is(topic, aTopic, "observing correct topic");
|
|
ok(
|
|
BrowsingContext.isInstance(subject),
|
|
"subject to be a BrowsingContext"
|
|
);
|
|
Services.obs.removeObserver(observer, aTopic);
|
|
resolve();
|
|
}
|
|
|
|
Services.obs.addObserver(observer, aTopic);
|
|
});
|
|
}
|
|
|
|
function waitForActiveChange() {
|
|
return observeTopic("browsing-context-active-change");
|
|
}
|
|
|
|
function waitForAttached() {
|
|
return observeTopic("browsing-context-attached");
|
|
}
|
|
|
|
add_task(async function () {
|
|
const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
|
|
const browser = tab.linkedBrowser;
|
|
|
|
let onActiveChange = waitForActiveChange();
|
|
browser.docShellIsActive = false;
|
|
await onActiveChange;
|
|
is(
|
|
browser.browsingContext.isActive,
|
|
false,
|
|
"The browsing context is no longer active"
|
|
);
|
|
|
|
onActiveChange = waitForActiveChange();
|
|
browser.docShellIsActive = true;
|
|
await onActiveChange;
|
|
is(
|
|
browser.browsingContext.isActive,
|
|
true,
|
|
"The browsing context is active again"
|
|
);
|
|
|
|
BrowserTestUtils.removeTab(tab);
|
|
});
|
|
|
|
// Tests that BrowsingContext.isActive becomes false in BF cache.
|
|
add_task(async function () {
|
|
const TEST_PATH1 =
|
|
getRootDirectory(gTestPath).replace(
|
|
"chrome://mochitests/content",
|
|
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
|
"http://example.com"
|
|
) + "dummy_page.html";
|
|
const TEST_PATH2 =
|
|
getRootDirectory(gTestPath).replace(
|
|
"chrome://mochitests/content",
|
|
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
|
|
"http://example.com"
|
|
) + "dummy_iframe_page.html";
|
|
|
|
let attached = waitForActiveChange();
|
|
const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_PATH1);
|
|
await attached;
|
|
|
|
const firstBC = tab.linkedBrowser.browsingContext;
|
|
is(firstBC.isActive, true, "The first browsing context is now active");
|
|
is(firstBC.currentURI.spec, TEST_PATH1);
|
|
|
|
// Load a new page now.
|
|
let stoppedLoadingPromise = BrowserTestUtils.browserStopped(
|
|
tab.linkedBrowser,
|
|
TEST_PATH2
|
|
);
|
|
await loadURI(TEST_PATH2);
|
|
await stoppedLoadingPromise;
|
|
const secondBC = tab.linkedBrowser.browsingContext;
|
|
await TestUtils.waitForCondition(() => secondBC.isActive);
|
|
|
|
isnot(firstBC, secondBC);
|
|
|
|
is(secondBC.isActive, true, "The second browsing context is now active");
|
|
is(secondBC.currentURI.spec, TEST_PATH2);
|
|
is(firstBC.isActive, false, "The first browsing context is no longer active");
|
|
is(firstBC.currentURI.spec, TEST_PATH1);
|
|
|
|
// Now try to back to the previous page, unlike above cases we don't wait
|
|
// "browsing-context-active-change" since it's not notified on this history back.
|
|
stoppedLoadingPromise = BrowserTestUtils.browserStopped(
|
|
tab.linkedBrowser,
|
|
TEST_PATH1
|
|
);
|
|
gBrowser.goBack();
|
|
await stoppedLoadingPromise;
|
|
|
|
is(
|
|
secondBC.isActive,
|
|
false,
|
|
"The second browsing context is no longer active"
|
|
);
|
|
is(firstBC.isActive, true, "The first browsing context is active again");
|
|
|
|
BrowserTestUtils.removeTab(tab);
|
|
});
|