chrome.offscreen

Descripción

Usa la API de offscreen para crear y administrar documentos fuera de la pantalla.

Permisos

offscreen

Para usar la API de Offscreen, declara el permiso "offscreen" en el manifiesto de la extensión. Por ejemplo:

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

Disponibilidad

Chrome 109 y versiones posteriores MV3 y versiones posteriores

Conceptos y uso

Los service workers no tienen acceso al DOM, y muchos sitios web tienen políticas de seguridad del contenido que limitan la funcionalidad de las secuencias de comandos de contenido. La API de Offscreen permite que la extensión use las APIs del DOM en un documento oculto sin interrumpir la experiencia del usuario abriendo ventanas o pestañas nuevas. La API de runtime es la única API de extensiones compatible con los documentos fuera de pantalla.

Las páginas cargadas como documentos fuera de pantalla se controlan de manera diferente a otros tipos de páginas de extensión. Los permisos de la extensión se transfieren a los documentos fuera de pantalla, pero con límites en el acceso a la API de extensiones. Por ejemplo, debido a que la API de chrome.runtime es la única API de extensiones compatible con los documentos fuera de pantalla, la mensajería debe controlarse con miembros de esa API.

A continuación, se indican otras formas en que los documentos fuera de pantalla se comportan de manera diferente a las páginas normales:

  • La URL de un documento fuera de pantalla debe ser un archivo HTML estático incluido en la extensión.
  • No se pueden enfocar los documentos fuera de la pantalla.
  • Un documento fuera de pantalla es una instancia de window, pero el valor de su propiedad opener siempre es null.
  • Si bien un paquete de extensión puede contener varios documentos fuera de pantalla, una extensión instalada solo puede tener uno abierto a la vez. Si la extensión se ejecuta en modo dividido con un perfil de Incógnito activo, cada perfil (normal y de Incógnito) puede tener un documento fuera de pantalla.

Usa chrome.offscreen.createDocument() y chrome.offscreen.closeDocument() para crear y cerrar un documento fuera de la pantalla. createDocument() requiere el url del documento, un motivo y una justificación:

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

Motivos

Para obtener una lista de los motivos válidos, consulta la sección Motivos. Los motivos se establecen durante la creación del documento para determinar su ciclo de vida. El motivo AUDIO_PLAYBACK establece que el documento se cierre después de 30 segundos sin que se reproduzca audio. Todos los demás motivos no establecen límites de duración.

Ejemplos

Cómo mantener el ciclo de vida de un documento fuera de pantalla

En el siguiente ejemplo, se muestra cómo garantizar que exista un documento fuera de la pantalla. La función setupOffscreenDocument() llama a runtime.getContexts() para encontrar un documento fuera de la pantalla existente o crear el documento si aún no existe.

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;   } } 

Antes de enviar un mensaje a un documento fuera de la pantalla, llama a setupOffscreenDocument() para asegurarte de que el documento exista, como se muestra en el siguiente ejemplo.

chrome.action.onClicked.addListener(async () => {   await setupOffscreenDocument('off_screen.html');    // Send message to offscreen document   chrome.runtime.sendMessage({     type: '...',     target: 'offscreen',     data: '...'   }); }); 

Para ver ejemplos completos, consulta las demostraciones de offscreen-clipboard y offscreen-dom en GitHub.

Antes de Chrome 116: Comprueba si hay un documento fuera de pantalla abierto

Se agregó runtime.getContexts() en Chrome 116. En versiones anteriores de Chrome, usa clients.matchAll() para verificar si existe un documento fuera de pantalla:

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);     });   } } 

Tipos

CreateParameters

Propiedades

  • justificación

    string

    Es una cadena proporcionada por el desarrollador que explica, con más detalle, la necesidad del contexto en segundo plano. El agente de usuario _puede_ usar esta información para mostrarla al usuario.

  • motivos

    Son los motivos por los que la extensión crea el documento fuera de pantalla.

  • url

    string

    Es la URL (relativa) que se cargará en el documento.

Reason

Enum

"PRUEBA"
Es un motivo que se usa solo con fines de prueba.

"AUDIO_PLAYBACK"
Especifica que el documento fuera de pantalla es responsable de reproducir audio.

"IFRAME_SCRIPTING"
Especifica que el documento fuera de pantalla necesita incorporar y programar un iframe para modificar su contenido.

"DOM_SCRAPING"
Especifica que el documento fuera de pantalla debe incorporar un iframe y extraer su DOM para extraer información.

"BLOBS"
Especifica que el documento fuera de pantalla debe interactuar con objetos Blob (incluido URL.createObjectURL()).

"DOM_PARSER"
Especifica que el documento fuera de pantalla debe usar la API de DOMParser.

"USER_MEDIA"
Especifica que el documento fuera de pantalla debe interactuar con transmisiones de medios de medios del usuario (p.ej., getUserMedia()).

"DISPLAY_MEDIA"
Especifica que el documento fuera de pantalla debe interactuar con transmisiones de contenido multimedia de medios de visualización (p.ej., getDisplayMedia()).

"WEB_RTC"
Especifica que el documento fuera de pantalla debe usar las APIs de WebRTC.

"CLIPBOARD"
Especifica que el documento fuera de pantalla debe interactuar con la API de Clipboard.

"LOCAL_STORAGE"
Especifica que el documento fuera de pantalla necesita acceso a localStorage.

"WORKERS"
Especifica que el documento fuera de pantalla necesita generar trabajadores.

"BATTERY_STATUS"
Especifica que el documento fuera de pantalla debe usar navigator.getBattery.

"MATCH_MEDIA"
Especifica que el documento fuera de pantalla debe usar window.matchMedia.

"GEOLOCATION"
Especifica que el documento fuera de pantalla debe usar navigator.geolocation.

Métodos

closeDocument()

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

Cierra el documento fuera de pantalla que está abierto actualmente para la extensión.

Muestra

  • Promise<void>

createDocument()

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

Crea un documento fuera de pantalla nuevo para la extensión.

Parámetros

  • Parámetros

    Son los parámetros que describen el documento fuera de pantalla que se creará.

Muestra

  • Promise<void>