Hatena::ブログ(Diary)

プログラミングノート RSSフィード

2009-07-18

[]Firefox拡張(アドオン)開発入門

この間アドオンを開発したのですが、開発に入るまで少し時間がかかって面倒だったので、初めて開発する際にさくっと作れるようにまとめました。


簡単なサンプルを作った後、参考URLに挙げているサイトで詳細な解説を見ると理解しやすいと思います。(Firefox3.0と3.5で動作確認済みです)


準備

開発を始める際に、一度だけ行えばよい設定です。


開発用プロファイル作成

予想外のトラブルでFirefoxが利用できなくなる可能性があるので、アドオン開発用のプロファイルを作成しておきます。プロファイルマネージャーの起動は下記オプションで。

Mac
/Applications/Firefox.app/Contents/MacOS/firefox -ProfileManager

Windows
C:\...\Mozilla Firefox> firefox -p

about:configの設定

URLにabout:configと入力し、下記変数の値をtrueに設定します。

現在値が設定されていないものについては右クリック「新規作成 > 真偽値」で追加します。

javascript.options.showInConsoleJavaScriptのエラーをエラーコンソールに出力する
javascript.options.strictJavaScriptのエラーを厳密にする
browser.dom.window.dump.enableddump関数で文字列を出力可能にする
nglayout.debug.disable_xul_cacheXULのキャッシュを無効にする

DOM Inspectorのインストール

ブラウザ構成要素(メニューバーとか)の情報を取得するために必要です。

https://addons.mozilla.org/ja/firefox/addon/6622


開発

ここからアドオンの実装です。


必要ファイルの作成

今回は下記のファイルを準備します。

開発用の作業ディレクトリ
/Users/ntaku/extensions/hello
/Users/ntaku/extensions/hello/install.rdf
/Users/ntaku/extensions/hello/chrome.manifest

メインスクリプトを設置するディレクトリ
/Users/ntaku/extensions/hello/content
/Users/ntaku/extensions/hello/content/overlay.xul
/Users/ntaku/extensions/hello/content/overlay.js

install.rdf

インストール情報を記述した設定ファイルです。

アドオンの基本情報、対応させるFirefoxのバージョンを指定します。

id アドオンを識別するためのID
name名称
versionバージョン
description説明
creator開発者
targetApplication対応させるアプリケーションの情報
<?xml version="1.0"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
           xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <RDF:Description RDF:about="urn:mozilla:install-manifest">
    <em:id>hello@ntaku.development.com</em:id>
    <em:name>hello</em:name>
    <em:version>0.1</em:version>
    <em:description>サンプルアプリケーション</em:description>
    <em:creator>ntaku</em:creator>
    <em:targetApplication>
       <RDF:Description em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
                    em:minVersion="3.0"
                    em:maxVersion="3.5.*" />
    </em:targetApplication>
  </RDF:Description>
</RDF:RDF>

chrome.manifest

アドオンのパッケージ情報を記述した設定ファイルです。

アドオンで利用するディレクトリを登録します。

content hello content/
overlay chrome://browser/content/browser.xul chrome://hello/content/overlay.xul

overlay.xul

GUIを定義するXUL(ズール)ファイルです。

ここで定義したGUIがFirefoxのブラウザウィンドウへオーバーレイされます。

<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/x-javascript" src="chrome://hello/content/overlay.js" />
  <popup id="contentAreaContextMenu">
    <menuitem id="hello-menu" label="Hello" oncommand="Hello.init();" />
  </popup>  
</overlay>

ここではコンテキストメニューのIDを指定して、その場所に新規アイテムを追加しています。DOM Inspectorを開いてURLにchrome://browser/content/browser.xulと入力してみてください。Firebugのような感覚でブラウザ構成要素のIDを調査できます。


overlay.js

具体的な処理を記述します。

xulの中にもJSを記述できますが、あまり好ましくないので分離します。

var Hello = {
  init: function(){
    var doc = window.content.document;
    var p = doc.getElementById("hello-popup");
    if(!p){
      var popup = doc.createElement("div");
      popup.setAttribute("id", "hello-popup");
      doc.body.appendChild(popup);
      p = doc.getElementById("hello-popup");
    }
    var s = p.style;
    s.position = "absolute";
    s.top = 0;
    s.left = 0;
    s.width = "100%";
    s.background = "#fff398";
    p.innerHTML = "<div>HELLO</div>";
  }
};

画面の上部にHELLOと表示するだけのスクリプトです。今回は特に気にしていませんが、アドオン内で指定するIDは他のアドオンと被らないように工夫した方がよいです。


デバッグ用インストール

上記ファイルが全て準備できたら、デバッグ用にインストールしてみます。


ソースファイルからインストールするには、作業ディレクトリのパスを記述したファイルをextensionsディレクトリに設置するだけでOKです。


ファイル名はinstall.rdfで指定したアプリケーションID(hello@ntaku.development.com)です。

/Users/ntaku/extensions/hello

extensionsディレクトリ

Mac
~/Library/Application Support/Firefox/Profiles/xxx/extentions/

Windows
C:\Documents and Settings\user\Application Data\Mozilla\Firefox\Profiles\xxx\extensions

この状態でFirefoxを再起動するとアドオンがインストールされます。

インストール後に処理を修正した場合は、Firefoxを再起動するか、新規ウィンドウを開けば適応されます。


インストーラー作成

開発が終了したらファイルをxpi形式でまとめて配布できるようにします。

ファイル構成が少し変わって、下記のようにまとめる必要があります。

/Users/ntaku/extensions/hello
/Users/ntaku/extensions/hello/chrome.manifest
/Users/ntaku/extensions/hello/install.rdf
/Users/ntaku/extensions/hello/chrome              ← 変更
/Users/ntaku/extensions/hello/chrome/hello.jar   ← 変更

hello.jarにはcontentディレクトリが含まれています。


構成が変わったので、chrome.manifestを少し変更します。

content hello jar:chrome/hello.jar!/content/      ← 変更
overlay chrome://browser/content/browser.xul chrome://hello/content/overlay.xul

最後に全てのファイルをzipで固めて拡張子をxpiに変更すればインストーラーの完成です。

xpiファイルをFirefoxにD&Dすればインストールできます。


xpi生成スクリプト

下記のようなスクリプトで上記作業を自動化できます

#!/bin/bash
cd /Users/ntaku/extensions
cp -r hello hello-xpi
sed 's/hello content\//hello jar:chrome\/hello.jar!\/content\//' hello/chrome.manifest > hello-xpi/chrome.manifest
cd hello-xpi
mkdir chrome
zip -r chrome/hello.jar content
rm -rf content
zip -r hello.xpi chrome install.rdf chrome.manifest
mv hello.xpi ~/Desktop
cd ..
rm -rf hello-xpi

参考

より詳しく知りたい方は続けて下記サイトをどうぞ。


ten13ten13 2009/10/20 17:10 FF3.5 で「デバッグ用インストール」まで終えて再起動したのですが、 再起動後にツールのアドオンを確認しても Hello アドオンの名前は現れません。ファイルの内容は十分確認したつもりなのですが、他に確認すべきところってありませんでしょうか?宜しければ、どうかアドバイスをお願い申し上げます。

ntakuntaku 2009/10/20 20:40 3.5.3でプロファイル新規作成して試してみたのですが、記載内容で問題はないようでした(全部コピペでやったので)。1点分かりづらいかと思ったところが、hello@ntaku.development.comの設置なのですが、これはファイル名が「hello@ntaku.development.com」で、ファイルの中身が「/Users/ntaku/extensions/hello」になっています。このファイルの記述、設置場所が間違っていたりしないでしょうか?

ten13ten13 2009/10/20 22:53 ポインタ ファイル hello@ntaku.development.com に関しては、正しく認識して作成してありました。が、試行錯誤しているうちに、ファイル名 install.rdf を途中から間違えて index.rdf にしている事に気が付きました。お恥ずかしい。。
FF3.5.3+WinXP で、プロファイルを新たに作成して試したのですが、やはりアドオンマネージャには何も現れず。間違いがないか、もう少し自分で確認してみます。わざわざお手数を割いて下さり、ありがとうございました。

daemadaema 2009/10/24 07:43 とっつきやすく大変参考になりました。

>ten13
hello@ntaku.development.comファイルに記載するパスの区切り文字は\\(¥二つ)になってますか。
ex)D:\\hoge\\hoge

kojikoji 2009/11/04 22:22 この方法で作ったところ起動時に
「Firefox はパッケージ中の "install.rdf" が正しくないまたは存在しないため、インストールできませんでした。この問題について作者に問い合わせてください」
とダイアログが表示されました。ちなみに直接フォルダをコピペしています。
またここでいうhello@ntaku.development.comファイルのを作らず、helloフォルダの名前をhello@ntaku.development.comという風にしています。

解決させたいので、是非アドバイスをお願いいたします。

hisahisa 2011/02/19 18:02 いまさらですが、文字コードではないでしょうか?
日本語を含むファイルの場合、UTF-8のBOMなしである必要があるみたいです。