Movatterモバイル変換


[0]ホーム

URL:


ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

この広告は、90日以上更新していないブログに表示しています。

Firefox 拡張の作り方 (2013 年版)

4 年前に Firefox 拡張機能の作り方についての記事を書いた のですが、いい加減内容が古いので、改めてFirefox 拡張を作ろうと思った人向けにFirefox 拡張の作り方について概要を記しておこうかと思います。

この記事の内容は古くなっています!!!!! (2015-12-15 追記)

タイトルにあるように、本記事は 2013 年に書かれたもので、現在ではすでに内容が古くなっています。 現在でも通用する部分もありますが、基本的には一から調べなおした方が良いと思います。

これ以降は古い内容である可能性がありますので、ご注意ください。

Firefox拡張機能の作り方は大きく分けて 3 とおり

3 種類の方法があるので、拡張機能を作り始める前にどの方法を使うかを決める必要があります。

  • Add-onSDK (または Add-on Builder) を使う方法
  • 従来からあるXUL オーバーレイを用いる方法 (ブートストラップ型ではないXUL ベースの拡張機能)
  • Add-onSDK を用いずにブートストラップ型拡張機能を作る方法 (ブートストラップ型のXUL ベースの拡張機能)

個人的な感触としては、上の方が初心者向けです。 最も多くのことができるのは従来からあるXUL オーバーレイを用いる方法です。 Add-onSDK を用いる方法が一番できることは少ないです (が、実験的にXPCOM の使用が可能になっているので、それを使えば他の 2 つでできるほとんどのことは可能になります)。

従来からあるXUL オーバーレイを用いる方法では、Firefox 拡張インストール後に再起動が必要です。 他の 2 つはインストール後のFirefox 再起動は不要です。

それぞれについての概要を以下で説明します。

Add-onSDK (または Add-on Builder) を使う方法

Add-onSDK はローカルホスト上の開発環境であり、Add-on Builder は web 上での開発環境です。 ローカルホスト上に環境構築できないなどの理由がなければ、Add-onSDK を使えばいいでしょう。 (これ以降、特に Add-on Builder については言及しませんが、基本的には Add-onSDK を使う場合と同じだと思います。 使ったことがないのでわかんないのですが。) ちなみに Add-onSDK は、昔はJetpackSDK と呼ばれていました。 Add-onSDK で開発したFirefox 拡張は、Firefox 4 以降にインストールできます。

Add-onSDK を使うと、主にJavaScript と HTML、CSS を使ってFirefox 拡張を開発することができます。 Add-onSDKAPI としてFirefox 拡張に必要な機能がある程度提供されているので、Firefox 独自のXUL*1XPCOM*2 について知らなくても、拡張機能を開発することができます。

Add-onSDK を使った開発のはじめかた

まずは Add-onSDK をインストールします。 下記ページが参考になります。

コマンドラインを使い慣れているなら、特に難しいところもないはずです。Python 2 系が必要になるので、場合によってはそれがちょっと面倒かもしれません。

Add-onSDK のインストールが完了したら、cfx コマンドが使えるようになります。 cfx コマンドを使うことで、Firefox 拡張の雛形を生成したり、開発中のFirefox 拡張を試してみたりテストを実行したりできます。

あとはチュートリアルなどを見れば、どのようなことができるのかわかると思います。

デバッグ用出力

チューリアルの 「開発テクニック」 の中にリンクがあるので改めて説明する必要はないかもしれませんが、特に最初は動作を調べる上で重要だと思いますのでここにも書いておきます。

Add-onSDK を使って開発する場合は、拡張機能のコードの中でconsole.log 関数などを使ってデバッグ出力を行うことが出来ます。cfx run によってFirefox を起動した場合は、そのコマンドラインconsole.log の出力が表示されます。 それ以外の場合は、Firefox のエラーコンソール (Ctrl + Shift + J で開くウィンドウ) に出力されます。

Add-onSDKAPI で提供されている機能では不足している場合

Firefox 拡張で可能な機能でも、全ての機能が Add-onSDKAPI で提供されているわけではありません。 例えばローカルファイルの操作などは Add-onSDKAPI では現在のところ不可能です。 そういった機能は、XPCOMコンポーネントとして提供されています。 Add-onSDK を使ってFirefox 拡張を開発する場合でもXPCOMコンポーネントは使用できますので、Add-onSDKAPI では不足する場合はXPCOMコンポーネントを直接使用しましょう。 下記ページが参考になります。

ただ、この機能は今のところ Add-onSDK の実験的な機能ということですので、XPCOMコンポーネントを使用しないといけないような拡張機能が作りたい場合はXUL ベースの拡張機能として開発する方が良さそうです。

従来からあるXUL オーバーレイを用いた拡張機能 (ブートストラップ型ではないXUL ベースの拡張機能)

Firefox の UI はXUL という言語で記述されています。 この開発方法ではFirefox アプリケーションの XUL を拡張機能側から上書きする (オーバーレイ) ことで UI を変更したり、読み込むJavaScript ファイルを決定したりします。拡張機能のメインのJavaScript ファイルは、オーバーレイしたXUL から読み込まれることで実行されるわけです。 (UI の変更自体は、XUL オーバーレイを使用しなくても、JS 側から DOM 操作で変更することも可能です。)

基本的には、DOM 操作によるXUL の変更やイベントハンドラの追加と、XPCOM コンポーネント を使用することで拡張機能としての処理を実装することになります。 例えば、アクティブなブラウザウィンドウを取得するのにもXPCOMコンポーネントを使用する必要があります。 (FUEL という拡張機能用のAPI もありますが、あまり主流ではなさそうです。)

他の 2 つの方法とは違い、この方法で開発したFirefox 拡張はインストール時にFirefox の再起動が必要となります。 また、他の開発方法ではFirefox 4 以降にしかインストールできませんが、この方法ではFirefox 3.6 やそれより前のFirefox にもインストールできる拡張機能を開発できます。

参考になるページ

従来からのXUL オーバーレイを用いた拡張機能については参考になるページが結構豊富なので、参考になるページを見ながら開発を進めると良いでしょう。

開発の流れ

開発の流れは、下記ページにまとまっています。

上記ページでは、XPI ファイルにパッケージングする際に JAR ファイルを作成していますが、実際にはわざわざ JAR ファイルを作成する必要はなく、全てまとめて ZIP 圧縮して拡張子を XPI に変更しても良いです。 もともと JAR ファイルに固めるようになっていたのはパフォーマンス上の理由からだったようですが、Firefox 4 以降ではむしろ JAR ファイルに固めない方が良いようです。

デバッグ出力

XUL オーバーレイの際に読み込まれたJavaScript ファイルは、Chrome ウィンドウ (Firefox そのもののウィンドウやダイアログなどのウィンドウを表すオブジェクト) の名前空間で実行されます。 そのため、例えば JS 中で alertメソッドを呼び出すとそのまま alert が表示されます。 もっとも簡易なデバッグ出力はこの方法だと思います。

他にも、エラーコンソールに出力するなど、デバッグ用の出力の方法はいくつかあります。 詳細は 「5章:Firefox拡張機能を作ってみよう! 開発環境の準備 - Firefox拡張機能開発チュートリアル (XHTML)」 の下の方のコラム (「JavaScriptデバッグ方法」) をご覧ください。

基本的な考え方

ブートストラップ型ではないXUL ベースの拡張機能の開発の際の考え方としては、

という風にするのが良いのかなーと思っています。 私は下記のことを最初のころ理解できてなくて苦労しました。

  • XUL オーバーレイの際に JS を読み込むと、(例えばFirefox アプリケーションウィンドウに対するオーバーレイを行った場合は)Firefox のアプリケーションごとに同じ JS ファイルが別々の名前空間で実行される
    • window 変数でChrome ウィンドウを表すオブジェクトにアクセスできたりするので、UI をいじるのはやりやすい
    • アプリケーション全体で 1 つだけ持っておきたい情報等はここで管理すべきではない
  • JavaScript コードモジュールとして実行された JS ファイルは、アプリケーション全体で単一のものとして実行される
    • Chrome ウィンドウを表すオブジェクトにアクセスするためにXPCOMコンポーネントを使う必要があったりして、UI をいじるのは多少面倒
    • アプリケーション全体で 1 つだけ持っておきたい情報等はここで管理すると良い

ここら辺のことについて saneyuki さんから言及頂きましたので合わせてご覧ください。

Add-onSDK を使わないでブートストラップ型のFirefox 拡張を開発する (ブートストラップ型のXUL ベースのFirefox 拡張)

従来からのXUL ベースのFirefox 拡張は、インストール時にFirefox の再起動が必要なわけですが、Firefox 4 からは再起動不要の拡張機能も開発出来るようになっています。 Add-onSDK を使った拡張機能は全て再起動が不要になるようになっているのですが、Add-onSDK を使わずに再起動不要の拡張機能を開発する方法もあります。

DOM 操作でXUL をいじったり、XPCOM を使ったりという部分はブートストラップ型ではないXUL ベースの拡張機能と同じなのですが、XUL オーバーレイを使用しないという点で大きく異なっています。

基本的な作り方

最低限必要なファイルは、下記の 2 つです。

  • install.rdf
  • bootstrap.js

install.rdf は、ブートストラップ型でないXUL ベースの拡張機能でも使用していたものと基本的には同じですが、ブートストラップ型にするために下記内容を追加する必要があります。 ((ここでem名前空間URIhttp://www.mozilla.org/2004/em-rdf#” を表すプレフィックスです。))

<em:bootstrap>true</em:bootstrap>

bootstrap.js には、インストール時や拡張機能の有効化、無効化時、アンインストール時などに呼び出されるいくつかの関数を記述します。 サンプルを Gist にあげました。

この 2 つのファイルを ZIP に固めて拡張子を XPI に変更すると、Firefox にインストールできる形になります。

基本的な考え方

bootstrap.js はChrome ウィンドウとは独立な名前空間で実行されます。JavaScript コードモジュールから全ての UI 操作を行うのと同じような感じで開発を進めることになると思います。 例えば、ウィンドウにツールバーボタンを追加するような拡張機能の場合、新しいウィンドウが開かれる際のイベントを検出して、新しいウィンドウが開かれたらそこにツールバーボタンを追加する、というようなことを拡張機能が行う必要があります。

また、拡張機能の無効化時などに再起動がされないので、拡張機能で行った UI 変更などは拡張機能自身が責任を持って元に戻すということをしなければなりません。

他の 2 つの開発方法と比べて考えるべき事が多くて難しいので、Firefox 拡張周りの知識が乏しい状態でブートストラップ型のXUL ベースのFirefox 拡張を開発するのはやめておいた方が良いんじゃないかなーと思います。

ブートストラップ型のXUL ベース拡張の雛形や参考になるサンプル

piroor さんによって、ブートストラップ型のXUL ベースのFirefox 拡張の雛形が公開されています。 ブートストラップ型のXUL ベースのFirefox 拡張を開発する際には、これを元にしたり参考にしたりして開発を進めると良いのではないかと思います。

teramako さんによる HTTPリファラをいじる拡張機能も参考になります。

Firefox 拡張の公開方法

作成した XPI パッケージは、基本的には 「Add-ons forFirefox」 で公開すると良いでしょう。Mozilla の人によるレビューがあるのでアップロードしてから実際に一般ユーザーが使用できるまでに 1 週間程度かかりますが、「Add-ons forFirefox」 で公開しておくと拡張機能のバージョンアップ時に自動的にアップデートされるようになるので、その点は便利です。

参考文献

Firefox 拡張開発にあたっては下記の書籍が参考になります。 特にブートストラップ型のXUL ベースの拡張機能の開発についてはあまり web 上にまとまった情報がないので、『Firefox Hacks Rebooted』 は非常に参考になりました。 (Firefox 8 のころの情報なので、多少最新の情報とは違う部分もありますが、本質的な部分の勉強には最適だと思います。)

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック

Firefox 3 Hacks ―Mozillaテクノロジ徹底活用テクニック

Firefox 3 Hacks ―Mozillaテクノロジ徹底活用テクニック

Web 上では、下記ページにMozilla による情報がまとまっていますので目を通すと良いでしょう。

あと、Mozilla 関係の開発者向けの情報はだいたい MDN (Mozilla Developer Network) にまとまっているので、何か調べたいことがあれば、調べたいキーワードに 「MDN」 をくっつけてググると良いです。

*1:XML をベースにした UI 記述用言語

*2:クロスプラットフォームコンポーネントオブジェクトモデル。 これらにより、例えばローカルファイルの読み書きをする機能などが提供される

注目記事
検索
最近のコメント
    カテゴリー

    引用をストックしました

    引用するにはまずログインしてください

    引用をストックできませんでした。再度お試しください

    限定公開記事のため引用できません。

    読者です読者をやめる読者になる読者になる

    [8]ページ先頭

    ©2009-2025 Movatter.jp