diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_parentProcessRestoreHash.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_parentProcessRestoreHash.js | 95 |
1 files changed, 95 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 000000000..1deb461c8 --- /dev/null +++ b/browser/components/sessionstore/test/browser_parentProcessRestoreHash.js @@ -0,0 +1,95 @@ +"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: XPCOMUtils.generateQI([Ci.nsIAboutModule]), + getURIFlags: function(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: function(aURI, aLoadInfo) { + // about: page inception! + let newURI = Services.io.newURI(SELFCHROMEURL, null, null); + let channel = Services.io.newChannelFromURIWithLoadInfo(newURI, + aLoadInfo); + channel.originalURI = aURI; + return channel; + }, + + createInstance: function(outer, iid) { + if (outer != null) { + throw Cr.NS_ERROR_NO_AGGREGATION; + } + return this.QueryInterface(iid); + }, + + register: function() { + Cm.QueryInterface(Ci.nsIComponentRegistrar).registerFactory( + Components.ID(TESTCLASSID), "Only here for a test", + "@mozilla.org/network/protocol/about;1?what=testpageforsessionrestore", this); + }, + + unregister: function() { + 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(function* () { + TestAboutPage.register(); + let tab = yield 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(wpl, 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"); + + yield locationChangePromise; + + ok(!tab.linkedBrowser.isRemoteBrowser, "Browser should no longer be remote"); + + is(gURLBar.textValue, TESTURL, "URL bar visible value should be correct."); + is(gURLBar.value, 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."); + + yield BrowserTestUtils.removeTab(tab); + gBrowser.removeProgressListener(wpl); + TestAboutPage.unregister(); +}); |