mozilla

JS XPCOM

UWAGA: Tłumaczenie tej strony nie zostało zakończone.
Może być ona niekompletna lub wymagać korekty.
Chcesz pomóc? | Dokończ tłumaczenie | Sprawdź ortografię | Więcej takich stron+.
Na tej stronie znajduje się kilka fragmentów kodu, użytecznych przy tworzeniu z komponentami XPCOM w JavaScript.

ID kontraktów

ID kontraktu przyznaje unikalną nazwę dla obiektu XPCOM. ID używane są do tworzenia lub uzyskiwania dostępu do obiektów XPCOM.

Interfejsy

Wszystkie obiekty XPCOM implementują jeden lub więcej interfejsów. Interfejs jest, upraszczając, listą stałych i metod, które można wywołać przez obiekt. Przykładem jest nsIFile. Każdy obiekt XPCOM musi posiadać zaimplementowany interfejs nsISupports.

Uzyskiwanie dostępu do komponentów XPCOM z poziomu JavaScript

Obiekty XPCOM są tworzone jako nowe instacje (każda oznacza kompletnie nowy obiekt) lub jako usługi (każdy dostęp dotyczy tego samego obiektu, nazywanego singletonem). Od danego obiektu zależy to, czy musisz stworzyć instację czy dostęp poprzez usługę. Chronologicznie, by dostać się do obiektu XPCOM, musisz znać ID kontraktu obiektu oraz interfejs, który chciałbyś na nim użyć.

Tworzenie instancji komponentu

var component = Components.classes["@mozilla.org/file/local;1"]
                          .createInstance(Components.interfaces.nsIFile);

Powyższy kod tworzy nową instację obiektu z ID kontraktu @mozilla.org/file/local;1 i daje ci możliwość wywoływania metody interfejsu nsIFile na ID.

Otrzymywanie usługi XPCOM

var preferences = Components.classes["@mozilla.org/preferences-service;1"]
                            .getService(Components.interfaces.nsIPrefService);

Dzięki temu fragmentowi kodu, możesz wywoływać metody interfejsu nsIPrefService na preferencjach obiektu.

Otrzymywanie różnych interfejsów jednego komponentu

Niektóre komponenty posiadają możliwość implementacji więcej niż jednego interfejsu. Czasami JavaScript zna wszystkie wszystkie możliwe dla komponentu interfejsu, ale w większości przypadków będziesz samodzielnie to sprawdzić. Z preferencjami usługi z poprzedniego przykładu, możemy napisać dalej:

preferences = preferences.QueryInterface(Components.interfaces.nsIPrefBranch2);

Powyższa linijka umożliwia ci używanie metod interfejsu nsIPrefBranch2.

Implementacja komponentów XPCOM w JavaScript

Poniżej znajduje się prosty zalążek komponentu XPCOM w JavaScript. W dokładnie takiej kolejności, musisz wykonać następujące kroki:

  • Zmienić 3 łańcuchy na początku initModule na własne.
  • Zmienić testowanie w metodzie QueryInterface umożliwiając sobie pracę z obojętnie jakimi interfejsami, które zaimplementujesz.
  • Dodać do prototypu metody, które pojawią się w implementowanym interfejsie.
  • Dodać kody inicjacji do konstruktora ExampleComponent.
function ExampleComponent()
{
	// Dodaj tutaj inicjację twego komponentu.
}

ExampleComponent.prototype = {
QueryInterface: function(iid)
{
	if (iid.equals(Components.interfaces.myInterface)
		|| iid.equals(Ci.nsISupports))
	{
		return this;
	}
	else
	{
		throw Components.results.NS_ERROR_NO_INTERFACE;
	}
}
};

var initModule =
{
	ServiceCID: Components.ID("{examplee-xamp-leex-ampl-eexampleexam}"),  // Insert a guid in the quotes
	ServiceContractID: "@example.com/example;1",                          // W cudzysłowiach wpisz ID kontraktu
	ServiceName: "",                                                      // W cudzysłowiach wpisz nazwę
	
	registerSelf: function (compMgr, fileSpec, location, type)
	{
		compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
		compMgr.registerFactoryLocation(this.ServiceCID,this.ServiceName,this.ServiceContractID,
			fileSpec,location,type);
	},

	unregisterSelf: function (compMgr, fileSpec, location)
	{
		compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
		compMgr.unregisterFactoryLocation(this.ServiceCID,fileSpec);
	},

	getClassObject: function (compMgr, cid, iid)
	{
		if (!cid.equals(this.ServiceCID))
			throw Components.results.NS_ERROR_NO_INTERFACE
		if (!iid.equals(Components.interfaces.nsIFactory))
			throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
		return this.instanceFactory;
	},

	canUnload: function(compMgr)
	{
		return true;
	},

	instanceFactory:
	{
		createInstance: function (outer, iid)
		{
			if (outer != null)
				throw Components.results.NS_ERROR_NO_AGGREGATION;
			return new ExampleComponent().QueryInterface(iid);
		}
	}
}; //Module

function NSGetModule(compMgr, fileSpec)
{
	return initModule;
}

Autorzy i etykiety dokumentu

Contributors to this page: Ptak82, Mgjbot, zarat
Ostatnia aktualizacja: zarat,