Cómo construir componentes XPCOM con javascript
Este componente expondrá un método que devuelve "¡Hola mundo!"
Definir una interfaz
Si desea utilizar su interfaz en JavaScript, o llamarla desde otros componentes XPCOM, debe definir una interfaz abierta (si su componente solo está en Javascript, Puede utilizar la técnica envueltoJSObject para evitar la interfaz creada aquí (ver ejemplo aquí).
Hay muchas interfaces definidas en las aplicaciones de Mozilla, por lo que es posible que no necesites definir otra interfaz. Las interfaces XPCOM existentes se pueden explorar en el código fuente de Mozilla o utilizando XPCOMviewer, una herramienta GUI para explorar interfaces y componentes registrados. Se puede descargar un navegador anterior compatible con Firefox 1.5, disponible en el mirror de mozdev.
Si una interfaz existente satisface sus necesidades, entonces no necesita escribir un IDL, compilar typelib y simplemente omitir la siguiente sección.
Si no encuentra una interfaz adecuada existente, debe definirla usted mismo. XPCOM utiliza una versión modificada de IDL para definir interfaces, llamada XPIDL. La siguiente es la definición XPIDL del componente HelloWorld:
HelloWorld.idl
#Contiene "nsISupports.idl"
[Scriptable, uuid(xxxxxxxx-xxxx - xxxx-xxxx-xxxxxxxxxxxx)]
Interfaz nsIHelloWorld: nsISupports
{
cadena hello();
}; p >
Tenga en cuenta que debe crear un UUID para cada componente XPCOM. Consulte Generación de GUID.
Biblioteca de tipos de compilación
La definición de su interfaz debe compilarse en un binario (XPT) para poder registrarse y usarse en aplicaciones Mozilla. La compilación está disponible en wiki.mozilla.org utilizando el SDK de Gecko. Versiones de Windows y Linux del SDK. Compilé una versión para Mac del SDK (rama 1.8, OS X PPC 10.4) y la puse aquí temporalmente.
Ejecute el siguiente comando para compilar typelib. Donde {sdk_dir} es el directorio donde se encuentra Gecko SDK.
{ SDK _ dir }/bin/xpidl-m typelib-w-v-I { SDK _ dir }/IDL-e hola mundo . xpt hola mundo
Esto estará en el. directorio actual Cree un archivo typelib HelloWorld.xpt.
Crear un ensamblado
HelloWorld.js
/************************ ************************************
Constante
*************************************************** *** ***********/
//Referencia a la interfaz definida en nsIHelloWorld.idl
const nsiihelloworld = interfaces.
p>//Referencia a la interfaz base requerida que todos los componentes deben admitir
const NSI admite = componentes que NSI admite;
//Exclusivamente. identifica nuestro componente El UUID
//se puede obtener de:/helloworld 1";
/****************** ******* *************************************
Definición de categoría
****************************************** ***** *************/
//Constructor de clases
Función HolaMundo() {
} ;
//Definición de clase
HelloWorld.prototype = {
//Definir las funciones que queremos exponer en la interfaz
Hola: función ( ){
Responder a "¡Hola mundo! ";
},
Interfaz de consulta: función (aIID)
{
Si (!aiid . es igual a(nshelloworld) y amp& amp
! aiid . igual (nsis admite))
tirar resultados .ns _ ERROR _ NO _ INTERFACE; p> p>
}
};
/*************************** ***** *************************************
Fábrica de clases
Este objeto es miembro del alcance global Components.classes
No tiene nada que ver con el ID del contrato. Por ejemplo:
my hello world =. Componentes.clases["@dietrich.ganx4.com/helloworld; 1 "].
crear instancia(componentes . interfaces . NSI hola mundo);
****** ******************* ********************************** ********/
var HelloWorldFactory = {
crear instancia:función(aoouter, aIID)
{
if (aOuter!=null)
lanzar resultados. ns_ERROR_NO_AGGREGATION;
devolver (nuevo HelloWorld()).
interfaz de consulta(aIID);
}
};
/********************* ***** *******************************************
Definición del módulo (registro xpcom)
********************************* ********* *******************/
var HelloWorldModule = {
_firstTime: verdadero ,
registrarSelf: función(aCompMgr, aFileSpec, aLocation, aType)
{
aCompMgr = aCompMgr.
interfaz de consulta(componentes . interfaces . nsiconterranger);
acompmgr . Registerfactorylocation(CLASS_ID, CLASS_NAME,
CONTRACT_ID, aFileSpec, aLocation, en tipo);
},
darse de baja self:function(aCompMgr, aLocation, aType)
{
aCompMgr = aCompMgr.
interfaz de consulta(componentes . interfaces . nsiconterranger);
acompmgr . unregisterfactorylocation(CLASS _ ID, una ubicación
},
obtener objeto de clase: función (aCompMgr, aCID, aIID)
{
if (!aiid . equals(components . interfaces . NSI factory))
lanzar resultados de componentes. ns _ ERROR _ NOT _ IMPLEMENTED;
if (aCID.equals(CLASS_ID))
Devolver HelloWorldFactory
lanzar resultados. ns _ ERROR _ NO _ INTERFACE;
},
puede descargar:función(aCompMgr){ return true;}
};
/************************************************ ** *************
Inicialización del módulo
Esta función
se llama cuando la aplicación registra el componente.
********************************************* *** ****************/
Función NSGetModule(aCompMgr, aFileSpec){ devolver módulo hola mundo;}