拡張機能サービス ワーカーは、Service Worker イベントと、拡張機能 API の多くのイベントの両方をサポートしています。このセクションでは、利用可能な機能とその使用に関するヒントについて説明します。
拡張機能イベントを宣言する
サービス ワーカーのイベント ハンドラはグローバル スコープで宣言する必要があります。つまり、スクリプトの最上位に記述し、関数内にネストしないでください。これにより、最初のスクリプト実行時に同期的に登録されるため、Chrome は起動するとすぐにイベントを Service Worker にディスパッチできます。次に例を示します。
browser.storage.local.get(["badgeText"], ({ badgeText }) => { browser.action.setBadgeText({ text: badgeText }); browser.action.onClicked.addListener(handleActionClick); });
browser.action.onClicked.addListener(handleActionClick); browser.storage.local.get(["badgeText"], ({ badgeText }) => { browser.action.setBadgeText({ text: badgeText }); });
一般的なイベント
拡張機能のサービス ワーカーは、特定の API のイベントをサポートしています。一般的なものをいくつか以下に示します。これらの API の一部は使用に権限が必要であり、Chrome のすべてのバージョンで使用できないイベント、メソッド、プロパティが含まれている場合があります。詳しくは、リンク先の API ドキュメント(特に使用するイベント、メソッド、プロパティ)をご覧ください。
browser.action- 拡張機能のツールバー アイコンに対するユーザー操作に応じて発火します。この操作は、特定のページ(タブ)に対するものか、拡張機能全体に対するものかに関わらず発火します。
browser.management- 拡張機能のインストール、アンインストール、有効化、無効化に関連するイベントを提供します。
browser.notifications- 拡張機能によって生成されたシステム通知に対するユーザーの操作に関連するイベントを提供します。
browser.permissions- 拡張機能の権限がユーザーによって付与または取り消されたタイミングを示します。
browser.runtime- 拡張機能のライフサイクル、拡張機能の他の部分から送信されたメッセージ、利用可能な拡張機能または Chrome の更新の通知に関連するイベントを提供します。
browser.storage.onChangedStorageAreaオブジェクトがクリアされたとき、またはキーの値が変更または設定されたときに発生します。各StorageAreaインスタンスには独自のonChangedイベントがあることに注意してください。browser.webNavigation- 飛行中のナビゲーション リクエストのステータスに関する情報を提供します。
フィルタ
イベントを特定のユースケースに制限したり、不要なイベント呼び出しを排除したりするには、イベント フィルタをサポートする API を使用します。たとえば、ユーザーが特定のウェブサイトにアクセスしたことを検出するために tabs.onUpdated イベントをリッスンする拡張機能を考えてみましょう。このイベントは、すべてのタブのすべてのナビゲーションで呼び出されます。代わりに、フィルタで webNavigation.onCompleted を使用します。次に例を示します。
const filter = {
url: [
{
urlMatches: 'https://www.google.com/',
},
],
};
browser.webNavigation.onCompleted.addListener(() => {
console.info("The user has loaded my favorite website!");
}, filter);
Service Worker イベント
拡張機能のサービス ワーカーは、他の場所で説明されているライフサイクル イベント以外もサポートしています。
ServiceWorkerGlobal.fetch
拡張機能パッケージから何かが取得されたとき、または拡張機能やポップアップ スクリプトから fetch() と XMLHttpRequest() が呼び出されたときに発生します。(コンテンツ スクリプトからの呼び出しは、Service Worker の fetch ハンドラによってインターセプトされません)。後者の場合は、取得するページの URL を manifest.json の "host_permissions" キーに追加する必要があります。
ServiceWorkerGlobal.message
Service Worker のメッセージ パスは、拡張機能のメッセージ パスに加えて利用できますが、2 つのシステムには相互運用性はありません。つまり、sendMessage()(複数の拡張機能 API で利用可能)を使用して送信されたメッセージは、Service Worker のメッセージ ハンドラによってインターセプトされません。同様に、postMessage() を使用して送信されたメッセージは、拡張機能のメッセージ ハンドラによってインターセプトされません。拡張機能サービス ワーカーでは、ServiceWorkerGlobal.message と browser.runtime.onMessage の両方のメッセージ ハンドラがサポートされています。
サービス ワーカー メッセージングを使用する特別な理由がない限り、拡張機能メッセージングを使用することをおすすめします。