Perubahan pada perilaku BFCache dengan port pesan ekstensi

Back-forward cache (atau BFCache) adalah pengoptimalan browser yang memungkinkan navigasi mundur dan maju secara instan. Kami melakukan perubahan pada Chrome BFCache yang berpotensi memengaruhi ekstensi menggunakan port pesan. Jika Anda memiliki ekstensi Chrome yang menggunakan pesan untuk berkomunikasi antara skrip konten dan ekstensi, baca terus untuk mempelajari cara menguji dan menyesuaikan ekstensi Anda.

Port pesan ekstensi

Ekstensi berkomunikasi dengan skrip konten atau ekstensi lainnya melalui penerusan pesan. Pesan dapat dikirim menggunakan permintaan satu kali dengan memanggil runtime.sendMessage() dan tabs.sendMessage(), atau menggunakan port pesan yang dapat digunakan kembali. Selama port aktif, skrip konten dan skrip latar belakang ekstensi dapat menggunakan kembali port tersebut untuk memposting pesan satu sama lain.

Untuk mengetahui informasi selengkapnya, lihat Penerusan pesan.

Back-forward cache

Saat keluar dari halaman yang memenuhi syarat untuk BFCache, browser mengizinkan halaman dengan semua statusnya tetap ada di memori, tetapi dalam status tidak aktif sepenuhnya. Jika pengguna melakukan navigasi riwayat (baik kembali atau maju) ke halaman yang di-cache, browser akan mencoba memulihkan halaman dari BFCache. Hal ini membuat navigasi lebih cepat dan meningkatkan pengalaman penjelajahan pengguna.

Saat berada dalam BFCache, halaman akan berstatus dibekukan dan eksekusi JavaScript tidak diizinkan. Artinya, SQL tidak dapat memproses pesan yang diterima.

Untuk informasi selengkapnya, lihat Back-forward cache.

Dampak port pesan ekstensi pada BFCache

Singkatnya, ekstensi yang mengirim pesan ke halaman dalam BFCache dapat menyebabkan penghapusan cache dan memengaruhi performa.

Jika halaman dengan port pesan ekstensi terbuka disimpan di BFCache, port akan tetap terbuka. Setelah halaman dipulihkan dari BFCache, referensi lama port pesan masih dapat digunakan oleh pekerja layanan ekstensi untuk memposting pesan ke skrip konten.

Namun, jika ekstensi mencoba memposting pesan melalui port pesan tersebut saat halaman masih berada dalam BFCache, pesan akan dikirim, tetapi tidak terkirim sepenuhnya karena pengendali dibekukan. Sangat sulit bagi ekstensi untuk memikirkan dan mengatasi situasi ini, karena mengantrekan dan meninggalkan pesan memiliki masalahnya sendiri.

Untuk menghindari masalah yang terkait dengan pesan yang hilang, dalam implementasi Chrome saat ini, Chrome akan mengeluarkan halaman host dari BFCache dan menghapus pesan tersebut. Jika pengguna kembali ke halaman, ekstensi akan dimuat baru, sehingga ekstensi dapat menyiapkan koneksi baru.

Di sisi lain, implementasi ini membatasi skenario yang menerapkan BFCache, sehingga membatasi peningkatan performa, terutama untuk ekstensi dengan mekanisme broadcast atau detak jantung yang secara rutin mengirim pesan ke semua koneksi. Selain itu, karena penghapusan dipicu saat ekstensi mengirimkan pesan ke skrip konten, developer web tidak memiliki cara untuk mencegah agar halaman mereka tidak dikeluarkan.

Untuk meningkatkan performa secara keseluruhan, kami berencana memperkenalkan perilaku port pesan baru.

Perilaku baru: menutup saluran pesan saat halaman disimpan dalam BFCache

Mulai Chrome 123, saat halaman dengan port pesan ekstensi terbuka disimpan di BFCache, saluran pesan yang mendasarinya akan ditutup secara proaktif dari sisi skrip konten. Akibatnya, semua port pesan akan ditutup, dan ekstensi akan menerima peristiwa onDisconnect.

Karena channel ditutup, tidak akan ada pesan yang dikirim ke halaman selama channel berada dalam BFCache. Oleh karena itu, halaman tidak akan dikeluarkan karena ekstensi.

Meskipun halaman telah dipulihkan dari BFCache, saluran pesan yang ditutup tidak akan dibuka kembali. Praktik yang direkomendasikan bagi penulis ekstensi adalah memproses peristiwa siklus proses halaman, dan menyiapkan koneksi baru saat halaman dipulihkan dari BFCache, seperti yang ditunjukkan dalam contoh berikut.

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

Baca selengkapnya tentang percakapan WECG dari perwakilan berbagai browser (pada masalah 474).

Apakah saya terpengaruh?

Perilaku baru ini akan tersedia di belakang tanda di Chrome 123 sehingga Anda dapat menguji kode Anda. Lihat linimasa untuk informasi selengkapnya. Gunakan langkah-langkah berikut untuk menguji ekstensi Anda. Perhatikan bahwa ini hanya menyediakan pengujian sederhana, dan sebaiknya Anda menjalankan Chrome dengan fitur yang diaktifkan selama jangka waktu tertentu karena sulit untuk memprediksi fitur apa dalam ekstensi yang dapat menyebabkan masalah.

  1. Pastikan versi Chrome minimal 123. Idealnya, gunakan Chrome Canary, yang memiliki peringatan tambahan untuk mempermudah pengujian.
  2. Luncurkan Chrome dengan tanda berikut:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Buka halaman yang memenuhi syarat untuk BFCache tanpa menjalankan ekstensi (misalnya, situs sederhana seperti https://example.com/). Ikuti tutorial BFCache untuk memastikan bahwa BFCache telah dipulihkan dari BFCache.

  4. Instal dan aktifkan ekstensi, lalu uji kembali kelayakan BFCache. Anda dapat keluar secara manual, tunggu beberapa waktu yang cukup lama sampai ekstensi Anda memposting pesan ke halaman BFCached, lalu kembali.

  5. Jika halaman harus dimuat baru, bukan dari BFCache karena penghapusan, dan masalah yang mencegah pemulihan adalah "ExtensionSentMessageToCachedFrame", ekstensi mungkin terpengaruh oleh perubahan ini.

    Di Chrome Canary 124.0.6315.0 dan yang lebih baru, Anda juga akan melihat peringatan berikut di halaman:

    Peringatan ditampilkan saat halaman tidak dipulihkan dari BFCache.
    Peringatan yang ditampilkan saat halaman tidak dipulihkan dari BFCache.

Setelah dikonfirmasi bahwa ekstensi memposting pesan ke halaman BFCache, Anda dapat mengikuti langkah-langkah berikut untuk mengaktifkan eksperimen secara paksa dan mengamati apakah ada logika yang rusak.

  1. Luncurkan Chrome dengan tanda berikut:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Buka halaman yang tidak dipulihkan dari BFCache karena "ExtensionSentMessageToCachedFrame".

  3. Keluar dan kembali ke layar sebelumnya. Halaman seharusnya sudah dipulihkan sekarang, tetapi saluran pesan antara skrip konten dan pekerja layanan harus terputus.

  4. Uji apakah ekstensi masih berfungsi seperti biasa. Jika tidak, Anda harus menghubungkan kembali secara manual seperti yang ditunjukkan di bagian sebelumnya.

Linimasa rilis

Kami berencana untuk meningkatkan perilaku baru secara bertahap mulai Chrome 123. Berikut adalah rencana detailnya:

Tanggal Pencapaian yang direncanakan
15 Februari Memulai eksperimen untuk perilaku baru di Chrome Canary dan Dev.
1 Maret Mulai eksperimen untuk perilaku baru di Chrome Beta.
18 Maret Rilis perilaku baru ke 4 persen pengguna di Chrome Stabil.
25 Maret Rilis perilaku baru ke 50 persen pengguna di Chrome Stabil.
2 April Eksperimen berakhir, menjadikan perilaku baru sebagai default.