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 yoksachrome.browserActions
API'sini mi kullanıyorsunuz?browser_actions
öğesini tekilbrowser_action
özelliğiyle değiştirin.chrome.browserActions
yerinechrome.browserAction
koyun.icons
özelliğinidefault_icon
ile değiştirin.name
özelliğinidefault_title
ile değiştirin.popup
özelliğinidefault_popup
ile değiştirin (bu özellik artık bir dize olmalıdır).page_actions
özelliğini mi yoksachrome.pageActions
API'sini mi kullanıyorsunuz?page_actions
yerinepage_action
koyun.chrome.pageActions
yerinechrome.pageAction
koyun.icons
özelliğinidefault_icon
ile değiştirin.name
özelliğinidefault_title
ile değiştirin.popup
özelliğinidefault_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 yoksachrome.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ğinibackground
özelliğiyle değiştirin.Sayfanın kodunu içeren bir
scripts
veyapage
özelliği ekleyin.Arka plan sayfanızı bir etkinlik sayfasına dönüştürmek için
persistent
özelliği ekleyipfalse
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()
, yeniFunction()
,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
vechrome.browserActions
özellikleri, bunların tekil eşdeğerleri olanbrowser_action
vechrome.browserAction
ile değiştirildi.Eski
browser_actions
mülkündeicons
,name
vepopup
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
vechrome.pageActions
özellikleri,page_action
vechrome.pageAction
gibi tekil eşdeğerleriyle değiştirildi.Eski
page_actions
mülkündeicons
,name
vepopup
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()
vechrome.extension.getExtensionTabs()
API'lerinin yerinichrome.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:
- İlgili kitaplığı yerel olarak indirin (jQuery gibi) ve uzantınızla paketleyin.
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:
- Manifest dosyanızda bir korumalı alan girişi oluşturun.
- Korumalı alan girişinde, korumalı alanda çalıştırmak istediğiniz sayfaları listeleyin.
- 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.