私はここ数週間、いくつかのブラウザ拡張機能を作成してきましたが、今日まで、Firefox用のWebExtensionはChromeでほぼ自動的に機能するはずだと思っていました。そこで、Mozillaの例に従ってコードを書こうとしました。
しかし、今日、Chrome ExtensionsのAPIドキュメントにPromisesについての言及がないことに気づきました。
すべての拡張機能のコード全体でPromiseを厳密に使用しました。
だから今私の質問は、私のコードはChromeで動作しますか?または、一番上にvar browser = chrome
宣言を追加すると機能しますか?
またはChrome APIのPromiseをまったくサポートしていませんか?
ChromeがAPI関数のPromisesをまだサポートしていない場合、将来的にはサポートしますか?
注:私はこのプロジェクトを知っています: https://github.com/mozilla/webextension-polyfill
しかし、私はそのライブラリをどこにでも含めるという面倒なことをやりたくありません。また、厄介なバグが含まれています。
それに加えて、私はChromeまたはChromiumを持っておらず、プライバシーとセキュリティ上の理由からそれらをインストールできません。
...今日まで、Firefox用のWebExtensionはChromeでほぼ自動的に機能するはずだと思っていました。
WebExtensionsは、Chrome拡張機能を念頭に置いて下位互換性を持って作成されました。サポートされているAPIでchrome.*
名前空間を使用できます。ここでの目標は、既存の拡張機能をFFにすばやく簡単に移植できるようにすることですbootstrapエコシステム。
ただし、Mozillaはbrowser.*
名前空間との上位互換性を無視します。 Mozillaは、APIに対してプロミスベースのアプローチを採用することを決定しましたが、それはその新しい名前空間に対してのみです。
だから今私の質問は、私のコードはChromeで動作しますか?
または、一番上にvar browser = chrome
宣言を追加すると機能しますか?
番号;それらは異なる動作をし、異なる署名を持っています。 Chromeは、明示的なコールバックを必要とせずに呼び出しを拒否します。browser.*
バリアントは、代わりにPromiseを発行します。
または、Chrome APIでPromiseをまったくサポートしていませんか?
ChromeがAPI関数のPromisesをまだサポートしていない場合、将来的にはサポートしますか?
コメントで述べたように、APIのPromiseベースの書き直し Chromeによって考慮されます ですが、目に見える作業は行われていません。ただし、 あなたが言及したもの を含むポリフィルが存在します。メソッドを自分でラップして独自のポリフィルを作成する以外に、他の解決策はありません。
それに加えて、私はChromeまたはChromiumを持っておらず、プライバシーとセキュリティ上の理由からそれらをインストールできません。
そうすると、とにかくポートを適切にテストできなくなります。これは、潜在的なユーザーにとっては良いアプローチではありません。この場合、移植はではなくしたほうがよいでしょう。
browser
APIを見たことがないので、ベースから外れている可能性がありますが、onlyの違いが、FirefoxAPIが使用する代わりにpromiseを返すことである場合コールバック、 chrome-promise ライブラリが役立つ可能性があります。代わりにpromiseを返す関数でコールバックを必要とするすべてのAPI呼び出しをラップします。
次に、Chromeで次のようなことを行うことができます。
var browser = new ChromePromise();
そして、約束の電話をかけます:
browser.storage.local.get(null).then(data => console.log(data));
編集:chrome-promise
の作者は、バグを修正する以外は、それを維持していません。 OPによって拒否されたMozillaポリフィルを含む、いくつかの代替ライブラリ ここ がリストされています。
私はこのライブラリを作成しました https://github.com/lawlietmester/webextension これをwebextension-polyfillのような1つの一般的なルールなしで作成します。
私のライブラリは、元のchrome/browserを変更せずに1つのBrowser
オブジェクトを作成するクロスブラウザの方法です。昔のjQueryのように。
一度だけ使用するには、バックグラウンドプロセスでインポートし、バックグラウンド用にグローバルにします。その後、他のインポート(ポップアップなどから)には、importfromを使用します。
( typeof browser === 'undefined' ? chrome : browser ).extension.getBackgroundPage().Browser