Modifiche al comportamento BFCache con le porte dei messaggi delle estensioni

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

Porta messaggio estensione

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

Per ulteriori informazioni, consulta Trasmettere messaggi.

Cache back-forward

Quando esce da una pagina idonea per BFCache, il browser consente alla pagina con tutto il suo stato di rimanere in memoria, ma con lo stato non completamente attivo. Se l'utente naviga nella cronologia (Indietro o Avanti) verso la pagina memorizzata nella cache, il browser tenterà di ripristinare la pagina da BFCache. Ciò rende la navigazione più veloce e migliora l'esperienza di navigazione dell'utente.

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 ricevuti.

Per ulteriori informazioni, consulta Cache back/forward.

Impatto delle porte dei messaggi delle estensioni su BFCache

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

Quando una pagina con una porta per i messaggi dell'estensione aperta è archiviata in BFCache, la porta rimane aperta. Una volta ripristinata la pagina da BFCache, il riferimento precedente della porta dei messaggi può ancora essere utilizzato dai service worker dell'estensione per pubblicare messaggi nello script dei contenuti.

Tuttavia, se l'estensione tenta di pubblicare un messaggio attraverso quella porta mentre la pagina è ancora in BFCache, il messaggio viene inviato ma non è stato recapitato completamente perché il gestore è bloccato. È difficile per l'estensione ragionare e affrontare questa situazione, poiché sia la coda sia l'eliminazione del messaggio hanno i propri problemi.

Per evitare di incorrere nei problemi relativi ai messaggi persi, nell'attuale implementazione di Chrome rimuove la pagina host da BFCache e ignora il messaggio. Se l'utente torna alla pagina, questa verrà caricata completamente, consentendo all'estensione di configurare una nuova connessione.

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

Per migliorare le prestazioni complessive, prevediamo di introdurre un nuovo comportamento delle porte dei messaggi.

Nuovo comportamento: chiusura del canale dei messaggi quando la pagina viene archiviata in BFCache

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

Poiché il canale è chiuso, nessun messaggio verrà inviato alla pagina mentre si trova in BFCache. Pertanto, la pagina non verrà rimossa a causa dell'estensione.

Anche dopo il ripristino della pagina da BFCache, il canale dei messaggi chiuso non verrà riaperto. La prassi consigliata per gli autori delle estensioni è ascoltare gli eventi del ciclo di vita delle pagine 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();
  }
});

Leggi ulteriori informazioni sulla conversazione di WECG da parte di rappresentanti di diversi browser (in base al problema 474).

Ci sono conseguenze?

Il nuovo comportamento sarà disponibile dietro un flag in Chrome 123 per consentirti di testare il codice. Consulta la cronologia per ulteriori informazioni. Per testare l'estensione, segui la procedura riportata di seguito. Tieni presente che si tratta solo di un semplice test e ti invitiamo a eseguire Chrome con la funzionalità attivata per un periodo di tempo, in quanto può essere difficile prevedere quali funzionalità dell'estensione potrebbero causare problemi.

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

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Visita una pagina idonea per BFCache senza l'estensione 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 attiva l'estensione, quindi verifica di nuovo l'idoneità a BFCache. Puoi uscire manualmente dalla pagina, attendere un po' di tempo sufficiente a consentire all'estensione di pubblicare un messaggio nella pagina BFCached e tornare indietro.

  5. Se la pagina ha dovuto essere caricata nuova anziché da BFCache a causa di un'eliminazione e il problema che impedisce il ripristino è "EstensioniSentMessageToCachedFrame", 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 mostrato quando una pagina non viene ripristinata dalla cache BFCache.

Una volta confermato che l'estensione pubblica messaggi sulla pagina BFCache, puoi seguire questi passaggi per forzare l'attivazione dell'esperimento e controllare se la logica si interrompe.

  1. Avvia Chrome con il seguente flag:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Vai alla pagina che non è stata ripristinata da BFCache a causa di "EstensioniSentMessageToCachedFrame".

  3. Vai avanti e indietro. La pagina dovrebbe essere ripristinata ora, ma il canale dei messaggi tra lo script dei contenuti e il service worker dovrebbe essere disconnesso.

  4. Verifica se l'estensione funziona normalmente. In caso contrario, dovrai riconnetterti manualmente come mostrato nella sezione precedente.

Cronologia di rilascio

Abbiamo in programma di accelerare 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 Canary e Dev.
1 marzo Avvia l'esperimento per il nuovo comportamento in Chrome Beta.
18 marzo Rilascia il nuovo comportamento per il 4% degli utenti nella versione stabile di Chrome.
25 marzo Rilascia il nuovo comportamento per il 50% degli utenti nella versione stabile di Chrome.
2 aprile L'esperimento termina e il nuovo comportamento viene impostato come predefinito.