Uzantı mesaj bağlantı noktalarıyla BFCache davranışında yapılan değişiklikler

Mingyu Lei
Mingyu Lei

Geri-ileri önbellek (veya BFCache), hızlı ileri ve geri gezinmeyi sağlayan bir tarayıcı optimizasyonudur. Chrome BFCache'te, mesaj bağlantı noktalarını kullanan uzantıları etkileyebilecek değişiklikler yapıyoruz. İçerik komut dosyaları ile uzantınız arasında iletişim kurmak için mesajlaşmayı kullanan bir Chrome uzantınız varsa uzantınızı nasıl test edip uyarlayacağınızı öğrenmek için okumaya devam edin.

Uzatma mesajı bağlantı noktası

Uzantılar, mesaj aktarımı yoluyla içerik komut dosyasıyla veya diğer uzantılarla iletişim kurar. Mesajlar, runtime.sendMessage() ve tabs.sendMessage() çağrılarak veya yeniden kullanılabilir bir mesaj bağlantı noktası kullanılarak tek kullanımlık istekler aracılığıyla gönderilebilir. Bağlantı noktası etkin olduğu sürece hem içerik komut dosyası hem de uzantı arka plan komut dosyası, birbirlerine mesaj göndermek için bağlantı noktasını yeniden kullanabilir.

Daha fazla bilgi için Mesaj aktarma başlıklı makaleyi inceleyin.

Geri-ileri önbellek

Tarayıcı, BFCache için uygun bir sayfadan ayrılırken sayfanın tüm durumuyla birlikte bellekte kalmasına ancak tam etkin durumda olmamasına izin verir. Kullanıcı, önbelleğe alınmış sayfaya geçmiş gezinmesi (geri veya ileri) yaparsa tarayıcı sayfayı BFCache'ten geri yüklemeyi dener. Bu sayede gezinme daha hızlı olur ve kullanıcının tarama deneyimi iyileşir.

Sayfa BFCache'teyken JavaScript çalıştırılmasına izin verilmeyen dondurulmuş bir durumdadır. Bu durumda, alınan mesajlar işlenemez.

Daha fazla bilgi için Geri/ileri önbellek bölümüne bakın.

Uzantı mesaj bağlantı noktalarının BFCache üzerindeki etkisi

Özetle, BFCache'teki bir sayfaya mesaj gönderen uzantı, önbelleğin kaldırılmasına neden olabilir ve performansı etkileyebilir.

Açık bir uzantı mesaj bağlantı noktası içeren bir sayfa BFCache'te depolandığında bağlantı noktası açık kalır. Sayfa BFCache'ten geri yüklendikten sonra, mesaj bağlantı noktasının eski referansı, içerik komut dosyasına mesaj yayınlamak için uzantı hizmet işçileri tarafından kullanılabilir.

Ancak sayfa hâlâ BFCache'teyken uzantı bu mesaj bağlantı noktası üzerinden bir mesaj yayınlamaya çalışırsa mesaj gönderilir ancak işleyici dondurulduğu için tam olarak teslim edilmez. Hem mesajı sıraya eklemenin hem de bırakmanın kendi sorunları olduğu için uzantının bu durumu değerlendirmesi ve ele alması zordur.

Chrome'un mevcut uygulamasında, kaybolan iletilerle ilgili sorunlarla karşılaşmamak için ana sayfa BFCache'ten çıkarılır ve ileti atılır. Kullanıcı sayfaya geri dönerse sayfa yeni yüklenir ve uzantının yeni bir bağlantı kurmasına izin verilir.

Öte yandan bu uygulama, BFCache'in geçerli olduğu senaryoları kısıtlayarak özellikle tüm bağlantılara düzenli olarak mesaj gönderen yayın veya kalp atışı mekanizmalarına sahip uzantılarda performans kazançlarını sınırlandırır. Ayrıca, uzantı içerik komut dosyasına mesaj gönderdiğinde kaldırma işlemi tetiklendiğinden web geliştiricilerinin sayfalarının kaldırılmasını önlemek için hiçbir yolu yoktur.

Genel performansı artırmak için yeni bir mesaj bağlantı noktası davranışı sunmayı planlıyoruz.

Yeni davranış: Sayfa BFCache'te depolandığında mesaj kanalının kapatılması

Chrome 123'ten itibaren, açık bir uzantı mesaj bağlantı noktası içeren bir sayfa BFCache'te depolandığında, temel mesaj kanalı içerik komut dosyası tarafından proaktif olarak kapatılır. Sonuç olarak tüm mesaj bağlantı noktaları kapatılır ve uzantı bir onDisconnect etkinliği alır.

Kanal kapalı olduğundan, sayfa BFCache'teyken sayfaya mesaj gönderilmez. Bu nedenle, sayfa uzantı nedeniyle kaldırılmaz.

Sayfa BFCache'ten geri yüklendikten sonra bile kapalı mesaj kanalı yeniden açılmaz. Uzantı yazarları için önerilen uygulama, sayfa yaşam döngüsü etkinliklerini dinlemek ve sayfa BFCache'ten geri yüklendiğinde aşağıdaki örnekte gösterildiği gibi yeni bir bağlantı oluşturmaktır.

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

Farklı tarayıcı temsilcilerinin WECG görüşmesi hakkında daha fazla bilgi edinin (474 numaralı sorun altında).

Güvenlik açıklarından etkilendim mi?

Kodunuzu test edebilmeniz için yeni davranış, Chrome 123'te bir işaretin arkasında kullanılabilir. Daha fazla bilgi için zaman çizelgesine bakın. Uzantılarınızı test etmek için aşağıdaki adımları uygulayın. Bu testin yalnızca basit bir test olduğunu unutmayın. Uzantıdaki hangi özelliklerin soruna neden olabileceğini tahmin etmek zor olabileceğinden, Chrome'u bir süre boyunca bu özellik etkinken çalıştırmanızı öneririz.

Yeni davranışı test etme

Denemeyi Chrome 123'te zorla etkinleştirmek için:

  1. Chrome'u, yeni davranışı zorunlu kılan aşağıdaki işaretle başlatın:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. Bir sayfaya gidin ve gerekirse uzantınızla etkileşime geçin. Böylece içerik komut dosyası, uzantınıza bir bağlantı noktası açar.

  3. Sayfadan ayrılıp geri dönün. Sayfa şimdi geri yüklenecektir ancak içerik komut dosyası ile hizmet çalışanı arasındaki mesaj kanalının bağlantısı kesilecektir.

  4. Uzantının hâlâ her zamanki gibi çalışıp çalışmadığını test edin. Aksi takdirde, önceki bölümde gösterildiği gibi manuel olarak yeniden bağlamanız gerekir.

Eski davranışı kullanarak basit sorunları belirleme

Bu değişiklikten önce Chrome, bfcache'teki bir sayfayla ilişkili bir bağlantı noktasına mesaj göndermeye çalıştığınızda uyarı gösterirdi. Bu, arka plandan sayfaya ileti göndermeyle ilgili tüm sorunların değil, bazılarının tespit edilmesi için yararlı olabilir.

  1. Chrome sürümünün en az 123 olduğundan emin olun. İdeal olarak, testleri kolaylaştırmak için ek bir uyarı içeren Chrome Canary'ı kullanın.
  2. Chrome'u, eski davranışı zorlayan aşağıdaki işaretle başlatın:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. Uzantı çalışmadan BFCache için uygun bir sayfaya gidin (ör. https://example.com/ gibi basit bir site). BFCache'ten geri yüklenmesini sağlamak için BFCache eğitim videosunu izleyin.

  4. Uzantı yükleyip etkinleştirin ve BFCache uygunluğunu tekrar test edin. Manuel olarak başka bir sayfaya gidebilir, uzantınızın BFCached sayfasına mesaj yayınlaması için yeterli süre bekleyebilir ve geri dönebilirsiniz.

  5. Sayfanın, çıkarma nedeniyle BFCache yerine yeni yüklenmesinin gerekmesi ve geri yüklemeyi engelleyen sorunun "ExtensionSentMessageToCachedFrame" olması durumunda uzantı bu değişiklikten etkilenebilir.

    Chrome Canary 124.0.6315.0 ve sonraki sürümlerde, sayfada aşağıdaki uyarıyı da görürsünüz:

    Bir sayfa BFCache'den geri yüklenmediğinde gösterilen uyarı.
    Bir sayfa BFCache'ten geri yüklenmediğinde gösterilen uyarı.

Uzantı'nın BFCache sayfasına mesaj yayınladığı doğrulandıktan sonra, denemeyi zorla etkinleştirmek ve mantıkta bozulma olup olmadığını gözlemlemek için önceki bölümdeki adımları uygulayabilirsiniz.

Yayın zaman çizelgesi

Chrome 123'ten itibaren yeni davranışı kademeli olarak kullanıma sunmayı planlıyoruz. Ayrıntılı planı aşağıda bulabilirsiniz:

Tarih Planlanan aşama
15 Şubat Chrome 123 Canary ve Dev'de yeni davranışla ilgili denemeyi başlatın.
7 Mart Chrome 123 Beta'da yeni davranış denemesini başlatın.
18 Mart Yeni davranışı Chrome 123 Kararlı sürümündeki kullanıcıların yüzde 4'üne yayınlayın.
25 Mart Yeni davranışı Chrome 123 Kararlı sürümündeki kullanıcıların %50'sine yayınlayın.
2 Nisan Deneme sona erer ve yeni davranış varsayılan olarak ayarlanır.