diff options
Diffstat (limited to 'browser/base/content/test/general/browser_e10s_switchbrowser.js')
-rw-r--r-- | browser/base/content/test/general/browser_e10s_switchbrowser.js | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_e10s_switchbrowser.js b/browser/base/content/test/general/browser_e10s_switchbrowser.js new file mode 100644 index 000000000..e6134f749 --- /dev/null +++ b/browser/base/content/test/general/browser_e10s_switchbrowser.js @@ -0,0 +1,261 @@ +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(Components.interfaces.nsIWebNavigation); + let sessionHistory = webNav.sessionHistory; + let result = { + index: sessionHistory.index, + entries: [] + }; + + for (let i = 0; i < sessionHistory.count; i++) { + let entry = sessionHistory.getEntryAtIndex(i, false); + 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 = Task.async(function*() { + let sessionHistory = yield 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]; + 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 = Task.async(function*(uri) { + info("Loading " + uri); + // Longwinded but this ensures we don't just shortcut to LoadInNewProcess + gBrowser.selectedBrowser.webNavigation.loadURI(uri, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); + + yield waitForDocLoadComplete(); + gExpectedHistory.index++; + gExpectedHistory.entries.push({ + uri: gBrowser.currentURI.spec, + title: gBrowser.contentTitle + }); +}); + +// Waits for a load and updates the known history +var waitForLoadWithFlags = Task.async(function*(uri, flags = Ci.nsIWebNavigation.LOAD_FLAGS_NONE) { + info("Loading " + uri + " flags = " + flags); + gBrowser.selectedBrowser.loadURIWithFlags(uri, flags, null, null, null); + + yield waitForDocLoadComplete(); + 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 = Task.async(function*() { + info("Going back"); + gBrowser.goBack(); + yield waitForDocLoadComplete(); + gExpectedHistory.index--; +}); + +var forward = Task.async(function*() { + info("Going forward"); + gBrowser.goForward(); + yield waitForDocLoadComplete(); + 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(function* test_navigation() { + let expectedRemote = gMultiProcessBrowser; + + info("1"); + // Create a tab and load a remote page in it + gBrowser.selectedTab = gBrowser.addTab("about:blank", {skipAnimation: true}); + let {permanentKey} = gBrowser.selectedBrowser; + yield 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 + yield 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"); + yield check_history(); + + info("3"); + // Load a non-remote page + yield waitForLoad("about:robots"); + is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct"); + is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same"); + yield check_history(); + + info("4"); + // Load a remote page + yield 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"); + yield check_history(); + + info("5"); + yield back(); + is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct"); + is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same"); + yield check_history(); + + info("6"); + yield back(); + is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct"); + is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same"); + yield check_history(); + + info("7"); + yield forward(); + is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct"); + is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same"); + yield check_history(); + + info("8"); + yield forward(); + is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct"); + is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same"); + yield check_history(); + + info("9"); + yield back(); + is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct"); + is(gBrowser.selectedBrowser.permanentKey, permanentKey, "browser.permanentKey is still the same"); + yield check_history(); + + info("10"); + // Load a new remote page, this should replace the last history entry + gExpectedHistory.entries.splice(gExpectedHistory.entries.length - 1, 1); + yield 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"); + yield 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(function* test_synchronous() { + let expectedRemote = gMultiProcessBrowser; + + info("1"); + // Create a tab and load a remote page in it + gBrowser.selectedTab = gBrowser.addTab("about:blank", {skipAnimation: true}); + let {permanentKey} = gBrowser.selectedBrowser; + yield 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"); + yield 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"); + + yield waitForDocLoadComplete(); + 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); + yield 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"); + + yield waitForDocLoadComplete(); + 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(function* test_loadflags() { + let expectedRemote = gMultiProcessBrowser; + + info("1"); + // Create a tab and load a remote page in it + gBrowser.selectedTab = gBrowser.addTab("about:blank", {skipAnimation: true}); + yield waitForLoadWithFlags("about:robots"); + is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct"); + yield check_history(); + + info("2"); + // Load a page in the remote process with some custom flags + yield waitForLoadWithFlags("http://example.com/" + DUMMY_PATH, Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY); + is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct"); + yield check_history(); + + info("3"); + // Load a non-remote page + yield waitForLoadWithFlags("about:robots"); + is(gBrowser.selectedBrowser.isRemoteBrowser, false, "Remote attribute should be correct"); + yield check_history(); + + info("4"); + // Load another remote page + yield waitForLoadWithFlags("http://example.org/" + DUMMY_PATH, Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY); + is(gBrowser.selectedBrowser.isRemoteBrowser, expectedRemote, "Remote attribute should be correct"); + yield check_history(); + + is(gExpectedHistory.entries.length, 2, "Should end with the right number of history entries"); + + info("5"); + gBrowser.removeCurrentTab(); + clear_history(); +}); |