Cambios en el comportamiento de BFCache con puertos de mensajes de extensión

La memoria caché atrás/adelante (o BFCache) es una optimización del navegador que permite la navegación instantánea hacia atrás y hacia adelante. Estamos realizando cambios en la caché BF de Chrome que podrían afectar a las extensiones que usan puertos de mensajes. Si tienes una extensión de Chrome que usa mensajes para comunicarse entre secuencias de comandos de contenido y tu extensión, sigue leyendo para obtener información sobre cómo probar y adaptar tu extensión.

Puerto de mensaje de extensión

Las extensiones se comunican con la secuencia de comandos de contenido o con otras extensiones mediante el envío de mensajes. Los mensajes se pueden enviar mediante solicitudes únicas llamando a runtime.sendMessage() y tabs.sendMessage(), o usando un puerto de mensajes reutilizable. Siempre que el puerto esté activo, la secuencia de comandos del contenido y la secuencia de comandos en segundo plano de la extensión pueden reutilizar el puerto para publicar mensajes entre sí.

Para obtener más información, consulta Envío de mensajes.

Memoria caché atrás/adelante

Cuando sales de una página apta para BFCache, el navegador permite que la página con todo su estado permanezca en la memoria, pero en el estado no completamente activo. Si el usuario navega por el historial (ya sea hacia atrás o hacia adelante) a la página almacenada en caché, el navegador intentará restablecer la página desde BFCache. De esta manera, la navegación es más rápida y se mejora la experiencia de navegación del usuario.

Mientras la página se encuentra en BFCache, se encuentra en estado bloqueado en el que no se permite la ejecución de JavaScript. Esto significa que no puede procesar los mensajes que recibe.

Para obtener más información, consulta Memoria caché atrás/adelante.

Impacto de los puertos de mensajes de la extensión en BFCache

En resumen, una extensión que envía mensajes a una página de BFCache puede provocar la expulsión de la caché y afectar el rendimiento.

Cuando una página con un puerto de mensaje de extensión abierto se almacena en BFCache, el puerto permanece abierto. Una vez que se restablece la página desde BFCache, los service worker de extensiones pueden usar la referencia antigua del puerto de mensajes para publicar mensajes en la secuencia de comandos de contenido.

Sin embargo, si la extensión intenta publicar un mensaje a través de ese puerto de mensajes mientras la página aún está en BFCache, el mensaje se envía, pero no se entrega por completo porque el controlador está bloqueado. Es difícil para la extensión razonar y abordar esta situación, ya que poner en cola y descartar el mensaje tienen sus propios problemas.

Para no abordar los problemas relacionados con la pérdida de mensajes, en la implementación actual de Chrome, expulsa la página de host de BFCache y descarta el mensaje. Si el usuario regresa a la página, se cargará de nuevo, lo que permitirá que la extensión configure una nueva conexión.

Por otro lado, esta implementación restringe las situaciones en las que se aplica BFCache, lo que limita las mejoras de rendimiento, en especial para extensiones con mecanismos de transmisión o señal de monitoreo de funcionamiento que envían mensajes regularmente a todas las conexiones. Además, como la expulsión se activa cuando la extensión envía un mensaje a la secuencia de comandos de contenido, los desarrolladores web no tienen medios para evitar que sus páginas sean expulsadas.

Para mejorar el rendimiento general, tenemos previsto incorporar un nuevo comportamiento de puerto de mensajes.

Comportamiento nuevo: Cierre del canal de mensajes cuando la página se almacena en BFCache

A partir de Chrome 123, cuando una página con un puerto de mensajes de extensión abierto se almacena en BFCache, el canal de mensajes subyacente se cierra de forma proactiva desde el lado de la secuencia de comandos del contenido. Como resultado, todos los puertos de mensajes se cerrarán, y la extensión recibirá un evento onDisconnect.

Como el canal está cerrado, no se enviarán mensajes a la página mientras esté en BFCache. Por lo tanto, la página no se expulsará debido a la extensión.

Incluso después de que la página se restablezca desde BFCache, el canal de mensajes cerrado no se volverá a abrir. La práctica recomendada para los autores de extensiones es escuchar los eventos de ciclo de vida de la página y configurar una nueva conexión cuando la página se restablezca desde BFCache, como se muestra en el siguiente ejemplo.

// content script

let port;

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // The page is restored from BFCache, set up a new connection.
    port = chrome.runtime.connect();
  }
});

Obtén más información sobre la conversación de WECG de los representantes de los diferentes navegadores (en el problema 474).

¿Me afecta esta vulnerabilidad?

El nuevo comportamiento estará disponible detrás de una función experimental en Chrome 123 para que puedas probar el código. Consulta el cronograma para obtener más información. Sigue los pasos que se indican a continuación para probar tu extensión. Ten en cuenta que solo proporciona una prueba sencilla, y te recomendamos que ejecutes Chrome con la función habilitada durante un período de tiempo, ya que puede ser difícil predecir qué funciones de la extensión pueden causar problemas.

  1. Asegúrate de que la versión de Chrome sea la 123 como mínimo. Lo ideal es que uses Chrome Canary, que incluye una advertencia adicional para facilitar las pruebas.
  2. Inicia Chrome con la siguiente función experimental:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Ve a una página que sea apta para BFCache sin que se ejecute la extensión (por ejemplo, un sitio sencillo como https://example.com/). Sigue el instructivo de BFCache para asegurarte de que se restablezca desde BFCache.

  4. Instala y habilita la extensión, y vuelve a probar la elegibilidad de BFCache. Puedes salir de la página de forma manual, esperar un tiempo suficiente para que tu extensión publique un mensaje en la página de BFCached y volver a la página anterior.

  5. Si la página tuvo que cargarse actualizada en lugar de BFCache debido a una expulsión y el problema que impide el restablecimiento es "ExtensionSentMessageToCachedFrame", es posible que este cambio afecte la extensión.

    En Chrome Canary 124.0.6315.0 y versiones posteriores, también verás la siguiente advertencia en la página:

    Advertencia que se muestra cuando no se restablece una página desde BFCache.
    Advertencia que se muestra cuando no se restablece una página desde BFCache.

Una vez que se confirme que la extensión publica mensajes en la página BFCache, puedes seguir estos pasos para forzar la habilitación del experimento y observar si se interrumpe la lógica.

  1. Inicia Chrome con la siguiente función experimental:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Ve a la página que no se restableció desde BFCache debido a "ExtensionSentMessageToCachedFrame".

  3. Navega hacia atrás y adelante. Ahora la página debería restablecerse, pero el canal de mensajes entre la secuencia de comandos de contenido y el service worker debería desconectarse.

  4. Prueba si la extensión sigue funcionando como de costumbre. De lo contrario, debes volver a conectarte manualmente como se muestra en la sección anterior.

Cronograma de lanzamiento

Planeamos incrementar gradualmente el nuevo comportamiento a partir de Chrome 123. Este es el plan detallado:

Fecha Meta planificado
15 de febrero Inicia el experimento del nuevo comportamiento en Chrome Canary y Dev.
1 de marzo Comienza el experimento del nuevo comportamiento en Chrome Beta.
18 de marzo Lanza el nuevo comportamiento al 4% de los usuarios en la versión estable de Chrome.
25 de marzo Lanza el nuevo comportamiento para el 50% de los usuarios en la versión estable de Chrome.
2 de abril El experimento finaliza y el comportamiento nuevo será predeterminado.