fune/browser/base/content/test/tabs/browser_e10s_switchbrowser.js
Tom Ritter ff200aa350 Bug 1539595 - Create a separate content process type for privleged mozilla content r=nika,flod
Differential Revision: https://phabricator.services.mozilla.com/D30276

--HG--
rename : browser/base/content/test/general/browser_e10s_about_page_triggeringprincipal.js => browser/base/content/test/tabs/browser_e10s_about_page_triggeringprincipal.js
rename : browser/base/content/test/general/browser_e10s_about_process.js => browser/base/content/test/tabs/browser_e10s_about_process.js
rename : browser/base/content/test/general/browser_e10s_chrome_process.js => browser/base/content/test/tabs/browser_e10s_chrome_process.js
rename : browser/base/content/test/general/browser_e10s_javascript.js => browser/base/content/test/tabs/browser_e10s_javascript.js
rename : browser/base/content/test/general/browser_e10s_switchbrowser.js => browser/base/content/test/tabs/browser_e10s_switchbrowser.js
rename : browser/base/content/test/general/file_about_child.html => browser/base/content/test/tabs/file_about_child.html
rename : browser/base/content/test/general/file_about_parent.html => browser/base/content/test/tabs/file_about_parent.html
rename : browser/base/content/test/general/test_process_flags_chrome.html => browser/base/content/test/tabs/test_process_flags_chrome.html
extra : moz-landing-system : lando
2019-05-29 11:31:50 +00:00

274 lines
10 KiB
JavaScript

/* eslint-env mozilla/frame-script */
requestLongerTimeout(2);
const DUMMY_PATH = "browser/browser/base/content/test/general/dummy_page.html";
const gExpectedHistory = {
index: -1,
entries: [],
};
function get_remote_history(browser) {
function frame_script() {
let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
let sessionHistory = webNav.sessionHistory;
let result = {
index: sessionHistory.index,
entries: [],
};
for (let i = 0; i < sessionHistory.count; i++) {
let entry = sessionHistory.legacySHistory.getEntryAtIndex(i);
result.entries.push({
uri: entry.URI.spec,
title: entry.title,
});
}
sendAsyncMessage("Test:History", result);
}
return new Promise(resolve => {
browser.messageManager.addMessageListener("Test:History", function listener({data}) {
browser.messageManager.removeMessageListener("Test:History", listener);
resolve(data);
});
browser.messageManager.loadFrameScript("data:,(" + frame_script.toString() + ")();", true);
});
}
var check_history = async function() {
let sessionHistory = await get_remote_history(gBrowser.selectedBrowser);
let count = sessionHistory.entries.length;
is(count, gExpectedHistory.entries.length, "Should have the right number of history entries");
is(sessionHistory.index, gExpectedHistory.index, "Should have the right history index");
for (let i = 0; i < count; i++) {
let entry = sessionHistory.entries[i];
info("Checking History Entry: " + entry.uri);
is(entry.uri, gExpectedHistory.entries[i].uri, "Should have the right URI");
is(entry.title, gExpectedHistory.entries[i].title, "Should have the right title");
}
};
function clear_history() {
gExpectedHistory.index = -1;
gExpectedHistory.entries = [];
}
// Waits for a load and updates the known history
var waitForLoad = async function(uri) {
info("Loading " + uri);
// Longwinded but this ensures we don't just shortcut to LoadInNewProcess
let loadURIOptions = {
triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
};
gBrowser.selectedBrowser.webNavigation.loadURI(uri, loadURIOptions);
await BrowserTestUtils.browserStopped(gBrowser);
gExpectedHistory.index++;
gExpectedHistory.entries.push({
uri: gBrowser.currentURI.spec,
title: gBrowser.contentTitle,
});
};
// Waits for a load and updates the known history
var waitForLoadWithFlags = async function(uri, flags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE) {
info("Loading " + uri + " flags = " + flags);
gBrowser.selectedBrowser.loadURI(uri, {
flags,
triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
});
await BrowserTestUtils.browserStopped(gBrowser);
if (!(flags & Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY)) {
if (flags & Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY) {
gExpectedHistory.entries.pop();
} else {
gExpectedHistory.index++;
}
gExpectedHistory.entries.push({
uri: gBrowser.currentURI.spec,
title: gBrowser.contentTitle,
});
}
};
var back = async function() {
info("Going back");
gBrowser.goBack();
await BrowserTestUtils.browserStopped(gBrowser);
gExpectedHistory.index--;
};
var forward = async function() {
info("Going forward");
gBrowser.goForward();
await BrowserTestUtils.browserStopped(gBrowser);
gExpectedHistory.index++;
};
// Tests that navigating from a page that should be in the remote process and
// a page that should be in the main process works and retains history
add_task(async function test_navigation() {
let expectedRemote = gMultiProcessBrowser;
info("1");
// Create a tab and load a remote page in it
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {skipAnimation: true});
let {permanentKey} = gBrowser.selectedBrowser;
await waitForLoad("http://example.org/" + DUMMY_PATH);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
info("2");
// Load another page
await waitForLoad("http://example.com/" + DUMMY_PATH);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("3");
// Load a non-remote page
await waitForLoad("about:robots");
await TestUtils.waitForCondition(() => gBrowser.selectedBrowser.contentTitle != "about:robots",
"Waiting for about:robots title to update");
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("4");
// Load a remote page
await waitForLoad("http://example.org/" + DUMMY_PATH);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("5");
await back();
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("6");
await back();
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("7");
await forward();
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("8");
await forward();
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("9");
await back();
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("10");
// Load a new remote page, this should replace the last history entry
gExpectedHistory.entries.splice(gExpectedHistory.entries.length - 1, 1);
await waitForLoad("http://example.com/" + DUMMY_PATH);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await check_history();
info("11");
gBrowser.removeCurrentTab();
clear_history();
});
// Tests that calling gBrowser.loadURI or browser.loadURI to load a page in a
// different process updates the browser synchronously
add_task(async function test_synchronous() {
let expectedRemote = gMultiProcessBrowser;
info("1");
// Create a tab and load a remote page in it
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {skipAnimation: true});
let {permanentKey} = gBrowser.selectedBrowser;
await waitForLoad("http://example.org/" + DUMMY_PATH);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
info("2");
// Load another page
info("Loading about:robots");
await BrowserTestUtils.loadURI(gBrowser.selectedBrowser, "about:robots");
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await BrowserTestUtils.browserStopped(gBrowser);
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
info("3");
// Load the remote page again
info("Loading http://example.org/" + DUMMY_PATH);
await BrowserTestUtils.loadURI(gBrowser.selectedBrowser, "http://example.org/" + DUMMY_PATH);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
await BrowserTestUtils.browserStopped(gBrowser);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same");
info("4");
gBrowser.removeCurrentTab();
clear_history();
});
// Tests that load flags are correctly passed through to the child process with
// normal loads
add_task(async function test_loadflags() {
let expectedRemote = gMultiProcessBrowser;
info("1");
// Create a tab and load a remote page in it
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {skipAnimation: true});
await waitForLoadWithFlags("about:robots");
await TestUtils.waitForCondition(() => gBrowser.selectedBrowser.contentTitle != "about:robots",
"Waiting for about:robots title to update");
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
await check_history();
info("2");
// Load a page in the remote process with some custom flags
await waitForLoadWithFlags("http://example.com/" + DUMMY_PATH, Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
await check_history();
info("3");
// Load a non-remote page
await waitForLoadWithFlags("about:robots");
await TestUtils.waitForCondition(() => gBrowser.selectedBrowser.contentTitle != "about:robots",
"Waiting for about:robots title to update");
is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct");
await check_history();
info("4");
// Load another remote page
await waitForLoadWithFlags("http://example.org/" + DUMMY_PATH, Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY);
is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct");
await check_history();
is(gExpectedHistory.entries.length, 2, "Should end with the right number of history entries");
info("5");
gBrowser.removeCurrentTab();
clear_history();
});