Modifications apportées au comportement de BFCache avec les ports de message des extensions

Le cache amélioré (ou BFCache) est une optimisation du navigateur qui permet une navigation instantanée vers l'avant et l'avant. Nous apportons actuellement des modifications à Chrome BFCache, ce qui peut affecter les extensions utilisant des ports de message. Si vous possédez une extension Chrome qui utilise des messages pour communiquer entre les scripts de contenu et l'extension, poursuivez votre lecture pour savoir comment la tester et l'adapter.

Port de message de l'extension

Les extensions communiquent avec le script de contenu ou d'autres extensions via la transmission de messages. Les messages peuvent être envoyés à l'aide de requêtes uniques en appelant runtime.sendMessage() et tabs.sendMessage(), ou en utilisant un port de messagerie réutilisable. Tant que le port est actif, le script de contenu et le script d'arrière-plan de l'extension peuvent le réutiliser pour s'envoyer des messages.

Pour en savoir plus, consultez l'article Transmission de messages.

Cache amélioré

Lorsque vous quittez une page éligible pour BFCache, le navigateur autorise la page avec tout son état à rester en mémoire, mais à l'état totalement actif. Si l'utilisateur effectue une navigation depuis l'historique (vers l'avant ou vers l'avant) vers la page mise en cache, le navigateur tente de restaurer la page à partir de BFCache. Cela permet d'accélérer la navigation et d'améliorer l'expérience de navigation de l'utilisateur.

Lorsque la page se trouve dans BFCache, elle est dans un état figé et aucune exécution JavaScript n'est autorisée. Cela signifie qu'il ne peut pas traiter les messages qu'il reçoit.

Pour en savoir plus, consultez la section Cache amélioré.

Impact des ports de message d'extension sur BFCache

En bref, l'envoi de messages par une extension à une page dans BFCache peut entraîner l'éviction du cache et affecter les performances.

Lorsqu'une page avec un port de message d'extension ouvert est stockée dans BFCache, le port reste ouvert. Une fois la page restaurée à partir de BFCache, l'ancienne référence du port de messages peut toujours être utilisée par les service workers d'extension pour publier des messages dans le script de contenu.

Toutefois, si l'extension tente de publier un message via ce port de message alors que la page se trouve toujours dans BFCache, le message est envoyé, mais n'est pas complètement distribué, car le gestionnaire est bloqué. Il est difficile pour l'extension de comprendre et de résoudre cette situation, car la mise en file d'attente et l'abandon des messages ont chacun leurs propres problèmes.

Pour éviter les problèmes liés aux messages perdus, Chrome évince la page hôte de BFCache et supprime le message dans sa mise en œuvre actuelle. Si l'utilisateur revient sur la page, celle-ci sera chargée à nouveau, ce qui permettra à l'extension de configurer une nouvelle connexion.

D'autre part, cette implémentation restreint les scénarios dans lesquels BFCache s'applique, limitant ainsi les gains de performances, en particulier pour les extensions dotées de mécanismes de diffusion ou de pulsation qui envoient régulièrement des messages à toutes les connexions. De plus, comme l'éviction est déclenchée lorsque l'extension envoie un message au script de contenu, les développeurs Web n'ont aucun moyen d'empêcher l'éviction de leurs pages.

Pour améliorer les performances globales, nous prévoyons d'introduire un nouveau comportement de port de messages.

Nouveau comportement: fermeture du canal de message lorsque la page est stockée dans BFCache

À partir de Chrome 123, lorsqu'une page avec un port de message d'extension ouvert est stockée dans BFCache, le canal de message sous-jacent est fermé de manière proactive du côté du script de contenu. Par conséquent, tous les ports de message seront fermés, et l'extension recevra un événement onDisconnect.

Comme le canal est fermé, aucun message ne sera envoyé à la page tant qu'elle se trouve dans BFCache. Par conséquent, la page ne sera pas évincée en raison de l'extension.

Même une fois la page restaurée à partir de BFCache, le canal de messagerie fermé n'est pas rouvert. La pratique recommandée pour les auteurs d'extensions consiste à écouter les événements de cycle de vie de la page et à configurer une nouvelle connexion lorsque la page est restaurée à partir de BFCache, comme illustré dans l'exemple suivant.

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

Vous trouverez davantage d'informations sur la conversation WECG avec les représentants de différents navigateurs (problème 474).

Suis-je concerné ?

Le nouveau comportement sera disponible derrière un indicateur dans Chrome 123 pour que vous puissiez tester votre code. Pour en savoir plus, consultez le calendrier. Suivez les étapes ci-dessous pour tester votre extension. Notez qu'il s'agit uniquement d'un test simple. Nous vous encourageons à exécuter Chrome avec la fonctionnalité activée pendant un certain temps, car il peut être difficile de prévoir quelles fonctionnalités de l'extension sont susceptibles de provoquer des problèmes.

  1. Assurez-vous de disposer de la version 123 ou ultérieure de Chrome. Idéalement, utilisez Chrome Canary, qui comporte un avertissement supplémentaire pour faciliter les tests.
  2. Lancez Chrome avec l'indicateur suivant:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Accédez à une page éligible pour BFCache sans l'extension (par exemple, un site simple comme https://example.com/). Suivez le tutoriel BFCache pour vous assurer qu'il est restauré à partir de BFCache.

  4. Installez et activez l'extension, puis testez à nouveau l'éligibilité à BFCache. Vous pouvez quitter manuellement la page, attendre un certain temps pour que votre extension publie un message sur la page BFCached, puis revenir en arrière.

  5. Si la page a dû être chargée à jour au lieu de BFCache en raison d'une éviction et que le problème empêchant la restauration est "ExtensionSentMessageToCachedFrame", il se peut que l'extension soit affectée par cette modification.

    Dans Chrome Canary 124.0.6315.0 et versions ultérieures, l'avertissement suivant s'affiche également sur la page:

    Avertissement affiché lorsqu'une page n'est pas restaurée à partir de BFCache.
    Avertissement affiché lorsqu'une page n'est pas restaurée à partir de BFCache.

Après avoir vérifié que l'extension envoie des messages sur la page BFCache, vous pouvez suivre ces étapes pour forcer l'activation du test et vérifier si la logique ne fonctionne pas.

  1. Lancez Chrome avec l'indicateur suivant:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Accédez à la page qui n'a pas été restaurée à partir de BFCache en raison de "ExtensionSentMessageToCachedFrame".

  3. Naviguez et revenez en arrière. La page devrait maintenant être restaurée, mais le canal du message entre le script de contenu et le service worker doit être déconnecté.

  4. Vérifiez si l'extension fonctionne toujours comme d'habitude. Si ce n'est pas le cas, vous devez vous reconnecter manuellement, comme indiqué dans la section précédente.

Dates de sortie

Nous prévoyons d'intensifier progressivement le nouveau comportement à partir de Chrome 123. Voici le plan détaillé:

Date Étape planifiée
15 février Lancez le test du nouveau comportement dans Chrome Canary et Dev.
1er mars Lancez le test du nouveau comportement dans la version bêta de Chrome.
18 mars Déploiement du nouveau comportement auprès de 4 % des utilisateurs dans la version stable de Chrome.
25 mars Déploiement du nouveau comportement auprès de 50 % des utilisateurs dans la version stable de Chrome.
2 avril Le test se termine et le nouveau comportement est défini par défaut.