События в сервисных работниках

Работники службы расширения поддерживают как стандартные события работника службы , так и многие события в API расширения . В этом разделе описываются доступные возможности и приводятся советы по их использованию.

Объявить события расширения

Обработчики событий в сервис-воркерах должны быть объявлены в глобальной области видимости, то есть они должны находиться на верхнем уровне сценария, а не быть вложенными внутри функций. Это гарантирует их синхронную регистрацию при первоначальном выполнении скрипта, что позволяет Chrome отправлять события сервисному работнику сразу после его запуска. Например:

Не рекомендуется
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 требуются разрешения, а другие могут иметь события, методы или свойства, которые доступны не во всех версиях 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-адреса страниц, которые вы хотите получить, к ключу "host_permissions" в файле manifest.json .

ServiceWorkerGlobal.message

Передача сообщений сервисного работника доступна в дополнение к передаче сообщений расширения, но эти две системы несовместимы. Это означает, что сообщения, отправленные с помощью sendMessage() (который доступен из нескольких API расширений), не перехватываются обработчиками сообщений сервисного работника. Аналогично, сообщения, отправленные с помощью postMessage() не перехватываются обработчиками сообщений расширения. Оба типа обработчиков сообщений — то есть как ServiceWorkerGlobal.message , так и chrome.runtime.onMessage — поддерживаются в работниках служб расширений.

Вам следует отдать предпочтение обмену сообщениями с расширениями , если у вас нет особой причины использовать обмен сообщениями сервисных работников.