forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
 | |
|  * vim: sw=2 ts=2 sts=2 et filetype=javascript
 | |
|  * 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/. */
 | |
| 
 | |
| /**
 | |
|  * Deprecated utilities for JavaScript components loaded by the JS component
 | |
|  * loader.
 | |
|  *
 | |
|  * Import into a JS component using
 | |
|  * 'Components.utils.import("resource://gre/modules/ComponentUtils.jsm");'
 | |
|  *
 | |
|  * Exposing a JS 'class' as a component using these utility methods consists
 | |
|  * of several steps:
 | |
|  * 0. Import ComponentUtils, as described above.
 | |
|  * 1. Declare the 'class' (or multiple classes) implementing the component(s):
 | |
|  *  function MyComponent() {
 | |
|  *    // constructor
 | |
|  *  }
 | |
|  *  MyComponent.prototype = {
 | |
|  *    // properties required for XPCOM registration:
 | |
|  *    classID:          Components.ID("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"),
 | |
|  *
 | |
|  *    // [optional] custom factory (an object implementing nsIFactory). If not
 | |
|  *    // provided, the default factory is used, which returns
 | |
|  *    // |(new MyComponent()).QueryInterface(iid)| in its createInstance().
 | |
|  *    _xpcom_factory: { ... },
 | |
|  *
 | |
|  *    // QueryInterface implementation, e.g. using the generateQI helper
 | |
|  *    QueryInterface: ChromeUtils.generateQI(
 | |
|  *      [Components.interfaces.nsIObserver,
 | |
|  *       Components.interfaces.nsIMyInterface,
 | |
|  *       "nsIFoo",
 | |
|  *       "nsIBar" ]),
 | |
|  *
 | |
|  *    // The following properties were used prior to Mozilla 2, but are no
 | |
|  *    // longer supported. They may still be included for compatibility with
 | |
|  *    // prior versions of ComponentUtils. In Mozilla 2, this information is
 | |
|  *    // included in the .manifest file which registers this JS component.
 | |
|  *    classDescription: "unique text description",
 | |
|  *    contractID:       "@example.com/xxx;1",
 | |
|  *
 | |
|  *    // ...component implementation...
 | |
|  *  };
 | |
|  *
 | |
|  * 2. Create an array of component constructors (like the one
 | |
|  * created in step 1):
 | |
|  *  var components = [MyComponent];
 | |
|  *
 | |
|  * 3. Define the NSGetFactory entry point:
 | |
|  *  this.NSGetFactory = ComponentUtils.generateNSGetFactory(components);
 | |
|  */
 | |
| 
 | |
| var EXPORTED_SYMBOLS = ["ComponentUtils"];
 | |
| 
 | |
| const nsIFactoryQI = ChromeUtils.generateQI(["nsIFactory"]);
 | |
| 
 | |
| var ComponentUtils = {
 | |
|   /**
 | |
|    * Generate a NSGetFactory function given an array of components.
 | |
|    */
 | |
|   generateNSGetFactory: function XPCU_generateNSGetFactory(componentsArray) {
 | |
|     let classes = {};
 | |
|     for (let i = 0; i < componentsArray.length; i++) {
 | |
|         let component = componentsArray[i];
 | |
|         if (!(component.prototype.classID instanceof Components.ID))
 | |
|           throw Error("In generateNSGetFactory, classID missing or incorrect for component " + component);
 | |
| 
 | |
|         classes[component.prototype.classID] = this._getFactory(component);
 | |
|     }
 | |
|     return function NSGetFactory(cid) {
 | |
|       let cidstring = cid.toString();
 | |
|       if (cidstring in classes)
 | |
|         return classes[cidstring];
 | |
|       throw Cr.NS_ERROR_FACTORY_NOT_REGISTERED;
 | |
|     }
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * Returns an nsIFactory for |component|.
 | |
|    */
 | |
|   _getFactory: function XPCOMUtils__getFactory(component) {
 | |
|     var factory = component.prototype._xpcom_factory;
 | |
|     if (!factory) {
 | |
|       factory = {
 | |
|         createInstance: function(outer, iid) {
 | |
|           if (outer)
 | |
|             throw Cr.NS_ERROR_NO_AGGREGATION;
 | |
|           return (new component()).QueryInterface(iid);
 | |
|         },
 | |
|         QueryInterface: nsIFactoryQI
 | |
|       }
 | |
|     }
 | |
|     return factory;
 | |
|   },
 | |
| 
 | |
|   /**
 | |
|    * generates a singleton nsIFactory implementation that can be used as
 | |
|    * the _xpcom_factory of the component.
 | |
|    * @param aServiceConstructor
 | |
|    *        Constructor function of the component.
 | |
|    */
 | |
|   generateSingletonFactory:
 | |
|   function XPCOMUtils_generateSingletonFactory(aServiceConstructor) {
 | |
|     return {
 | |
|       _instance: null,
 | |
|       createInstance: function XPCU_SF_createInstance(aOuter, aIID) {
 | |
|         if (aOuter !== null) {
 | |
|           throw Cr.NS_ERROR_NO_AGGREGATION;
 | |
|         }
 | |
|         if (this._instance === null) {
 | |
|           this._instance = new aServiceConstructor();
 | |
|         }
 | |
|         return this._instance.QueryInterface(aIID);
 | |
|       },
 | |
|       QueryInterface: nsIFactoryQI
 | |
|     };
 | |
|   },
 | |
| };
 | 
