Управляйте событиями с помощью фоновых сценариев

Расширения — это программы, основанные на событиях, используемые для изменения или улучшения работы браузера Chrome. События — это триггеры браузера, такие как переход на новую страницу, удаление закладки или закрытие вкладки. Расширения отслеживают эти события в своем фоновом сценарии, а затем реагируют указанными инструкциями.

Фоновая страница загружается, когда она необходима, и выгружается, когда она простаивает. Некоторые примеры событий включают в себя:

  • Расширение сначала устанавливается или обновляется до новой версии.
  • Фоновая страница прослушивала событие, и событие было отправлено.
  • Сценарий содержимого или другое расширение отправляет сообщение.
  • Другое представление в расширении, например всплывающее окно, вызывает runtime.getBackgroundPage .

После загрузки фоновая страница будет работать до тех пор, пока она выполняет какое-либо действие, например вызов API Chrome или отправку сетевого запроса. Кроме того, фоновая страница не будет выгружаться до тех пор, пока не будут закрыты все видимые представления и все порты сообщений. Обратите внимание, что открытие представления не приводит к загрузке страницы событий, а только предотвращает ее закрытие после загрузки.

Эффективные фоновые сценарии остаются бездействующими до тех пор, пока не произойдет событие: они отслеживают возгорание, реагируют указанными инструкциями, а затем выгружаются.

Регистрация фоновых сценариев

Фоновые сценарии регистрируются в манифесте в поле "background" . Они перечислены в массиве после ключа "scripts" , а "persistent" должно быть указано как false.

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

Для модульного кода можно зарегистрировать несколько фоновых сценариев.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

Если расширение в настоящее время использует постоянную фоновую страницу, обратитесь к Руководству по фоновой миграции за инструкциями о том, как переключиться на непостоянную модель.

Инициализировать расширение

Прослушайте событие runtime.onInstalled , чтобы инициализировать расширение при установке. Используйте это событие для установки состояния или для однократной инициализации, например контекстного меню .

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

Настройка прослушивателей

Структурируйте фоновые сценарии вокруг событий, от которых зависит расширение. Определение функционально значимых событий позволяет фоновым сценариям оставаться бездействующими до тех пор, пока эти события не будут запущены, и предотвращает пропуск важных триггеров расширением.

Слушатели должны быть зарегистрированы синхронно с начала страницы.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

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

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

Расширения могут удалять прослушиватели из своих фоновых сценариев, вызывая removeListener . Если все прослушиватели события удалены, Chrome больше не будет загружать фоновый скрипт расширения для этого события.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

Фильтровать события

Используйте API, которые поддерживают фильтры событий , чтобы ограничить прослушиватели теми случаями, которые важны для расширения. Если расширение прослушивает событие tabs.onUpdated , попробуйте вместо этого использовать событие webNavigation.onCompleted с фильтрами, поскольку API вкладок не поддерживает фильтры.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

Реагируйте на слушателей

Прослушиватели существуют для запуска функций после срабатывания события. Чтобы отреагировать на событие, структурируйте желаемую реакцию внутри события прослушивателя.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

Выгрузить фоновые сценарии

Данные следует периодически сохранять, чтобы важная информация не была потеряна в случае сбоя расширения без получения onSuspend . Для этого используйте API хранилища .

chrome.storage.local.set({variable: variableInformation});

Если расширение использует передачу сообщений , убедитесь, что все порты закрыты. Фоновый сценарий не будет выгружаться до тех пор, пока все порты сообщений не закроются. Прослушивание события runtime.Port.onDisconnect позволит узнать, когда открытые порты закрываются. Вручную закройте их с помощью runtime.Port.disconnect .

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

Время жизни фонового сценария можно наблюдать, отслеживая появление и исчезновение записи о расширении в диспетчере задач Chrome.

ALT_TEXT_ЗДЕСЬ

Откройте диспетчер задач, щелкнув меню Chrome, наведя курсор на дополнительные инструменты и выбрав «Диспетчер задач».

Фоновые сценарии выгружаются самостоятельно через несколько секунд бездействия. Если требуется какая-либо очистка в последнюю минуту, прослушайте событие runtime.onSuspend .

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

Однако сохранение данных должно быть предпочтительнее, чем использование runtime.onSuspend . Он не позволяет выполнить необходимую очистку и не поможет в случае сбоя.