La versione 1 del manifest è stata ritirata in Chrome 18 e il supporto verrà gradualmente eliminato in base al programma di supporto della versione 1 del manifest. Le modifiche dalla versione 1 alla versione 2 rientrano in due categorie generali: modifiche all'API e modifiche alla sicurezza.
Questo documento fornisce elenchi di controllo per la migrazione delle estensioni Chrome dalla versione 1 del manifest alla versione 2, seguiti da riepiloghi più dettagliati di cosa significano queste modifiche e perché sono state apportate.
Elenco di controllo delle modifiche alle API
Stai utilizzando la proprietà
browser_actionso l'APIchrome.browserActions?Sostituisci
browser_actionscon la proprietà singolarebrowser_action.Sostituisci
chrome.browserActionsconchrome.browserAction.Sostituisci la proprietà
iconscondefault_icon.Sostituisci la proprietà
namecondefault_title.Sostituisci la proprietà
popupcondefault_popup(che ora deve essere una stringa).Stai utilizzando la proprietà
page_actionso l'APIchrome.pageActions?Sostituisci
page_actionsconpage_action.Sostituisci
chrome.pageActionsconchrome.pageAction.Sostituisci la proprietà
iconscondefault_icon.Sostituisci la proprietà
namecondefault_title.Sostituisci la proprietà
popupcondefault_popup(che ora deve essere una stringa).Utilizzi la proprietà
chrome.self?Sostituisci con
chrome.extension.Utilizzi la proprietà
Port.tab?Sostituisci con
Port.sender.Stai utilizzando le API
chrome.extension.getTabContentses()ochrome.extension.getExtensionTabs()?Sostituisci con
chrome.extension.getViews( { "type" : "tab" } ).La tua estensione utilizza una pagina di sfondo?
Sostituisci la proprietà
background_pagecon una proprietàbackground.Aggiungi una proprietà
scriptsopageche contenga il codice della pagina.Aggiungi una proprietà
persistente impostala sufalseper convertire la pagina di sfondo in una pagina evento
Elenco di controllo delle modifiche alla sicurezza
Utilizzi blocchi di script incorporati nelle pagine HTML?
Rimuovi il codice JS contenuto nei tag
<script>e inseriscilo in un file JS esterno.Utilizzi gestori di eventi incorporati (come onclick e così via)?
Rimuovili dal codice HTML, spostali in un file JS esterno e utilizza
addEventListener()invece.La tua estensione inserisce script di contenuti nelle pagine web che devono accedere a risorse (come immagini e script) contenute nel pacchetto dell'estensione?
Definisci la proprietà web_accessible_resources ed elenca le risorse (e, facoltativamente, una Content Security Policy separata per queste risorse).
La tua estensione incorpora pagine web esterne?
Definisci la proprietà sandbox.
Il tuo codice o la tua libreria utilizza
eval(),Function(),innerHTML,setTimeout()o passa in altro modo stringhe di codice JS che vengono valutate dinamicamente?Utilizza
JSON.parse()se analizzi il codice JSON in un oggetto.Utilizza una libreria compatibile con CSP, ad esempio AngularJS.
Crea una voce sandbox nel manifest e esegui il codice interessato nella sandbox utilizzando
postMessage()per comunicare con la pagina in sandbox.Stai caricando codice esterno, ad esempio jQuery o Google Analytics?
Valuta la possibilità di scaricare la libreria e inserirla nel pacchetto dell'estensione, quindi caricarla dal pacchetto locale.
Aggiungi alla lista consentita il dominio HTTPS che gestisce la risorsa nella sezione "content_security_policy" del manifest.
Riepilogo delle modifiche alle API
La versione 2 del manifest introduce alcune modifiche alle API di azione del browser e azione della pagina e sostituisce alcune API precedenti con altre più recenti.
Modifiche alle azioni del browser
L'API Azioni browser introduce alcune modifiche ai nomi:
- Le proprietà
browser_actionsechrome.browserActionssono state sostituite con le loro controparti singolaribrowser_actionechrome.browserAction. Nella vecchia proprietà
browser_actions, erano presenti le proprietàicons,nameepopup. Questi sono stati sostituiti da:default_iconper l'icona del badge dell'azione del browserdefault_nameper il testo visualizzato nella descrizione comando quando passi il mouse sopra il badgedefault_popupper la pagina HTML che rappresenta la UI per l'azione del browser (e ora deve essere una stringa, non può essere un oggetto)
Modifiche alle azioni della pagina
Analogamente alle modifiche per le azioni del browser, è cambiata anche l'API Page Actions:
- Le proprietà
page_actionsechrome.pageActionssono state sostituite dalle rispettive controparti singolaripage_actionechrome.pageAction. Nella vecchia proprietà
page_actions, erano presenti le proprietàicons,nameepopup. Questi sono stati sostituiti da:default_iconper l'icona del badge dell'azione della paginadefault_nameper il testo visualizzato nella descrizione comando quando passi il mouse sopra il badgedefault_popupper la pagina HTML che rappresenta la UI per l'azione di pagina (e ora deve essere una stringa, non può essere un oggetto)
API rimosse e modificate
Alcune API di estensione sono state rimosse e sostituite con nuove controparti:
- La proprietà
background_pageè stata sostituita da background. - La proprietà
chrome.selfè stata rimossa, utilizzachrome.extension. - La proprietà
Port.tabè stata sostituita conPort.sender. - Le API
chrome.extension.getTabContentses()echrome.extension.getExtensionTabs()sono state sostituite dachrome.extension.getViews( { "type" : "tab" } ).
Riepilogo delle modifiche alla sicurezza
Il passaggio dalla versione 1 alla versione 2 del manifest comporta una serie di modifiche relative alla sicurezza. Molte di queste modifiche derivano dall'adozione da parte di Chrome della Content Security Policy; ti consigliamo di leggere di più su queste norme per comprenderne le implicazioni.
Script e gestori di eventi incorporati non consentiti
A causa dell'utilizzo dei Content Security Policy, non puoi più utilizzare i tag <script> incorporati
nei contenuti HTML. Questi devono essere spostati in file JS esterni. Inoltre, non sono supportati
i gestori di eventi incorporati. Ad esempio, supponiamo che tu abbia il seguente codice nella tua estensione:
<html>
<head>
<script>
function myFunc() { ... }
</script>
</head>
</html>
Questo codice causerebbe un errore in fase di runtime. Per risolvere il problema, sposta i contenuti del tag <script> in file esterni
e fai riferimento a questi file con un attributo src='path_to_file.js'.
Allo stesso modo, i gestori di eventi incorporati, che sono una funzionalità comune e pratica utilizzata da molti sviluppatori web, non verranno eseguiti. Ad esempio, prendi in considerazione istanze comuni come:
<body onload="initialize()">
<button onclick="handleClick()" id="button1">
Questi non funzioneranno nelle estensioni Manifest V2. Rimuovi i gestori di eventi incorporati, inseriscili nel file JS esterno e utilizza addEventListener() per registrarli. Ad esempio, nel codice JS, utilizza:
window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);
Questo è un modo molto più pulito per separare il comportamento dell'estensione dal markup dell'interfaccia utente.
Incorporare contenuti
Esistono alcuni scenari in cui la tua estensione potrebbe incorporare contenuti che possono essere utilizzati esternamente o provenire da una fonte esterna.
Contenuti dell'estensione nelle pagine web: Se la tua estensione incorpora risorse (come immagini, script, stili CSS e così via) utilizzate negli script di contenuti inseriti nelle pagine web, devi utilizzare la proprietà web_accessible_resources per inserire queste risorse nella lista consentita in modo che le pagine web esterne possano utilizzarle:
{
...
"web_accessible_resources": [
"images/image1.png",
"script/myscript.js"
],
...
}
Incorporamento di contenuti esterni:la Content Security Policy consente di caricare solo script e oggetti locali dal pacchetto, il che impedisce agli aggressori esterni di introdurre codice sconosciuto nell'estensione. Tuttavia, a volte vuoi caricare risorse pubblicate esternamente, come il codice jQuery o Google Analytics. Puoi utilizzare due metodi:
- Scarica la libreria pertinente localmente (ad esempio jQuery) e pacchettizzala con l'estensione.
Puoi allentare CSP in modo limitato inserendo le origini HTTPS nella sezione "content_security_policy" del manifest. Per includere una libreria come Google Analytics, segui questo approccio:
{ ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", ... }
Utilizzo della valutazione dinamica degli script
Forse uno dei cambiamenti più importanti nel nuovo schema Manifest v2 è che le estensioni non possono più utilizzare tecniche di valutazione dinamica degli script come eval() o Function() o passare stringhe di codice JS a funzioni che causeranno l'utilizzo di eval(), come setTimeout(). Inoltre, è noto che alcune librerie JavaScript di uso comune, come Google Maps e alcune librerie di modelli, utilizzano alcune di queste tecniche.
Chrome fornisce una sandbox per le pagine da eseguire nella propria origine, a cui viene negato l'accesso a chrome.*
API Per utilizzare eval() e simili ai sensi della nuova Content Security Policy:
- Crea una voce sandbox nel file manifest.
- Nella voce della sandbox, elenca le pagine che vuoi eseguire nella sandbox.
- Utilizza il passaggio di messaggi tramite
postMessage()per comunicare con la pagina in sandbox.
Per maggiori dettagli su come farlo, consulta la documentazione relativa al sandboxing di Eval.
Per approfondire
Le modifiche alla versione 2 del manifest sono progettate per guidare gli sviluppatori verso la creazione di estensioni e app più sicure e con un'architettura solida. Per visualizzare un elenco completo delle modifiche dalla versione 1 del manifest alla versione 2, consulta la documentazione del file manifest. Per saperne di più sull'utilizzo del sandboxing per isolare il codice non sicuro, leggi l'articolo Valutazione del sandboxing. Per saperne di più sulla Content Security Policy, consulta il nostro tutorial relativo alle estensioni e una buona introduzione su HTML5Rocks.