Electrolysis (e10s) をサポートするために、Firefox 拡張機能の 1 つを移植しようとしています。私の拡張機能は、いくつかのページ データを取得し、ユーザーがクリックできるコンテキスト メニュー項目を介してクリップボードに配置します。メッセージ マネージャーのドキュメントに基づいて、3 種類のメッセージ マネージャーを使用できます。
- グローバル
- 窓
- ブラウザ
私のアドオンはコンテキスト固有であるため、最後のアドオンが使用したいもののようです。問題は、フレーム スクリプトをロードするタイミングが完全にわからないことです。コンテキスト メニュー項目のアクション処理コードの簡易バージョンは次のようになります。
onContext: function() {
let browserMM = gBrowser.selectedBrowser.messageManager;
browserMM.loadFrameScript("chrome://myaddon/content/frame-script.js", true);
browserMM.sendAsyncMessage("myaddon@myaddon.com:get-page-info", json);
}
ここでフレーム スクリプトをロードすることは、(a) フレーム スクリプトがすべてのページで使用されるとは限らず、(b) フレーム スクリプトは<browser>
. 2 番目の理論は正しくないようです。を呼び出すたびにloadFrameScript
、新しいコピーが読み込まれます。負荷保護ロジック (つまり、フレーム スクリプト関数がまだ存在しない場合にのみ作成する) でさえ、問題を解決していないようです。
したがって、私の問題は、コンテキスト メニュー項目にアクセスするたびに、フレーム スクリプトの新しいコピーが読み込まれることです。また、フレーム スクリプトがメッセージ リスナーを追加するため、コンテキスト メニュー項目の後続の呼び出しでメッセージが重複して表示されます。
ブラウザ フレーム スクリプトはいつロードする必要がありますか? アドオンの初期化時に一度ロードすると、最初にしかロードされないため、うまく機能しないようです<browser>
(後続の によって要求されたときにこのコードを実行したい<browser>
)。しかし、オンデマンドでロードすると、重複するように見えます。
ここで見逃している他の戦略はありますか?