Le cache amélioré (ou BFCache) est une optimisation de navigateur qui permet de naviguer instantanément vers les pages précédentes et suivantes. Nous apportons des modifications à Chrome BFCache qui peuvent avoir un impact sur les extensions utilisant des ports de message. Si vous possédez une extension Chrome qui utilise la messagerie pour communiquer entre les scripts de contenu et votre extension, lisez la suite pour découvrir comment tester et adapter votre extension.
Port de message d'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 ponctuelles en appelant runtime.sendMessage()
et tabs.sendMessage()
, ou à l'aide d'un port de message réutilisable. Tant que le port est actif, le script de contenu et le script en arrière-plan de l'extension peuvent le réutiliser pour s'envoyer des messages.
Pour en savoir plus, consultez la section Transmission de messages.
Cache amélioré
Lorsque vous quittez une page éligible au cache amélioré, le navigateur permet à la page et à l'ensemble de son état de rester en mémoire, mais dans un état non entièrement actif. Si l'utilisateur accède à la page mise en cache à l'aide de l'historique (en arrière ou en avant), le navigateur tente de la restaurer à partir de BFCache. Cela accélère la navigation et améliore l'expérience de navigation de l'utilisateur.
Lorsque la page est dans le cache amélioré, elle est figée 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 "Retour"/"Avant".
Impact des ports de message d'extension sur BFCache
En résumé, 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 du BFCache, les anciens référents du port de message peuvent toujours être utilisés par les service workers de l'extension pour publier des messages dans le script de contenu.
Toutefois, si l'extension tente d'envoyer un message via ce port de message alors que la page est toujours dans BFCache, le message est envoyé, mais pas entièrement distribué, car le gestionnaire est figé. Il est difficile pour l'extension de raisonner sur cette situation et de la résoudre, car la mise en file d'attente et l'abandon du message présentent chacun leurs propres problèmes.
Pour éviter les problèmes liés aux messages perdus, dans l'implémentation actuelle de Chrome, la page hôte est supprimée de BFCache et le message est supprimé. Si l'utilisateur revient sur la page, elle sera chargée à nouveau, ce qui permettra à l'extension de configurer une nouvelle connexion.
D'autre part, cette implémentation limite les scénarios dans lesquels BFCache s'applique, ce qui limite les gains de performances, en particulier pour les extensions avec des mécanismes de diffusion ou de battement de cœur 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 message.
Nouveau comportement: fermeture du canal de messages 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
.
Étant donné que 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 supprimée en raison de l'extension.
Même après la restauration de la page à partir de BFCache, le canal de messages fermé ne sera pas rouvert. Il est recommandé aux auteurs d'extensions d'écouter les événements de cycle de vie de la page et de configurer une nouvelle connexion lorsque la page est restaurée à partir du cache amélioré, 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();
}
});
Pour en savoir plus sur la conversation WECG avec les représentants de différents navigateurs (problème 474), consultez cette page.
Suis-je concerné ?
Le nouveau comportement sera disponible derrière un flag dans Chrome 123 afin que vous puissiez tester votre code. Pour en savoir plus, consultez la chronologie. Suivez les étapes ci-dessous pour tester votre extension. Notez qu'il ne s'agit que 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édire quelles fonctionnalités de l'extension peuvent causer des problèmes.
Tester le nouveau comportement
Pour forcer l'activation du test dans Chrome 123:
Lancez Chrome avec l'indicateur suivant, qui force le nouveau comportement:
--enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
Accédez à une page et interagissez avec votre extension si nécessaire, afin qu'un script de contenu ouvre un port vers votre extension.
Quittez la page, puis revenez-y. La page devrait maintenant être restaurée, mais le canal de messages entre le script de contenu et le service worker doit être déconnecté.
Vérifiez si l'extension fonctionne toujours normalement. Si ce n'est pas le cas, vous devez vous reconnecter manuellement, comme indiqué dans la section précédente.
Identifier les problèmes simples à l'aide de l'ancien comportement
Avant ce changement, Chrome affichait un avertissement si vous tentiez d'envoyer un message à un port associé à une page dans le bfcache. Cela peut être utile pour identifier certains problèmes, mais pas tous, liés aux messages de l'arrière-plan vers la page.
- Assurez-vous que la version de Chrome est au moins la version 123. Dans l'idéal, utilisez Chrome Canary, qui dispose d'un avertissement supplémentaire pour faciliter les tests.
Lancez Chrome avec l'indicateur suivant, qui force l'ancien comportement:
--disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
Accédez à une page éligible au cache amélioré sans que l'extension ne soit exécutée (par exemple, un site simple comme https://example.com/). Suivez le tutoriel BFCache pour vous assurer qu'il est restauré à partir de BFCache.
Installez et activez l'extension, puis testez à nouveau l'éligibilité de BFCache. Vous pouvez quitter manuellement la page, attendre suffisamment longtemps pour que votre extension publie un message sur la page BFCached, puis revenir sur la page.
Si la page a dû être chargée à nouveau au lieu de BFCache en raison d'une éviction et que le problème empêchant la restauration est "ExtensionSentMessageToCachedFrame", l'extension peut être affectée par ce changement.
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.
Une fois que vous avez vérifié que l'extension publie des messages sur la page BFCache, vous pouvez suivre la procédure de la section précédente pour forcer l'activation du test et observer si des erreurs logiques se produisent.
Dates de sortie
Nous prévoyons de déployer 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 123 Canary et Dev. |
7 mars | Lancez le test du nouveau comportement dans la version bêta de Chrome 123. |
18 mars | Lancement du nouveau comportement auprès de 4 % des utilisateurs de Chrome 123 stable. |
25 mars | Lancement du nouveau comportement auprès de 50 % des utilisateurs dans Chrome 123 stable. |
2 avril | Le test se termine, et le nouveau comportement devient le comportement par défaut. |