В Chrome 18 поддержка версии манифеста 1 была прекращена, и её постепенное прекращение будет осуществляться в соответствии с графиком поддержки версии манифеста 1. Изменения от версии 1 к версии 2 делятся на две основные категории: изменения API и изменения в области безопасности.
В этом документе представлены контрольные списки для миграции ваших расширений Chrome с версии манифеста 1 на версию 2, а также более подробное описание того, что означают эти изменения и почему они были внесены.
Контрольный список изменений API
Вы используете свойство
browser_actionsили APIchrome.browserActions?Замените
browser_actionsна свойствоbrowser_actionв единственном числе.Замените
chrome.browserActionsнаchrome.browserAction.Замените свойство
iconsнаdefault_icon.Замените свойство
nameнаdefault_title.Замените свойство
popupнаdefault_popup(теперь оно должно быть строкой).Вы используете свойство
page_actionsили APIchrome.pageActions?Замените
page_actionsнаpage_action.Замените
chrome.pageActionsнаchrome.pageAction.Замените свойство
iconsнаdefault_icon.Замените свойство
nameнаdefault_title.Замените свойство
popupнаdefault_popup(теперь оно должно быть строкой).Вы используете свойство
chrome.self?Замените на
chrome.extension.Вы используете свойство
Port.tab?Замените на
Port.sender.Вы используете API
chrome.extension.getTabContentses()илиchrome.extension.getExtensionTabs()?Замените на
chrome.extension.getViews( { "type" : "tab" } ).Использует ли ваше расширение фоновую страницу?
Замените свойство
background_pageна свойствоbackground.Добавьте свойство
scriptsилиpage, содержащее код страницы.Добавьте свойство
persistentи установите его значение вfalse, чтобы преобразовать фоновую страницу в страницу события.
Контрольный список изменений в системе безопасности
Используете ли вы встроенные блоки скриптов на HTML-страницах?
Удалите JS-код, заключенный в теги
<script>, и поместите его во внешний JS-файл.Используете ли вы встроенные обработчики событий (например, onclick и т. д.)?
Удалите их из HTML-кода, переместите во внешний JS-файл и используйте вместо них
addEventListener().Внедряет ли ваше расширение скрипты контента в веб-страницы, которым необходим доступ к ресурсам (таким как изображения и скрипты), содержащимся в пакете расширения?
Определите свойство web_accessible_resources и перечислите ресурсы (а также, при необходимости, отдельную политику безопасности контента для этих ресурсов).
Ваше расширение встраивает внешние веб-страницы?
Определите свойство "песочница" .
Использует ли ваш код или библиотека функции
eval(), newFunction(),innerHTML,setTimeout()или иные способы передачи строк кода JavaScript, которые динамически вычисляются?Используйте
JSON.parse()если вы преобразуете JSON-код в объект.Используйте библиотеку, поддерживающую CSP, например, AngularJS .
Создайте запись в песочнице в вашем манифесте и запустите соответствующий код в песочнице, используя
postMessage()для связи с изолированной страницей.Вы загружаете внешний код, например, jQuery или Google Analytics?
Рекомендуется загрузить библиотеку, упаковать её в ваше расширение, а затем загрузить из локального пакета.
Добавьте в список разрешенных доменов HTTPS, который обслуживает ресурс, указанный в разделе "content_security_policy" вашего манифеста.
Краткое описание изменений API
Вторая версия манифеста вносит ряд изменений в API для действий в браузере и на странице, а также заменяет некоторые старые API на новые.
Изменения в действиях браузера
В API действий браузера внесены некоторые изменения в названия:
- Свойства
browser_actionsиchrome.browserActionsзаменены на их аналоги в единственном числе:browser_actionиchrome.browserAction. В старом свойстве
browser_actionsнаходились свойстваicons,nameиpopup. Теперь они заменены следующими:default_iconдля значка действия браузераdefault_nameимя текста, который отображается во всплывающей подсказке при наведении курсора на значок.default_popupуказывает HTML-страницу, представляющую пользовательский интерфейс для действия в браузере (и теперь это должна быть строка, а не объект).
Изменения в действиях страницы
Аналогично изменениям в работе с действиями браузера, API для действий на страницах также претерпел изменения:
- Свойства
page_actionsиchrome.pageActionsзаменены на их аналоги в единственном числе:page_actionиchrome.pageAction. В старом свойстве
page_actionsнаходились свойстваicons,nameиpopup. Теперь они заменены следующими:default_iconдля значка действия страницыdefault_nameимя текста, который отображается во всплывающей подсказке при наведении курсора на значок.default_popupуказывает HTML-страницу, представляющую пользовательский интерфейс для действия на странице (и теперь это должна быть строка, а не объект).
Удалены и изменены API.
Некоторые API-интерфейсы расширений были удалены и заменены новыми аналогами:
- Свойство
background_pageбыло заменено на background . - Свойство
chrome.selfудалено, используйтеchrome.extension. - Свойство
Port.tabзаменено наPort.sender. - API-функции
chrome.extension.getTabContentses()иchrome.extension.getExtensionTabs()были заменены наchrome.extension.getViews( { "type" : "tab" } ).
Краткое описание изменений в системе безопасности
Переход от версии манифеста 1 к версии 2 сопровождается рядом изменений, связанных с безопасностью. Многие из этих изменений обусловлены внедрением Chrome политики безопасности контента (Content Security Policy ); вам следует подробнее ознакомиться с этой политикой, чтобы понять ее последствия.
Встроенные скрипты и обработчики событий запрещены.
В связи с использованием политики безопасности контента (Content Security Policy) вы больше не можете использовать теги <script> , встроенные в HTML-контент. Их необходимо переместить во внешние JS-файлы. Кроме того, встроенные обработчики событий также не поддерживаются. Например, предположим, что в вашем расширении был следующий код:
<html>
<head>
<script>
function myFunc() { ... }
</script>
</head>
</html>
Этот код вызовет ошибку во время выполнения. Чтобы это исправить, переместите содержимое тега <script> во внешние файлы и укажите на них ссылку с помощью атрибута src='path_to_file.js' .
Аналогично, встроенные обработчики событий, которые являются распространенным и удобным инструментом, используемым многими веб-разработчиками, не будут выполняться. Например, рассмотрим такие распространенные случаи, как:
<body onload="initialize()">
<button onclick="handleClick()" id="button1">
Эти функции не будут работать в расширениях манифеста V2. Удалите встроенные обработчики событий, поместите их во внешний JS-файл и используйте addEventListener() для регистрации обработчиков событий для них. Например, в вашем JS-коде используйте:
window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);
Это гораздо более удобный способ отделить поведение вашего расширения от разметки его пользовательского интерфейса.
Встраивание контента
В некоторых случаях ваше расширение может содержать контент, предназначенный для внешнего использования или поступающий из внешнего источника.
Содержимое расширения на веб-страницах: Если ваше расширение встраивает ресурсы (например, изображения, скрипты, стили CSS и т. д.), которые используются в скриптах содержимого, внедряемых в веб-страницы, вам необходимо использовать свойство web_accessible_resources , чтобы добавить эти ресурсы в список разрешенных, чтобы внешние веб-страницы могли их использовать:
{
...
"web_accessible_resources": [
"images/image1.png",
"script/myscript.js"
],
...
}
Встраивание внешнего контента: Политика безопасности контента разрешает загрузку из вашего пакета только локальных скриптов и объектов, что предотвращает внедрение неизвестного кода в ваше расширение внешними злоумышленниками. Однако иногда возникает необходимость загрузки внешних ресурсов, таких как код jQuery или Google Analytics. Для этого есть два способа:
- Загрузите необходимую библиотеку локально (например, jQuery) и упакуйте её вместе с вашим расширением.
Вы можете частично ослабить ограничения CSP, добавив HTTPS-источники в список разрешенных в разделе "content_security_policy" вашего манифеста. Для подключения такой библиотеки, как Google Analytics, следует использовать следующий подход:
{ ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", ... }
Использование динамической оценки скриптов
Пожалуй, одно из самых значительных изменений в новой схеме манифеста v2 заключается в том, что расширения больше не могут использовать методы динамической оценки скриптов, такие как eval() или new Function() , или передавать строки кода JavaScript в функции, которые вызовут использование eval() , например, setTimeout() . Кроме того, известно, что некоторые широко используемые библиотеки JavaScript, такие как Google Maps и некоторые библиотеки шаблонов, используют некоторые из этих методов.
Chrome предоставляет песочницу для страниц, позволяющую им работать в собственном исходном коде, при этом доступ к API chrome.* для них закрыт. Для использования eval() и подобных им в соответствии с новой политикой безопасности контента:
- Создайте запись в песочнице в файле манифеста.
- В поле "Песочница" укажите страницы, которые вы хотите запустить в этой песочнице.
- Для связи с изолированной страницей используйте передачу сообщений через
postMessage().
Более подробную информацию о том, как это сделать, см. в документации по оценке в изолированной среде .
Дополнительная информация
Изменения во второй версии манифеста призваны помочь разработчикам создавать более безопасные и надёжно спроектированные расширения и приложения. Полный список изменений от первой до второй версии манифеста см. в документации к файлу манифеста . Для получения дополнительной информации об использовании песочницы для изоляции небезопасного кода прочитайте статью о песочнице eval . Вы можете узнать больше о политике безопасности контента (Content Security Policy), посетив наш учебник по расширениям и ознакомившись с полезным руководством на HTML5Rocks .