зеркало из https://github.com/mozilla/gecko-dev.git
75 строки
2.4 KiB
JavaScript
75 строки
2.4 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
// Simple tab wrapper abstracting our messaging mechanism;
|
|
class KnownTab {
|
|
constructor(name, tab) {
|
|
this.name = name;
|
|
this.tab = tab;
|
|
}
|
|
|
|
cleanup() {
|
|
this.tab = null;
|
|
}
|
|
}
|
|
|
|
// Simple data structure class to help us track opened tabs and their pids.
|
|
class KnownTabs {
|
|
constructor() {
|
|
this.byPid = new Map();
|
|
this.byName = new Map();
|
|
}
|
|
|
|
cleanup() {
|
|
this.byPid = null;
|
|
this.byName = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Open our helper page in a tab in its own content process, asserting that it
|
|
* really is in its own process. We initially load and wait for about:blank to
|
|
* load, and only then loadURI to our actual page. This is to ensure that
|
|
* LocalStorageManager has had an opportunity to be created and populate
|
|
* mOriginsHavingData.
|
|
*
|
|
* (nsGlobalWindow will reliably create LocalStorageManager as a side-effect of
|
|
* the unconditional call to nsGlobalWindow::PreloadLocalStorage. This will
|
|
* reliably create the StorageDBChild instance, and its corresponding
|
|
* StorageDBParent will send the set of origins when it is constructed.)
|
|
*/
|
|
async function openTestTabInOwnProcess(helperPageUrl, name, knownTabs) {
|
|
let realUrl = helperPageUrl + "?" + encodeURIComponent(name);
|
|
// Load and wait for about:blank.
|
|
let tab = await BrowserTestUtils.openNewForegroundTab({
|
|
gBrowser,
|
|
opening: "about:blank",
|
|
forceNewProcess: true,
|
|
});
|
|
let pid = tab.linkedBrowser.frameLoader.remoteTab.osPid;
|
|
ok(!knownTabs.byName.has(name), "tab needs its own name: " + name);
|
|
ok(!knownTabs.byPid.has(pid), "tab needs to be in its own process: " + pid);
|
|
|
|
let knownTab = new KnownTab(name, tab);
|
|
knownTabs.byPid.set(pid, knownTab);
|
|
knownTabs.byName.set(name, knownTab);
|
|
|
|
// Now trigger the actual load of our page.
|
|
BrowserTestUtils.loadURI(tab.linkedBrowser, realUrl);
|
|
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
|
|
is(tab.linkedBrowser.frameLoader.remoteTab.osPid, pid, "still same pid");
|
|
return knownTab;
|
|
}
|
|
|
|
/**
|
|
* Close all the tabs we opened.
|
|
*/
|
|
async function cleanupTabs(knownTabs) {
|
|
for (let knownTab of knownTabs.byName.values()) {
|
|
BrowserTestUtils.removeTab(knownTab.tab);
|
|
knownTab.cleanup();
|
|
}
|
|
knownTabs.cleanup();
|
|
}
|