拡張機能サービス ワーカーは、標準のサービス ワーカー イベントと、拡張機能 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.message
と chrome.runtime.onMessage
の両方のタイプのメッセージ ハンドラがサポートされています。
サービス ワーカー メッセージを使用する明確な理由がない限り、拡張機能のメッセージングを使用することをおすすめします。