Firefox extension: Change Profile 0.1

Firefoxでメニューまたはツールバー・ボタンからプロファイルの切り替えを行う拡張を作ってみた。普段は滅多にプロファイルを切り替えてFirefoxを使ったりはしないんだけど、たまに切り替える必要がある時はものすごく頻繁に切り替えることになるので、あったら良さそうと思ったので。インストールはXPI置き場からchange-profile-0.1.xpiをダウンロードして、Firefoxにドラッグ・アンド・ドロップで。ソースが読みたい人はChange Profileのリポジトリ・ページを参照。

作り始めた時はFirefoxから直接プロファイル・マネージャ呼べるんじゃないかとか考えてたのだけど、どうもFirefoxでは呼べないらしい(SeaMonkeyでは呼べるとか)。

次に考えたのはFirefoxが起動時に読んでいるProfiles.iniをプロファイル・マネージャが立ち上がるように書き換えて、再起動してやるという手法。Profiles.iniは、

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=1
Path=Profiles/xxxxxxxx.default
Default=1

[Profile1]
Name=development
IsRelative=1
Path=Profiles/xxxxxxxx.development

という感じになっていて、GeneralセクションのStartWithLastProfileキーの値が0で、各プロファイルのセクションにDefaultキーがない場合プロファイル・マネージャが立ち上がる。なので、ベタベタにファイルの内容を全部読み込んで正規表現で置換という方法で書き換えて再起動させるものを作ったのだけど、nsIAppStartupインターフェイスのquit()メソッドをeRestartフラグを立てて呼び出した場合、同じプロファイルで再起動するという仕様(明記されてたが読んでなかった)のため実現不可能だった。

最終的に-P -no-remoteをコマンド・ライン・オプションに付けてもうひとつFirefoxを立ち上げて、元のFirefoxをこっそり終了させるという方法に辿りついた。0.1はこれで実装されている。OSによって実行ファイル名を少し変えてあげる手間以外はほとんど考えずに実装できた(実行ファイルのある場所自体は共通のインターフェイスで取得できる実行ファイルのある場所自体は共通のインターフェイスで取得できる)。最初にこれに気づいていれば……。

が、この拡張でプロファイルを切り替えた後に外部アプリケーションからURLを開こうとすると、「Firefoxが動いてるけど応答しない! ちゃんと閉じて再起動しろ!」とかいうダイアログで怒られてしまう。

Firefoxの終了を促されるダイアログ。

どうも裏でこっそりFirefoxを終了させているのがまずいようだ。そこが肝なのに! これをなんとかどうにかしてAMOに公開できるようなものにしたいが、もう飽きてきた。最初からうまくいかないならともかく、うまくいったかなと思った時に致命的な不具合を発見しちゃうと絶望するよね!