Documentos fuera de pantalla en Manifest V3

Ian Stanion
Ian Stanion

Para reemplazar la funcionalidad en la transición de páginas de fondo a service worker de extensiones, los desarrolladores pueden usar la API de chrome.offscreen y el permiso del manifiesto a partir de Chrome 109. La solicitud de este permiso permite la creación de documentos fuera de la pantalla para usar API de DOM sin abrir ventanas o pestañas nuevas de forma intrusiva que interrumpan la experiencia del usuario. La API de chrome.offscreen ahora está disponible en las extensiones de Chrome.

En Chromium, las extensiones de Manifest V3 se basan en service worker, pero estos no brindan compatibilidad con las mismas APIs y mecanismos que las páginas basadas en documentos (incluidas las páginas de fondo y eventos). Además, el uso de secuencias de comandos de contenido para acceder a APIs de DOM en páginas web deja la extensión a merced de diferentes políticas de seguridad de contenido de página a página. Para resolver esto, introducimos los documentos fuera de pantalla para admitir funciones y APIs relacionadas con el DOM al permitir que las extensiones de Manifest V3 abran documentos fuera de pantalla mínimos, con alcance y relativamente sin permisos en tiempo de ejecución a través de una API dedicada.

Información de la función

Dado que los documentos fuera de pantalla están diseñados específicamente para abordar casos de uso que no se admiten en los service workers (por ejemplo, reproducción de audio), la vida útil de esta página y los permisos que se le otorgarán son independientes de los del service worker de extensión. La página tendrá un mecanismo de ciclo de vida similar al de las páginas de eventos en Manifest V2, ya que se eliminará cuando deje de realizar acciones. Además, el usuario-agente puede establecer restricciones adicionales en el ciclo de vida específicas para el propósito especificado. Los documentos fuera de pantalla están diseñados para llenar los vacíos de las APIs a las que solo pueden acceder las APIs del DOM; por este motivo, no es necesario exponer las APIs de extensiones directamente en este contexto. Para reducir la probabilidad de que se usen extensiones como "reemplazo de página en segundo plano", solo se exponen las APIs de chrome.runtime de mensajes al documento fuera de pantalla. (Los desarrolladores también pueden usar la mensajería web reclamando el documento fuera de pantalla como Cliente a través de su service worker). Dado que algunos casos de uso, en particular, el scraping de sitios, requieren acceso a marcos de origen cruzado, permitimos que estos documentos incorporen marcos de origen cruzado siguiendo las mismas reglas que se aplican actualmente a las páginas de extensiones. En los documentos fuera de pantalla, las secuencias de comandos de contenido especificadas por la extensión pueden ejecutarse en estos marcos para extraer el contenido necesario, como lo haría en cualquier página web normal.

Motivos y exigir un propósito

Para crear un documento fuera de pantalla, se requieren motivos indicados y justificación adicional. Estos motivos se enumeran en la documentación de referencia de la API y manejan la vida útil del documento de diferentes maneras. Por ejemplo, en este momento, un documento abierto para la reproducción de audio tiene reglas distintas durante su ciclo de vida que a un documento abierto para la administración del portapapeles. También puedes agregar más detalles sobre el propósito del documento fuera de pantalla en la justificación, que es una cadena escrita por el desarrollador y no un parámetro con efectos en el documento. Con el tiempo, se pueden agregar más razones a la API a medida que los desarrolladores comparten sus comentarios y casos de uso.

Hacia el futuro

Para facilitar la implementación, la primera versión de esta API solo admite una página por extensión y por perfil a la vez. En versiones futuras, es posible que debamos flexibilizar esto para admitir varias páginas. Actualmente, si la extensión se ejecuta en modo dividido con un perfil de incógnito activo, tanto el perfil normal como el de incógnito pueden tener un documento fuera de pantalla cada uno. También está planificado ofrecer la funcionalidad del DOM del trabajador de extensión más adelante. Puedes “preparar tus extensiones para el futuro” combinando funciones que usen la API fuera de pantalla con una función comentada equivalente en el service worker para hacer el intercambio en una fecha posterior.

// Solution 1 - Service workers cannot directly interact with
// the system clipboard. To work around this, we'll create an offscreen
// document and pass the data we want to write to the clipboard.
async function addToClipboard(value) {
    await chrome.offscreen.createDocument({
      url: 'offscreen.html',
      reasons: [chrome.offscreen.Reason.CLIPBOARD],
      justification: 'Write text to the clipboard.',
    });
  }


// Solution 2 – Once extension service workers can use the Clipboard API,
// replace the offscreen document based implementation with something like this
async function addToClipboardV2(value) {
  navigator.clipboard.writeText(value);
}

Además, a medida que se agregan la funcionalidad del DOM y las APIs al service worker, se agregará o reducirá la lista de motivos para crear un documento según el estado actual del service worker y las razones para usar documentos fuera de pantalla.

Conclusión

Los documentos fuera de pantalla permiten extensiones que requieren acceso de interacción entre ventanas o DOM y que actualmente no se puede lograr con service workers. También proporciona un enfoque flexible, en el que se pueden agregar nuevos casos de uso y quitar aquellos que se resuelvan en el futuro. Las extensiones deben emplear la API propuesta de documento fuera de pantalla para casos de uso específicos, y el contexto de fondo principal de la extensión debe seguir siendo el service worker especificado en el manifiesto. El documento fuera de pantalla no debe ser el lugar para almacenar la lógica de extensión principal porque tiene acceso limitado a la API. La vida útil de un documento fuera de pantalla es independiente del service worker que lo creó. En otra entrada de blog, se abordarán las consideraciones sobre el ciclo de vida del service worker y los casos de uso relacionados con este ciclo de vida en extensiones. Los motivos para usar documentos fuera de pantalla fluctúan con el tiempo a medida que se agreguen funciones y APIs al service worker. Esperamos recibir comentarios de los desarrolladores a medida que avance.

Foto de Kari Shea de Unsplash