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
		
	
			
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | |
| /* 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/. */
 | |
| 
 | |
| const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
 | |
| const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 | |
| 
 | |
| const STRING_BUNDLE_URI = "chrome://browser/locale/feeds/subscribe.properties";
 | |
| 
 | |
| function WebProtocolHandlerRegistrar() {
 | |
| }
 | |
| 
 | |
| WebProtocolHandlerRegistrar.prototype = {
 | |
|   get stringBundle() {
 | |
|     let sb = Services.strings.createBundle(STRING_BUNDLE_URI);
 | |
|     delete WebProtocolHandlerRegistrar.prototype.stringBundle;
 | |
|     return WebProtocolHandlerRegistrar.prototype.stringBundle = sb;
 | |
|   },
 | |
| 
 | |
|   _getFormattedString(key, params) {
 | |
|     return this.stringBundle.formatStringFromName(key, params, params.length);
 | |
|   },
 | |
| 
 | |
|   _getString(key) {
 | |
|     return this.stringBundle.GetStringFromName(key);
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * See nsIWebProtocolHandlerRegistrar
 | |
|    */
 | |
|   removeProtocolHandler(aProtocol, aURITemplate) {
 | |
|     let eps = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
 | |
|               getService(Ci.nsIExternalProtocolService);
 | |
|     let handlerInfo = eps.getProtocolHandlerInfo(aProtocol);
 | |
|     let handlers =  handlerInfo.possibleApplicationHandlers;
 | |
|     for (let i = 0; i < handlers.length; i++) {
 | |
|       try { // We only want to test web handlers
 | |
|         let handler = handlers.queryElementAt(i, Ci.nsIWebHandlerApp);
 | |
|         if (handler.uriTemplate == aURITemplate) {
 | |
|           handlers.removeElementAt(i);
 | |
|           let hs = Cc["@mozilla.org/uriloader/handler-service;1"].
 | |
|                    getService(Ci.nsIHandlerService);
 | |
|           hs.store(handlerInfo);
 | |
|           return;
 | |
|         }
 | |
|       } catch (e) { /* it wasn't a web handler */ }
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * Determines if a web handler is already registered.
 | |
|    *
 | |
|    * @param aProtocol
 | |
|    *        The scheme of the web handler we are checking for.
 | |
|    * @param aURITemplate
 | |
|    *        The URI template that the handler uses to handle the protocol.
 | |
|    * @return true if it is already registered, false otherwise.
 | |
|    */
 | |
|   _protocolHandlerRegistered(aProtocol, aURITemplate) {
 | |
|     let eps = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
 | |
|               getService(Ci.nsIExternalProtocolService);
 | |
|     let handlerInfo = eps.getProtocolHandlerInfo(aProtocol);
 | |
|     let handlers =  handlerInfo.possibleApplicationHandlers;
 | |
|     for (let i = 0; i < handlers.length; i++) {
 | |
|       try { // We only want to test web handlers
 | |
|         let handler = handlers.queryElementAt(i, Ci.nsIWebHandlerApp);
 | |
|         if (handler.uriTemplate == aURITemplate) {
 | |
|           return true;
 | |
|         }
 | |
|       } catch (e) { /* it wasn't a web handler */ }
 | |
|     }
 | |
|     return false;
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * See nsIWebProtocolHandlerRegistrar
 | |
|    */
 | |
|   registerProtocolHandler(aProtocol, aURI, aTitle, aDocumentURI, aBrowserOrWindow) {
 | |
|     aProtocol = (aProtocol || "").toLowerCase();
 | |
|     if (!aURI || !aDocumentURI) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     let browser = aBrowserOrWindow; // This is the e10s case.
 | |
|     if (aBrowserOrWindow instanceof Ci.nsIDOMWindow) {
 | |
|       // In the non-e10s case, grab the browser off the same-process window.
 | |
|       let rootDocShell = aBrowserOrWindow.docShell.sameTypeRootTreeItem;
 | |
|       browser = rootDocShell.QueryInterface(Ci.nsIDocShell).chromeEventHandler;
 | |
|     }
 | |
| 
 | |
|     let browserWindow = browser.ownerGlobal;
 | |
|     try {
 | |
|       browserWindow.navigator.checkProtocolHandlerAllowed(aProtocol, aURI, aDocumentURI);
 | |
|     } catch (ex) {
 | |
|       // We should have already shown the user an error.
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     // If the protocol handler is already registered, just return early.
 | |
|     if (this._protocolHandlerRegistered(aProtocol, aURI.spec)) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     // Now Ask the user and provide the proper callback
 | |
|     let message = this._getFormattedString("addProtocolHandlerMessage",
 | |
|                                            [aURI.host, aProtocol]);
 | |
| 
 | |
|     let notificationIcon = aURI.prePath + "/favicon.ico";
 | |
|     let notificationValue = "Protocol Registration: " + aProtocol;
 | |
|     let addButton = {
 | |
|       label: this._getString("addProtocolHandlerAddButton"),
 | |
|       accessKey: this._getString("addProtocolHandlerAddButtonAccesskey"),
 | |
|       protocolInfo: { protocol: aProtocol, uri: aURI.spec, name: aTitle },
 | |
| 
 | |
|       callback(aNotification, aButtonInfo) {
 | |
|         let protocol = aButtonInfo.protocolInfo.protocol;
 | |
|         let name     = aButtonInfo.protocolInfo.name;
 | |
| 
 | |
|         let handler = Cc["@mozilla.org/uriloader/web-handler-app;1"].
 | |
|           createInstance(Ci.nsIWebHandlerApp);
 | |
|         handler.name = name;
 | |
|         handler.uriTemplate = aButtonInfo.protocolInfo.uri;
 | |
| 
 | |
|         let eps = Cc["@mozilla.org/uriloader/external-protocol-service;1"].
 | |
|           getService(Ci.nsIExternalProtocolService);
 | |
|         let handlerInfo = eps.getProtocolHandlerInfo(protocol);
 | |
|         handlerInfo.possibleApplicationHandlers.appendElement(handler);
 | |
| 
 | |
|         // Since the user has agreed to add a new handler, chances are good
 | |
|         // that the next time they see a handler of this type, they're going
 | |
|         // to want to use it.  Reset the handlerInfo to ask before the next
 | |
|         // use.
 | |
|         handlerInfo.alwaysAskBeforeHandling = true;
 | |
| 
 | |
|         let hs = Cc["@mozilla.org/uriloader/handler-service;1"].
 | |
|           getService(Ci.nsIHandlerService);
 | |
|         hs.store(handlerInfo);
 | |
|       },
 | |
|     };
 | |
|     let notificationBox = browser.getTabBrowser().getNotificationBox(browser);
 | |
|     notificationBox.appendNotification(message,
 | |
|                                        notificationValue,
 | |
|                                        notificationIcon,
 | |
|                                        notificationBox.PRIORITY_INFO_LOW,
 | |
|                                        [addButton]);
 | |
|   },
 | |
| 
 | |
|   classID: Components.ID("{efbd7b87-9b15-4684-abf0-dc2679daadb1}"),
 | |
| 
 | |
|   /**
 | |
|    * See nsISupports
 | |
|    */
 | |
|   QueryInterface: ChromeUtils.generateQI([Ci.nsIWebProtocolHandlerRegistrar]),
 | |
| };
 | |
| 
 | |
| this.NSGetFactory =
 | |
|   XPCOMUtils.generateNSGetFactory([WebProtocolHandlerRegistrar]);
 |