Firefox 拡張機能プログラミングのメモ

最終更新日: 2008年 2月 11日

HomeBack

  1. 拡張機能用ディレクトリのフルパスを取得
  2. テキストファイルを1行づつ読み込む

  1. メニュー、メニューアイテムの追加
  2. XMLファイル処理
  3. documentオブジェクトの要素を表示


ここは、以下にあるプログラムを参考にしています。
mozilla developer centerのFile I/O関連サンプル

拡張機能用ディレクトリのフルパスを取得

拡張機能用ディレクトリのフルパスを取得

例.
function getExtensionDir(id) {
	var ext = Components.classes["@mozilla.org/extensions/manager;1"]
                    .getService(Components.interfaces.nsIExtensionManager)
                    .getInstallLocation(id)
                    .getItemLocation(id); 
	// ext は nsIFile のインスタンス、ext.path はディレクトリ文字列を保持します
	return ext.path;
}			

テキストファイルを1行づつ読み込む

この例では、まず拡張機能が置かれているディレクトリのフルパスの文字列をgetExtensionDIr関数で取得します。 そして、そのディレクトリにある"example.txt"というテキストファイルを開き、1行づつ読み込みます。

	var extPath = getExtensionDir('extest@aaa.net');
	var file = Components.classes["@mozilla.org/file/local;1"]
                      .createInstance(Components.interfaces.nsILocalFile);

	file.initWithPath(extPath + '\\exampe.txt');

	// file から入力ストリームを開く
	var istream = Components.classes["@mozilla.org/network/file-input-stream;1"]
    	                    .createInstance(Components.interfaces.nsIFileInputStream);
	istream.init(file, 0x01, 0444, 0);
	istream.QueryInterface(Components.interfaces.nsILineInputStream);

	// 行を配列に読み込む
	var line = {}, lines = [], hasmore;
	do {
		hasmore = istream.readLine(line);	// 1行読み込む
		lines.push(line.value); 
	} while(hasmore);
	istream.close();

	// データで何かする
	//alert(lines);			

メニュー、メニューアイテムの追加

要素を別の要素の子要素として追加する場合、以下の関数を使用します。
appendChild()
insertBefore()
replaceChild()
削除ではremoveChild()を使用します

注意. ポップアップを持つ新しいメニューを追加する場合は、appehdChildを実行するタイミングに 注意すること。

以下の場合では追加されたはずのメニューが表示されません。
	const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
	 // 新しい XUL メニューアイテムを作成する
	var menu = document.createElementNS(XUL_NS, "menu");
	menu.setAttribute("label", "testMenu");
	menu.setAttribute("id", "testMenu");

	var popup = document.getElementById("cpdev-popup-menu");
	popup.appendChild(menu);		// この位置が問題!!!

	var newPopup = document.createElementNS(XUL_NS, 'menupopup');
	menu.appendChild(newPopup);

	// 新しい XUL メニューアイテムを作成する
	var item = document.createElementNS(XUL_NS, "menuitem");
	item.setAttribute("label", 'aaaa');
	newPopup.appendChild(item);
正しいのは、新規メニュにポップアップを登録(appendChild)後、親ポップアップに登録します。 メニューアイテムの登録は、その後でも可能です。
	var newPopup = document.createElementNS(XUL_NS, 'menupopup');
	menu.appendChild(newPopup);

	var popup = document.getElementById("cpdev-popup-menu");
	popup.appendChild(menu);    // これが menu.appendChild(newPopup)の後に来ること

XMLファイル処理

	var req = new XMLHttpRequest();
	req.open('GET', 'file:///d:/Develop/test.xml', false);
	req.send(null);
	if (0 != req.status) {
		this.debug.dump('XMLファイルを開けませんでした');
		return;
	}
	var dom = req.responseXML;
	if (dom.documentElement.nodeName == "parsererror") {
		this.debug.dump("error while parsing");
		return;
	}
	this.debug.dump('XML:' + dom.documentElement.nodeName);
	・・・//処理・・・
		
注意. req.open('GET', XMLファイルのパス)のように第3引数のfalseを指定忘れた場合、 req.repsonseXMLはnullを返します。 そして、dom.documentElement.nodeNameで処理がストップされますが、 エラーコンソールには何も表示されず、エラー原因に気がつき難いので、第3引数のfalseは 忘れないように。

参考

documentオブジェクトの要素を表示

以下のJavaScriptでdocumentオブジェクトの要素をalertで確認することができます。

	var pr = ""; var i = 0; for (var s in document ) { pr = pr + "  " + s ; }; alert(pr);
			



HomeBack