Chrome Uzantıları: API'yi Anında Gezinme'yi destekleyecek şekilde genişletme

Dave Tapuska
Dave Tapuska

Özet: Extensions API, geri-ileri önbelleği ve gezinmeleri önceden yükleyecek şekilde güncellendi. Bu konuyla ilgili ayrıntıları aşağıda bulabilirsiniz.

Chrome, gezinmeyi hızlandırmak için yoğun bir şekilde çalışıyor. Geri/İleri Önbelleği (Chrome 96'da masaüstünde gönderildi) ve Spekülasyon Kuralları (Chrome 103'te gönderildi) gibi Anında Navigasyon teknolojileri hem geri hem de ileriye dönük deneyimi iyileştirir. Bu yayında, bu yeni iş akışlarını karşılamak için tarayıcı uzantısı API'lerinde yaptığımız güncellemeleri keşfedeceğiz.

Sayfa türlerini anlama

Geri/İleri Önbelleğinin ve önceden işlemenin kullanıma sunulmasından önce, tek bir sekme yalnızca bir etkin sayfaya sahipti. Her zaman görünür olan buydu. Kullanıcı önceki sayfaya dönerse etkin sayfa kaldırılır (Sayfa B) ve geçmişteki önceki sayfa tamamen yeniden oluşturulur (Sayfa A). Uzantıların yaşam döngüsü sayfalarının ne kadarını bulunduğu konusunda endişelenmesine gerek yoktu. Çünkü bir sekme için yalnızca bir bölüm vardı, yani etkin/görünür durum.

Etkin sayfayı çıkarma
Etkin sayfanın çıkarılması.

Geri/İleri Önbellek ve önceden işleme ile, artık sekmeler ve sayfalar arasında bire bir ilişki yoktur. Artık her sekme, yok edilip yeniden oluşturulmak yerine durumlar arasında birden fazla sayfa ve sayfa geçişini saklar.

Örneğin, bir sayfa önceden işlenmiş (görünür olmayan) bir sayfa olarak başlatılabilir, kullanıcı bir bağlantıyı tıkladığında etkin (görünür) bir sayfaya geçebilir ve daha sonra kullanıcı başka bir sayfaya gittiğinde Geri/İleri Önbelleğinde (görünür değil) depolanabilir. Üstelik tüm bunları, sayfa hiç yok olmadan yapabilirsiniz. Bu makalenin ilerleyen kısımlarında, uzantıların durum sayfalarının hangi içeriklerde olduğunu anlamasına yardımcı olmak için kullanıma sunulan yeni mülklere bakacağız.

Sayfa türleri
Sayfa türleri.

Bir sekmede, önceden işlenmiş bir dizi sayfa (yalnızca bir değil), tek bir etkin (görünür) sayfa ve Geri/İleri önbelleğe alınmış bir dizi sayfa olabileceğini unutmayın.

Uzantı geliştiricileri için neler değişiyor?

Çerçeve Kimliği == 0

Chromium'da, en üstteki/ana kareyi en dıştaki kare olarak adlandırırız.

En dıştaki karenin frameId değerinin 0 olduğunu (önceki en iyi uygulama) varsayan uzantı yazarlarında sorun olabilir. Bir sekme artık birden fazla dış çerçeveye (önceden oluşturulmuş ve önbelleğe alınmış sayfalar) sahip olabileceğinden, sekme için en dışta tek bir çerçeve olduğu varsayımı yanlıştır. frameId == 0, etkin sayfanın en dıştaki çerçevesini temsil etmeye devam eder ancak aynı sekmedeki diğer sayfaların en dıştaki çerçeveleri sıfır dışında bir çerçeve olacaktır. Bu sorunu düzeltmek için yeni bir frameType alanı eklenmiştir. Bu yayının "Bir karenin en dıştaki kare olup olmadığını nasıl belirlerim?" bölümüne bakın.

Çerçevelerin yaşam döngüsü ile dokümanlar arasındaki farklılıklar

Uzantılarla ilgili sorun yaratan bir başka kavram da çerçevenin yaşam döngüsüdür. Çerçeve, bir dokümanı (kaydedilmiş bir URL ile ilişkilendirilir) barındırır. Doküman değişebilir (örneğin, gezinerek) ancak frameId değişmediğinden, belirli bir dokümanda olan bir şeyin sadece frameIds ile ilişkilendirilmesi zordur. Her belge için benzersiz bir tanımlayıcı olan documentId kavramını kullanıma sunuyoruz. Bir çerçevede gezinirken yeni bir doküman açılırsa tanımlayıcı değişir. Bu alan, aynı kaldığı için sayfaların yaşam döngüsü durumlarını (önceden oluşturma/etkin/önbelleğe alınmış arasında) ne zaman değiştirdiğini belirlemek için yararlıdır.

Web'de gezinme etkinlikleri

chrome.webNavigation ad alanındaki etkinlikler, içinde bulunduğu yaşam döngüsüne bağlı olarak aynı sayfada birden çok kez tetiklenebilir. "Sayfanın hangi yaşam döngüsünde olduğunu nasıl anlayabilirim?" ve "Bir sayfanın ne zaman geçiş yaptığını nasıl belirlerim?" bölümlerine bakın.

Sayfanın hangi yaşam döngüsünde olduğunu nasıl anlayabilirim?

DocumentLifecycle türü, daha önce frameId öğesinin mevcut olduğu çeşitli uzantı API'lerine eklendi. DocumentLifecycle türü bir etkinlikte mevcutsa (onCommitted gibi) değeri, etkinliğin oluşturulduğu durumdur. WebNavigation getFrame() ve getAllFrames() yöntemlerindeki bilgileri dilediğiniz zaman sorgulayabilirsiniz ancak etkinlikteki değerin kullanılması her zaman tercih edilir. Bu iki yöntemden birini kullanırsanız kare durumunun, etkinliğin oluşturulduğu zaman ile her iki yöntemde de taahhüt edilen sonucun çözümlendiği zaman arasında değişebileceğini unutmayın.

DocumentLifecycle aşağıdaki değerlere sahiptir:

  • "prerender" : Şu anda kullanıcıya sunulmasa da kullanıcıya görüntülenmek için hazırlanıyor.
  • "active": Kullanıcıya o anda gösterilir.
  • "cached": Geri/İleri Önbellekte depolanır.
  • "pending_deletion": Belge yok ediliyor.

Bir karenin en dıştaki kare olup olmadığını nasıl anlarım?

Daha önce uzantılar, etkinliğin en dıştaki karede olup olmadığını belirlemek için frameId == 0 öğesinin olup olmadığını kontrol edebiliyordu. Bir sekmede birden çok sayfa olduğunda artık birden fazla dış çerçevemiz var. Bu nedenle frameId tanımı sorunludur. Hiçbir zaman Geri/İleri önbelleğe alınmış bir çerçeveyle ilgili etkinlikleri almazsınız. Ancak, önceden işlenmiş kareler için frameId, en dıştaki kare için sıfır olmayan bir değer olacaktır. En dıştaki karenin yanlış olup olmadığını belirlemek için sinyal olarak frameId == 0 kullanılması.

Bu konuda yardımcı olmak için FrameType adlı yeni bir türü kullanıma sunduk. Böylece karenin gerçekten en dıştaki kare olup olmadığını belirlemek artık çok kolay. FrameType aşağıdaki değerlere sahiptir:

  • "outermost_frame": Genellikle en üstteki kare olarak adlandırılır. Bunların birden fazla olduğunu unutmayın. Örneğin, önceden işlenmiş ve önbelleğe alınmış sayfalarınız varsa her birinin, en üst çerçevesi olarak adlandırılabilecek en dıştaki karesi olur.
  • "fenced_frame": İleride kullanılmak üzere ayrılmıştır.
  • "sub_frame": Genellikle iframe'dir.

DocumentLifecycle öğesini FrameType ile birleştirebilir ve bir karenin, en etkin dış kare olup olmadığını belirleyebiliriz. Örneğin: js tab.documentLifecycle == “active” && frameType == “outermost_frame”

Karelerle ilgili kullanım süresi sorunlarını nasıl çözebilirim?

Yukarıda belirttiğimiz gibi çerçeve, dokümanı barındırır ve çerçeve yeni bir dokümana gidebilir, ancak frameId değişmez. Bu durum, yalnızca bir frameId ile etkinlik aldığınızda sorunlara yol açar. Çerçevenin URL'sini ararsanız bu, olayın gerçekleştiği zamandan farklı olabilir. Buna kullanım zamanı sorunu denir.

Bu sorunu gidermek için documentId (ve parentDocumentId) özelliğini kullanıma sunduk. webNavigation.getFrame() yöntemi, documentId sağlanırsa frameId yöntemini artık isteğe bağlı hale getirmektedir. Bir karede gezinildiğinde documentId değişir.

Bir sayfanın ne zaman geçiş yapacağını nasıl belirleyebilirim?

Bir sayfanın ne zaman durumlar arasında geçiş yapacağını belirlemek için açık sinyaller vardır.

WebNavigation etkinliklerine göz atalım.

Herhangi bir sayfada ilk gezinmeniz için aşağıda listelenen sırayla dört etkinlik görürsünüz. Bu dört etkinliğin, DocumentLifecycle durumu "prerender" ya da "active" olduğunda gerçekleşebileceğini unutmayın.

onBeforeNavigate
onCommitted
onDOMContentLoaded
onCompleted

Bu, aşağıdaki şemada gösterilmektedir. Önceden işlenmiş sayfa etkin sayfa haline geldiğinde documentId, "xyz" olarak değişir.

Önceden işlenmiş sayfa etkin sayfa haline geldiğinde documentId değişir
Önceden işlenmiş sayfa etkin sayfa haline geldiğinde documentId değişir.

Bir sayfa Geri/İleri Önbellekten veya önceden etkin duruma geçirildiğinde, üç etkinlik daha olur (ancak DocumentLifecyle "active" olarak görünür).

onBeforeNavigate
onCommitted
onCompleted

documentId, orijinal etkinliklerdekiyle aynı kalır. Bu, documentId == xyz etkinleştirildiğinde yukarıda gösterilmektedir. Sayfa zaten yüklenmiş olduğundan onDOMContentLoaded etkinliği hariç olmak üzere aynı gezinme etkinliklerinin tetikleneceğini unutmayın.

Herhangi bir yorumunuz veya sorunuz olursa lütfen chromium-extensions grubuna sorabilirsiniz.