forked from mirrors/gecko-dev
		
	 7829e5aab5
			
		
	
	
		7829e5aab5
		
	
	
	
	
		
			
			Right now we rely on the menulist to be injected by hand in all the relevant windows. Instead create it lazily, making the select code more standalone. The DevTools window was missing it, for example. Differential Revision: https://phabricator.services.mozilla.com/D149620
		
			
				
	
	
		
			188 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- 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/. */
 | |
| 
 | |
| // Via webext-panels.xhtml
 | |
| /* import-globals-from browser.js */
 | |
| /* import-globals-from nsContextMenu.js */
 | |
| 
 | |
| ChromeUtils.defineModuleGetter(
 | |
|   this,
 | |
|   "ExtensionParent",
 | |
|   "resource://gre/modules/ExtensionParent.jsm"
 | |
| );
 | |
| 
 | |
| const { ExtensionUtils } = ChromeUtils.import(
 | |
|   "resource://gre/modules/ExtensionUtils.jsm"
 | |
| );
 | |
| 
 | |
| var { promiseEvent } = ExtensionUtils;
 | |
| 
 | |
| function getBrowser(panel) {
 | |
|   let browser = document.getElementById("webext-panels-browser");
 | |
|   if (browser) {
 | |
|     return Promise.resolve(browser);
 | |
|   }
 | |
| 
 | |
|   let stack = document.getElementById("webext-panels-stack");
 | |
|   if (!stack) {
 | |
|     stack = document.createXULElement("stack");
 | |
|     stack.setAttribute("flex", "1");
 | |
|     stack.setAttribute("id", "webext-panels-stack");
 | |
|     document.documentElement.appendChild(stack);
 | |
|   }
 | |
| 
 | |
|   browser = document.createXULElement("browser");
 | |
|   browser.setAttribute("id", "webext-panels-browser");
 | |
|   browser.setAttribute("type", "content");
 | |
|   browser.setAttribute("flex", "1");
 | |
|   browser.setAttribute("disableglobalhistory", "true");
 | |
|   browser.setAttribute("messagemanagergroup", "webext-browsers");
 | |
|   browser.setAttribute("webextension-view-type", panel.viewType);
 | |
|   browser.setAttribute("context", "contentAreaContextMenu");
 | |
|   browser.setAttribute("tooltip", "aHTMLTooltip");
 | |
|   browser.setAttribute("autocompletepopup", "PopupAutoComplete");
 | |
| 
 | |
|   // Ensure that the browser is going to run in the same bc group as the other
 | |
|   // extension pages from the same addon.
 | |
|   browser.setAttribute(
 | |
|     "initialBrowsingContextGroupId",
 | |
|     panel.extension.policy.browsingContextGroupId
 | |
|   );
 | |
| 
 | |
|   let readyPromise;
 | |
|   if (panel.extension.remote) {
 | |
|     browser.setAttribute("remote", "true");
 | |
|     let oa = E10SUtils.predictOriginAttributes({ browser });
 | |
|     browser.setAttribute(
 | |
|       "remoteType",
 | |
|       E10SUtils.getRemoteTypeForURI(
 | |
|         panel.uri,
 | |
|         /* remote */ true,
 | |
|         /* fission */ false,
 | |
|         E10SUtils.EXTENSION_REMOTE_TYPE,
 | |
|         null,
 | |
|         oa
 | |
|       )
 | |
|     );
 | |
|     browser.setAttribute("maychangeremoteness", "true");
 | |
| 
 | |
|     readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
 | |
|   } else {
 | |
|     readyPromise = Promise.resolve();
 | |
|   }
 | |
| 
 | |
|   stack.appendChild(browser);
 | |
| 
 | |
|   browser.addEventListener(
 | |
|     "DoZoomEnlargeBy10",
 | |
|     () => {
 | |
|       let { ZoomManager } = browser.ownerGlobal;
 | |
|       let zoom = browser.fullZoom;
 | |
|       zoom += 0.1;
 | |
|       if (zoom > ZoomManager.MAX) {
 | |
|         zoom = ZoomManager.MAX;
 | |
|       }
 | |
|       browser.fullZoom = zoom;
 | |
|     },
 | |
|     true
 | |
|   );
 | |
|   browser.addEventListener(
 | |
|     "DoZoomReduceBy10",
 | |
|     () => {
 | |
|       let { ZoomManager } = browser.ownerGlobal;
 | |
|       let zoom = browser.fullZoom;
 | |
|       zoom -= 0.1;
 | |
|       if (zoom < ZoomManager.MIN) {
 | |
|         zoom = ZoomManager.MIN;
 | |
|       }
 | |
|       browser.fullZoom = zoom;
 | |
|     },
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   const initBrowser = () => {
 | |
|     ExtensionParent.apiManager.emit(
 | |
|       "extension-browser-inserted",
 | |
|       browser,
 | |
|       panel.browserInsertedData
 | |
|     );
 | |
| 
 | |
|     browser.messageManager.loadFrameScript(
 | |
|       "chrome://extensions/content/ext-browser-content.js",
 | |
|       false,
 | |
|       true
 | |
|     );
 | |
| 
 | |
|     let options =
 | |
|       panel.browserStyle !== false
 | |
|         ? { stylesheets: ExtensionParent.extensionStylesheets }
 | |
|         : {};
 | |
|     browser.messageManager.sendAsyncMessage("Extension:InitBrowser", options);
 | |
|     return browser;
 | |
|   };
 | |
| 
 | |
|   browser.addEventListener("DidChangeBrowserRemoteness", initBrowser);
 | |
|   return readyPromise.then(initBrowser);
 | |
| }
 | |
| 
 | |
| // Stub tabbrowser implementation for use by the tab-modal alert code.
 | |
| var gBrowser = {
 | |
|   get selectedBrowser() {
 | |
|     return document.getElementById("webext-panels-browser");
 | |
|   },
 | |
| 
 | |
|   getTabForBrowser(browser) {
 | |
|     return null;
 | |
|   },
 | |
| 
 | |
|   getTabModalPromptBox(browser) {
 | |
|     if (!browser.tabModalPromptBox) {
 | |
|       browser.tabModalPromptBox = new TabModalPromptBox(browser);
 | |
|     }
 | |
|     return browser.tabModalPromptBox;
 | |
|   },
 | |
| };
 | |
| 
 | |
| function updatePosition() {
 | |
|   // We need both of these to make sure we update the position
 | |
|   // after any lower level updates have finished.
 | |
|   requestAnimationFrame(() =>
 | |
|     setTimeout(() => {
 | |
|       let browser = document.getElementById("webext-panels-browser");
 | |
|       if (browser && browser.isRemoteBrowser) {
 | |
|         browser.frameLoader.requestUpdatePosition();
 | |
|       }
 | |
|     }, 0)
 | |
|   );
 | |
| }
 | |
| 
 | |
| 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();
 | |
|   }
 | |
| 
 | |
|   let policy = WebExtensionPolicy.getByID(extensionId);
 | |
| 
 | |
|   let sidebar = {
 | |
|     uri: extensionUrl,
 | |
|     extension: policy.extension,
 | |
|     browserStyle,
 | |
|     viewType: "sidebar",
 | |
|   };
 | |
| 
 | |
|   getBrowser(sidebar).then(browser => {
 | |
|     let uri = Services.io.newURI(policy.getURL());
 | |
|     let triggeringPrincipal = Services.scriptSecurityManager.createContentPrincipal(
 | |
|       uri,
 | |
|       {}
 | |
|     );
 | |
|     browser.loadURI(extensionUrl, { triggeringPrincipal });
 | |
|   });
 | |
| }
 |