summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_parentProcessRestoreHash.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_parentProcessRestoreHash.js')
-rw-r--r--browser/components/sessionstore/test/browser_parentProcessRestoreHash.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_parentProcessRestoreHash.js b/browser/components/sessionstore/test/browser_parentProcessRestoreHash.js
new file mode 100644
index 0000000000..442914d580
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_parentProcessRestoreHash.js
@@ -0,0 +1,115 @@
+"use strict";
+
+const SELFCHROMEURL =
+ "chrome://mochitests/content/browser/browser/" +
+ "components/sessionstore/test/browser_parentProcessRestoreHash.js";
+
+const Cm = Components.manager;
+
+const TESTCLASSID = "78742c04-3630-448c-9be3-6c5070f062de";
+
+const TESTURL = "about:testpageforsessionrestore#foo";
+
+let TestAboutPage = {
+ QueryInterface: ChromeUtils.generateQI(["nsIAboutModule"]),
+ getURIFlags(aURI) {
+ // No CAN_ or MUST_LOAD_IN_CHILD means this loads in the parent:
+ return (
+ Ci.nsIAboutModule.ALLOW_SCRIPT |
+ Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT |
+ Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT
+ );
+ },
+
+ newChannel(aURI, aLoadInfo) {
+ // about: page inception!
+ let newURI = Services.io.newURI(SELFCHROMEURL);
+ let channel = Services.io.newChannelFromURIWithLoadInfo(newURI, aLoadInfo);
+ channel.originalURI = aURI;
+ return channel;
+ },
+
+ createInstance(iid) {
+ return this.QueryInterface(iid);
+ },
+
+ register() {
+ Cm.QueryInterface(Ci.nsIComponentRegistrar).registerFactory(
+ Components.ID(TESTCLASSID),
+ "Only here for a test",
+ "@mozilla.org/network/protocol/about;1?what=testpageforsessionrestore",
+ this
+ );
+ },
+
+ unregister() {
+ Cm.QueryInterface(Ci.nsIComponentRegistrar).unregisterFactory(
+ Components.ID(TESTCLASSID),
+ this
+ );
+ },
+};
+
+/**
+ * Test that switching from a remote to a parent process browser
+ * correctly clears the userTypedValue
+ */
+add_task(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [["dom.security.skip_about_page_has_csp_assert", true]],
+ });
+
+ TestAboutPage.register();
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "http://example.com/",
+ true,
+ true
+ );
+ ok(tab.linkedBrowser.isRemoteBrowser, "Browser should be remote");
+
+ let resolveLocationChangePromise;
+ let locationChangePromise = new Promise(
+ r => (resolveLocationChangePromise = r)
+ );
+ let wpl = {
+ onStateChange(listener, request, state, status) {
+ let location = request.QueryInterface(Ci.nsIChannel).originalURI;
+ // Ignore about:blank loads.
+ let docStop =
+ Ci.nsIWebProgressListener.STATE_STOP |
+ Ci.nsIWebProgressListener.STATE_IS_NETWORK;
+ if (location.spec == "about:blank" || (state & docStop) != docStop) {
+ return;
+ }
+ is(location.spec, TESTURL, "Got the expected URL");
+ resolveLocationChangePromise();
+ },
+ };
+ gBrowser.addProgressListener(wpl);
+
+ gURLBar.value = TESTURL;
+ gURLBar.select();
+ EventUtils.sendKey("return");
+
+ await locationChangePromise;
+
+ ok(!tab.linkedBrowser.isRemoteBrowser, "Browser should no longer be remote");
+
+ is(gURLBar.value, TESTURL, "URL bar visible value should be correct.");
+ is(gURLBar.untrimmedValue, TESTURL, "URL bar value should be correct.");
+ is(
+ gURLBar.getAttribute("pageproxystate"),
+ "valid",
+ "URL bar is in valid page proxy state"
+ );
+
+ ok(
+ !tab.linkedBrowser.userTypedValue,
+ "No userTypedValue should be on the browser."
+ );
+
+ BrowserTestUtils.removeTab(tab);
+ gBrowser.removeProgressListener(wpl);
+ TestAboutPage.unregister();
+});