Service Worker のイベント

拡張機能サービス ワーカーは、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.onChanged
StorageArea オブジェクトがクリアされたとき、またはキーの値が変更または設定されたときに発生します。各 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.messagebrowser.runtime.onMessage の両方のメッセージ ハンドラがサポートされています。

サービス ワーカー メッセージングを使用する特別な理由がない限り、拡張機能メッセージングを使用することをおすすめします。