Bug 1329032 - Extend loadURIWithOptions by a triggeringPrincipal (without an hard e10s)

This commit is contained in:
janekptacijarabaci 2018-04-30 22:57:23 +02:00 • committed by Roy Tam
commit dee826b7ee
10 changed files with 56 additions and 22 deletions

View file

@ -204,6 +204,9 @@ ContentRestoreInternal.prototype = {
: Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT); : Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT);
let postData = loadArguments.postData ? let postData = loadArguments.postData ?
Utils.makeInputStream(loadArguments.postData) : null; Utils.makeInputStream(loadArguments.postData) : null;
let triggeringPrincipal = loadArguments.triggeringPrincipal
? Utils.deserializePrincipal(loadArguments.triggeringPrincipal)
: null;
if (loadArguments.userContextId) { if (loadArguments.userContextId) {
webNavigation.setOriginAttributesBeforeLoading({ userContextId: loadArguments.userContextId }); webNavigation.setOriginAttributesBeforeLoading({ userContextId: loadArguments.userContextId });
@ -211,7 +214,7 @@ ContentRestoreInternal.prototype = {
webNavigation.loadURIWithOptions(loadArguments.uri, loadArguments.flags, webNavigation.loadURIWithOptions(loadArguments.uri, loadArguments.flags,
referrer, referrerPolicy, postData, referrer, referrerPolicy, postData,
null, null); null, null, triggeringPrincipal);
} else if (tabData.userTypedValue && tabData.userTypedClear) { } else if (tabData.userTypedValue && tabData.userTypedClear) {
// If the user typed a URL into the URL bar and hit enter right before // If the user typed a URL into the URL bar and hit enter right before
// we crashed, we want to start loading that page again. A non-zero // we crashed, we want to start loading that page again. A non-zero

View file

@ -8,6 +8,7 @@ const { Ci, Cu, Cr } = require("chrome");
const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm"); const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
const Services = require("Services"); const Services = require("Services");
const { NetUtil } = require("resource://gre/modules/NetUtil.jsm"); const { NetUtil } = require("resource://gre/modules/NetUtil.jsm");
const { Utils } = require("resource://gre/modules/sessionstore/Utils.jsm");
function readInputStreamToString(stream) { function readInputStreamToString(stream) {
return NetUtil.readInputStreamToString(stream, stream.available()); return NetUtil.readInputStreamToString(stream, stream.available());
@ -61,11 +62,11 @@ BrowserElementWebNavigation.prototype = {
// No equivalent in the current BrowserElement API // No equivalent in the current BrowserElement API
this.loadURIWithOptions(uri, flags, referrer, this.loadURIWithOptions(uri, flags, referrer,
Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT, Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT,
postData, headers, null); postData, headers, null, null);
}, },
loadURIWithOptions(uri, flags, referrer, referrerPolicy, postData, headers, loadURIWithOptions(uri, flags, referrer, referrerPolicy, postData, headers,
baseURI) { baseURI, triggeringPrincipal) {
// No equivalent in the current BrowserElement API // No equivalent in the current BrowserElement API
this._sendMessage("WebNavigation:LoadURI", { this._sendMessage("WebNavigation:LoadURI", {
uri, uri,
@ -75,6 +76,9 @@ BrowserElementWebNavigation.prototype = {
postData: postData ? readInputStreamToString(postData) : null, postData: postData ? readInputStreamToString(postData) : null,
headers: headers ? readInputStreamToString(headers) : null, headers: headers ? readInputStreamToString(headers) : null,
baseURI: baseURI ? baseURI.spec : null, baseURI: baseURI ? baseURI.spec : null,
triggeringPrincipal: triggeringPrincipal
? Utils.serializePrincipal(triggeringPrincipal)
: null,
}); });
}, },

View file

@ -4732,7 +4732,7 @@ nsDocShell::LoadURI(const char16_t* aURI,
{ {
return LoadURIWithOptions(aURI, aLoadFlags, aReferringURI, return LoadURIWithOptions(aURI, aLoadFlags, aReferringURI,
mozilla::net::RP_Default, aPostStream, mozilla::net::RP_Default, aPostStream,
aHeaderStream, nullptr); aHeaderStream, nullptr, nullptr);
} }
NS_IMETHODIMP NS_IMETHODIMP
@ -4742,7 +4742,8 @@ nsDocShell::LoadURIWithOptions(const char16_t* aURI,
uint32_t aReferrerPolicy, uint32_t aReferrerPolicy,
nsIInputStream* aPostStream, nsIInputStream* aPostStream,
nsIInputStream* aHeaderStream, nsIInputStream* aHeaderStream,
nsIURI* aBaseURI) nsIURI* aBaseURI,
nsIPrincipal* aTriggeringPrincipal)
{ {
NS_ASSERTION((aLoadFlags & 0xf) == 0, "Unexpected flags"); NS_ASSERTION((aLoadFlags & 0xf) == 0, "Unexpected flags");
@ -4861,6 +4862,7 @@ nsDocShell::LoadURIWithOptions(const char16_t* aURI,
loadInfo->SetReferrerPolicy(aReferrerPolicy); loadInfo->SetReferrerPolicy(aReferrerPolicy);
loadInfo->SetHeadersStream(aHeaderStream); loadInfo->SetHeadersStream(aHeaderStream);
loadInfo->SetBaseURI(aBaseURI); loadInfo->SetBaseURI(aBaseURI);
loadInfo->SetTriggeringPrincipal(aTriggeringPrincipal);
loadInfo->SetForceAllowDataURI(forceAllowDataURI); loadInfo->SetForceAllowDataURI(forceAllowDataURI);
if (fixupInfo) { if (fixupInfo) {
@ -10606,7 +10608,7 @@ nsDocShell::InternalLoad(nsIURI* aURI,
} }
bool shouldLoad; bool shouldLoad;
rv = browserChrome3->ShouldLoadURI(this, uriForShouldLoadCheck, aReferrer, rv = browserChrome3->ShouldLoadURI(this, uriForShouldLoadCheck, aReferrer,
&shouldLoad); aTriggeringPrincipal, &shouldLoad);
if (NS_SUCCEEDED(rv) && !shouldLoad) { if (NS_SUCCEEDED(rv) && !shouldLoad) {
return NS_OK; return NS_OK;
} }

View file

@ -9,6 +9,7 @@ interface nsIDOMDocument;
interface nsIInputStream; interface nsIInputStream;
interface nsISHistory; interface nsISHistory;
interface nsIURI; interface nsIURI;
interface nsIPrincipal;
/** /**
* The nsIWebNavigation interface defines an interface for navigating the web. * The nsIWebNavigation interface defines an interface for navigating the web.
@ -288,6 +289,11 @@ interface nsIWebNavigation : nsISupports
* that at present this argument is only used with view-source aURIs * that at present this argument is only used with view-source aURIs
* and cannot be used to resolve aURI. * and cannot be used to resolve aURI.
* This parameter is optional and may be null. * This parameter is optional and may be null.
* @param aTriggeringPrincipal
* The principal that initiated the load of aURI. If omitted docShell
* tries to create a codeBasePrincipal from aReferrer if not null. If
* aReferrer is also null docShell peforms a load using the
* SystemPrincipal as the triggeringPrincipal.
*/ */
void loadURIWithOptions(in wstring aURI, void loadURIWithOptions(in wstring aURI,
in unsigned long aLoadFlags, in unsigned long aLoadFlags,
@ -295,7 +301,8 @@ interface nsIWebNavigation : nsISupports
in unsigned long aReferrerPolicy, in unsigned long aReferrerPolicy,
in nsIInputStream aPostData, in nsIInputStream aPostData,
in nsIInputStream aHeaders, in nsIInputStream aHeaders,
in nsIURI aBaseURI); in nsIURI aBaseURI,
[optional] in nsIPrincipal aTriggeringPrincipal);
/** /**
* Tells the Object to reload the current page. There may be cases where the * Tells the Object to reload the current page. There may be cases where the

View file

@ -1582,7 +1582,8 @@ nsSHistory::LoadURIWithOptions(const char16_t* aURI,
uint32_t aReferrerPolicy, uint32_t aReferrerPolicy,
nsIInputStream* aPostStream, nsIInputStream* aPostStream,
nsIInputStream* aExtraHeaderStream, nsIInputStream* aExtraHeaderStream,
nsIURI* aBaseURI) nsIURI* aBaseURI,
nsIPrincipal* aTriggeringPrincipal)
{ {
return NS_OK; return NS_OK;
} }

View file

@ -9776,9 +9776,13 @@ nsContentUtils::AttemptLargeAllocationLoad(nsIHttpChannel* aChannel)
rv = aChannel->GetReferrer(getter_AddRefs(referrer)); rv = aChannel->GetReferrer(getter_AddRefs(referrer));
NS_ENSURE_SUCCESS(rv, false); NS_ENSURE_SUCCESS(rv, false);
nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
nsCOMPtr<nsIPrincipal> triggeringPrincipal = loadInfo->TriggeringPrincipal();
// Actually perform the cross process load // Actually perform the cross process load
bool reloadSucceeded = false; bool reloadSucceeded = false;
rv = wbc3->ReloadInFreshProcess(docShell, uri, referrer, &reloadSucceeded); rv = wbc3->ReloadInFreshProcess(docShell, uri, referrer,
triggeringPrincipal, &reloadSucceeded);
NS_ENSURE_SUCCESS(rv, false); NS_ENSURE_SUCCESS(rv, false);
return reloadSucceeded; return reloadSucceeded;

View file

@ -8,6 +8,7 @@
interface nsIDocShell; interface nsIDocShell;
interface nsIInputStream; interface nsIInputStream;
interface nsIPrincipal;
/** /**
* nsIWebBrowserChrome3 is an extension to nsIWebBrowserChrome2. * nsIWebBrowserChrome3 is an extension to nsIWebBrowserChrome2.
@ -43,10 +44,13 @@ interface nsIWebBrowserChrome3 : nsIWebBrowserChrome2
* The URI being loaded. * The URI being loaded.
* @param aReferrer * @param aReferrer
* The referrer of the load. * The referrer of the load.
* @param aTriggeringPrincipal
* The principal that initiated the load of aURI.
*/ */
bool shouldLoadURI(in nsIDocShell aDocShell, bool shouldLoadURI(in nsIDocShell aDocShell,
in nsIURI aURI, in nsIURI aURI,
in nsIURI aReferrer); in nsIURI aReferrer,
in nsIPrincipal aTriggeringPrincipal);
/** /**
* Attempts to load the currently loaded page into a fresh process to increase * Attempts to load the currently loaded page into a fresh process to increase
@ -57,5 +61,6 @@ interface nsIWebBrowserChrome3 : nsIWebBrowserChrome2
*/ */
bool reloadInFreshProcess(in nsIDocShell aDocShell, bool reloadInFreshProcess(in nsIDocShell aDocShell,
in nsIURI aURI, in nsIURI aURI,
in nsIURI aReferrer); in nsIURI aReferrer,
in nsIPrincipal aTriggeringPrincipal);
}; };

View file

@ -654,13 +654,14 @@ nsWebBrowser::LoadURIWithOptions(const char16_t* aURI, uint32_t aLoadFlags,
uint32_t aReferrerPolicy, uint32_t aReferrerPolicy,
nsIInputStream* aPostDataStream, nsIInputStream* aPostDataStream,
nsIInputStream* aExtraHeaderStream, nsIInputStream* aExtraHeaderStream,
nsIURI* aBaseURI) nsIURI* aBaseURI,
nsIPrincipal* aTriggeringPrincipal)
{ {
NS_ENSURE_STATE(mDocShell); NS_ENSURE_STATE(mDocShell);
return mDocShellAsNav->LoadURIWithOptions( return mDocShellAsNav->LoadURIWithOptions(
aURI, aLoadFlags, aReferringURI, aReferrerPolicy, aPostDataStream, aURI, aLoadFlags, aReferringURI, aReferrerPolicy, aPostDataStream,
aExtraHeaderStream, aBaseURI); aExtraHeaderStream, aBaseURI, aTriggeringPrincipal);
} }
NS_IMETHODIMP NS_IMETHODIMP

View file

@ -390,6 +390,7 @@ NS_IMETHODIMP nsContentTreeOwner::OnBeforeLinkTraversal(const nsAString &origina
NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURI(nsIDocShell *aDocShell, NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURI(nsIDocShell *aDocShell,
nsIURI *aURI, nsIURI *aURI,
nsIURI *aReferrer, nsIURI *aReferrer,
nsIPrincipal* aTriggeringPrincipal,
bool *_retval) bool *_retval)
{ {
NS_ENSURE_STATE(mXULWindow); NS_ENSURE_STATE(mXULWindow);
@ -398,7 +399,8 @@ NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURI(nsIDocShell *aDocShell,
mXULWindow->GetXULBrowserWindow(getter_AddRefs(xulBrowserWindow)); mXULWindow->GetXULBrowserWindow(getter_AddRefs(xulBrowserWindow));
if (xulBrowserWindow) if (xulBrowserWindow)
return xulBrowserWindow->ShouldLoadURI(aDocShell, aURI, aReferrer, _retval); return xulBrowserWindow->ShouldLoadURI(aDocShell, aURI, aReferrer,
aTriggeringPrincipal, _retval);
*_retval = true; *_retval = true;
return NS_OK; return NS_OK;
@ -407,6 +409,7 @@ NS_IMETHODIMP nsContentTreeOwner::ShouldLoadURI(nsIDocShell *aDocShell,
NS_IMETHODIMP nsContentTreeOwner::ReloadInFreshProcess(nsIDocShell* aDocShell, NS_IMETHODIMP nsContentTreeOwner::ReloadInFreshProcess(nsIDocShell* aDocShell,
nsIURI* aURI, nsIURI* aURI,
nsIURI* aReferrer, nsIURI* aReferrer,
nsIPrincipal* aTriggeringPrincipal,
bool* aRetVal) bool* aRetVal)
{ {
NS_WARNING("Cannot reload in fresh process from a nsContentTreeOwner!"); NS_WARNING("Cannot reload in fresh process from a nsContentTreeOwner!");

View file

@ -13,6 +13,7 @@ interface nsIDOMElement;
interface nsIInputStream; interface nsIInputStream;
interface nsIDocShell; interface nsIDocShell;
interface nsITabParent; interface nsITabParent;
interface nsIPrincipal;
interface mozIDOMWindowProxy; interface mozIDOMWindowProxy;
/** /**
@ -60,10 +61,13 @@ interface nsIXULBrowserWindow : nsISupports
* The URI being loaded. * The URI being loaded.
* @param aReferrer * @param aReferrer
* The referrer of the load. * The referrer of the load.
* @param aTriggeringPrincipal
* The principal that initiated the load of aURI.
*/ */
bool shouldLoadURI(in nsIDocShell aDocShell, bool shouldLoadURI(in nsIDocShell aDocShell,
in nsIURI aURI, in nsIURI aURI,
in nsIURI aReferrer); in nsIURI aReferrer,
in nsIPrincipal aTriggeringPrincipal);
/** /**
* Show/hide a tooltip (when the user mouses over a link, say). * Show/hide a tooltip (when the user mouses over a link, say).
*/ */