私はクロスプラットフォームのブラウザー拡張機能を開発しており、これを行う Chrome の方法に基づいてすべてのコードを作成しています。オプション ページからバックグラウンド ページにアクセスできると期待していましたが、Safari の拡張機能では不可能であることが判明しました (オプション ページのようなものがないため)。拡張ポップアップと背景ページ自体からのみアクセスできます。safari.extension.globalPage.contentWindow
現在、拡張機能バンドル内の html ページであるオプション ページがありますが、これまでのところ、Safari が拡張機能の「権限」を付与する方法を見つけていません。最も近いのは、オプション ページにのみ追加されるコンテンツ スクリプトを追加することです。HTML ページ自体が拡張バンドルに含まれているため、これは少しばかげているように思えます。
他の人は、非同期のピンポン スタイルのmessage
イベント ハンドラーを使用することを提案しcanLoad
ましたbeforeload
。canLoad
を偽造することにより、同期メッセージングのメカニズムをハックすることができましたBeforeLoadEvent
。
// Content script (run from anywhere)
var result = safari.self.tab.canLoad(new BeforeLoadEvent, "data")
-> "return value"
// Background page
safari.application.addEventListener('message', function(e) {
if ( e.name === "canLoad" )
e.message = "return value";
}, true);
これはハックですが、機能します。ただし、バックグラウンド ページからオブジェクトのメソッドとデータにアクセスできるようにする必要があるため、メッセージ トランスポートのシリアライゼーションには不自由です。とにかくこのあたりはありますか?
うまくいく可能性のある方法ですが、可能かどうかはわかりません:
- 背景ページからoptions-page
window
-object にアクセスします。それは可能ですか? - メッセージ パッシング、メッセージのシリアル化をバイパスする必要がある
- オブジェクトをアタッチしてオプション ページからフェッチできる共有/グローバル オブジェクトはありますか?
- content-script サンドボックスの外から Safari に options.html ページを実行させますか? どちらも拡張バンドル内にあるため、Chrome で動作します。サファリもこれをしないのはかなり面倒です。
- ポップアップ内からオプション ページを実行します。これは有望ですが、サファリがクラッシュします (これは非常に有望です!)。ただし、見た目からすると、options.html ページの CSS アニメーションと関係があるだけです。最大の問題は、OAuth2 ポップアップを開くことができる必要があることですが、プログラムでポップオーバーを開くことができるため、問題ではない可能性があります。ただし、このオプションが最も現実的ですが、新しいタブで開く方がよいでしょう。
提案やハック的な回避策は本当に役に立ちます。