Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo construir componentes XPCOM con javascript

Cómo construir componentes XPCOM con javascript

Implementación

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();

};

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;}