chrome.offscreen

Descripción

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

Permisos

offscreen

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

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

Disponibilidad

Chrome 109 y versiones posteriores MV3+ .

Conceptos y uso

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

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

Las siguientes son otras maneras 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 con la extensión.
  • Los documentos fuera de pantalla no se pueden enfocar.
  • Un documento fuera de pantalla es una instancia de window, pero el valor de su propiedad opener siempre es null.
  • Aunque un paquete de extensión puede contener varios documentos fuera de pantalla, una extensión instalada solo puede tengan una abierta a la vez. Si la extensión se está ejecutando en modo dividido con un perfil de incógnito activo, tanto el perfil normal como el incógnito tener un documento fuera de pantalla.

Usa chrome.offscreen.createDocument() y chrome.offscreen.closeDocument() para crear y cerrar un elemento fuera de 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 ver una lista de motivos válidos, consulta la sección Motivos. Los motivos se establecen durante la creación de documentos para determinar su vida útil. El motivo AUDIO_PLAYBACK establece la el documento se cierre después de 30 segundos sin reproducir audio. Los demás motivos no establecen límites de duración.

Ejemplos

Mantener el ciclo de vida de un documento fuera de pantalla

En el siguiente ejemplo, se muestra cómo asegurarse de que exista un documento fuera de pantalla. El La función setupOffscreenDocument() llama a runtime.getContexts() para buscar un documento existente fuera de pantalla o crea 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 pantalla, llama a setupOffscreenDocument() para asegurarte existe el documento, 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 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 buscar un documento fuera de pantalla existente:

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

Tipos

CreateParameters

Propiedades

  • justificación

    string

    Es una cadena proporcionada por el desarrollador que explica con más detalle la necesidad de un contexto en segundo plano. El usuario-agente _puede_ usarla para mostrársela al usuario.

  • motivos

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

  • url

    string

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

Reason

Enum

“PRUEBAS”
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 debe incorporar un iframe y una secuencia de comandos para poder 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 contenido multimedia del contenido multimedia del usuario (p.ej., getUserMedia()).

"DISPLAY_MEDIA"
Especifica que el documento fuera de pantalla debe interactuar con transmisiones de contenido multimedia del contenido multimedia de la pantalla (p.ej., getDisplayMedia()).

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

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

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

"WORKERS"
Especifica que el documento fuera de pantalla debe 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()

Promesa
chrome.offscreen.closeDocument(
  callback?: function,
)

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

Parámetros

  • callback

    función opcional

    El parámetro callback se ve de la siguiente manera:

    () => void

Muestra

  • Promesa<void>

    Las promesas son compatibles con Manifest V3 y versiones posteriores, pero se proporcionan devoluciones de llamada para retrocompatibilidad. No puedes usar ambos en la misma llamada a función. El se resuelve con el mismo tipo que se pasa a la devolución de llamada.

createDocument()

Promesa
chrome.offscreen.createDocument(
  parameters: CreateParameters,
  callback?: function,
)

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

Parámetros

  • Parámetros

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

  • callback

    función opcional

    El parámetro callback se ve de la siguiente manera:

    () => void

Muestra

  • Promesa<void>

    Las promesas son compatibles con Manifest V3 y versiones posteriores, pero se proporcionan devoluciones de llamada para retrocompatibilidad. No puedes usar ambos en la misma llamada a función. El se resuelve con el mismo tipo que se pasa a la devolución de llamada.