Bug 1331686 - Pass correct triggeringPrincipal for tabs openen through ctrl-click and open link in new tab

This commit is contained in:
janekptacijarabaci 2018-05-01 00:15:28 +02:00 • committed by Roy Tam
commit 9b3581eddb
5 changed files with 38 additions and 6 deletions

View file

@ -71,6 +71,16 @@ XPCOMUtils.defineLazyModuleGetter(this, "SafeBrowsing",
["gDNSService", "@mozilla.org/network/dns-service;1", "nsIDNSService"], ["gDNSService", "@mozilla.org/network/dns-service;1", "nsIDNSService"],
].forEach(([name, cc, ci]) => XPCOMUtils.defineLazyServiceGetter(this, name, cc, ci)); ].forEach(([name, cc, ci]) => XPCOMUtils.defineLazyServiceGetter(this, name, cc, ci));
XPCOMUtils.defineLazyServiceGetter(this, "gSerializationHelper",
"@mozilla.org/network/serialization-helper;1",
"nsISerializationHelper");
XPCOMUtils.defineLazyGetter(this, "BrowserToolboxProcess", function() {
let tmp = {};
Cu.import("resource://devtools/client/framework/ToolboxProcess.jsm", tmp);
return tmp.BrowserToolboxProcess;
});
XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() { XPCOMUtils.defineLazyGetter(this, "gBrowserBundle", function() {
return Services.strings.createBundle('chrome://browser/locale/browser.properties'); return Services.strings.createBundle('chrome://browser/locale/browser.properties');
}); });
@ -806,6 +816,7 @@ function _loadURIWithFlags(browser, uri, params) {
if (!uri) { if (!uri) {
uri = "about:blank"; uri = "about:blank";
} }
let triggeringPrincipal = params.triggeringPrincipal || null;
let flags = params.flags || 0; let flags = params.flags || 0;
let referrer = params.referrerURI; let referrer = params.referrerURI;
let referrerPolicy = ('referrerPolicy' in params ? params.referrerPolicy : let referrerPolicy = ('referrerPolicy' in params ? params.referrerPolicy :
@ -830,7 +841,7 @@ function _loadURIWithFlags(browser, uri, params) {
browser.webNavigation.loadURIWithOptions(uri, flags, browser.webNavigation.loadURIWithOptions(uri, flags,
referrer, referrerPolicy, referrer, referrerPolicy,
postData, null, null); postData, null, null, triggeringPrincipal);
} else { } else {
// Check if the current browser is allowed to unload. // Check if the current browser is allowed to unload.
let {permitUnload, timedOut} = browser.permitUnload(); let {permitUnload, timedOut} = browser.permitUnload();
@ -844,6 +855,9 @@ function _loadURIWithFlags(browser, uri, params) {
let loadParams = { let loadParams = {
uri: uri, uri: uri,
triggeringPrincipal: triggeringPrincipal
? gSerializationHelper.serializePrincipal(triggeringPrincipal)
: null,
flags: flags, flags: flags,
referrer: referrer ? referrer.spec : null, referrer: referrer ? referrer.spec : null,
referrerPolicy: referrerPolicy, referrerPolicy: referrerPolicy,
@ -871,7 +885,7 @@ function _loadURIWithFlags(browser, uri, params) {
} }
browser.webNavigation.loadURIWithOptions(uri, flags, referrer, referrerPolicy, browser.webNavigation.loadURIWithOptions(uri, flags, referrer, referrerPolicy,
postData, null, null); postData, null, null, triggeringPrincipal);
} else { } else {
throw e; throw e;
} }
@ -4838,7 +4852,7 @@ nsBrowserAccess.prototype = {
_openURIInNewTab: function(aURI, aReferrer, aReferrerPolicy, aIsPrivate, _openURIInNewTab: function(aURI, aReferrer, aReferrerPolicy, aIsPrivate,
aIsExternal, aForceNotRemote=false, aIsExternal, aForceNotRemote=false,
aUserContextId=Ci.nsIScriptSecurityManager.DEFAULT_USER_CONTEXT_ID, aUserContextId=Ci.nsIScriptSecurityManager.DEFAULT_USER_CONTEXT_ID,
aOpener=null) { aOpener = null, aTriggeringPrincipal = null) {
let win, needToFocusWin; let win, needToFocusWin;
// try the current window. if we're in a popup, fall back on the most recent browser window // try the current window. if we're in a popup, fall back on the most recent browser window
@ -4863,6 +4877,7 @@ nsBrowserAccess.prototype = {
let loadInBackground = gPrefService.getBoolPref("browser.tabs.loadDivertedInBackground"); let loadInBackground = gPrefService.getBoolPref("browser.tabs.loadDivertedInBackground");
let tab = win.gBrowser.loadOneTab(aURI ? aURI.spec : "about:blank", { let tab = win.gBrowser.loadOneTab(aURI ? aURI.spec : "about:blank", {
triggeringPrincipal: aTriggeringPrincipal,
referrerURI: aReferrer, referrerURI: aReferrer,
referrerPolicy: aReferrerPolicy, referrerPolicy: aReferrerPolicy,
userContextId: aUserContextId, userContextId: aUserContextId,
@ -4911,9 +4926,11 @@ nsBrowserAccess.prototype = {
} }
let referrer = aOpener ? makeURI(aOpener.location.href) : null; let referrer = aOpener ? makeURI(aOpener.location.href) : null;
let triggeringPrincipal = null;
let referrerPolicy = Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT; let referrerPolicy = Ci.nsIHttpChannel.REFERRER_POLICY_DEFAULT;
if (aOpener && aOpener.document) { if (aOpener && aOpener.document) {
referrerPolicy = aOpener.document.referrerPolicy; referrerPolicy = aOpener.document.referrerPolicy;
triggeringPrincipal = aOpener.document.nodePrincipal;
} }
let isPrivate = aOpener let isPrivate = aOpener
? PrivateBrowsingUtils.isContentWindowPrivate(aOpener) ? PrivateBrowsingUtils.isContentWindowPrivate(aOpener)
@ -4947,7 +4964,7 @@ nsBrowserAccess.prototype = {
let browser = this._openURIInNewTab(aURI, referrer, referrerPolicy, let browser = this._openURIInNewTab(aURI, referrer, referrerPolicy,
isPrivate, isExternal, isPrivate, isExternal,
forceNotRemote, userContextId, forceNotRemote, userContextId,
openerWindow); openerWindow, triggeringPrincipal);
if (browser) if (browser)
newWindow = browser.contentWindow; newWindow = browser.contentWindow;
break; break;
@ -4958,6 +4975,7 @@ nsBrowserAccess.prototype = {
Ci.nsIWebNavigation.LOAD_FLAGS_FROM_EXTERNAL : Ci.nsIWebNavigation.LOAD_FLAGS_FROM_EXTERNAL :
Ci.nsIWebNavigation.LOAD_FLAGS_NONE; Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
gBrowser.loadURIWithFlags(aURI.spec, { gBrowser.loadURIWithFlags(aURI.spec, {
triggeringPrincipal,
flags: loadflags, flags: loadflags,
referrerURI: referrer, referrerURI: referrer,
referrerPolicy: referrerPolicy, referrerPolicy: referrerPolicy,
@ -4986,7 +5004,8 @@ nsBrowserAccess.prototype = {
aParams.referrerPolicy, aParams.referrerPolicy,
aParams.isPrivate, aParams.isPrivate,
isExternal, false, isExternal, false,
userContextId); userContextId, null,
aParams.triggeringPrincipal);
if (browser) if (browser)
return browser.QueryInterface(Ci.nsIFrameLoaderOwner); return browser.QueryInterface(Ci.nsIFrameLoaderOwner);

View file

@ -482,6 +482,7 @@ var ClickEventHandler = {
ctrlKey: event.ctrlKey, metaKey: event.metaKey, ctrlKey: event.ctrlKey, metaKey: event.metaKey,
altKey: event.altKey, href: null, title: null, altKey: event.altKey, href: null, title: null,
bookmark: false, referrerPolicy: referrerPolicy, bookmark: false, referrerPolicy: referrerPolicy,
triggeringPrincipal: principal,
originAttributes: principal ? principal.originAttributes : {}, originAttributes: principal ? principal.originAttributes : {},
isContentWindowPrivate: PrivateBrowsingUtils.isContentWindowPrivate(ownerDoc.defaultView)}; isContentWindowPrivate: PrivateBrowsingUtils.isContentWindowPrivate(ownerDoc.defaultView)};

View file

@ -1525,6 +1525,7 @@
<parameter name="aAllowThirdPartyFixup"/> <parameter name="aAllowThirdPartyFixup"/>
<body> <body>
<![CDATA[ <![CDATA[
var aTriggeringPrincipal;
var aReferrerPolicy; var aReferrerPolicy;
var aFromExternal; var aFromExternal;
var aRelatedToCurrent; var aRelatedToCurrent;
@ -1540,6 +1541,7 @@
typeof arguments[1] == "object" && typeof arguments[1] == "object" &&
!(arguments[1] instanceof Ci.nsIURI)) { !(arguments[1] instanceof Ci.nsIURI)) {
let params = arguments[1]; let params = arguments[1];
aTriggeringPrincipal = params.triggeringPrincipal
aReferrerURI = params.referrerURI; aReferrerURI = params.referrerURI;
aReferrerPolicy = params.referrerPolicy; aReferrerPolicy = params.referrerPolicy;
aCharset = params.charset; aCharset = params.charset;
@ -1562,6 +1564,7 @@
Services.prefs.getBoolPref("browser.tabs.loadInBackground"); Services.prefs.getBoolPref("browser.tabs.loadInBackground");
var owner = bgLoad ? null : this.selectedTab; var owner = bgLoad ? null : this.selectedTab;
var tab = this.addTab(aURI, { var tab = this.addTab(aURI, {
triggeringPrincipal: aTriggeringPrincipal,
referrerURI: aReferrerURI, referrerURI: aReferrerURI,
referrerPolicy: aReferrerPolicy, referrerPolicy: aReferrerPolicy,
charset: aCharset, charset: aCharset,
@ -2136,6 +2139,7 @@
"use strict"; "use strict";
const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
var aTriggeringPrincipal;
var aReferrerPolicy; var aReferrerPolicy;
var aFromExternal; var aFromExternal;
var aRelatedToCurrent; var aRelatedToCurrent;
@ -2152,6 +2156,7 @@
typeof arguments[1] == "object" && typeof arguments[1] == "object" &&
!(arguments[1] instanceof Ci.nsIURI)) { !(arguments[1] instanceof Ci.nsIURI)) {
let params = arguments[1]; let params = arguments[1];
aTriggeringPrincipal = params.triggeringPrincipal;
aReferrerURI = params.referrerURI; aReferrerURI = params.referrerURI;
aReferrerPolicy = params.referrerPolicy; aReferrerPolicy = params.referrerPolicy;
aCharset = params.charset; aCharset = params.charset;
@ -2283,6 +2288,7 @@
try { try {
b.loadURIWithFlags(aURI, { b.loadURIWithFlags(aURI, {
flags, flags,
triggeringPrincipal: aTriggeringPrincipal,
referrerURI: aNoReferrer ? null: aReferrerURI, referrerURI: aNoReferrer ? null: aReferrerURI,
referrerPolicy: aReferrerPolicy, referrerPolicy: aReferrerPolicy,
charset: aCharset, charset: aCharset,

View file

@ -407,6 +407,7 @@ function openLinkIn(url, where, params) {
} }
aCurrentBrowser.loadURIWithFlags(url, { aCurrentBrowser.loadURIWithFlags(url, {
triggeringPrincipal: aPrincipal,
flags: flags, flags: flags,
referrerURI: aNoReferrer ? null : aReferrerURI, referrerURI: aNoReferrer ? null : aReferrerURI,
referrerPolicy: aReferrerPolicy, referrerPolicy: aReferrerPolicy,
@ -432,6 +433,7 @@ function openLinkIn(url, where, params) {
noReferrer: aNoReferrer, noReferrer: aNoReferrer,
userContextId: aUserContextId, userContextId: aUserContextId,
originPrincipal: aPrincipal, originPrincipal: aPrincipal,
triggeringPrincipal: aPrincipal,
}); });
browserUsedForLoad = tabUsedForLoad.linkedBrowser; browserUsedForLoad = tabUsedForLoad.linkedBrowser;
break; break;

View file

@ -135,6 +135,7 @@
aURI = "about:blank"; aURI = "about:blank";
var aReferrerPolicy = Components.interfaces.nsIHttpChannel.REFERRER_POLICY_DEFAULT; var aReferrerPolicy = Components.interfaces.nsIHttpChannel.REFERRER_POLICY_DEFAULT;
var aTriggeringPrincipal;
// Check for loadURIWithFlags(uri, { ... }); // Check for loadURIWithFlags(uri, { ... });
var params = arguments[1]; var params = arguments[1];
@ -144,6 +145,9 @@
if ('referrerPolicy' in params) { if ('referrerPolicy' in params) {
aReferrerPolicy = params.referrerPolicy; aReferrerPolicy = params.referrerPolicy;
} }
if ("triggeringPrincipal" in params) {
aTriggeringPrincipal = params.triggeringPrincipal;
}
aCharset = params.charset; aCharset = params.charset;
aPostData = params.postData; aPostData = params.postData;
} }
@ -151,7 +155,7 @@
this._wrapURIChangeCall(() => this._wrapURIChangeCall(() =>
this.webNavigation.loadURIWithOptions( this.webNavigation.loadURIWithOptions(
aURI, aFlags, aReferrerURI, aReferrerPolicy, aURI, aFlags, aReferrerURI, aReferrerPolicy,
aPostData, null, null)); aPostData, null, null, aTriggeringPrincipal));
]]> ]]>
</body> </body>
</method> </method>