Bug 1909074. Don't pass OFFSET_BY_ORIGIN to GetResultingTransformMatrix when it's...
[gecko.git] / browser / base / content / webext-panels.js
blob85474de26104005b049639fa6ce9c5e81d37ed56
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",
11 });
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");
21   if (browser) {
22     return Promise.resolve(browser);
23   }
25   let stack = document.getElementById("webext-panels-stack");
26   if (!stack) {
27     stack = document.createXULElement("stack");
28     stack.setAttribute("flex", "1");
29     stack.setAttribute("id", "webext-panels-stack");
30     document.documentElement.appendChild(stack);
31   }
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");
46   }
48   // Ensure that the browser is going to run in the same bc group as the other
49   // extension pages from the same addon.
50   browser.setAttribute(
51     "initialBrowsingContextGroupId",
52     panel.extension.policy.browsingContextGroupId
53   );
55   let readyPromise;
56   if (panel.extension.remote) {
57     browser.setAttribute("remote", "true");
58     let oa = E10SUtils.predictOriginAttributes({ browser });
59     browser.setAttribute(
60       "remoteType",
61       E10SUtils.getRemoteTypeForURI(
62         panel.uri,
63         /* remote */ true,
64         /* fission */ false,
65         E10SUtils.EXTENSION_REMOTE_TYPE,
66         null,
67         oa
68       )
69     );
70     browser.setAttribute("maychangeremoteness", "true");
72     readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
73   } else {
74     readyPromise = Promise.resolve();
75   }
77   stack.appendChild(browser);
79   browser.addEventListener(
80     "DoZoomEnlargeBy10",
81     () => {
82       let { ZoomManager } = browser.ownerGlobal;
83       let zoom = browser.fullZoom;
84       zoom += 0.1;
85       if (zoom > ZoomManager.MAX) {
86         zoom = ZoomManager.MAX;
87       }
88       browser.fullZoom = zoom;
89     },
90     true
91   );
92   browser.addEventListener(
93     "DoZoomReduceBy10",
94     () => {
95       let { ZoomManager } = browser.ownerGlobal;
96       let zoom = browser.fullZoom;
97       zoom -= 0.1;
98       if (zoom < ZoomManager.MIN) {
99         zoom = ZoomManager.MIN;
100       }
101       browser.fullZoom = zoom;
102     },
103     true
104   );
106   const initBrowser = () => {
107     ExtensionParent.apiManager.emit(
108       "extension-browser-inserted",
109       browser,
110       panel.browserInsertedData
111     );
113     browser.messageManager.loadFrameScript(
114       "chrome://extensions/content/ext-browser-content.js",
115       false,
116       true
117     );
119     let options = {};
120     if (panel.browserStyle) {
121       options.stylesheets = ["chrome://browser/content/extension.css"];
122     }
123     browser.messageManager.sendAsyncMessage("Extension:InitBrowser", options);
124     return browser;
125   };
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.
133 var gBrowser = {
134   get selectedBrowser() {
135     return document.getElementById("webext-panels-browser");
136   },
138   getTabForBrowser() {
139     return null;
140   },
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(() =>
147     setTimeout(() => {
148       let browser = document.getElementById("webext-panels-browser");
149       if (browser && browser.isRemoteBrowser) {
150         browser.frameLoader.requestUpdatePosition();
151       }
152     }, 0)
153   );
156 function loadPanel(extensionId, extensionUrl, browserStyle) {
157   let browserEl = document.getElementById("webext-panels-browser");
158   if (browserEl) {
159     if (browserEl.currentURI.spec === extensionUrl) {
160       return;
161     }
162     // Forces runtime disconnect.  Remove the stack (parent).
163     browserEl.parentNode.remove();
164   }
166   let policy = WebExtensionPolicy.getByID(extensionId);
168   let sidebar = {
169     uri: extensionUrl,
170     extension: policy.extension,
171     browserStyle,
172     viewType: "sidebar",
173   };
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 });
180   });
183 XPCOMUtils.defineLazyPreferenceGetter(
184   this,
185   "gAllowTransparentBrowser",
186   "browser.tabs.allow_transparent_browser",
187   false