Änderungen am BFCache-Verhalten mit Erweiterungsnachrichtenports

Der Back-Forward-Cache (auch „BFCache“ genannt) ist eine Browseroptimierung, die eine sofortige Zurück- und Vorwärtsnavigation ermöglicht. Wir nehmen Änderungen am Chrome BFCache vor, die möglicherweise Auswirkungen auf Erweiterungen mit Nachrichtenports haben. Wenn Sie eine Chrome-Erweiterung haben, die Nachrichten für die Kommunikation zwischen Inhaltsskripten und Ihrer Erweiterung verwendet, lesen Sie weiter, um zu erfahren, wie Sie Ihre Erweiterung testen und anpassen.

Nachrichtenport für Erweiterung

Erweiterungen kommunizieren über die Nachrichtenweitergabe mit dem Inhaltsskript oder anderen Erweiterungen. Nachrichten können mit einmaligen Anfragen durch Aufrufen von runtime.sendMessage() und tabs.sendMessage() oder über einen wiederverwendbaren Nachrichtenport gesendet werden. Solange der Port aktiv ist, können sowohl das Inhaltsskript als auch das Hintergrundskript der Erweiterung den Port wiederverwenden, um Nachrichten aneinander zu senden.

Weitere Informationen finden Sie unter Nachrichtenübergabe.

Back-Forward-Cache

Wird eine Seite verlassen, die für BFCache geeignet ist, lässt der Browser zu, dass die Seite mit ihrem gesamten Status zwar im Arbeitsspeicher verbleibt, aber nicht vollständig aktiv ist. Wenn der Nutzer im Verlauf (entweder vorwärts oder zurück) zur im Cache gespeicherten Seite navigiert, versucht der Browser, die Seite aus BFCache wiederherzustellen. Dies beschleunigt die Navigation und verbessert das Surferlebnis für den Nutzer.

Während sich die Seite in BFCache befindet, befindet sie sich in einem eingefrorenen Zustand, in dem keine JavaScript-Ausführung zulässig ist. Das bedeutet, dass empfangene Nachrichten nicht verarbeitet werden können.

Weitere Informationen finden Sie unter Back-Forward-Cache.

Auswirkungen der Nachrichtenports der Erweiterung auf BFCache

Kurz gesagt, kann eine Erweiterung, die Nachrichten an eine Seite in BFCache sendet, die Cache-Bereinigung verursachen und die Leistung beeinträchtigen.

Wenn eine Seite mit einem offenen Nachrichtenport für eine Erweiterung im BFCache gespeichert ist, bleibt der Port geöffnet. Nachdem die Seite aus BFCache wiederhergestellt wurde, kann die alte Referenz des Nachrichtenports weiterhin von den Service Workern der Erweiterung verwendet werden, um Nachrichten im Inhaltsskript zu posten.

Wenn die Erweiterung jedoch versucht, eine Nachricht über diesen Nachrichtenport zu posten, während sich die Seite noch im BFCache befindet, wird die Nachricht zwar gesendet, aber nicht vollständig zugestellt, da der Handler eingefroren ist. Es ist für die Erweiterung schwierig, diese Situation nachzuvollziehen und umzugehen, da sowohl das Zurückstellen als auch das Ablegen der Nachricht eigene Probleme mit sich bringen können.

In der aktuellen Implementierung von Chrome wird die Host-Seite aus dem BFCache entfernt und die Nachricht verworfen, um zu vermeiden, dass Probleme im Zusammenhang mit verlorenen Nachrichten auftreten. Wenn der Nutzer zur Seite zurückkehrt, wird sie neu geladen, sodass die Erweiterung eine neue Verbindung herstellen kann.

Andererseits beschränkt diese Implementierung die Szenarien, in denen BFCache angewendet wird, und schränkt die Leistungssteigerungen ein, insbesondere bei Erweiterungen mit Broadcast- oder Heartbeat-Mechanismen, die regelmäßig Nachrichten an alle Verbindungen senden. Da die Bereinigung ausgelöst wird, wenn die Erweiterung eine Nachricht an das Inhaltsskript sendet, haben Webentwickler außerdem keine Möglichkeit zu verhindern, dass ihre Seiten entfernt werden.

Um die Gesamtleistung zu verbessern, planen wir die Einführung eines neuen Nachrichtenportverhaltens.

Neues Verhalten: Schließen des Nachrichtenkanals, wenn die Seite in BFCache gespeichert wird

Wenn ab Chrome 123 eine Seite mit einem offenen Nachrichtenport für eine Erweiterung im BFCache gespeichert ist, wird der zugrunde liegende Nachrichtenkanal proaktiv über die Inhaltsskriptseite geschlossen. Infolgedessen werden alle Nachrichtenports geschlossen und die Erweiterung empfängt das Ereignis onDisconnect.

Da der Kanal geschlossen ist, werden keine Nachrichten an die Seite gesendet, solange sie sich im BFCache befindet. Daher wird die Seite aufgrund der Verlängerung nicht entfernt.

Auch nachdem die Seite aus BFCache wiederhergestellt wurde, wird der geschlossene Nachrichtenkanal nicht wieder geöffnet. Für Autoren von Erweiterungen wird empfohlen, die Lebenszyklusereignisse der Seite zu beobachten und eine neue Verbindung herzustellen, wenn die Seite aus BFCache wiederhergestellt wird, wie im folgenden Beispiel gezeigt.

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

Weitere Informationen zur WECG-Unterhaltung von verschiedenen Browsern (unter Problem 474)

Bin ich betroffen?

Das neue Verhalten wird hinter einer Markierung in Chrome 123 verfügbar sein, damit Sie Ihren Code testen können. Weitere Informationen finden Sie in der Zeitachse. Führen Sie die folgenden Schritte aus, um Ihre Erweiterung zu testen. Hinweis: Es handelt sich lediglich um einen einfachen Test. Wir empfehlen Ihnen, Chrome für einen bestimmten Zeitraum mit aktivierter Funktion auszuführen, da schwer vorherzusagen ist, welche Funktionen in der Erweiterung möglicherweise Probleme verursachen.

  1. Achten Sie darauf, dass die Chrome-Version 123 mindestens ist. Verwenden Sie am besten Chrome Canary, das über eine zusätzliche Warnung verfügt, um das Testen zu vereinfachen.
  2. Starten Sie Chrome mit dem folgenden Flag:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Rufen Sie eine Seite auf, die für BFCache geeignet ist, ohne dass die Erweiterung ausgeführt wird (z. B. eine einfache Website wie https://example.com/). Folgen Sie der Anleitung zu BFCache, um sicherzustellen, dass er aus BFCache wiederhergestellt wird.

  4. Installieren und aktivieren Sie die Erweiterung und testen Sie die BFCache-Berechtigung noch einmal. Du kannst die Seite manuell verlassen, eine gewisse Zeit warten, bis deine Erweiterung eine Nachricht auf der „BFCache“-Seite posten kann, und dann zurücknavigieren.

  5. Wenn die Seite aufgrund einer Bereinigung neu geladen werden musste und nicht aus BFCache, und das Problem, das die Wiederherstellung verhindert, „ExtensionSentMessageToCachedFrame“ ist, ist die Erweiterung möglicherweise von dieser Änderung betroffen.

    Ab Chrome Canary 124.0.6315.0 wird auf der Seite außerdem die folgende Warnung angezeigt:

    Warnung, die angezeigt wird, wenn eine Seite nicht aus BFCache wiederhergestellt wird.
    Warnung, die angezeigt wird, wenn eine Seite nicht aus dem BFCache wiederhergestellt wird.

Sobald bestätigt wurde, dass die Erweiterung Nachrichten auf der BFCache-Seite postet, können Sie die Aktivierung des Tests durch folgende Schritte erzwingen und beobachten, ob Logikfehler vorliegt.

  1. Starten Sie Chrome mit dem folgenden Flag:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Rufen Sie die Seite auf, die aufgrund von „ExtensionSentMessageToCachedFrame“ nicht aus BFCache wiederhergestellt wurde.

  3. Weg und Zurück navigieren Die Seite sollte jetzt wiederhergestellt werden, aber der Nachrichtenkanal zwischen dem Inhaltsskript und dem Service Worker sollte getrennt werden.

  4. Testen Sie, ob die Erweiterung weiterhin wie gewohnt funktioniert. Falls nicht, stellen Sie die Verbindung wie im vorherigen Abschnitt beschrieben manuell wieder her.

Zeitplan für die Veröffentlichung

Wir planen, das neue Verhalten ab Chrome 123 nach und nach einzuführen. Hier ist der detaillierte Plan:

Datum Geplanter Meilenstein
15. Februar Starten Sie den Test für das neue Verhalten in Chrome Canary und Chrome Dev.
1. März Starte den Test für das neue Verhalten in Chrome Beta.
18. März Das neue Verhalten wird für 4 % der Nutzer in der stabilen Chrome-Version veröffentlicht.
25. März Das neue Verhalten wird für 50 % der Nutzer in der stabilen Chrome-Version veröffentlicht.
2. April Der Test wird beendet und das neue Verhalten wird standardmäßig verwendet.