La versión 1 del manifiesto dejó de estar disponible en Chrome 18, y la compatibilidad se eliminará de forma gradual según el programa de compatibilidad con la versión 1 del manifiesto. Los cambios de la versión 1 a la versión 2 se dividen en dos categorías generales: cambios en la API y cambios en la seguridad.
En este documento, se proporcionan listas de tareas para migrar tus extensiones de Chrome de la versión 1 a la versión 2 del manifiesto, seguidas de resúmenes más detallados de lo que significan estos cambios y por qué se realizaron.
Lista de verificación de cambios en la API
¿Usas la propiedad
browser_actionso la API dechrome.browserActions?Reemplaza
browser_actionspor la propiedadbrowser_actionsingular.Reemplaza
chrome.browserActionsporchrome.browserAction.Reemplaza la propiedad
iconspordefault_icon.Reemplaza la propiedad
namepordefault_title.Reemplaza la propiedad
popuppordefault_popup(y ahora debe ser una cadena).¿Usas la propiedad
page_actionso la API dechrome.pageActions?Reemplaza
page_actionsporpage_action.Reemplaza
chrome.pageActionsporchrome.pageAction.Reemplaza la propiedad
iconspordefault_icon.Reemplaza la propiedad
namepordefault_title.Reemplaza la propiedad
popuppordefault_popup(y ahora debe ser una cadena).¿Usas la propiedad
chrome.self?Se reemplazó con
chrome.extension.¿Usas la propiedad
Port.tab?Se reemplazó con
Port.sender.¿Usas las APIs de
chrome.extension.getTabContentses()o dechrome.extension.getExtensionTabs()?Se reemplazó con
chrome.extension.getViews( { "type" : "tab" } ).¿Tu extensión usa una página en segundo plano?
Reemplaza la propiedad
background_pagepor una propiedadbackground.Agrega una propiedad
scriptsopageque contenga el código de la página.Agrega una propiedad
persistenty configúrala comofalsepara convertir tu página en segundo plano en una página de eventos.
Lista de tareas de cambios de seguridad
¿Usas bloques de secuencias de comandos intercalados en páginas HTML?
Quita el código JS que se encuentra dentro de las etiquetas
<script>y colócalo en un archivo JS externo.¿Usas controladores de eventos intercalados (como onclick, etc.)?
Quítalos del código HTML, muévelos a un archivo JS externo y usa
addEventListener()en su lugar.¿Tu extensión inserta secuencias de comandos de contenido en páginas web que necesitan acceder a recursos (como imágenes y secuencias de comandos) que se encuentran en el paquete de la extensión?
Define la propiedad web_accessible_resources y enumera los recursos (y, de manera opcional, una política de seguridad del contenido independiente para esos recursos).
¿Tu extensión incorpora páginas web externas?
Define la propiedad sandbox.
¿Tu código o biblioteca usan
eval(),Function(),innerHTML,setTimeout()nuevos o, de alguna otra manera, pasan cadenas de código JS que se evalúan de forma dinámica?Usa
JSON.parse()si analizas código JSON en un objeto.Usa una biblioteca compatible con la CSP, por ejemplo, AngularJS.
Crea una entrada de zona de pruebas en tu manifiesto y ejecuta el código afectado en la zona de pruebas con
postMessage()para comunicarte con la página de zona de pruebas.¿Cargas código externo, como jQuery o Google Analytics?
Considera descargar la biblioteca y empaquetarla en tu extensión, y, luego, cargarla desde el paquete local.
Incluye en la lista de entidades permitidas el dominio HTTPS que entrega el recurso en la parte "content_security_policy" de tu manifiesto.
Resumen de los cambios en la API
La versión 2 del manifiesto introduce algunos cambios en las APIs de acción del navegador y acción de página, y reemplaza algunas APIs antiguas por otras más nuevas.
Cambios en las acciones del navegador
La API de Browser Actions presenta algunos cambios de nombres:
- Las propiedades
browser_actionsychrome.browserActionsse reemplazaron por sus contrapartes singularesbrowser_actionychrome.browserAction. En la propiedad
browser_actionsanterior, había propiedadesicons,nameypopup. Se reemplazaron por los siguientes:default_iconpara el ícono de insignia de acción del navegadordefault_namepara el texto que aparece en la información sobre herramientas cuando colocas el cursor sobre el distintivodefault_popuppara la página HTML que representa la IU de la acción del navegador (y ahora debe ser una cadena, no puede ser un objeto)
Cambios en las acciones de la página
Al igual que los cambios en las acciones del navegador, la API de Page Actions también cambió:
- Las propiedades
page_actionsychrome.pageActionsse reemplazaron por sus contrapartes singularespage_actionychrome.pageAction. En la propiedad
page_actionsanterior, había propiedadesicons,nameypopup. Se reemplazaron por los siguientes:default_iconpara el ícono de insignia de acción de la páginadefault_namepara el texto que aparece en la información sobre herramientas cuando colocas el cursor sobre el distintivodefault_popuppara la página HTML que representa la IU de la acción de página (y ahora debe ser una cadena, no puede ser un objeto)
APIs quitadas y modificadas
Se quitaron algunas APIs de extensión y se reemplazaron por otras nuevas:
- La propiedad
background_pagese reemplazó por background. - Se quitó la propiedad
chrome.self; usachrome.extension. - La propiedad
Port.tabse reemplazó porPort.sender. - Las APIs de
chrome.extension.getTabContentses()ychrome.extension.getExtensionTabs()se reemplazaron porchrome.extension.getViews( { "type" : "tab" } ).
Resumen de los cambios de seguridad
Hay varios cambios relacionados con la seguridad que acompañan la transición de la versión 1 a la versión 2 del manifiesto. Muchos de estos cambios se deben a la adopción de la Política de Seguridad del Contenido por parte de Chrome. Debes leer más sobre esta política para comprender sus implicaciones.
No se permiten los controladores de eventos ni las secuencias de comandos intercalados
Debido al uso de la Política de seguridad del contenido, ya no puedes usar etiquetas <script> intercaladas con el contenido HTML. Estos deben trasladarse a archivos JS externos. Además, tampoco se admiten los controladores de eventos intercalados. Por ejemplo, supongamos que tienes el siguiente código en tu extensión:
<html>
<head>
<script>
function myFunc() { ... }
</script>
</head>
</html>
Este código generaría un error durante el tiempo de ejecución. Para solucionar este problema, mueve el contenido de la etiqueta <script> a archivos externos y haz referencia a ellos con un atributo src='path_to_file.js'.
Del mismo modo, no se ejecutarán los controladores de eventos intercalados, que son una función común y conveniente que usan muchos desarrolladores web. Por ejemplo, considera instancias comunes como las siguientes:
<body onload="initialize()">
<button onclick="handleClick()" id="button1">
No funcionarán en las extensiones de Manifest V2. Quita los controladores de eventos intercalados, colócalos en tu archivo JS externo y usa addEventListener() para registrar controladores de eventos para ellos. Por ejemplo, en tu código de JS, usa lo siguiente:
window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);
Esta es una forma mucho más clara de separar el comportamiento de tu extensión del lenguaje de marcado de la interfaz de usuario.
Incorporación de contenido
En algunos casos, es posible que tu extensión incorpore contenido que se pueda usar de forma externa o que provenga de una fuente externa.
Contenido de la extensión en páginas web: Si tu extensión incorpora recursos (como imágenes, secuencias de comandos, estilos CSS, etcétera) que se usan en secuencias de comandos de contenido que se insertan en páginas web, debes usar la propiedad web_accessible_resources para incluir estos recursos en la lista de entidades permitidas, de modo que las páginas web externas puedan usarlos:
{
...
"web_accessible_resources": [
"images/image1.png",
"script/myscript.js"
],
...
}
Incorporación de contenido externo: La Política de Seguridad del Contenido solo permite que se carguen secuencias de comandos y objetos locales desde tu paquete, lo que evita que atacantes externos introduzcan código desconocido en tu extensión. Sin embargo, hay ocasiones en las que deseas cargar recursos que se entregan de forma externa, como el código de jQuery o Google Analytics. Existen dos maneras de hacerlo:
- Descarga la biblioteca pertinente de forma local (como jQuery) y empaquétala con tu extensión.
Puedes relajar la CSP de forma limitada incluyendo en la lista de entidades permitidas los orígenes HTTPS en la sección "content_security_policy" de tu manifiesto. Para incluir una biblioteca como Google Analytics, sigue este enfoque:
{ ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", ... }
Uso de la evaluación dinámica de secuencias de comandos
Quizás uno de los mayores cambios en el nuevo esquema de Manifest v2 es que las extensiones ya no pueden usar técnicas de evaluación de secuencias de comandos dinámicas, como eval() o el nuevo Function(), ni pasar cadenas de código JS a funciones que harán que se use un eval(), como setTimeout(). Además, se sabe que ciertas bibliotecas de JavaScript de uso frecuente, como Google Maps y algunas bibliotecas de plantillas, utilizan algunas de estas técnicas.
Chrome proporciona un entorno de pruebas para que las páginas se ejecuten en su propio origen, al que se les niega el acceso a chrome.*.
APIs Para usar eval() y similares con la nueva política de seguridad del contenido, haz lo siguiente:
- Crea una entrada de zona de pruebas en tu archivo de manifiesto.
- En la entrada de la zona de pruebas, enumera las páginas que deseas ejecutar en la zona de pruebas.
- Usa el paso de mensajes a través de
postMessage()para comunicarte con la página en zona de pruebas.
Para obtener más detalles sobre cómo hacerlo, consulta la documentación de Sandboxing Eval.
Lecturas adicionales
Los cambios en la versión 2 del manifiesto están diseñados para guiar a los desarrolladores a crear extensiones y apps más seguras y con una arquitectura más sólida. Para ver una lista completa de los cambios de la versión 1 a la versión 2 del manifiesto, consulta la documentación del archivo de manifiesto. Para obtener más información sobre el uso de zonas de pruebas para aislar código no seguro, consulta el artículo evaluación de zonas de pruebas. Puedes obtener más información sobre la Política de Seguridad del Contenido en nuestro instructivo relacionado con extensiones y en una buena introducción en HTML5Rocks.