84
Firefox ExtDev Intro Firefox 拡張機能開発 入門編 by Tomoya Asai (aka. dynamis)

Firefox ExtDev Introduction

Embed Size (px)

DESCRIPTION

Firefox 拡張機能開発@入門編 http://dev.mozilla.jp/addons/intro/

Citation preview

Page 1: Firefox ExtDev Introduction

Firefox ExtDev IntroFirefox 拡張機能開発 @ 入門編by Tomoya Asai (aka. dynamis)

Page 2: Firefox ExtDev Introduction

入門編

拡張機能開発に備えて準備しよう .(・・).

Page 3: Firefox ExtDev Introduction

✴ Firefox と拡張機能✴ Firefox も拡張機能も XUL アプリケーション

✴ 拡張機能の開発環境✴ 開発用の Firefox 環境を準備する (準備編参照)

✴ 拡張機能を作ってみよう✴ 取りあえず作ってインストールしてみよう

✴ パッケージ管理システム✴ クロム、パッケージ、オーバーレイとは

✴ 配布用パッケージを作ろう✴ インストーラの構造と作り方を理解しよう

拡張機能開発に備えて準備しよう .(・・).

Page 4: Firefox ExtDev Introduction

がんばろう .(・・).

Page 5: Firefox ExtDev Introduction

✓ Firefox と拡張機能✓ Firefox も拡張機能も XUL アプリケーション

✴ 拡張機能の開発環境✴ 開発用の Firefox 環境を準備する (準備編参照)

✴ 拡張機能を作ってみよう✴ 取りあえず作ってインストールしてみよう

✴ パッケージ管理システム✴ クロム、パッケージ、オーバーレイとは

✴ 配布用パッケージを作ろう✴ インストーラの構造と作り方を理解しよう

拡張機能開発に備えて準備しよう .(・・).

Page 6: Firefox ExtDev Introduction
Page 7: Firefox ExtDev Introduction
Page 8: Firefox ExtDev Introduction
Page 9: Firefox ExtDev Introduction

アプリも拡張機能もXUL + JS + CSS

Page 10: Firefox ExtDev Introduction

アプリも拡張機能もXUL + JS + CSS

Page 11: Firefox ExtDev Introduction

Mozilla PlatformFirefox などのアプリは Mozilla Platform 上で動作

Mozilla Platform = XUL Application PlatformC++ で書かれた XUL プラットフォーム

Firefox などのアプリ = XUL ApplicationXUL と JavaScript で書かれたアプリケーション

XUL アプリは Web アプリと同じようなもの

UI については (X)HTML の代わりに XUL で書く処理については Web と同様に JavaScript で書くDOM やイベントモデルなどの考え方も基本的に同じWeb 開発経験があれば比較的容易に開発できる

Page 12: Firefox ExtDev Introduction

Jetpack: https://wiki.mozilla.org/Labs/Jetpack

Firefox と拡張機能拡張機能は Firefox を動的に書き換える方法

Firefox に追加のコードを動的に読み込み、挿入するXUL はオーバーレイを使って動的に書き換えられるJavaScript は動的言語なので何でも書き換えられる

Firefox でできることは拡張機能で何でもできる

セキュリティには注意して開発する必要がある

Jetpack プロジェクトでは API は限られるが簡単に機能を実装できる次世代拡張機能フレームワークを策定中

基本的には JavaScript だけで書けるように

Page 13: Firefox ExtDev Introduction

ずーるって (・・)?

Page 14: Firefox ExtDev Introduction

XUL とはXUL (ずーる) = XML User Interface Language

HTML と同じスタイルでアプリを開発できる言語XML で UI やアプリの構造を記述する言語の先駆け

XUL アプリケーション = XUL + JS + CSS

XUL で UI の構造 (枠組み) を記述要素や属性が違うだけで Web アプリと同じスタイル

JavaScript で処理 (振る舞い) を記述JavaScript でできないことは XPCOM ライブラリを利用

CSS で細かな外観 (デザイン) を記述Web と同じ CSS に加えて XUL 専用のプロパティを追加

HTML5 の先輩みたいなプラットフォーム

Page 15: Firefox ExtDev Introduction

ねむぃ... (・・)zzZ

Page 16: Firefox ExtDev Introduction

✴ Firefox と拡張機能✴ Firefox も拡張機能も XUL アプリケーション

✓拡張機能の開発環境✓ 開発用の Firefox 環境を準備する (準備編参照)

✴ 拡張機能を作ってみよう✴ 取りあえず作ってインストールしてみよう

✴ パッケージ管理システム✴ クロム、パッケージ、オーバーレイとは

✴ 配布用パッケージを作ろう✴ インストーラの構造と作り方を理解しよう

拡張機能開発に備えて準備しよう .(・・).

Page 17: Firefox ExtDev Introduction

わくわく .(・・).

Page 18: Firefox ExtDev Introduction

ユーザプロファイルユーザの設定やデータを収めたファイル群のこと

設定、ブックマーク、履歴、拡張機能などを含む

Firefox では複数のプロファイルを使い分けできる

OS に複数のユーザを登録できるのと同じ別プロファイルで複数の Firefox を同時起動も可能

拡張機能の開発用プロファイルを作るとよい

開発用の設定や拡張機能をインストールする他のアドオンがない方がデバッグが簡単万一起動しなくなったりデータ壊しても安心

初心者は特に専用のプロファイルで開発することを強く推奨します

Page 19: Firefox ExtDev Introduction

プロファイルマネージャプロファイルの新規作成や選択を行う管理画面を起動

Firefox を -P オプション付きで起動すると表示される-no-remote をつけると別プロファイルで同時起動可能

Vista 以降ではスタートメニューの検索ボックスにXP 以前では「ファイル名を指定して実行」に入力:

Mac ではターミナルで次のコマンドを実行:

firefox -P extdev などと -P に続けてプロファイル名を指定して起動することもできる

firefox.exe -no-remote -P

/Applications/Firefox.app/Contents/MacOS/firefox -P

Page 20: Firefox ExtDev Introduction

プロファイルマネージャプロファイルの新規作成や選択を行う管理画面を起動

Firefox を -P オプション付きで起動すると表示される-no-remote をつけると別プロファイルで同時起動可能

Vista 以降ではスタートメニューの検索ボックスにXP 以前では「ファイル名を指定して実行」に入力:

Mac ではターミナルで次のコマンドを実行:

firefox -P extdev などと -P に続けてプロファイル名を指定して起動することもできる

firefox.exe -no-remote -P

/Applications/Firefox.app/Contents/MacOS/firefox -P

Page 21: Firefox ExtDev Introduction

プロファイルマネージャプロファイルの新規作成や選択を行う管理画面を起動

Firefox を -P オプション付きで起動すると表示される-no-remote をつけると別プロファイルで同時起動可能

Vista 以降ではスタートメニューの検索ボックスにXP 以前では「ファイル名を指定して実行」に入力:

Mac ではターミナルで次のコマンドを実行:

firefox -P extdev などと -P に続けてプロファイル名を指定して起動することもできる

firefox.exe -no-remote -P

/Applications/Firefox.app/Contents/MacOS/firefox -P

Page 22: Firefox ExtDev Introduction

開発用プロファイルプロファイルマネージャで開発用プロファイルを作る

extdev という名前でプロファイルを新規作成「今後このプロファイルを使用する」を無効にする

-P オプション無しでプロファイルマネージャが起動する

extdev プロファイルで Firefox を起動する

Page 23: Firefox ExtDev Introduction

開発用プロファイルプロファイルマネージャで開発用プロファイルを作る

extdev という名前でプロファイルを新規作成「今後このプロファイルを使用する」を無効にする

-P オプション無しでプロファイルマネージャが起動する

extdev プロファイルで Firefox を起動する

Page 24: Firefox ExtDev Introduction

プロファイルディレクトリユーザプロファイルのデータを収めるディレクトリ

%APPDATA% は Windows Vista/7 では C:¥Users¥<username>¥AppData¥Roaming¥%APPDATA% は Windows XP/2000 では C:¥Documents and Settings¥<username>¥Application Data¥

xxxxxxxx.extdev の xxxxxxxx はランダムな 8 文字 (salt) になりますxxxxxxxx.extdev の extdev はプロファイル名になります

開発用でなくデフォルトのプロファイル名は extdev でなく default

http://support.mozilla.com/ja/kb/プロファイル

OS フォルダパスWin 2000~ %APPDATA%¥Mozilla¥Firefox¥Profiles¥xxxxxxxx.extdevWin 98/Me C:¥Windows¥Application Data¥Mozilla¥Firefox¥Profiles¥xxxxxxxx.detdevMac OS X ~/Library/Application support/Firefox/Profiles/xxxxxxxx.extdevLinux ~/.mozilla/firefox/xxxxxxxx.extdev

Page 25: Firefox ExtDev Introduction

開発用の設定about:config を開いて次の開発環境用の設定をオンにする

javascript.options.showInConsole = truejavascript.options.strict = truenglayout.debug.disable_xul_cache = truebrowser.dom.window.dump.enabled = trueすべて真偽値、表示されない設定は新規作成する

Extdev Preferences 拡張機能をインストールするのが簡単https://addons.mozilla.org/ja/firefox/addon/12920/

上記の設定をデフォルト設定にするだけの単機能アドオン

ロケーションバーに about:config と入力すると Firefox の内部設定画面が表示されます

Page 26: Firefox ExtDev Introduction

おっけー (・・)v

Page 27: Firefox ExtDev Introduction

✴ Firefox と拡張機能✴ Firefox も拡張機能も XUL アプリケーション

✴ 拡張機能の開発環境✴ 開発用の Firefox 環境を準備する (準備編参照)

✓拡張機能を作ってみよう✓ 取りあえず作ってインストールしてみよう

✴ パッケージ管理システム✴ クロム、パッケージ、オーバーレイとは

✴ 配布用パッケージを作ろう✴ インストーラの構造と作り方を理解しよう

拡張機能開発に備えて準備しよう .(・・).

Page 28: Firefox ExtDev Introduction

開発の第一歩

Page 29: Firefox ExtDev Introduction

どきどき .(・・).

Page 30: Firefox ExtDev Introduction

困ったときは...何はともあれエラーコンソールを確認

エラーコンソールがデバッグの基本

他のアドオンを無効化してから動作確認

他にエラーを吐いているアドオンはすべて無効化XUL や XML は Firefox で読み込んで構文エラーを確認

確認時には chrome:// URL で読み込むことローカルから chrome:// を読み込むとパースエラー

ファイルの文字コードは UTF-8 (BOM なし) で保存

マルチバイト文字が使えない場合もあるので注意

Page 31: Firefox ExtDev Introduction

拡張機能の作成手順1. どんな拡張機能を作るか考える

• ここが実は拡張機能開発最大の難関かも?2. 拡張機能の開発用ディレクトリを作る

• 修正するたびに再インストールせずにすませる3. install.rdf と chrome.manifest を書く

• 拡張機能と含まれるパッケージを登録する4. 拡張機能本体のコードを書く

• 登録しても中身がないと何もできません5. 試行錯誤しながら完成させる

• うまく動くようになるまで諦めずに頑張る簡易的な拡張機能開発を行う場合

Page 32: Firefox ExtDev Introduction

拡張機能の ID拡張機能やアプリケーションを識別し登録するための ID

GUID 形式とメールアドレスのような形式の 2 つがある

GUID は uuidgen コマンドなどで生成できる識別子Firefox は {ec8030f7-c20a-464f-9b0e-13a3a9e97384}

特に理由がない限り [email protected] 形式を使うドメイン持ってない場合は仕方ないので GUID を使う@extdev.org は自由に使ってくれて良いですが、他の人が作ったアドオンと名前が重複しても責任は持ちません (^^;

今回は取りあえず [email protected] とする

余力のある方は別の ID で作ってみてください

https://developer.mozilla.org/ja/Generating_GUIDs

Page 33: Firefox ExtDev Introduction

拡張機能ディレクトリ 拡張機能のインストール= 拡張機能のファイルをプロファイルに展開= プロファイルに直接ファイルを置く

拡張機能のアンインストール= 拡張機能のディレクトリをプロファイルから削除

開発中は拡張機能ディレクトリのファイルを直接編集∵ 修正するたびにインストールし直すのは面倒だから

${プロファイル}/extensions/[email protected]

拡張機能の ID 名でディレクトリを作成する

開発中に間違ってアンインストール(=ファイル削除)してしまわないように注意

Page 34: Firefox ExtDev Introduction

プロファイルディレクトリユーザプロファイルのデータを収めるディレクトリ

%APPDATA% は Windows Vista/7 では C:¥Users¥<username>¥AppData¥Roaming¥%APPDATA% は Windows XP/2000 では C:¥Documents and Settings¥<username>¥Application Data¥

xxxxxxxx.extdev の xxxxxxxx はランダムな 8 文字 (salt) になりますxxxxxxxx.extdev の extdev はプロファイル名になります

開発用でなくデフォルトのプロファイル名は extdev でなく default

http://support.mozilla.com/ja/kb/プロファイル

OS フォルダパスWin 2000~ %APPDATA%¥Mozilla¥Firefox¥Profiles¥xxxxxxxx.extdevWin 98/Me C:¥Windows¥Application Data¥Mozilla¥Firefox¥Profiles¥xxxxxxxx.detdevMac OS X ~/Library/Application support/Firefox/Profiles/xxxxxxxx.extdevLinux ~/.mozilla/firefox/xxxxxxxx.extdev

Page 35: Firefox ExtDev Introduction

拡張機能を登録する<?xml version="1.0"?><RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>[email protected]</em:id> <em:version>0.1</em:version> <em:name>Sample Extension</em:name> <em:description>拡張機能の第一歩</em:description> <em:creator>dynamis</em:creator> <em:homepageURL>http://extdev.org/</em:homepageURL> <em:targetApplication> <Description><!-- Firefox --> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>3.0</em:minVersion> <em:maxVersion>3.5.*</em:maxVersion> </Description> </em:targetApplication> </Description></RDF>

コピーして青色の部分だけ変えれば OK https://developer.mozilla.org/ja/Install.rdf

[email protected]/install.rdf

Page 36: Firefox ExtDev Introduction

拡張機能を登録する<?xml version="1.0"?><RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>[email protected]</em:id> <em:version>0.1</em:version> <em:name>Sample Extension</em:name> <em:description>拡張機能の第一歩</em:description> <em:creator>dynamis</em:creator> <em:homepageURL>http://extdev.org/</em:homepageURL> <em:targetApplication> <Description><!-- Firefox --> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>3.0</em:minVersion> <em:maxVersion>3.5.*</em:maxVersion> </Description> </em:targetApplication> </Description></RDF>

コピーして青色の部分だけ変えれば OK https://developer.mozilla.org/ja/Install.rdf

em:id は拡張機能の ID (一意に識別するために使う)em:version は拡張機能のバージョン番号

em:name と em:description はアドオンマネージャに表示する

拡張機能の名前と説明em:creator や em:homepageURL

なども必要に応じて設定する

em:minVersion と em:MaxVersion は対応している(インストールできる)

Firefox の最小および最大バージョン

[email protected]/install.rdf

Page 37: Firefox ExtDev Introduction

Firefox 起動してみるFirefox を(再)起動すると登録される

v(・・) インストールできた (・・)v

Page 38: Firefox ExtDev Introduction

• content/ ディレクトリを sample という名前のcontent 型(ソースファイル)パッケージとして登録

• chrome://sample/content/ でアクセス可能になる

• パッケージの型 = content 型 = ソースファイル

• content 型以外に locale 型 (言語ファイル) と skin 型(テーマファイル) と合わせて 3 種類のパッケージが存在

• パッケージの名前 = sample (普通は ID の @までと同じ)

• 登録ディレクトリ = content/ (相対パスで記述)

パッケージを登録するcontent sample content/

[email protected]/chrome.manifest

https://developer.mozilla.org/ja/Chrome_Registration

Page 39: Firefox ExtDev Introduction

• content/ ディレクトリを sample という名前のcontent 型(ソースファイル)パッケージとして登録

• chrome://sample/content/ でアクセス可能になる

• パッケージの型 = content 型 = ソースファイル

• content 型以外に locale 型 (言語ファイル) と skin 型(テーマファイル) と合わせて 3 種類のパッケージが存在

• パッケージの名前 = sample (普通は ID の @までと同じ)

• 登録ディレクトリ = content/ (相対パスで記述)

パッケージを登録するcontent sample content/

[email protected]/chrome.manifest

https://developer.mozilla.org/ja/Chrome_Registration

ディレクトリパス末尾の / を忘れずに!型 名前 ディレクトリ

Page 40: Firefox ExtDev Introduction

XUL ファイルを書く<?xml version="1.0"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<hbox pack="center" align="center" height="300"> <label onclick=" " style="font-size: 64px">(・・)v</label> </hbox></window>

[email protected]/content/sample.xul

Page 41: Firefox ExtDev Introduction

XUL ファイルを書く<?xml version="1.0"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<hbox pack="center" align="center" height="300"> <label onclick=" " style="font-size: 64px">(・・)v</label> </hbox></window>

[email protected]/content/sample.xul

Sample = { alert: function() { var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); prompts.alert(window, "(・・)?", "v(・・).(・・).(・・)v"); }};

[email protected]/content/sample.js

<script type="application/javascript" src="chrome://sample/content/sample.js"/>

Sample.alert();

Page 42: Firefox ExtDev Introduction

Firefox で表示してみる再起動して chrome://sample/content/ を表示

chrome://sample/content/ だけで index.html のようにchrome://sample/content/sample.xul が読み込まれる

Page 43: Firefox ExtDev Introduction

Firefox で表示してみる再起動して chrome://sample/content/ を表示

chrome://sample/content/ だけで index.html のようにchrome://sample/content/sample.xul が読み込まれる

Page 44: Firefox ExtDev Introduction

トラブルシューティングアドオンマネージャに表示されない

install.rdf の構文エラーやバージョン指定ミス?

chrome://sample/content/ が見つからない

chrome.manifest でディレクトリ指定に / がない?ファイル名やディレクトリ名が間違っていないか?

XML パースエラーが表示される

XUL が整形式になっているか?

ダイアログが表示されない

sample.js に構文エラーや typo がないか?常にエラーコンソールを確認すること

Page 45: Firefox ExtDev Introduction

ボタンとか... (・・)?

Page 46: Firefox ExtDev Introduction

XUL オーバーレイオーバーレイ = XUL に要素や属性を挿入する技術

書き換え対象要素の ID を指定してマージする

拡張機能では Firefox 本体の XUL に要素や属性を追加するために (クロスパッケージ) オーバーレイを使用する

Firefox の振る舞いを変えるときはほぼ確実に使うパーツを分離することで見通しが良くなるテンプレートシステムとして使うこともある

今回はツールバーパレットにボタンを追加してみる

toolbarpalette 要素に子要素を挿入すればよい

https://developer.mozilla.org/ja/XUL/overlay, https://developer.mozilla.org/ja/XUL_Overlays

Page 47: Firefox ExtDev Introduction

パッケージを追加する

content/ ディレクトリを sample という名前のcontent 型 (ソースファイル) パッケージとして登録

content/ ディレクトリを chrome://sample/content/ で読み込み可能に

skin/ ディレクトリを sample という名前のデフォルトテーマ用skin 型 (テーマファイル) パッケージとして登録

skin/ ディレクトリを chrome://sample/skin/ で読み込み可能に

overlay.xul を browser.xul にオーバーレイ

toolbar.css を customizeToolbar.xul のスタイルシートに設定

content sample content/skin sample classic/1.0 skin/overlay chrome://browser/content/browser.xul chrome://sample/content/overlay.xulstyle chrome://global/content/customizeToolbar.xul chrome://sample/skin/toolbar.css

[email protected]/chrome.manifest

https://developer.mozilla.org/ja/Chrome_Registration

Page 48: Firefox ExtDev Introduction

パッケージを追加する

content/ ディレクトリを sample という名前のcontent 型 (ソースファイル) パッケージとして登録

content/ ディレクトリを chrome://sample/content/ で読み込み可能に

skin/ ディレクトリを sample という名前のデフォルトテーマ用skin 型 (テーマファイル) パッケージとして登録

skin/ ディレクトリを chrome://sample/skin/ で読み込み可能に

overlay.xul を browser.xul にオーバーレイ

toolbar.css を customizeToolbar.xul のスタイルシートに設定

content sample content/skin sample classic/1.0 skin/overlay chrome://browser/content/browser.xul chrome://sample/content/overlay.xulstyle chrome://global/content/customizeToolbar.xul chrome://sample/skin/toolbar.css

[email protected]/chrome.manifest型 名前 [ターゲット] ディレクトリ

classic/1.0 はデフォルトテーマ

命令 ターゲットファイル ソースファイル ファイルパスは chrome:// URL で記述

https://developer.mozilla.org/ja/Chrome_Registration

Page 49: Firefox ExtDev Introduction

オーバーレイを書く<?xml version="1.0"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ..... <toolbarpalette id="BrowserToolbarPalette" ... > ... (・・) ... </toolbarpalette> .....</window>

chrome://browser/content/browser.xul

<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<toolbarpalette id="BrowserToolbarPalette">

</toolbarpalette></overlay>

[email protected]/content/overlay.xul

簡単のため一部修正や省略した

<toolbarbutton id="sample-toolbarbutton" class="toolbarbutton-1" label="(・・)v" tooltiptext="(・・)v" oncommand="Sample.alert();"/>

<script type="application/javascript" src="chrome://sample/content/sample.js"/>

Page 50: Firefox ExtDev Introduction

オーバーレイを書く<?xml version="1.0"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ..... <toolbarpalette id="BrowserToolbarPalette" ... > ... (・・) ... </toolbarpalette> .....</window>

chrome://browser/content/browser.xul

<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<toolbarpalette id="BrowserToolbarPalette">

</toolbarpalette></overlay>

[email protected]/content/overlay.xul

簡単のため一部修正や省略した

<toolbarbutton id="sample-toolbarbutton" class="toolbarbutton-1" label="(・・)v" tooltiptext="(・・)v" oncommand="Sample.alert();"/>

<script type="application/javascript" src="chrome://sample/content/sample.js"/>

overlay 直下の要素は対象ファイルのルート要素直下に挿入される

同一 ID の要素がある場合その子孫は該当タグの下に挿入される

この toolbarpalett 配下に toolbarbutton を追加したい

Page 51: Firefox ExtDev Introduction

オーバーレイを書く<?xml version="1.0"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ..... <toolbarpalette id="BrowserToolbarPalette" ... > ... (・・) ... </toolbarpalette> .....</window>

chrome://browser/content/browser.xul

<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<toolbarpalette id="BrowserToolbarPalette">

</toolbarpalette></overlay>

[email protected]/content/overlay.xul

簡単のため一部修正や省略した

overlay 直下の要素は対象ファイルのルート要素直下に挿入される

同一 ID の要素がある場合その子孫は該当タグの下に挿入される

この toolbarpalett 配下に toolbarbutton を追加したい

Page 52: Firefox ExtDev Introduction

オーバーレイを書く

デフォルトでは overlay する側の子要素がオーバーレイされる側の要素の最後の子要素として追加される

挿入位置は position 属性などで制御できる (MDC 参照)

<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ..... <toolbarpalette id="BrowserToolbarPalette" ... > ... (・・) ...

</toolbarpalette> .....

</window>

chrome://browser/content/browser.xul

https://developer.mozilla.org/ja/XUL_Tutorial/Overlays

Page 53: Firefox ExtDev Introduction

オーバーレイを書く

デフォルトでは overlay する側の子要素がオーバーレイされる側の要素の最後の子要素として追加される

挿入位置は position 属性などで制御できる (MDC 参照)

<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ..... <toolbarpalette id="BrowserToolbarPalette" ... > ... (・・) ...

</toolbarpalette> .....

</window>

chrome://browser/content/browser.xul

<toolbarbutton id="sample-toolbarbutton" class="toolbarbutton-1" label="(・・)v" tooltiptext="(・・)v" oncommand="Sample.alert();"/>

<script type="application/javascript" src="chrome://sample/content/sample.js"/>

https://developer.mozilla.org/ja/XUL_Tutorial/Overlays

Page 54: Firefox ExtDev Introduction

オーバーレイを書く

デフォルトでは overlay する側の子要素がオーバーレイされる側の要素の最後の子要素として追加される

挿入位置は position 属性などで制御できる (MDC 参照)

<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> ..... <toolbarpalette id="BrowserToolbarPalette" ... > ... (・・) ...

</toolbarpalette> .....

</window>

chrome://browser/content/browser.xul

<toolbarbutton id="sample-toolbarbutton" class="toolbarbutton-1" label="(・・)v" tooltiptext="(・・)v" oncommand="Sample.alert();"/>

<script type="application/javascript" src="chrome://sample/content/sample.js"/>

overlay 直下の要素は対象ファイルのルート要素直下に挿入される

同一 ID の要素がある場合その子孫は該当タグの下に挿入される

https://developer.mozilla.org/ja/XUL_Tutorial/Overlays

Page 55: Firefox ExtDev Introduction

ツールバーボタンを作る<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/javascript" src="chrome://sample/content/sample.js"/> <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="sample-toolbarbutton" class="toolbarbutton-1" label="(・・)v" tooltiptext="(・・)v" oncommand="Sample.alert();"/> </toolbarpalette></overlay>

[email protected]/content/overlay.xul

#sample-toolbarbutton { list-style-image: url("chrome://sample/skin/icon-48x24.png");}toolbar[iconsize="small"] #sample-toolbarbutton { list-style-image: url("chrome://sample/skin/icon-32x16.png");}

[email protected]/skin/toolbar.css

ボタンやメニューは MDC のサンプルコードを見ながら作ればよい

Page 56: Firefox ExtDev Introduction

ツールバーボタンを作る<?xml version="1.0"?><?xml-stylesheet href="chrome://sample/skin/toolbar.css" type="text/css"?><overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/javascript" src="chrome://sample/content/sample.js"/> <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="sample-toolbarbutton" class="toolbarbutton-1" label="(・・)v" tooltiptext="(・・)v" oncommand="Sample.alert();"/> </toolbarpalette></overlay>

[email protected]/content/overlay.xul

#sample-toolbarbutton { list-style-image: url("chrome://sample/skin/icon-48x24.png");}toolbar[iconsize="small"] #sample-toolbarbutton { list-style-image: url("chrome://sample/skin/icon-32x16.png");}

[email protected]/skin/toolbar.css

ボタンやメニューは MDC のサンプルコードを見ながら作ればよい

ツールバーボタンは class 属性に toolbarbutton-1 を指定する

スタイルシートの適用を忘れないように

ボタンに使用するアイコンを大小 2 つ指定する

Page 57: Firefox ExtDev Introduction

Firefox で表示してみるFirefox を再起動して chrome://sample/

content/ を表示

v(・・) ボタン追加された (・・)v

Page 58: Firefox ExtDev Introduction

Firefox で表示してみるFirefox を再起動して chrome://sample/

content/ を表示

v(・・) ボタン追加された (・・)v

Page 59: Firefox ExtDev Introduction

パレットにアイコンが追加されない

chrome.manifest の記述は正しいか?overlay.xul が整形式になっているか?

アイコンの画像がおかしい

chrome.manifest の style 命令は正しいか?overlay.xul の xml-stylesheet 処理命令は正しいか?toolbar.css に構文エラーや typo がないか?

ラベルがアイコンの下でなく横に表示される

class 属性に toolbarbutton-1 を指定しているか?

常にエラーコンソールを確認すること

トラブルシューティング

Page 60: Firefox ExtDev Introduction

できた! (・・)v

Page 61: Firefox ExtDev Introduction

✴ Firefox と拡張機能✴ Firefox も拡張機能も XUL アプリケーション

✴ 拡張機能の開発環境✴ 開発用の Firefox 環境を準備する (準備編参照)

✴ 拡張機能を作ってみよう✴ 取りあえず作ってインストールしてみよう

✓パッケージ管理システム✓ クロム、パッケージ、オーバーレイとは

✴ 配布用パッケージを作ろう✴ インストーラの構造と作り方を理解しよう

拡張機能開発に備えて準備しよう .(・・).

Page 62: Firefox ExtDev Introduction

パッケージ管理

Page 63: Firefox ExtDev Introduction

しくみは (・・)?

Page 64: Firefox ExtDev Introduction

クロムとパッケージFirefox の GUI や機能を実装する部分をクロムと呼ぶ

クロム (chrome) はパッケージという構成要素の集合

パッケージには content, locale, skin の 3 種類がある

拡張機能では通常新しいパッケージを作り登録する

パッケージを含まない拡張機能というのも存在するdefaults や searchplugin ディレクトリなどは登録不要

https://developer.mozilla.org/ja/Chrome

型 パッケージに含まれるものcontent XUL や JavaScript など UI や処理を記述するソースファイルlocale 各言語用の UI 文字列を含む言語リソースファイル (*dtd, *.properties)skin 各テーマ用のデザイン要素となる CSS や画像などのファイル

Page 65: Firefox ExtDev Introduction

パッケージ管理manifest ファイルで chrome レジストリに登録する

登録されると chrome:// URL でアクセス可能になる

既存のパッケージを書き換えるにはオーバーレイを使う

ファイルを丸ごと置き換える override 命令もあるその他高度な機能については MDC を参照https://developer.mozilla.org/ja/Chrome_Registration

content example chrome/content/locale example en-US chrome/locale/en-US/locale example ja chrome/locale/ja/skin example classic/1.0 chrome/skin/overlay chrome://browser/content/some.xul chrome://example/content/overlay.xulstyle chrome://browser/content/other.xul chrome://example/skin/sample.css

https://developer.mozilla.org/ja/Chrome_Registration

Page 66: Firefox ExtDev Introduction

chrome:// URLクロムのパッケージを参照するための特別なスキーマ

chrome://packagename/type/path/to.file 形式locale や skin はユーザ設定に合うものが選択される

chrome:// URL のファイルには特権が与えられる

ユーザ設定やファイルなどにアクセスする特権chrome:// の外から chrome:// にはアクセスできない

ローカルファイルも chrome:// に登録しないと権限なし

Firefox 本体は browser パッケージの browser.xul

chrome://browser/content/browser.xul

Page 67: Firefox ExtDev Introduction

ディレクトリ構成基本的には Firefox 本体と同じディレクトリ構成が良い

クロムのパッケージは chrome ディレクトリに

chrome/content, chrome/locale, chrome/skinmanifest ファイルで指定すれば何処でも動作はする

拡張機能の初期設定ファイルは defaults/preferences

defaults/preferences/*.js を初期設定として読み込む

検索プラグインは searchplugins

searchplugins/*.xml が自動的に登録される

配布パッケージでは chrome 以下を jar に zip 圧縮する実際には先の例のように直下に content などを置くことも多い

Page 68: Firefox ExtDev Introduction

わかった! v(・・)

Page 69: Firefox ExtDev Introduction

✴ Firefox と拡張機能✴ Firefox も拡張機能も XUL アプリケーション

✴ 拡張機能の開発環境✴ 開発用の Firefox 環境を準備する (準備編参照)

✴ 拡張機能を作ってみよう✴ 取りあえず作ってインストールしてみよう

✴ パッケージ管理システム✴ クロム、パッケージ、オーバーレイとは

✓配布用パッケージを作ろう✓ インストーラの構造と作り方を理解しよう

拡張機能開発に備えて準備しよう .(・・).

Page 70: Firefox ExtDev Introduction

配布用パッケージ

Page 71: Firefox ExtDev Introduction

配ろう .(・・)!

Page 72: Firefox ExtDev Introduction

パッケージの作り方

ZIP する

Page 73: Firefox ExtDev Introduction

XPI パッケージとはXPI = Cross(X)-Platfort Installer

拡張機能などの配布用 ZIP パッケージのこと

拡張機能の登録情報は install.rdf と chrome.manifest

ファイルの構成は開発用ディレクトリと一緒で OK

トップに install.rdf と chrome.manifestあとは chrome.manifest の記述次第

.zip ファイルにまとめて拡張子だけ .xpi にすればよい

逆に拡張機能のインストールは XPI を展開してextensions ディレクトリに置いているだけ

https://developer.mozilla.org/ja/XPI

Page 74: Firefox ExtDev Introduction

パッケージの作り方

ZIP する

Page 75: Firefox ExtDev Introduction

「正しい」パッケージchrome のファイルは jar (これも zip) にまとめておく

jar ファイル中では content, locale, skin の配下にパッケージ名のディレクトリを追加する

chrome/content/ -> content/content/packagename/

chrome 配下を zip して packagename.jar にjar は非圧縮の zip にするのが普通

chrome.manifest も jar! を使った記述に修正が必要content example chrome/example.jar!/content/example/locale example en-US chrome/example.jar!/locale/en-US/example/locale example ja chrome/example.jar!/locale/ja/example/skin example classic/1.0 chrome/skin/overlay chrome://browser/content/some.xul chrome://example/content/overlay.xulstyle chrome://browser/content/other.xul chrome://example/skin/sample.css

普通はスクリプトで処理しますが、今回は環境準備が手間なので割愛

Page 76: Firefox ExtDev Introduction

パッケージの作り方

ZIP する

Page 77: Firefox ExtDev Introduction

できた! \(・・)/

Page 78: Firefox ExtDev Introduction

AMO で公開しようexample.xpi ができたら Firefox にインストール

問題なければ addons.mozilla.org に UP する

アドオンの説明なども書いて公開しましょう

修正したら新しいバージョンとして登録

インストールしているユーザには更新が通知される評価やコメントがある程度集まったらレビュー申請

評価されていないアドオンはレビュー対象外エディタと呼ばれる人にレビューしてもらいますパスしたら「実験的アドオン」ではなくなる

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

Page 79: Firefox ExtDev Introduction

参考資料集

Page 80: Firefox ExtDev Introduction

XML & XHTML & CSSごく簡単な HTML の説明http://www.kanzaki.com/docs/htminfo.html

セマンティック HTML/XHTML (書籍でさらに詳しく読む場合)http://www.amazon.co.jp/dp/483993195X

ごくごく簡単な DTD の説明 (実体宣言の説明部分だけ)http://www.kanzaki.com/docs/html/read-dtd.html#entity

スタイルシートの基本 - スタイル設定の方法 & CSS の主なプロパティhttp://www.kanzaki.com/docs/html/htminfo17.htmlhttp://www.kanzaki.com/docs/html/htminfo17-2.html

セオリーオブスタイルシート (書籍でさらに詳しく読む場合)http://www.amazon.co.jp/dp/4774127833

Page 81: Firefox ExtDev Introduction

JavaScriptCore JavaScript 1.5 ガイドhttps://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference

JavaScript の再紹介https://developer.mozilla.org/ja/A_re-introduction_to_JavaScript

JavaScript のイロハ (シリーズ連載記事)http://builder.japan.zdnet.com/sp/javascript-kickstart-2007/

JavaScript 1.6 以降で導入された機能https://developer.mozilla.org/ja/New_in_JavaScript_1.6https://developer.mozilla.org/ja/New_in_JavaScript_1.7https://developer.mozilla.org/ja/New_in_JavaScript_1.8https://developer.mozilla.org/En/New_in_JavaScript_1.8.1

ECMAScript for XML (E4X)https://developer.mozilla.org/ja/E4X

Page 82: Firefox ExtDev Introduction

開発チュートリアル拡張機能開発チュートリアルhttp://firefox3hacks.org/tutorial.html

XUL チュートリアルhttps://developer.mozilla.org/Ja/XUL_Tutorial

Firefox 3 で始める拡張機能開発http://gihyo.jp/dev/feature/01/firefox-addons

Firefox 3 的な FUEL と JSM を存分に使って拡張機能開発をしよう!http://d.hatena.ne.jp/sotarok/20090127/firefox_3_fuel_jsm

拡張機能開発の一般的な質問https://developer.mozilla.org/ja/Extension_Frequently_Asked_Questions

Page 83: Firefox ExtDev Introduction

リファレンスMozilla Developer Center (略称: MDC, Devmo)https://developer.mozilla.org/

XUL リファレンスhttps://developer.mozilla.org/ja/XUL_Reference

Firefox User Extension Library (FUEL)https://developer.mozilla.org/ja/FUEL

XPCOM API リファレンスhttps://developer.mozilla.org/ja/XPCOM_API_Reference

Mozilla Cross-Reference (ソースコード検索)http://mxr.mozilla.org/

Page 84: Firefox ExtDev Introduction

コードサンプルMozilla Developer Center (MIT License)https://developer.mozilla.org/

Code Snippets (MIT License)https://developer.mozilla.org/ja/Code_snippets

jslibs - JavaScript Tips & Tricks (GPL v2)http://code.google.com/p/jslibs/wiki/JavascriptTips

既存の拡張機能 (殆どは GPL/LGPL/MPL)https://addons.mozilla.org/

Firefox 本体のコード (GPL/LGPL/MPL Triple License)http://mxr.mozilla.org/