Modifiche al comportamento BFCache con le porte dei messaggi delle estensioni

Mingyu Lei
Mingyu Lei

La cache back-forward (o BFCache) è un'ottimizzazione del browser che consente la navigazione immediata avanti e indietro. Stiamo apportando modifiche a BFCache di Chrome che potrebbero influire sulle estensioni che utilizzano le porte dei messaggi. Se possiedi un'estensione di Chrome che utilizza la messaggistica per comunicare tra gli script dei contenuti e l'estensione, continua a leggere per scoprire come testare e adattare l'estensione.

Porta messaggio di estensione

Le estensioni comunicano con lo script di contenuti o con altre estensioni tramite la trasmissione di messaggi. I messaggi possono essere inviati utilizzando richieste una tantum chiamando runtime.sendMessage() e tabs.sendMessage() oppure utilizzando una porta di messaggio riutilizzabile. Finché la porta è attiva, sia lo script dei contenuti che lo script in background dell'estensione possono riutilizzarla per inviare messaggi l'uno all'altro.

Per ulteriori informazioni, consulta la sezione Passaggio di messaggi.

Cache back-forward

Quando esci da una pagina idonea per la cache BF, il browser consente alla pagina con tutto il relativo stato di rimanere in memoria, ma non in stato completamente attivo. Se l'utente esegue una navigazione nella cronologia (indietro o avanti) fino alla pagina memorizzata nella cache, il browser tenterà di ripristinarla dalla cache BFCache. In questo modo, la navigazione è più veloce e l'esperienza di navigazione dell'utente migliora.

Mentre la pagina è in BFCache, è in uno stato bloccato in cui non è consentita l'esecuzione di JavaScript. Ciò significa che non può elaborare i messaggi che riceve.

Per ulteriori informazioni, consulta la sezione Cache back/forward.

Impatto delle porte dei messaggi delle estensioni su BFCache

In breve, l'estensione che invia messaggi a una pagina in BFCache potrebbe causare l'espulsione della cache e influire sulle prestazioni.

Quando una pagina con una porta di messaggio dell'estensione aperta viene memorizzata in BFCache, la porta rimane aperta. Una volta ripristinata la pagina da BFCache, il vecchio riferimento della porta dei messaggi può essere ancora utilizzato dai worker di servizio dell'estensione per pubblicare messaggi nello script dei contenuti.

Tuttavia, se l'estensione tenta di pubblicare un messaggio tramite la porta dei messaggi mentre la pagina è ancora in BFCache, il messaggio viene inviato, ma non viene consegnato completamente perché il gestore è bloccato. È difficile per l'estensione comprendere e risolvere questa situazione, poiché sia l'inserimento in coda che l'eliminazione del messaggio hanno i loro problemi.

Per evitare i problemi relativi ai messaggi persi, nell'attuale implementazione di Chrome la pagina host viene espulsa dalla BFCache e il messaggio viene eliminato. Se l'utente torna alla pagina, questa verrà ricaricata, consentendo all'estensione di configurare una nuova connessione.

D'altra parte, questa implementazione limita gli scenari in cui si applica BFCache, limitando i vantaggi in termini di prestazioni, in particolare per le estensioni con meccanismi di trasmissione o heartbeat che inviano regolarmente messaggi a tutte le connessioni. Inoltre, poiché l'espulsione viene attivata quando l'estensione invia un messaggio allo script dei contenuti, gli sviluppatori web non hanno modo di impedire l'espulsione delle loro pagine.

Per migliorare il rendimento complessivo, prevediamo di introdurre un nuovo comportamento della porta dei messaggi.

Nuovo comportamento: chiusura del canale di messaggi quando la pagina è memorizzata in BFCache

A partire da Chrome 123, quando una pagina con una porta di messaggio dell'estensione aperta viene memorizzata in BFCache, il canale di messaggi sottostante viene chiuso in modo proattivo dal lato dello script dei contenuti. Di conseguenza, tutte le porte dei messaggi verranno chiuse e l'estensione riceverà un evento onDisconnect.

Poiché il canale è chiuso, non verranno inviati messaggi alla pagina mentre è nella cache BFCache. Pertanto, la pagina non verrà eliminata a causa dell'estensione.

Anche dopo il ripristino della pagina dalla cache BFCache, il canale di messaggi chiusi non verrà riaperto. La pratica consigliata per gli autori di estensioni è ascoltare gli eventi del ciclo di vita della pagina e configurare una nuova connessione quando la pagina viene ripristinata da BFCache, come mostrato nell'esempio seguente.

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

Scopri di più sulla conversazione WECG con i rappresentanti di diversi browser (nell'issue 474).

Sono interessato?

Il nuovo comportamento sarà disponibile dietro un flag in Chrome 123 per consentirti di testare il codice. Per saperne di più, consulta le tempistiche. Per testare l'estensione, segui i passaggi che seguono. Tieni presente che si tratta solo di un semplice test e ti invitiamo a eseguire Chrome con la funzionalità attivata per un determinato periodo di tempo, in quanto può essere difficile prevedere quali funzionalità dell'estensione potrebbero causare problemi.

Test del nuovo comportamento

Per attivare forzatamente l'esperimento in Chrome 123:

  1. Avvia Chrome con il seguente flag, che forza il nuovo comportamento:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Vai a una pagina e interagisci con l'estensione, se necessario, in modo che uno script di contenuto apra una porta per l'estensione.

  3. Esci dalla pagina e torna indietro. La pagina dovrebbe essere stata ripristinata, ma il canale di messaggi tra lo script di contenuti e il service worker dovrebbe essere disconnesso.

  4. Verifica se l'estensione funziona ancora come al solito. In caso contrario, devi ricollegarti manualmente come mostrato nella sezione precedente.

Identificare problemi semplici utilizzando il vecchio comportamento

Prima di questa modifica, Chrome mostrava un avviso se tenti di inviare un messaggio a una porta associata a una pagina nella cache bf. Questo può essere utile per identificare alcuni, ma non tutti, i problemi relativi ai messaggi dallo sfondo alla pagina.

  1. Assicurati che la versione di Chrome sia almeno 123. Idealmente, utilizza Chrome Canary, che ha un avviso aggiuntivo per semplificare i test.
  2. Avvia Chrome con il seguente flag, che forza il comportamento precedente:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Vai a una pagina idonea per BFCache senza che l'estensione sia in esecuzione (ad esempio, un sito semplice come https://example.com/). Segui il tutorial su BFCache per assicurarti che venga ripristinato da BFCache.

  4. Installa e abilita l'estensione, quindi testa di nuovo l'idoneità di BFCache. Puoi uscire manualmente dalla pagina, attendere un tempo sufficiente per consentire all'estensione di pubblicare un messaggio nella pagina BFCached e tornare indietro.

  5. Se la pagina ha dovuto essere caricata di nuovo anziché dalla cache BFCache a causa di un'eliminazione e il problema che impedisce il ripristino è "ExtensionSentMessageToCachedFrame", l'estensione potrebbe essere interessata da questa modifica.

    In Chrome Canary 124.0.6315.0 e versioni successive, nella pagina viene visualizzato anche il seguente avviso:

    Avviso visualizzato quando una pagina non viene ripristinata da BFCache.
    Avviso visualizzato quando una pagina non viene ripristinata da BFCache.

Una volta confermata la pubblicazione di messaggi da parte dell'estensione nella pagina BFCache, puoi seguire i passaggi descritti nella sezione precedente per attivare forzatamente l'esperimento e osservare se si verificano interruzioni della logica.

Cronologia di rilascio

Abbiamo in programma di implementare gradualmente il nuovo comportamento a partire da Chrome 123. Ecco il piano dettagliato:

Data Traguardo pianificato
15 febbraio Avvia l'esperimento per il nuovo comportamento in Chrome 123 Canary e Dev.
7 marzo Avvia l'esperimento per il nuovo comportamento in Chrome 123 Beta.
18 marzo Rilascia il nuovo comportamento al 4% degli utenti di Chrome 123 stabile.
25 marzo Rilasciare il nuovo comportamento al 50% degli utenti di Chrome 123 stabile.
2 aprile L'esperimento termina e il nuovo comportamento diventa predefinito.