Eğitim: Manifest V2'ye Taşıma

Manifest sürüm 1, Chrome 18'de kullanımdan kaldırıldı ve manifest sürüm 1 destek programına uygun olarak destek kademeli olarak sonlandırılacaktır. Sürüm 1 ile sürüm 2 arasındaki değişiklikler iki geniş kategoriye ayrılır: API değişiklikleri ve Güvenlik değişiklikleri.

Bu dokümanda, Chrome uzantılarınızı manifest sürüm 1'den sürüm 2'ye taşımak için kontrol listelerinin yanı sıra bu değişikliklerin ne anlama geldiği ve neden yapıldığına dair daha ayrıntılı özetler sağlanmaktadır.

API değişiklikleri kontrol listesi

  • browser_actions özelliğini mi yoksa chrome.browserActions API'sini mi kullanıyorsunuz?

  • browser_actions öğesini tekil browser_action özelliğiyle değiştirin.

  • chrome.browserActions yerine chrome.browserAction koyun.

  • icons özelliğini default_icon ile değiştirin.

  • name özelliğini default_title ile değiştirin.

  • popup özelliğini default_popup ile değiştirin (bu özellik artık bir dize olmalıdır).

  • page_actions özelliğini mi yoksa chrome.pageActions API'sini mi kullanıyorsunuz?

  • page_actions yerine page_action koyun.

  • chrome.pageActions yerine chrome.pageAction koyun.

  • icons özelliğini default_icon ile değiştirin.

  • name özelliğini default_title ile değiştirin.

  • popup özelliğini default_popup ile değiştirin (bu özellik artık bir dize olmalıdır).

  • chrome.self özelliğini mi kullanıyorsunuz?

  • chrome.extension ile değiştirin.

  • Port.tab özelliğini mi kullanıyorsunuz?

  • Port.sender ile değiştirin.

  • chrome.extension.getTabContentses() API'lerini mi yoksa chrome.extension.getExtensionTabs() API'lerini mi kullanıyorsunuz?

  • chrome.extension.getViews( { "type" : "tab" } ) ile değiştirin.

  • Uzantınız bir arka plan sayfası kullanıyor mu?

  • background_page özelliğini background özelliğiyle değiştirin.

  • Sayfanın kodunu içeren bir scripts veya page özelliği ekleyin.

  • Arka plan sayfanızı bir etkinlik sayfasına dönüştürmek için persistent özelliği ekleyip false olarak ayarlayın.

Güvenlik değişiklikleriyle ilgili yapılacaklar listesi

  • HTML sayfalarında satır içi komut dosyası blokları kullanıyor musunuz?

  • <script> etiketlerinin içindeki JS kodunu kaldırın ve harici bir JS dosyasına yerleştirin.

  • Satır içi etkinlik işleyiciler (ör. onclick) kullanıyor musunuz?

  • Bunları HTML kodundan kaldırın, harici bir JS dosyasına taşıyın ve bunun yerine addEventListener() kullanın.

  • Uzantınız, içerik komut dosyalarını, uzantı paketindeki kaynaklara (resimler ve komut dosyaları gibi) erişmesi gereken web sayfalarına ekliyor mu?

  • web_accessible_resources mülkünü tanımlayın ve kaynakları (ve isteğe bağlı olarak bu kaynaklar için ayrı bir İçerik Güvenliği Politikası) listeleyin.

  • Uzantınız harici web sayfalarını yerleştiriyor mu?

  • sandbox özelliğini tanımlayın.

  • Kodunuz veya kitaplığınız eval(), yeni Function(), innerHTML, setTimeout() ya da başka bir şekilde dinamik olarak değerlendirilen JS kodu dizelerini kullanıyor mu?

  • JSON kodunu bir nesneye ayrıştırıyorsanız JSON.parse() kullanın.

  • CSP ile uyumlu bir kitaplık kullanın (ör. AngularJS).

  • Manifest dosyanızda bir korumalı alan girişi oluşturun ve etkilenen kodu korumalı alanda çalıştırın ve korumalı alana alınmış sayfayla iletişim kurmak için postMessage() kodunu kullanın.

  • jQuery veya Google Analytics gibi harici bir kod mu yüklüyorsunuz?

  • Kitaplığı indirip uzantınızda paketlemeyi ve daha sonra yerel paketten yüklemeyi düşünün.

  • Manifest dosyanızdaki "content_security_policy" bölümünde kaynağı yayınlayan HTTPS alanını izin verilenler listesine ekleyin.

API değişikliklerinin özeti

Manifest sürümü 2, tarayıcı işlemi ve sayfa işlemi API'lerinde birkaç değişiklik getirmekte ve birkaç eski API'yi yenileriyle değiştirmektedir.

Tarayıcı işlemlerindeki değişiklikler

Tarayıcı eylemleri API'si bazı adlandırma değişiklikleri sunar:

  • browser_actions ve chrome.browserActions özellikleri, bunların tekil eşdeğerleri olan browser_action ve chrome.browserAction ile değiştirildi.
  • Eski browser_actions mülkünde icons, name ve popup mülk vardı. Bu etiketler, şununla değiştirildi:

  • Tarayıcı işlem rozeti simgesi için default_icon

  • Fareyle rozetin üzerine geldiğinizde ipucunda görünen metin için default_name

  • Tarayıcı işleminin kullanıcı arayüzünü temsil eden HTML sayfası için default_popup (ve bu, artık bir dize olmalıdır, nesne olamaz)

Sayfa işlemlerindeki değişiklikler

Tarayıcı işlemlerinde yapılan değişikliklere benzer şekilde, page actions API'de de değişiklikler yapılmıştır:

  • page_actions ve chrome.pageActions özellikleri, page_action ve chrome.pageAction gibi tekil eşdeğerleriyle değiştirildi.
  • Eski page_actions mülkünde icons, name ve popup mülk vardı. Bu etiketler, aşağıdakilerle değiştirilmiştir:

  • Sayfa işlemi rozeti simgesi için default_icon

  • Fareyle rozetin üzerine geldiğinizde ipucunda görünen metin için default_name

  • Sayfa işlemiyle ilgili kullanıcı arayüzünü temsil eden HTML sayfası için default_popup (ve bu, artık bir dize olmalıdır, nesne olamaz)

Kaldırılan ve değiştirilen API'ler

Birkaç uzantı API'si kaldırıldı ve bunların yerini yenileri aldı:

  • background_page özelliğinin yerini arka plan aldı.
  • chrome.self özelliği kaldırıldı, chrome.extension özelliğini kullanın.
  • Port.tab özelliği, Port.sender ile değiştirildi.
  • chrome.extension.getTabContentses() ve chrome.extension.getExtensionTabs() API'lerinin yerini chrome.extension.getViews( { "type" : "tab" } ) aldı.

Güvenlik değişikliklerinin özeti

Manifest sürüm 1'den sürüm 2'ye geçişe eşlik eden güvenlikle ilgili bir dizi değişiklik vardır. Bu değişikliklerin çoğu, Chrome'un İçerik Güvenliği Politikası'nı benimsemesinden kaynaklanmaktadır. Bu politikanın etkilerini anlamak için bu politika hakkında daha fazla bilgi edinmeniz gerekir.

Satır içi komut dosyalarına ve etkinlik işleyicilere izin verilmiyor

İçerik Güvenliği Politikası uyarınca, HTML içeriğiyle satır içi olan <script> etiketlerini artık kullanamazsınız. Bunların harici JS dosyalarına taşınması gerekir. Ayrıca satır içi etkinlik işleyiciler de desteklenmez. Örneğin, uzantınızda aşağıdaki kodun olduğunu varsayalım:

<html>
<head>
  <script>
    function myFunc() { ... }
  </script>
</head>
</html>

Bu kod, çalışma zamanında hataya neden olur. Bunu düzeltmek için <script> etiketi içeriğini harici dosyalara taşıyın ve src='path_to_file.js' özelliğiyle bunlara referans verin.

Benzer şekilde, birçok web geliştiricisi tarafından yaygın olarak kullanılan satır içi etkinlik işleyiciler de yürütülmez. Örneğin, aşağıdakiler gibi yaygın örnekleri göz önünde bulundurun:

<body onload="initialize()">
<button onclick="handleClick()" id="button1">

Bunlar manifest V2 uzantılarında çalışmaz. Satır içi etkinlik işleyicileri kaldırın, harici JS dosyanıza yerleştirin ve bunların yerine etkinlik işleyicileri kaydetmek için addEventListener() kullanın. Örneğin, JS kodunuzda:

window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);

Bu, uzantınızın davranışını kullanıcı arayüzü işaretlemesinden ayırmanın çok daha anlaşılır bir yoludur.

İçerik yerleştirme

Uzantınızın harici olarak kullanılabilen veya harici bir kaynaktan gelebilen içeriği yerleştirebileceği bazı senaryolar vardır.

Web sayfalarındaki uzantı içeriği: Uzantınız web sayfalarına yerleştirilen içerik komut dosyalarında kullanılan kaynakları (ör. resim, komut dosyası, CSS stilleri vb.) yerleştiriyorsa harici web sayfalarının kullanabilmesi için bu kaynakları izin verilenler listesine eklemek üzere web_accessible_resources özelliğini kullanmanız gerekir:

{
...
  "web_accessible_resources": [
    "images/image1.png",
    "script/myscript.js"
  ],
...
}

Harici içerik yerleştirme: İçerik Güvenliği Politikası yalnızca yerel komut dosyalarının ve nesnelerin paketinizden yüklenmesine izin vererek harici saldırganların uzantınıza bilinmeyen kod eklemesini önler. Ancak jQuery veya Google Analytics kodu gibi harici olarak sunulan kaynakları yüklemek istediğiniz zamanlar olabilir. Bunu iki şekilde yapabilirsiniz:

  1. İlgili kitaplığı yerel olarak indirin (jQuery gibi) ve uzantınızla paketleyin.
  2. Manifest'inizin "content_security_policy" bölümünde HTTPS kaynaklarını izin verilenler listesine ekleyerek CSP'yi sınırlı şekilde gevşetebilirsiniz. Google Analytics gibi bir kitaplığı dahil etmek için şu yaklaşım benimsenir:

    {
      ...,
      "content_security_policy": "script-src 'self'
      https://ssl.google-analytics.com; object-src 'self'",
      ...
    }
    

Dinamik komut dosyası değerlendirmesini kullanma

Yeni manifest v2 şemasındaki en büyük değişikliklerden biri, uzantıların artık eval() veya yeni Function() gibi dinamik komut dosyası değerlendirme tekniklerini kullanamaması veya JS kodu dizelerini, setTimeout() gibi eval() kullanılmasına neden olacak işlevlere aktaramamasıdır. Ek olarak, Google Haritalar ve belirli şablon kitaplıkları gibi yaygın olarak kullanılan belirli JavaScript kitaplıklarının bu tekniklerden bazılarını kullandığı bilinmektedir.

Chrome, sayfaların kendi kaynaklarında çalışması için bir korumalı alan sağlar. Bu tür sayfaların Chrome'a erişimi reddedilir.* API'ler hakkında daha fazla bilgi edinin. Yeni İçerik Güvenliği Politikası kapsamında eval() ve benzerlerini kullanmak için:

  1. Manifest dosyanızda bir korumalı alan girişi oluşturun.
  2. Korumalı alan girişinde, korumalı alanda çalıştırmak istediğiniz sayfaları listeleyin.
  3. Korumalı alana alınmış sayfayla iletişim kurmak için postMessage() aracılığıyla ileti iletmeyi kullanın.

Bunun nasıl yapılacağı hakkında daha fazla bilgi için Korumalı Alan Oluşturma Değerlendirmesi dokümanlarına bakın.

Daha fazla bilgi

Manifest sürümü 2'deki değişiklikler, geliştiricileri daha güvenli ve güçlü şekilde tasarlanmış uzantılar ile uygulamalar oluşturmaya yönlendirmek için tasarlanmıştır. Manifest sürümü 1 ile sürüm 2 arasındaki değişikliklerin tam listesini görmek için manifest dosyası dokümanlarına bakın. Güvenli olmayan kodu yalıtmak için korumalı alan kullanma hakkında daha fazla bilgi için korumalı alan değerlendirmesi makalesini okuyun. Uzantılarla ilgili eğiticimizi ve HTML5Rocks ile ilgili iyi tanıtımı ziyaret ederek İçerik Güvenliği Politikası hakkında daha fazla bilgi edinebilirsiniz.