Service Worker のイベント

拡張機能 Service Worker は、標準 Service Worker のイベントと、拡張機能 API の多くのイベントの両方をサポートします。このセクションでは、利用可能な機能とそれを使用するためのヒントについて説明します。

拡張機能イベントを宣言する

Service Worker のイベント ハンドラは、グローバル スコープで宣言する必要があります。つまり、関数内でネストするのではなく、スクリプトの最上位に配置する必要があります。これにより、最初のスクリプト実行時に同期的にイベントが登録され、Chrome が開始したらすぐにイベントを Service Worker にディスパッチできるようになります。次に例を示します。

推奨しない
chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
  chrome.action.onClicked.addListener(handleActionClick);
});

比較的良い
chrome.action.onClicked.addListener(handleActionClick);

chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
});

一般的なイベント

拡張機能 Service Worker は、特定の API のイベントをサポートします。以下で、一般的なものをいくつか説明します。これらの API には、使用するための権限が必要な API や、Chrome のバージョンによっては利用できないイベント、メソッド、プロパティが含まれているものがあります。詳しくは、リンク先の API ドキュメント(特に、使用するイベント、メソッド、プロパティ)をご覧ください。

chrome.action
拡張機能のツールバー アイコンに対するユーザー操作に応じて発行されます。特定のページ(タブ)に対するアクションか、拡張機能全体に対するアクションかに応じて呼び出されます。
chrome.management
拡張機能のインストール、アンインストール、有効化、無効化に関連するイベントを提供します。
chrome.notifications
拡張機能によって生成されたシステム通知に対するユーザーの操作に関連するイベントを提供します。
chrome.permissions
ユーザーによって拡張機能の権限が付与または取り消されるタイミングを示します。
chrome.runtime
拡張機能のライフサイクルに関連するイベント、拡張機能の他の部分から送信されたメッセージ、利用可能な拡張機能や Chrome のアップデートの通知を提供します。
chrome.storage.onChanged
StorageArea オブジェクトがクリアされるか、キーの値が変更または設定された場合に発生します。各 StorageArea インスタンスに独自の onChanged イベントがあります。
chrome.webNavigation
処理中のナビゲーション リクエストのステータスに関する情報を提供します。

フィルタ

イベントを特定のユースケースに制限したり、不要なイベント呼び出しを排除したりするには、イベント フィルタをサポートする API を使用します。たとえば、ユーザーが特定のウェブサイトに移動したことを検出するために、tabs.onUpdated イベントをリッスンする拡張機能について考えてみましょう。このイベントは、各タブのすべてのナビゲーションで呼び出されます。代わりに、フィルタ付きの webNavigation.onCompleted を使用してください。次に例を示します。

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

chrome.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

ウェブ Service Worker イベント

拡張機能 Service Worker は、こちらで説明されているライフサイクル イベントよりも多くの機能をサポートしています。

ServiceWorkerGlobal.fetch

拡張機能パッケージから取得された場合、または拡張機能またはポップアップ スクリプトから fetch()XMLHttpRequest() が呼び出されたときに呼び出されます。(コンテンツ スクリプトからの呼び出しは、Service Worker fetch ハンドラによってインターセプトされません)。後者の場合は、取得するページの URL を manifest.json"host_permissions" キーに追加する必要があります。

ServiceWorkerGlobal.message

Service Worker のメッセージの受け渡しは拡張機能のメッセージの受け渡しに加えて使用できますが、この 2 つのシステムは相互運用できません。つまり、sendMessage()(複数の拡張 API から使用可能)を使用して送信されたメッセージは、Service Worker のメッセージ ハンドラでインターセプトされません。同様に、postMessage() を使用して送信されたメッセージは、拡張機能のメッセージ ハンドラによってインターセプトされません。拡張機能 Service Worker では、両方のタイプのメッセージ ハンドラ(ServiceWorkerGlobal.messagechrome.runtime.onMessage の両方)がサポートされています。

Service Worker メッセージを使用する特別な理由がない限り、拡張機能メッセージを使用することをおすすめします。