fune/browser/components/sessionstore/test/browser_parentProcessRestoreHash.js
Ian Moody 011b59d595 Bug 1536556 - Replace raw thrown Cr.ERRORs with Components.Exception. r=mossop,remote-protocol-reviewers,marionette-reviewers,whimboo,necko-reviewers,geckoview-reviewers,valentin,agi
Raw Cr.ERROR don't get stack information, same as throwing JS literals instead
of `new Error()`s.

This was done automatically with a new eslint rule that will be introduced in
the next commit.  One instance of a raw Cr.ERROR was not replaced since it is
used in a test that specifically checks the preservation of raw Cr values in
XPCJS.  The rule will be disabled for that instance.

Differential Revision: https://phabricator.services.mozilla.com/D28073
2020-05-05 17:41:36 +00:00

118 lines
3.2 KiB
JavaScript

"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([Ci.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(outer, iid) {
if (outer != null) {
throw Components.Exception("", Cr.NS_ERROR_NO_AGGREGATION);
}
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();
});