JS XPCOM

 

JavaScript で XPCOM コンポーネントを利用するためのいくつかの有用なコードを示します。

コンタクト ID

コンタクト ID は XPCOM オブジェクトの固有の名前になります。XPCOM で既知のオブジェクトを作成もしくはアクセスするときに利用します。

インターフェース

全ての XPCOM オブジェクトは、一つ以上のインターフェースをもちます。インターフェースは簡単には、nsIFile のようなオブジェクト上で呼び出せる定数やメソッドのリストです。全ての XPCOM オブジェクトは、nsISupports インターフェースを実装していなければなりません。

JavaScript から XPCOM コンポーネントにアクセスする

XPCOM オブジェクトは新規インスタンスとして作成 (完全に新しいオブジェクトが戻ります) するか、もしくはサービスとして作成 (同じオブジェクトが戻ります。シングルトンと呼ばれてもいます。) することが可能です。新しいインスタンスとして作成するかサービスとしてアクセスするかはオブジェクトに依存します。XPCOM オブジェクトを取得するには、オブジェクトのコンタクト ID と呼び出したいインターフェースを知っておく必要があります。

コンポーネントのインスタンスを作成する

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

このコードにより、コンタクト ID が @mozilla.org/file/local;1 のオブジェクトへの新しいインスタンスが生成され、nsIFile インターフェースの全てのメソッドを呼ぶことができます。

XPCOM サービスを取得する

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

このコードにより、設定オブジェクトの nsIPrefService インターフェースの全てのメソッドを呼ぶことができます。

コンポーネントの別のインターフェースを取得する

コンポーネントによっては一つ以上のインターフェースを自走しています。時によっては JavaScript はコンポーネントに存在する全てのインターフェースを認識するほど賢いですが、ほとんどの場合はあなたがインターフェースをチェックする必要があります。先ほどの設定サービスのサンプルでは次のように調べます。

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

このコードにより、nsIPrefBranch2 インターフェースのメソッドを利用できるようになります。

XPCOM コンポーネントを JavaScript で実装する

JavaScript による XPCOM コンポーネントの簡単なサンプルです。利用するためには、次のことをする必要があります。

  • initModule の最初の 3 行をあなた自身のものに入れ替える
  • QueryInterface メソッドのテスト (equals 内部) をあなたが実装しようとしているインターフェースに置き換える
  • プロトタイプに実装しようとしているインターフェースのメソッドを追加する
  • ExsampleComponent コンストラクタに初期化コードを必要なら追加する
function ExampleComponent()
{
        // コンポーネントの初期化コードはここに追加
}

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}"),  // quote の中に guid を追加
	ServiceContractID: "@example.com/example;1",                          // quote の中にコンタクト ID を挿入
	ServiceName: "",                                                      // quote の中に名前を挿入
	
	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;
}

 

 

 

<hints id="hah_hints"/>

ドキュメントのタグと貢献者

 このページの貢献者: mooz, Shimono, Mgjbot
 最終更新者: mooz,