2017-02-09 23:32:50 +00:00
|
|
|
/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
2017-04-04 12:42:33 +00:00
|
|
|
// Via webext-panels.xul
|
2017-04-15 07:33:34 +00:00
|
|
|
/* import-globals-from browser.js */
|
2017-04-15 17:30:44 +00:00
|
|
|
/* import-globals-from nsContextMenu.js */
|
2017-04-04 12:42:33 +00:00
|
|
|
|
2018-01-29 23:20:18 +00:00
|
|
|
ChromeUtils.defineModuleGetter(this, "ExtensionParent",
|
|
|
|
"resource://gre/modules/ExtensionParent.jsm");
|
2017-05-26 22:44:41 +00:00
|
|
|
|
2018-02-28 23:32:01 +00:00
|
|
|
ChromeUtils.import("resource://gre/modules/Services.jsm");
|
2018-01-29 23:20:18 +00:00
|
|
|
ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm");
|
2017-02-09 23:32:50 +00:00
|
|
|
|
2017-02-21 21:51:14 +00:00
|
|
|
var {
|
|
|
|
promiseEvent,
|
|
|
|
} = ExtensionUtils;
|
|
|
|
|
|
|
|
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
|
|
|
|
|
|
|
function getBrowser(sidebar) {
|
2017-02-09 23:32:50 +00:00
|
|
|
let browser = document.getElementById("webext-panels-browser");
|
2017-02-21 21:51:14 +00:00
|
|
|
if (browser) {
|
|
|
|
return Promise.resolve(browser);
|
|
|
|
}
|
|
|
|
|
2017-08-01 22:44:05 +00:00
|
|
|
let stack = document.createElementNS(XUL_NS, "stack");
|
|
|
|
stack.setAttribute("flex", "1");
|
|
|
|
|
2017-02-21 21:51:14 +00:00
|
|
|
browser = document.createElementNS(XUL_NS, "browser");
|
|
|
|
browser.setAttribute("id", "webext-panels-browser");
|
|
|
|
browser.setAttribute("type", "content");
|
|
|
|
browser.setAttribute("flex", "1");
|
|
|
|
browser.setAttribute("disableglobalhistory", "true");
|
|
|
|
browser.setAttribute("webextension-view-type", "sidebar");
|
|
|
|
browser.setAttribute("context", "contentAreaContextMenu");
|
|
|
|
browser.setAttribute("tooltip", "aHTMLTooltip");
|
2017-06-01 23:20:34 +00:00
|
|
|
browser.setAttribute("autocompletepopup", "PopupAutoComplete");
|
2017-08-14 17:20:08 +00:00
|
|
|
browser.setAttribute("selectmenulist", "ContentSelectDropdown");
|
2017-02-21 21:51:14 +00:00
|
|
|
browser.setAttribute("onclick", "window.parent.contentAreaClick(event, true);");
|
|
|
|
|
2018-04-04 16:57:00 +00:00
|
|
|
// Ensure that the browser is going to run in the same process of the other
|
|
|
|
// extension pages from the same addon.
|
|
|
|
browser.sameProcessAsFrameLoader = sidebar.extension.groupFrameLoader;
|
|
|
|
|
2017-02-21 21:51:14 +00:00
|
|
|
let readyPromise;
|
2018-04-04 16:57:00 +00:00
|
|
|
if (sidebar.extension.remote) {
|
2017-02-09 23:32:50 +00:00
|
|
|
browser.setAttribute("remote", "true");
|
2017-02-21 21:51:14 +00:00
|
|
|
browser.setAttribute("remoteType",
|
|
|
|
E10SUtils.getRemoteTypeForURI(sidebar.uri, true,
|
|
|
|
E10SUtils.EXTENSION_REMOTE_TYPE));
|
|
|
|
readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
|
2017-04-15 17:30:44 +00:00
|
|
|
|
|
|
|
window.messageManager.addMessageListener("contextmenu", openContextMenu);
|
|
|
|
window.addEventListener("unload", () => {
|
|
|
|
window.messageManager.removeMessageListener("contextmenu", openContextMenu);
|
|
|
|
}, {once: true});
|
2017-02-09 23:32:50 +00:00
|
|
|
} else {
|
2017-02-21 21:51:14 +00:00
|
|
|
readyPromise = Promise.resolve();
|
2017-02-09 23:32:50 +00:00
|
|
|
}
|
2017-08-01 22:44:05 +00:00
|
|
|
|
|
|
|
stack.appendChild(browser);
|
|
|
|
document.documentElement.appendChild(stack);
|
2017-02-21 21:51:14 +00:00
|
|
|
|
|
|
|
return readyPromise.then(() => {
|
|
|
|
browser.messageManager.loadFrameScript("chrome://browser/content/content.js", false);
|
|
|
|
ExtensionParent.apiManager.emit("extension-browser-inserted", browser);
|
2017-05-25 23:46:59 +00:00
|
|
|
|
|
|
|
if (sidebar.browserStyle) {
|
|
|
|
browser.messageManager.loadFrameScript(
|
|
|
|
"chrome://extensions/content/ext-browser-content.js", false);
|
|
|
|
|
|
|
|
browser.messageManager.sendAsyncMessage("Extension:InitBrowser", {
|
2017-05-26 22:44:41 +00:00
|
|
|
stylesheets: ExtensionParent.extensionStylesheets,
|
2017-05-25 23:46:59 +00:00
|
|
|
});
|
|
|
|
}
|
2017-02-21 21:51:14 +00:00
|
|
|
return browser;
|
|
|
|
});
|
2017-02-09 23:32:50 +00:00
|
|
|
}
|
|
|
|
|
2017-08-01 22:44:05 +00:00
|
|
|
// Stub tabbrowser implementation for use by the tab-modal alert code.
|
|
|
|
var gBrowser = {
|
|
|
|
getTabForBrowser(browser) {
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
|
|
|
|
getTabModalPromptBox(browser) {
|
|
|
|
if (!browser.tabModalPromptBox) {
|
|
|
|
browser.tabModalPromptBox = new TabModalPromptBox(browser);
|
|
|
|
}
|
|
|
|
return browser.tabModalPromptBox;
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2018-03-09 22:30:49 +00:00
|
|
|
function loadPanel(extensionId, extensionUrl, browserStyle) {
|
|
|
|
let browserEl = document.getElementById("webext-panels-browser");
|
|
|
|
if (browserEl) {
|
|
|
|
if (browserEl.currentURI.spec === extensionUrl) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Forces runtime disconnect. Remove the stack (parent).
|
|
|
|
browserEl.parentNode.remove();
|
|
|
|
}
|
|
|
|
|
2018-02-28 23:32:01 +00:00
|
|
|
let policy = WebExtensionPolicy.getByID(extensionId);
|
2017-02-21 21:51:14 +00:00
|
|
|
let sidebar = {
|
2018-02-28 23:32:01 +00:00
|
|
|
uri: extensionUrl,
|
2018-04-04 16:57:00 +00:00
|
|
|
extension: policy.extension,
|
2018-02-28 23:32:01 +00:00
|
|
|
browserStyle,
|
2017-02-21 21:51:14 +00:00
|
|
|
};
|
|
|
|
getBrowser(sidebar).then(browser => {
|
2018-02-28 23:32:01 +00:00
|
|
|
let uri = Services.io.newURI(policy.getURL());
|
|
|
|
let triggeringPrincipal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
|
2018-03-16 23:21:46 +00:00
|
|
|
browser.loadURI(extensionUrl, {triggeringPrincipal});
|
2017-02-21 21:51:14 +00:00
|
|
|
});
|
|
|
|
}
|