2

私はクロスプラットフォームのブラウザー拡張機能を開発しており、これを行う Chrome の方法に基づいてすべてのコードを作成しています。オプション ページからバックグラウンド ページにアクセスできると期待していましたが、Safari の拡張機能では不可能であることが判明しました (オプション ページのようなものがないため)。拡張ポップアップと背景ページ自体からのアクセスできます。safari.extension.globalPage.contentWindow

現在、拡張機能バンドル内の html ページであるオプション ページがありますが、これまでのところ、Safari が拡張機能の「権限」を付与する方法を見つけていません。最も近いのは、オプション ページにのみ追加されるコンテンツ スクリプトを追加することです。HTML ページ自体が拡張バンドルに含まれているため、これは少しばかげているように思えます。

他の人は、非同期のピンポン スタイルのmessageイベント ハンドラーを使用することを提案しcanLoadましたbeforeloadcanLoadを偽造することにより、同期メッセージングのメカニズムをハックすることができました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 ポップアップを開くことができる必要があることですが、プログラムでポップオーバーを開くことができるため、問題ではない可能性があります。ただし、このオプションが最も現実的ですが、新しいタブで開く方がよいでしょう。

提案やハック的な回避策は本当に役に立ちます。

4

0 に答える 0