forked from mirrors/gecko-dev
		
	 c0768c8f7c
			
		
	
	
		c0768c8f7c
		
	
	
	
	
		
			
			Depends on D5420 Differential Revision: https://phabricator.services.mozilla.com/D5421 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			135 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
	
		
			4.6 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.xul
 | |
| /* import-globals-from browser.js */
 | |
| /* import-globals-from nsContextMenu.js */
 | |
| 
 | |
| ChromeUtils.defineModuleGetter(this, "ExtensionParent",
 | |
|                                "resource://gre/modules/ExtensionParent.jsm");
 | |
| 
 | |
| ChromeUtils.import("resource://gre/modules/Services.jsm");
 | |
| ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm");
 | |
| 
 | |
| var {
 | |
|   promiseEvent,
 | |
| } = ExtensionUtils;
 | |
| 
 | |
| const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 | |
| 
 | |
| 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("webextension-view-type", panel.viewType);
 | |
|   browser.setAttribute("context", "contentAreaContextMenu");
 | |
|   browser.setAttribute("tooltip", "aHTMLTooltip");
 | |
|   browser.setAttribute("autocompletepopup", "PopupAutoComplete");
 | |
|   browser.setAttribute("selectmenulist", "ContentSelectDropdown");
 | |
| 
 | |
|   // Ensure that the browser is going to run in the same process of the other
 | |
|   // extension pages from the same addon.
 | |
|   browser.sameProcessAsFrameLoader = panel.extension.groupFrameLoader;
 | |
| 
 | |
|   let readyPromise;
 | |
|   if (panel.extension.remote) {
 | |
|     browser.setAttribute("remote", "true");
 | |
|     browser.setAttribute("remoteType",
 | |
|                          E10SUtils.getRemoteTypeForURI(panel.uri, true,
 | |
|                                                        E10SUtils.EXTENSION_REMOTE_TYPE));
 | |
|     readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
 | |
| 
 | |
|     window.messageManager.addMessageListener("contextmenu", openContextMenu);
 | |
|     window.addEventListener("unload", () => {
 | |
|       window.messageManager.removeMessageListener("contextmenu", openContextMenu);
 | |
|     }, {once: true});
 | |
|   } else {
 | |
|     readyPromise = Promise.resolve();
 | |
|   }
 | |
| 
 | |
|   stack.appendChild(browser);
 | |
| 
 | |
|   return readyPromise.then(() => {
 | |
|     browser.messageManager.loadFrameScript("chrome://browser/content/content.js", false, true);
 | |
|     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;
 | |
|   });
 | |
| }
 | |
| 
 | |
| // 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.createCodebasePrincipal(uri, {});
 | |
|     browser.loadURI(extensionUrl, {triggeringPrincipal});
 | |
|   });
 | |
| }
 |