SyntaxHighlighter

2016年11月4日金曜日

Open TortoiseSVN の Native Messaging 対応 (Firefox)

Open TortoiseSVN の Native Messaging 対応 (Firefox)

Firefox 向けの Open TortoiseSVN を WebExtensions 化したので、そのまとめと思うことをダラダラと書きます。

Firefox の WebExtensions

Firefox では、従来の形式のアドオンを将来的に廃止し、 WebExtensions という新しい形式のアドオンへ移行しようとしています。

WebExtensions は、内容は Google Chrome の拡張機能とほぼ同じものです。
従来のアドオンとの大きな違いは、アドオンでできることの自由度です。
従来のアドオンでは、 Firefox を構成する XUL, JavaScript の非常に幅広い部分を自由にカスタマイズできたのに対し、WebExtensions では、あらかじめ Firefox 側から提供された部分しか拡張できません。

ブラウザを作る側からすれば、あまりに自由にアドオン側にカスタマイズを許すと、互換性を保ちながら内部構造を大きく変更することが困難になり、マルチプロセス化など大規模なコード変更ができなくなるなどの弊害があったようです。

Firefox ユーザーの中には、「自由度が減る」ことを嫌って WebExtensions への流れに反発している人も多いようです。
個人的にはこの心情はよく理解できます。
私もそうなのですが、今でも Firefox を使っている人には、 Firefox の「自由なウェブブラウザ」という考え方を好む人がいるように思います。
そういった場合には、アドオン作成者の自由度が減る方向になるのは、受け入れづらいのだろうと思います。
ブラウザをメンテナンスする側の気持ちとしてはよく分かるのですが。

WebExtensions の Native Messaging での注意点

Open TortoiseSVN では、外部ツールである TortoiseSVN を開く必要があります。
Google Chrome 版と同様に、 Firefox の WebExtensions では、 Firefox 50 以降でサポートされた Native Messaging を使う必要があります。

Google Chrome 版とほぼ同様なのですが、一点だけ注意する必要がありました。
それは CreateProcess 関数へのフラグ指定です。

Firefox の Native Messaging で起動されるプログラムから、さらに外部プログラムを実行する場合、Windows では CreateProcess で起動することが多いと思います。
このとき、 CreateProcessdwCreationFlags として CREATE_BREAKAWAY_FROM_JOB を指定する必要があります。
より正確には、 Firefox 50 では不要なのですが、 Firefox 51 では必要となるので、注意が必要です。

Firefox 51 で Bug 1290598 - Migrate native messaging tests to xpcshell への対応の一つとして Manage and terminate Windows subprocess trees as a single job object. の変更が加えられました。
これにより、 Native Messaging で起動された外部プログラムのプロセスは、ある一つの Job Object に結びつけられることになります。
よって、その Job Object が Terminate されるタイミングで、 CreateProcess で起動された子や孫のプロセスも、同時に終了されることになります。

CREATE_BREAKAWAY_FROM_JOB を指定しない場合、起動した TortoiseSVN は、 Job Object の終了とともにプロセスが終了されることになり、うまく動作しませんでした。
CREATE_BREAKAWAY_FROM_JOB を指定することで、 TortoiseProc.exe を Job Object に関連付けず、プロセスの終了を防ぐことができます。

これは MDN Native Messaging の Closing the native app に書かれている内容ですが、知らずに Google Chrome から移植すると、何が起こっているのか分からずかなり悩むことになりました。

なお、同様に悩まれた方が Bug 1301246 - extension will close native client and sub processes those native client created で議論されており、結果として上記の MDN Native Messaging に注釈が加えられたようです。

こういった Google Chrome 拡張機能と Firefox のアドオンの微妙な違いは、今後も残ってしまうのでしょうか。
ちょっと面倒です。

0 件のコメント:

コメントを投稿