Service Worker のイベント

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

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

サービス ワーカーのイベント ハンドラはグローバル スコープで宣言する必要があります。つまり、スクリプトの最上位レベルに配置し、関数内にネストしないようにする必要があります。これにより、スクリプトの最初の実行時に同期的に登録されるため、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 });
});

一般的なイベント

拡張機能サービス ワーカーは、特定の 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);

ウェブサービス ワーカーのイベント

拡張機能サービス ワーカーは、他の場所で説明されているライフサイクル イベント以外もサポートしています。

ServiceWorkerGlobal.fetch

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

ServiceWorkerGlobal.message

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

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