forked from mirrors/gecko-dev
		
	 e930b89c34
			
		
	
	
		e930b89c34
		
	
	
	
	
		
			
			***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8
This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:
  ChromeUtils.import("resource://gre/modules/Services.jsm");
is approximately the same as the following, in the new model:
  var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs
This was done using the followng script:
https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8
Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs
Differential Revision: https://phabricator.services.mozilla.com/D16750
--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
		
	
			
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			134 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");
 | |
| 
 | |
| const {ExtensionUtils} = 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});
 | |
|   });
 | |
| }
 |