Bug 1398713 pass triggeringPrincipal when using browser.loadURI, r=Gijs,kmag

This commit is contained in:
Shane Caraveo
2018-02-28 17:32:01 -06:00
parent 02ba173095
commit cc9b7fb4c5
9 changed files with 52 additions and 44 deletions

View File

@@ -360,6 +360,15 @@ var SidebarUI = {
return this.show(commandID, triggerNode);
},
_loadSidebarExtension(sidebarBroadcaster) {
let extensionId = sidebarBroadcaster.getAttribute("extensionId");
if (extensionId) {
let extensionUrl = sidebarBroadcaster.getAttribute("panel");
let browserStyle = sidebarBroadcaster.getAttribute("browserStyle");
SidebarUI.browser.contentWindow.loadPanel(extensionId, extensionUrl, browserStyle);
}
},
/**
* Show the sidebar, using the parameters from the specified broadcaster.
* @see SidebarUI note.
@@ -371,7 +380,9 @@ var SidebarUI = {
* showing of the sidebar.
*/
show(commandID, triggerNode) {
return this._show(commandID).then(() => {
return this._show(commandID).then((sidebarBroadcaster) => {
this._loadSidebarExtension(sidebarBroadcaster);
if (triggerNode) {
updateToggleControlLabel(triggerNode);
}
@@ -388,9 +399,11 @@ var SidebarUI = {
*
* @param {string} commandID ID of the xul:broadcaster element to use.
*/
showInitially(commandID) {
return this._show(commandID);
},
showInitially(commandID) {
return this._show(commandID).then((sidebarBroadcaster) => {
this._loadSidebarExtension(sidebarBroadcaster);
});
},
/**
* Implementation for show. Also used internally for sidebars that are shown
@@ -446,14 +459,14 @@ var SidebarUI = {
// We're handling the 'load' event before it bubbles up to the usual
// (non-capturing) event handlers. Let it bubble up before resolving.
setTimeout(() => {
resolve();
resolve(sidebarBroadcaster);
// Now that the currentId is updated, fire a show event.
this._fireShowEvent();
}, 0);
}, {capture: true, once: true});
} else {
resolve();
resolve(sidebarBroadcaster);
// Now that the currentId is updated, fire a show event.
this._fireShowEvent();

View File

@@ -10,6 +10,7 @@
ChromeUtils.defineModuleGetter(this, "ExtensionParent",
"resource://gre/modules/ExtensionParent.jsm");
ChromeUtils.import("resource://gre/modules/Services.jsm");
ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm");
var {
@@ -88,18 +89,16 @@ var gBrowser = {
},
};
function loadWebPanel() {
let sidebarURI = new URL(location);
async function loadPanel(extensionId, extensionUrl, browserStyle) {
let policy = WebExtensionPolicy.getByID(extensionId);
let sidebar = {
uri: sidebarURI.searchParams.get("panel"),
remote: sidebarURI.searchParams.get("remote"),
browserStyle: sidebarURI.searchParams.get("browser-style"),
uri: extensionUrl,
remote: policy.extension.remote,
browserStyle,
};
getBrowser(sidebar).then(browser => {
browser.loadURI(sidebar.uri);
let uri = Services.io.newURI(policy.getURL());
let triggeringPrincipal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
browser.loadURIWithFlags(extensionUrl, {triggeringPrincipal});
});
}
function load() {
this.loadWebPanel();
}

View File

@@ -18,8 +18,7 @@
<page id="webextpanels-window"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="load()">
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://global/content/contentAreaUtils.js"/>
<script type="application/javascript" src="chrome://browser/content/browser.js"/>
<script type="application/javascript" src="chrome://browser/content/browser-places.js"/>

View File

@@ -316,7 +316,7 @@ class BasePopup {
stylesheets: this.STYLESHEETS,
});
browser.loadURI(popupURL);
browser.loadURIWithFlags(popupURL, {triggeringPrincipal: this.extension.principal});
});
}

View File

@@ -264,7 +264,9 @@ class ParentDevToolsPanel {
},
});
browser.loadURI(url);
browser.loadURIWithFlags(url, {
triggeringPrincipal: extension.principal,
});
}
destroyBrowserElement() {

View File

@@ -176,7 +176,9 @@ class DevToolsPage extends HiddenExtensionPage {
},
});
this.browser.loadURI(this.url);
this.browser.loadURIWithFlags(this.url, {
triggeringPrincipal: this.extension.principal,
});
await this.waitForTopLevelContext;
}

View File

@@ -136,20 +136,6 @@ this.sidebarAction = class extends ExtensionAPI {
}
}
sidebarUrl(panel) {
let url = `${sidebarURL}?panel=${encodeURIComponent(panel)}`;
if (this.extension.remote) {
url += "&remote=1";
}
if (this.browserStyle) {
url += "&browser-style=1";
}
return url;
}
createMenuItem(window, details) {
let {document, SidebarUI} = window;
@@ -161,7 +147,12 @@ this.sidebarAction = class extends ExtensionAPI {
broadcaster.setAttribute("type", "checkbox");
broadcaster.setAttribute("group", "sidebar");
broadcaster.setAttribute("label", details.title);
broadcaster.setAttribute("sidebarurl", this.sidebarUrl(details.panel));
broadcaster.setAttribute("sidebarurl", sidebarURL);
broadcaster.setAttribute("panel", details.panel);
if (this.browserStyle) {
broadcaster.setAttribute("browserStyle", "true");
}
broadcaster.setAttribute("extensionId", this.extension.id);
let id = `ext-key-id-${this.id}`;
broadcaster.setAttribute("key", id);
@@ -227,10 +218,9 @@ this.sidebarAction = class extends ExtensionAPI {
broadcaster.setAttribute("tooltiptext", title);
broadcaster.setAttribute("label", title);
let url = this.sidebarUrl(tabData.panel);
let urlChanged = url !== broadcaster.getAttribute("sidebarurl");
let urlChanged = tabData.panel !== broadcaster.getAttribute("panel");
if (urlChanged) {
broadcaster.setAttribute("sidebarurl", url);
broadcaster.setAttribute("panel", tabData.panel);
}
this.setMenuIcon(menu, tabData);

View File

@@ -507,10 +507,13 @@ this.tabs = class extends ExtensionAPI {
return Promise.reject({message: `Illegal URL: ${url}`});
}
let flags = updateProperties.loadReplace
? Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY
: Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
nativeTab.linkedBrowser.loadURIWithFlags(url, {flags});
let options = {
flags: updateProperties.loadReplace
? Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY
: Ci.nsIWebNavigation.LOAD_FLAGS_NONE,
triggeringPrincipal: context.principal,
};
nativeTab.linkedBrowser.loadURIWithFlags(url, options);
}
if (updateProperties.active !== null) {

View File

@@ -31,7 +31,7 @@ class BackgroundPage extends HiddenExtensionPage {
extensions.emit("extension-browser-inserted", this.browser);
this.browser.loadURI(this.url);
this.browser.loadURIWithFlags(this.url, {triggeringPrincipal: this.extension.principal});
let context = await promiseExtensionViewLoaded(this.browser);
TelemetryStopwatch.finish("WEBEXT_BACKGROUND_PAGE_LOAD_MS", this);