*ブログElectronic Genomeでも補足的な情報が得られます。

Dropfoxの必要性

Dropboxでプロファイルを共有するときにキャッシュフォルダを除外したい場合などがあると思いますが、これは簡単にはできません。WindowsとLinuxでプロファイルを共有する場合を考えてみます。

 たとえばWindows上でprefs.jsまたはuser.jsを編集してキャッシュフォルダをデフォルトのパスから変更したとします。この設定情報はDropboxを介してLinux上で同期されます。しかしLinuxのパスフォーマットはWindowsのものとは互換性がないため、Linux上でFirefoxを起動するとデフォルトのキャッシュフォルダに強制的に戻されてしまいます。この結果Linux側のキャッシュファイルがWindows側に流れてくることに なります。

 もちろんこのOS間のパスフォーマットの違いによる問題だけに限らず、同一OS間や同一OSの複数ユーザ間での共有の場合であっても、完全なクローン環境でも構築しない限り「単純に設定を共有するだけ」では必ずどこかに不都合が生じてしまいます。

 要するにここで問題になっているのは、共有プロファイルに対してOSやマシンやユーザ固有の設定を適用する仕組みがないということです。

この仕組みを提供するのがDropfoxです。



主な特徴

 Dropfoxは環境変数や通常のJavascriptコードが記述可能な言わば「拡張版 user.js」をWINNT/Linux/Darwinの3種類のOS用に個別に保持できます。Dropbox等でプロファイルフォルダを複数環境で共有する際に、キャッシュフォルダの位置やダウンロードファイルの保存先、外部エディ タのパスなど、一部の設定だけをその環境に適した値に変更できます。プロファイルフォルダ外部の任意の設定ファイルも合わせて使用することができます。

以下に主な特徴を列挙します。

  • Windows/Linux/Mac用に個別の設定ファイルが使用可能
  • 設定ファイルは基本的には prefs.js や user.js と同じ書式
  • 設定値に ${HOME} や ${USERPROFILE} のように環境変数が記述可能
  • 設定値に ${ProfD} のようにMozilla定義の特殊フォルダ変数が記述可能
  • プロファイルフォルダ外部の任意の設定ファイルもOSごとに指定可能
  • 外部設定ファイルを指定するパスにも変数が記述可能
  • 設定ファイルには if文 などの通常のJavascriptコードも記述可能
  • 設定ファイルには XPCOM などの特権コードも記述可能。
  • Dropfox APIを利用すればbashやPowerShellのコマンドを設定ファイルのJavascriptコードから実行可能。
  • 各設定ファイルはFirefox起動時にOSに応じてロードされ実行される
  • 変数は実行時に変換される
  • コンフリクトファイルの自動削除が可能

対象ユーザ

 残念ながらDropfoxはその機能上、使用する上である程度の知識が必要になってしまいます。以下の条件を満たしていないとこの先の説明は読むのがちょっと大変かもしれません。

  • user.jsの役割りを理解している。
  • Javascriptのごく基本的な文法を理解している。
  • 環境変数の意味とその設定方法を理解している。
  • Dropbox等のソフトウェアやUSBメモリなど、なんらかの方法でFirefoxのプロファイルを複数環境で使いまわす方法を理解している。


設定ファイルの書式

 Dropfoxの設定ファイルは各OSごとに複数ありますが、基本的には役割りも書式もuser.jsと同じです。現在使用しているuser.jsの内容をDropfoxの設定ファイルにそのままコピペしてuser.jsを削除してもかまいません。

 もちろん全く違いがないわけではありません。ひとつ目の違いはuser_pref関数の第2引数に環境変数やMozilla特殊フォルダ変数が記述可能なことです。変数の記述にはUnixライクな ${変数名} という書式を使います。具体的には以下のようになります。

user_pref("foo.boo.bar", "${HOME}/fooBar"); 

変数が利用可能なことで共有プロファイルを利用しながらも、実行環境固有の設定を適用することができます。

 ふたつ目の違いは、user_pref関数以外のJavascriptコードも実行できることです。if文で条件分岐させたり、XPCOMなどの特権コードやDropfox APIによるシェルコマンドの実行も可能です。

このようにDropfoxの設定ファイルはプログラマブルで柔軟な記述が可能です。user_pref関数で設定を書き換える以外の使い方もアイディア次第だと思います。



共有設定ファイル

 各OS別の設定ファイルはプロファイルフォルダ内に保存され、Dropboxなどによって他のマシンと共有されるので「共有設定ファイル」と呼んでいます。共有設定ファイルは以下のパスに保存されます。

<プロファイルフォルダ>/dropfox.<OS名>.js

OS名には「WINNT」「Linux」「Darwin」が入ります。 


 オプションウィンドウの「コード」タブのWINNT / Linux / Darwinタブの中の大きなテキストボックスで各OS用の共有設定ファイルの編集ができます。ここにuser.jsと同じようにuser_pref関数を使って変更したい設定を書くことになります。スクリーンショットのように通常のJavascriptやDropfox API関数などもそのまま記述できます。

 バージョン0.3.0から共有設定ファイルを外部エディタで開くボタンが追加されました。外部エディタプログラムには「view_source.editor.path」の値が利用されます。



外部設定ファイル

 プロファイルフォルダの外部に保存している設定ファイルを実行することもできます。この設定ファイルを「外部設定ファイル」と呼びます。外部設定ファイルは共有されないので共有プロファイルに対してマシン固有の設定を適用することができます。外部設定ファイルを使用するには設定ウィンドウでファイルパスを指定します。また、以下のようにファイルパスに変数を含めることができるので配置場所を各マシンで統一する必要はありません。

${USERPROFILE}\MyExternalPref.js

外部設定ファイルは共有設定ファイルと同じくFirefoxの起動時にロードされ実行されます。外部設定ファイルの書式は共有設定ファイルと全く同じですが、UTF-8(BOMなし)で保存するようにして下さい。

 バージョン0.3.0からDropfox APIのexecFile関数を利用すれば設定ファイル内のJavascriptコードから任意の外部設定ファイルを簡単に実行できるようになっています。


環境変数と特殊フォルダ変数

 Dropfoxではシステム定義の環境変数とMozilla定義の特殊フォルダ変数を利用できます。システム定義の環境変数とはWindowsなら %USERPROFILE% や %WINDIR% などのことです。これに対してMozilla定義の特殊フォルダ変数とはProfDnaFile I/O - MDCに記載されているような、FirefoxやThunderbirdなどのMozillaテクノロジーを使ったソフトウェアで利用可能な変数のことです。Dropfoxではこれらの変数を ${変数名} というUNIXライクな形式で統一的に扱うことができます。

 注意点は Mozilla定義特殊フォルダ変数 → システム定義環境変数 の順に変換が試みられるということです。両者に同名の変数が存在した場合はMozilla定義の特殊フォルダ変数が使用されることになります。

 バージョン0.3.0からDropfox APIのconvVar関数とconvVarsInStr関数を使って設定ファイル中のJavascriptコードから変数変換が可能になっています。

//単体の変数の変換にはconvVar関数を使用する
var myprof = convVar("USERPROFILE");

//文字列中の変数の変換にはconvVarsInStr()関数を使用する
var aPath = convVarsInStr("${USERPROFILE}\\デスクトップ");


テスト実行

 オプションウィンドウのコードタブにはプレイボタン(右向きの三角形)があります。これを押すと共有設定ファイルの場合は現在のテキストボックスに入力されているコードをテストすることができます。外部設定ファイルの場合は実際に外部ファイルをロードして実行します。

Dropfox Test Execution Result

 テスト実行で変数の変換結果やエラー、設定の書き換えが発生するかどうかなどを確認することができます。注意しなくてはならないのは変数の変換はテストを実行しているシステム環境に完全に依存するということです。現在テストを実行している環境で変数の変換がうまくいったからといって他の環境で同じ結果になるとは限りません。基本的にテストは実際の環境で実行するようにしてください。

 テストモードではuser_pref関数を使用している限り、設定が本当に書き換えられることはありません。setPref関数を使用した場合はテストモードかどうかのチェックは行われないので実際に書き換えが発生します。


各設定ファイルの実行順序

 Dropfoxを導入することで一般ユーザがFirefoxで利用できる設定ファイルが「prefs.js」「user.js」「共有設定ファイル」「外部設定ファイル」の4つになります。実行順序は

prefs.js → user.js → 共有設定ファイル → 外部設定ファイル

となります。prefs.jsの設定をベースに後に続くファイルがそれに上書きしていきます。後のファイルになるほどよりマシン固有の設定を書けばいいわけです。 



メタキャラクタ

 user_pref() 関数内では $ をメタキャラクタとして扱います。もし $ をエスケープしたい場合は $$ と2つ続けて記述します。例えば ${HOME} を変数ではなく、"${HOME}"という文字列自体として扱いたいときは $${HOME} と記述します。

user_pref("foo.boo.bar", "$${HOME}");

テスト実行して結果を確認するようにしてください。



変数の展開後の値の型

 設定値に変数を含めるときは"${HOME}"のように文字列として変数を指定することになります。しかしその設定項目が整数値(Number型)や真偽値(Boolean型)でなければならない場合があると思います。こういった場合は user_pref関数の第3引数で変数展開後の値の型を「0(String型)」「1(Number型)」「2(Boolean型)」の3つの整数で指定することができます。

user_pref("foo.bar.myString","${MYSTRING}",0); //String型
user_pref("foo.bar.myNumber","${MYNUMBER}",1); //Number型
user_pref("foo.bar.myBoolean","${MYBOOLEAN}",2); //Boolean型

デフォルトで文字列として扱うのでString型の場合は第三引数はなくても構いません。もちろん ${MYNUMBER}を展開した場合は数値、${MYBOOLEAN} を展開した場合は「true」か「false」になるように変数を定義していなければエラーになります。設定ウィンドウでテスト実行できるので前もって変換結果を確認して下さい。 


実行時のスコープ

 設定ファイルのコードはXPCOMコンテキスト内の「dropfox」というObject型オブジェクトのスコープで実行されます。 user_pref()関数もdropfox.user_pref()として実行されています。設定ウィンドウでのテスト実行時はchromeウィンドウコンテキスト内の「dropfox」というObject型オブジェクトのスコープで実行されます。user_pref()以外のコードを書くときはテスト実行時のスコープと実際の実行時のスコープは違うということに注意してください。



実行のタイミング

 Dropfoxが実行されるタイミングはFirefox起動時の"profile-after-change"イベント発生時です。処理結果のウィンドウ表示は"sessionstore-windows-restored"イベント発生時に実行されます。その他イベントに関してはObserver Notifications - MDCあたりを参照してください。