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

Описание

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

Разрешения

offscreen

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

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

Доступность

Хром 109+ МВ3+

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

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

Страницы, загруженные как закадровые документы, обрабатываются иначе, чем другие типы страниц расширений. Разрешения расширения передаются и на закадровые документы, но с ограничениями на доступ к 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 await matchedClients.some(client => {
        client
.url.includes(chrome.runtime.id);
   
});
 
}
}

Типы

CreateParameters

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

  • оправдание

    нить

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

  • причины

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

  • URL

    нить

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

Reason

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

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

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

"IFRAME_SCRIPTING"
Указывает, что в закадровый документ необходимо внедрить и создать сценарий iframe, чтобы изменить содержимое iframe.

"ДОМ_СКРАПИНГ"
Указывает, что в закадровый документ необходимо внедрить iframe и очистить его DOM для извлечения информации.

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

"ДОМ_ПАРСЕР"
Указывает, что закадровый документ должен использовать API DOMParser .

"ПОЛЬЗОВАТЕЛЬ_МЕДИА"
Указывает, что закадровый документ должен взаимодействовать с медиапотоками пользовательского мультимедиа (например, getUserMedia() ).

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

"ВЕБ_RTC"
Указывает, что закадровый документ должен использовать API WebRTC .

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

"LOCAL_STORAGE"
Указывает, что документу за кадром требуется доступ к localStorage .

"РАБОЧИЕ"
Указывает, что закадровый документ должен порождать рабочие процессы.

"БАТАРЕЯ_СТАТУС"
Указывает, что закадровый документ должен использовать navigator.getBattery .

"МАТЧ_МЕДИА"
Указывает, что закадровый документ должен использовать window.matchMedia .

"ГЕОЛОКАЦИЯ"
Указывает, что закадровый документ должен использовать navigator.geolocation .

Методы

closeDocument()

Обещать
chrome.offscreen.closeDocument(
  callback
?: function,
)

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

Параметры

  • перезвонить

    функция необязательна

    Параметр callback выглядит так:

    () => void

Возврат

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

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

createDocument()

Обещать
chrome.offscreen.createDocument(
  parameters
: CreateParameters,
  callback
?: function,
)

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

Параметры

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

  • перезвонить

    функция необязательна

    Параметр callback выглядит так:

    () => void

Возврат

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

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