хром.за кадром

Описание

Используйте API- offscreen для создания и управления документами, не отображаемыми на экране.

Разрешения

offscreen

Чтобы использовать Offscreen API, укажите разрешение "offscreen" в манифесте расширения . Например:

{
  "name": "My extension",
  ...
  "permissions": [
    "offscreen"
  ],
  ...
}

Доступность

Chrome 109+ MV3+

Концепции и использование

У сервис-воркеров нет доступа к DOM, и на многих веб-сайтах действуют политики безопасности контента, ограничивающие функциональность скриптов контента. API Offscreen позволяет расширению использовать API DOM в скрытом документе, не прерывая работу пользователя открытием новых окон или вкладок. API runtime — единственный API расширений, поддерживаемый документами Offscreen.

Страницы, загруженные как внеэкранные документы, обрабатываются иначе, чем другие типы страниц расширений. Разрешения расширения переносятся на внеэкранные документы, но с ограничениями на доступ к API расширения. Например, поскольку API chrome.runtime — единственный API расширений, поддерживаемый внеэкранными документами, обмен сообщениями должен осуществляться с использованием элементов этого API.

Ниже приведены другие отличия поведения внеэкранных документов от поведения обычных страниц:

  • URL-адрес внеэкранного документа должен представлять собой статический HTML-файл, связанный с расширением.
  • Невозможно сфокусироваться на документах, находящихся за пределами экрана.
  • Внеэкранный документ является экземпляром window , но значение его свойства opener всегда равно null .
  • Хотя пакет расширения может содержать несколько внеэкранных документов, установленное расширение может одновременно открыть только один документ. Если расширение работает в раздельном режиме с активным профилем инкогнито, в обычном и инкогнито-профилях может быть открыто по одному внеэкранному документу.

Используйте chrome.offscreen.createDocument() и chrome.offscreen.closeDocument() для создания и закрытия внеэкранного документа. createDocument() требуется url документа, причина и обоснование:

chrome.offscreen.createDocument({
  url: 'off_screen.html',
  reasons: ['CLIPBOARD'],
  justification: 'reason for needing the document',
});

Причины

Список допустимых причин см. в разделе «Причины» . Причины задаются при создании документа и определяют срок его действия. Причина AUDIO_PLAYBACK закрывает документ через 30 секунд без воспроизведения звука. Все остальные причины не ограничивают срок действия.

Примеры

Поддерживать жизненный цикл внеэкранного документа

В следующем примере показано, как убедиться в существовании внеэкранного документа. Функция setupOffscreenDocument() вызывает runtime.getContexts() для поиска существующего внеэкранного документа или создаёт его, если он ещё не существует.

let creating; // A global promise to avoid concurrency issues
async function setupOffscreenDocument(path) {
  // Check all windows controlled by the service worker to see if one
  // of them is the offscreen document with the given path
  const offscreenUrl = chrome.runtime.getURL(path);
  const existingContexts = await chrome.runtime.getContexts({
    contextTypes: ['OFFSCREEN_DOCUMENT'],
    documentUrls: [offscreenUrl]
  });

  if (existingContexts.length > 0) {
    return;
  }

  // create offscreen document
  if (creating) {
    await creating;
  } else {
    creating = chrome.offscreen.createDocument({
      url: path,
      reasons: ['CLIPBOARD'],
      justification: 'reason for needing the document',
    });
    await creating;
    creating = null;
  }
}

Перед отправкой сообщения в документ, не отображаемый на экране, вызовите setupOffscreenDocument() чтобы убедиться, что документ существует, как показано в следующем примере.

chrome.action.onClicked.addListener(async () => {
  await setupOffscreenDocument('off_screen.html');

  // Send message to offscreen document
  chrome.runtime.sendMessage({
    type: '...',
    target: 'offscreen',
    data: '...'
  });
});

Полные примеры смотрите в демонстрационных версиях offscreen-clipboard и offscreen-dom на GitHub.

До Chrome 116: проверьте, открыт ли документ, не отображаемый на экране

runtime.getContexts() был добавлен в Chrome 116. В более ранних версиях Chrome для проверки наличия существующего закадрового документа используйте clients.matchAll() :

async function hasOffscreenDocument() {
  if ('getContexts' in chrome.runtime) {
    const contexts = await chrome.runtime.getContexts({
      contextTypes: ['OFFSCREEN_DOCUMENT'],
      documentUrls: [OFFSCREEN_DOCUMENT_PATH]
    });
    return Boolean(contexts.length);
  } else {
    const matchedClients = await clients.matchAll();
    return matchedClients.some(client => {
      return client.url.includes(chrome.runtime.id);
    });
  }
}

Типы

CreateParameters

Характеристики

  • оправдание

    нить

    Строка, предоставленная разработчиком, которая более подробно объясняет необходимость фонового контекста. Пользовательский агент _может_ использовать её для отображения пользователю.

  • причины

    Причина(ы) по которой расширение создает внеэкранный документ.

  • URL-адрес

    нить

    (Относительный) URL-адрес для загрузки документа.

Reason

Перечисление

«ТЕСТИРОВАНИЕ»
Причина, используемая только в целях тестирования.

"ВОСПРОИЗВЕДЕНИЕ_АУДИО"
Указывает, что за воспроизведение звука отвечает внеэкранный документ.

"IFRAME_SCRIPTING"
Указывает, что для изменения содержимого iframe внеэкранный документ должен быть встроен и оформлен в виде скрипта.

"DOM_SCRAPING"
Указывает, что внеэкранный документ должен встраивать iframe и считывать его DOM для извлечения информации.

"Капли"
Указывает, что внеэкранный документ должен взаимодействовать с объектами Blob (включая URL.createObjectURL() ).

"DOM_PARSER"
Указывает, что для внеэкранного документа необходимо использовать API DOMParser .

"USER_MEDIA"
Указывает, что внеэкранный документ должен взаимодействовать с медиапотоками из пользовательского медиа (например, getUserMedia() ).

"DISPLAY_MEDIA"
Указывает, что внеэкранный документ должен взаимодействовать с медиа-потоками от отображаемого носителя (например, getDisplayMedia() ).

"WEB_RTC"
Указывает, что для внеэкранного документа необходимо использовать API WebRTC .

«БУФЕР ОБМЕНА»
Указывает, что внеэкранный документ должен взаимодействовать с API буфера обмена .

"ЛОКАЛЬНОЕ_ХРАНИЛИЩЕ"
Указывает, что для внеэкранного документа необходим доступ к localStorage .

«РАБОТНИКИ»
Указывает, что внеэкранный документ должен порождать рабочих.

"СТАТУС_БАТАРЕИ"
Указывает, что для внеэкранного документа необходимо использовать navigator.getBattery .

"MATCH_MEDIA"
Указывает, что для внеэкранного документа необходимо использовать window.matchMedia .

«ГЕОЛОКАЦИЯ»
Указывает, что для внеэкранного документа необходимо использовать navigator.geolocation .

Методы

closeDocument()

chrome.offscreen.closeDocument(): Promise<void>

Закрывает открытый в данный момент внеэкранный документ для расширения.

Возврат

  • Обещание<void>

createDocument()

chrome.offscreen.createDocument(
  parameters: CreateParameters,
)
: Promise<void>

Создает новый внеэкранный документ для расширения.

Параметры

  • параметры

    Параметры, описывающие создаваемый внеэкранный документ.

Возврат

  • Обещание<void>