Zmiany w działaniu BFCache związane z portami wiadomości rozszerzeń

Pamięć podręczna stanu strony internetowej (BFCache) to optymalizacja przeglądarki, która umożliwia natychmiastową nawigację wstecz i do przodu. Wprowadzamy zmiany w pamięci podręcznej przeglądarki Chrome, które mogą mieć wpływ na rozszerzenia korzystające z portów wiadomości. Jeśli masz rozszerzenie do Chrome, które komunikuje się między skryptami treści a rozszerzeniem za pomocą komunikatów, przeczytaj poniżej, jak je przetestować i dostosować.

Port wiadomości rozszerzenia

Rozszerzenia komunikują się ze skryptem treści lub innymi rozszerzeniami za pomocą przekazywania wiadomości. Wiadomości można wysyłać za pomocą jednorazowych próśb, dzwoniąc do runtime.sendMessage() i tabs.sendMessage() lub korzystając z portu wielokrotnego użytku. Dopóki ten port jest aktywny, zarówno skrypt treści, jak i skrypt rozszerzenia działający w tle mogą ponownie wykorzystywać ten port do publikowania wiadomości między sobą.

Więcej informacji znajdziesz w sekcji Przekazywanie wiadomości.

Pamięć podręczna stanu strony internetowej

Podczas opuszczania strony, która kwalifikuje się do korzystania z pamięci podręcznej stanu strony internetowej, przeglądarka zezwala na pozostawienie w pamięci podręcznej strony ze stanem niepełnym aktywności. Jeśli użytkownik wykona nawigację w historii (do tyłu lub do przodu) do strony w pamięci podręcznej, przeglądarka spróbuje przywrócić stronę z BFCache. Dzięki temu nawigacja jest szybsza i wygodniejsza dla użytkownika.

Gdy strona znajduje się w pamięci podręcznej stanu strony internetowej, jest w stanie zablokowanym, przez co nie jest dozwolone wykonywanie kodu JavaScript. Oznacza to, że nie może przetwarzać otrzymywanych wiadomości.

Więcej informacji znajdziesz w artykule o pamięci podręcznej stanu strony internetowej.

Wpływ portów wiadomości rozszerzenia na BFCache

Krótko mówiąc, rozszerzenie wysyłające komunikaty do strony w BFCache może spowodować usunięcie pamięci podręcznej i wpłynąć na wydajność.

Gdy strona z otwartym portem wiadomości rozszerzenia jest przechowywana w BFCache, port pozostaje otwarty. Po przywróceniu strony z BFCache stare odniesienie do portu wiadomości może być nadal używane przez mechanizmy Service Worker rozszerzenia do publikowania wiadomości w skrypcie treści.

Jeśli jednak rozszerzenie spróbuje wysłać wiadomość przez ten port wiadomości, gdy strona nadal znajduje się w pamięci podręcznej, wiadomość zostanie wysłana, ale nie zostanie w pełni dostarczona, ponieważ moduł obsługi jest zablokowany. Rozumienie takiej sytuacji i rozwiązanie problemu nie jest łatwe, ponieważ zarówno kolejkowanie, jak i usuwanie wiadomości ma swoje własne problemy.

Aby uniknąć problemów związanych z utraconymi wiadomościami, w bieżącej implementacji Chrome usuwa stronę hosta z BFCache i usuwa wiadomość. Jeśli użytkownik wróci na stronę, zostanie ona wczytana na nowo, dzięki czemu rozszerzenie będzie mogło utworzyć nowe połączenie.

Z drugiej strony taka implementacja ogranicza przypadki, w których stosuje się buforowanie BFCache, ograniczając wzrost wydajności, zwłaszcza w przypadku rozszerzeń z mechanizmami przesyłania lub pakietu podtrzymującego, które regularnie wysyłają wiadomości do wszystkich połączeń. Poza tym trwałe usunięcie następuje, gdy rozszerzenie wysyła wiadomość do skryptu z treścią, więc programiści nie mogą zapobiec usunięciu stron.

Aby poprawić ogólną wydajność, planujemy wprowadzić nowy sposób przenoszenia wiadomości.

Nowe zachowanie: zamknięcie kanału wiadomości, gdy strona jest przechowywana w BFCache

Od wersji Chrome 123, gdy strona z otwartym portem wiadomości rozszerzenia jest przechowywana w BFCache, bazowy kanał wiadomości jest aktywnie zamykany od strony skryptu treści. Z tego powodu wszystkie porty wiadomości zostaną zamknięte, a rozszerzenie otrzyma zdarzenie onDisconnect.

Ponieważ kanał jest zamknięty, na stronę, która znajduje się w pamięci podręcznej, nie są wysyłane żadne wiadomości. Dlatego strona nie zostanie usunięta z powodu rozszerzenia.

Nawet po przywróceniu strony z BFCache zamknięty kanał wiadomości nie zostanie ponownie otwarty. Zalecaną praktyką dla autorów rozszerzeń jest nasłuchiwanie zdarzeń cyklu życia strony i skonfigurowanie nowego połączenia po przywróceniu strony z BFCache, jak pokazano w tym przykładzie.

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

Więcej informacji na temat rozmów z WECG przygotowanych przez przedstawicieli różnych przeglądarek (w ramach problemu 474).

Czy ta zmiana mnie dotyczy?

Nowy sposób działania będzie dostępny za flagą w Chrome 123, która pozwoli Ci przetestować kod. Więcej informacji znajdziesz na osi czasu. Aby przetestować rozszerzenie, wykonaj podane niżej czynności. Pamiętaj, że służy ona tylko do prostego testu, dlatego zalecamy używanie Chrome z włączoną tą funkcją przez jakiś czas, ponieważ trudno jest przewidzieć, które funkcje rozszerzenia mogą powodować problemy.

  1. Upewnij się, że Chrome jest w wersji co najmniej 123. Najlepiej jest używać Chrome Canary, który zawiera dodatkowe ostrzeżenie ułatwiające testowanie.
  2. Uruchom Chrome z tą flagą:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Otwórz stronę, która kwalifikuje się do korzystania z pamięci podręcznej stanu strony internetowej, nie mając aktywnego rozszerzenia (na przykład prostą witrynę, taką jak https://example.com/). Postępuj zgodnie z samouczkiem BFCache, aby upewnić się, że został on przywrócony z BFCache.

  4. Zainstaluj i włącz rozszerzenie, a następnie ponownie przetestuj zgodność z BFCache. Możesz ręcznie opuścić tę stronę, odczekać do czasu, aż rozszerzenie opublikuje wiadomość na stronie BFCache, a następnie wrócić.

  5. Jeśli z powodu usunięcia strona musiała zostać wczytana na nowo, a nie z BFCache, a problem uniemożliwiający przywrócenie to „ExtensionSentMessageToCachedFrame”, ta zmiana może wpłynąć na rozszerzenie.

    W Chrome Canary w wersji 124.0.6315.0 i nowszych pojawi się też to ostrzeżenie:

    Ostrzeżenie wyświetlane, gdy strona nie zostanie przywrócona z BFCache.
    Ostrzeżenie pokazywane, gdy strona nie zostanie przywrócona z BFCache.

Po potwierdzeniu, że rozszerzenie publikuje wiadomości na stronie BFCache, możesz wykonać te czynności, aby wymusić włączenie eksperymentu i sprawdzić, czy występują jakieś błędy logiczne.

  1. Uruchom Chrome z tą flagą:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Otwórz stronę, która nie została przywrócona z BFCache z powodu „ExtensionSentMessageToCachedFrame”.

  3. Przejdź na inną stronę i wróć. Strona powinna zostać teraz przywrócona, ale kanał wiadomości między skryptem treści a skryptem service worker powinien być odłączony.

  4. Sprawdź, czy rozszerzenie działa normalnie. Jeśli nie, musisz ręcznie połączyć się ponownie, jak pokazano w poprzedniej sekcji.

Harmonogram wersji

Nowe działanie planujemy stopniowo wprowadzać w Chrome 123. Oto szczegółowy plan:

Data Planowany kamień milowy
15 lutego Rozpocznij eksperyment z nowym zachowaniem w Chrome Canary i Dev.
1 marca Rozpocznij eksperyment z nowym sposobem działania Chrome w wersji beta.
18 marca Wprowadź nowe działanie w wersji stabilnej u 4% użytkowników.
25 marca Udostępniaj nowe działanie u 50% użytkowników w wersji stabilnej Chrome.
2 kwietnia Eksperyment się zakończy, a nowe zachowanie zostanie ustawione jako domyślne.