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

Dave Tapuska
Dave Tapuska

Özet: Extensions API, gezinmeleri önceden yükleme ve geri-ileri önbelleği destekleyecek ş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 Önbellek (Chrome 96'da masaüstünde gönderilir) ve Spekülasyon Kuralları (Chrome 103'te gönderilen) gibi Anında Navigasyon teknolojileri hem geri hem de ileriye dönük deneyimlerini iyileştirir. Bu yayında, bu yeni iş akışlarına uyum sağlamak için tarayıcı uzantıları API'lerinde yaptığımız güncellemeleri keşfedeceğiz.

Sayfa türlerini anlama

Geri/İleri Önbelleğinin kullanıma sunulması ve önceden oluşturma işleminden önce, tek bir sekmede yalnızca bir etkin sayfa bulunuyordu. Her zaman bu görünürdü. Bir kullanıcı önceki sayfaya dönerse etkin sayfa yok edilir (B Sayfası) ve geçmişteki bir önceki sayfa tamamen yeniden oluşturulur (Sayfa A). Bir sekme için yalnızca bir tane (etkin/görünür durum) olduğundan uzantıların yaşam döngüsü sayfalarının hangi bölümünde olduğu konusunda endişe duymasına gerek yoktu.

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

Geri-İleri Önbellek ve önceden oluşturma ile sekmeler ve sayfalar arasında artık bire bir ilişki yoktur. Artık her sekme, yok edilip yeniden tasarlanmak yerine durumlar arasında birden çok sayfa ve sayfa geçişini depolar.

Örneğin, bir sayfa ömrüne önceden işlenmiş (görünmez) bir sayfa olarak başlayabilir, kullanıcı bir bağlantıyı tıkladığında etkin (görünür) bir sayfaya geçiş yapabilir ve ardından kullanıcı başka bir sayfaya gittiğinde Geri/İleri Önbellek'te (görünmez) saklanabilir ve bu, hiçbir şekilde sayfa silinmeden yapılabilir. Bu makalenin ilerleyen bölümlerinde, uzantıların hangi sayfalarda olduğunu anlamalarına yardımcı olmak için gösterilen yeni özelliklere göz atacağız.

Sayfa türleri
Sayfa türleri.

Bir sekmede önceden işlenmiş bir dizi sayfa (yalnızca bir tane 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?

FrameId == 0

Chromium'da en üstteki/ana çerçeveye en dış çerçeve denir.

En dıştaki çerçevenin frameId değerinin 0 olduğunu (önceki en iyi uygulama) varsayan uzantı yazarlarının sorunları olabilir. Bir sekmenin artık birden çok dış çerçevesi (önceden oluşturulmuş ve önbelleğe alınmış sayfalar) olabildiğ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ış çerçevesini temsil etmeye devam edecek ancak aynı sekmedeki diğer sayfaların en dıştaki çerçeveleri sıfır dışında olacaktır. Bu sorunu düzeltmek için yeni bir frameType alanı eklenmiştir. Bu gönderinin "Bir çerçevenin en dış kare olup olmadığını nasıl belirlerim?" bölümüne bakın.

Karelerin ve dokümanların yaşam döngüsü

Uzantılarla ilgili sorunlu olan bir başka kavram da çerçevenin yaşam döngüsüdür. Çerçeve, bir dokümanı (taahhüt edilen bir URL ile ilişkilendirilen) barındırır. Doküman değişebilir (örneğin, gezinerek) ancak frameId değişmez. Bu nedenle, belirli bir dokümanda 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 gezinilirse ve 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ı ne zaman değiştirdiğini (önceden oluşturma/etkin/önbelleğe alınmış arasında) 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ü, frameId daha önce kullanılabildiği çeşitli uzantı API'lerine eklendi. Bir etkinlikte DocumentLifecycle türü varsa (ör. onCommitted) değeri, etkinliğin oluşturulduğu durumdur. Dilediğiniz zaman WebNavigation getFrame() ve getAllFrames() yöntemlerindeki bilgileri sorgulayabilirsiniz ancak etkinlikteki değerin kullanılması her zaman tercih edilir. İki yöntemden de birini kullanırsanız, etkinliğin oluşturulduğu zaman ile vaatlerin her iki yöntemle de sonuçlandırıldığı zaman arasında çerçeve durumunun değişebileceğini unutmayın.

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

  • "prerender" : Şu anda kullanıcıya sunulmuyor, ancak kullanıcıya görüntülenmek üzere hazırlanıyor.
  • "active": Kullanıcıya gösterilir.
  • "cached": Geri/İleri Önbellek'te depolanır.
  • "pending_deletion": Belge imha ediliyor.

En dıştaki karenin bir çerçeve olup olmadığını nasıl anlarım?

Daha önce uzantılar, gerçekleşen etkinliğin en dıştaki çerçeveyle ilgili olup olmadığını belirlemek için frameId == 0 özelliğini kontrol edebiliyordu. Bir sekmede birden fazla sayfa olduğunda artık en dışta birden çok çerçevemiz vardır, bu nedenle frameId tanımı sorunludur. Hiçbir zaman Geri/İleri önbelleğe alınmış bir çerçeveyle ilgili etkinlik almazsınız. Bununla birlikte, önceden işlenmiş karelerde frameId en dıştaki kare için sıfır olmaz. Bu nedenle, en dıştaki çerçevenin yanlış olup olmadığını belirlemek için sinyal olarak frameId == 0 kullanmak gerekir.

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

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

DocumentLifecycle ile FrameType değerini birleştirerek en dıştaki etkin karenin bir kare olup olmadığını belirleyebiliriz. Örneğin: js tab.documentLifecycle == “active” && frameType == “outermost_frame”

Çerçevelerle ilgili kullanım süresi sorunlarını nasıl çözebilirim?

Yukarıda belirttiğimiz gibi, bir çerçeve bir dokümanı barındırır ve çerçeve yeni bir dokümana gidebilir ancak frameId değişmez. Bu, yalnızca frameId ile etkinlik aldığınızda sorunlar oluşturur. Çerçevenin URL'sini ararsanız, olayın gerçekleştiği zamana göre farklı olabilir. Bu, kullanım zamanı sorunu olarak adlandırılır.

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

Sayfa geçişinin ne zaman yapıldığını nasıl belirleyebilirim?

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

Şimdi WebNavigation etkinliklerine göz atalım.

Herhangi bir sayfanın ilk kez gezinmesi için aşağıda listelenen sırada dört etkinlik görürsünüz. Bu dört etkinliğin, DocumentLifecycle durumu "prerender" veya "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 değeri "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 Önbellek'ten geçiş yaptığında veya etkin duruma önceden oluşturulduğunda üç etkinlik daha olacaktır (ancak DocumentLifecyle "active" değerine sahip).

onBeforeNavigate
onCommitted
onCompleted

documentId, orijinal etkinliklerde olduğu gibi kalır. Bu, yukarıda documentId == xyz etkinleştirildiğinde gösterilmektedir. Sayfa zaten yüklenmiş olduğu için onDOMContentLoaded etkinliği dışında aynı gezinme etkinliklerinin tetiklendiğini unutmayın.

Yorum veya sorularınız varsa chromium-extensions grubunda sorabilirsiniz.