1 /* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 // Via webext-panels.xhtml
7 /* import-globals-from browser.js */
9 ChromeUtils.defineESModuleGetters(this, {
10 ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs",
13 const { ExtensionUtils } = ChromeUtils.importESModule(
14 "resource://gre/modules/ExtensionUtils.sys.mjs"
17 var { promiseEvent } = ExtensionUtils;
19 function getBrowser(panel) {
20 let browser = document.getElementById("webext-panels-browser");
22 return Promise.resolve(browser);
25 let stack = document.getElementById("webext-panels-stack");
27 stack = document.createXULElement("stack");
28 stack.setAttribute("flex", "1");
29 stack.setAttribute("id", "webext-panels-stack");
30 document.documentElement.appendChild(stack);
33 browser = document.createXULElement("browser");
34 browser.setAttribute("id", "webext-panels-browser");
35 browser.setAttribute("type", "content");
36 browser.setAttribute("flex", "1");
37 browser.setAttribute("disableglobalhistory", "true");
38 browser.setAttribute("messagemanagergroup", "webext-browsers");
39 browser.setAttribute("webextension-view-type", panel.viewType);
40 browser.setAttribute("context", "contentAreaContextMenu");
41 browser.setAttribute("tooltip", "aHTMLTooltip");
42 browser.setAttribute("autocompletepopup", "PopupAutoComplete");
44 if (gAllowTransparentBrowser) {
45 browser.setAttribute("transparent", "true");
48 // Ensure that the browser is going to run in the same bc group as the other
49 // extension pages from the same addon.
51 "initialBrowsingContextGroupId",
52 panel.extension.policy.browsingContextGroupId
56 if (panel.extension.remote) {
57 browser.setAttribute("remote", "true");
58 let oa = E10SUtils.predictOriginAttributes({ browser });
61 E10SUtils.getRemoteTypeForURI(
65 E10SUtils.EXTENSION_REMOTE_TYPE,
70 browser.setAttribute("maychangeremoteness", "true");
72 readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
74 readyPromise = Promise.resolve();
77 stack.appendChild(browser);
79 browser.addEventListener(
82 let { ZoomManager } = browser.ownerGlobal;
83 let zoom = browser.fullZoom;
85 if (zoom > ZoomManager.MAX) {
86 zoom = ZoomManager.MAX;
88 browser.fullZoom = zoom;
92 browser.addEventListener(
95 let { ZoomManager } = browser.ownerGlobal;
96 let zoom = browser.fullZoom;
98 if (zoom < ZoomManager.MIN) {
99 zoom = ZoomManager.MIN;
101 browser.fullZoom = zoom;
106 const initBrowser = () => {
107 ExtensionParent.apiManager.emit(
108 "extension-browser-inserted",
110 panel.browserInsertedData
113 browser.messageManager.loadFrameScript(
114 "chrome://extensions/content/ext-browser-content.js",
120 if (panel.browserStyle) {
121 options.stylesheets = ["chrome://browser/content/extension.css"];
123 browser.messageManager.sendAsyncMessage("Extension:InitBrowser", options);
127 browser.addEventListener("DidChangeBrowserRemoteness", initBrowser);
128 return readyPromise.then(initBrowser);
131 // Stub tabbrowser implementation to make sure that links from inside
132 // extension sidebar panels open in new tabs, see bug 1488055.
134 get selectedBrowser() {
135 return document.getElementById("webext-panels-browser");
143 function updatePosition() {
144 // We need both of these to make sure we update the position
145 // after any lower level updates have finished.
146 requestAnimationFrame(() =>
148 let browser = document.getElementById("webext-panels-browser");
149 if (browser && browser.isRemoteBrowser) {
150 browser.frameLoader.requestUpdatePosition();
156 function loadPanel(extensionId, extensionUrl, browserStyle) {
157 let browserEl = document.getElementById("webext-panels-browser");
159 if (browserEl.currentURI.spec === extensionUrl) {
162 // Forces runtime disconnect. Remove the stack (parent).
163 browserEl.parentNode.remove();
166 let policy = WebExtensionPolicy.getByID(extensionId);
170 extension: policy.extension,
175 getBrowser(sidebar).then(browser => {
176 let uri = Services.io.newURI(policy.getURL());
177 let triggeringPrincipal =
178 Services.scriptSecurityManager.createContentPrincipal(uri, {});
179 browser.fixupAndLoadURIString(extensionUrl, { triggeringPrincipal });
183 XPCOMUtils.defineLazyPreferenceGetter(
185 "gAllowTransparentBrowser",
186 "browser.tabs.allow_transparent_browser",