Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the BSD License.
©2012 Google
清单文件版本1在Chrome 18中弃用,对它的支持将根据 清单文件版本1支持计划逐渐减少。 从版本1到版本2的更改分为两大类:API更改和安全性更改。
该文档提供了将您的Chrome扩展程序从清单文件版本1迁移到版本2所需要做的事情清单,并提供有关这些改变会带来什么以及为什么作出这些改变的更多详细摘要。
browser_actions
属性或者
chrome.browserActions
API 吗?browser_action
属性替换browser_actions
。chrome.browserAction
替换
chrome.browserActions
.default_icon
替换icons
属性。default_title
替换name
属性。default_popup
替换popup
属性(并且现在它必须为字符串)。page_actions
属性或者chrome.pageActions
API吗?page_action
属性替换page_actions
。chrome.pageAction
替换chrome.pageActions
。default_icon
替换icons
属性。default_title
替换name
属性。default_popup
替换popup
属性(并且现在它必须为字符串)。chrome.self
属性吗?chrome.extension
。Port.tab
属性吗?Port.sender
。chrome.extension.getTabContentses()
或者chrome.extension.getExtensionTabs()
API吗?chrome.extension.getViews( { "type" : "tab" } )
。background_page
属性替换为background
属性。scripts
或page
属性,包含页面的代码。persistent
属性,并将它设置为false
,将您的后台页面转换为事件页面。<script>
标签内的JavaScript代码并将它放在外部的JS文件中。onclick
等)?addEventListener()
。eval()
、new Function()
、innerHTML
、setTimeout()
或者通过其它方式传递动态求值的JavaScript代码字符串吗?JSON.parse()
如果您需要将JSON代码分析为对象。postMessage()
与受沙箱保护的页面通信。清单文件版本2引入了对浏览器按钮与页面按钮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
。chrome.extension.getTabContentses()
与chrome.extension.getExtensionTabs()
API已替换为chrome.extension.getViews( { "type" : "tab" } )
。清单文件版本1到版本2的转换伴随着一系列安全性相关的更改。许多这些更改来源于Chrome浏览器对 内容安全策略的采用,您应该了解这一策略的更多信息来理解它带来的影响。
由于内容安全策略的使用,
您不能继续使用HTML内容中内嵌的<script>
标签,这些必须移动至外部的JS文件中去。此外,内嵌的事件处理器也不支持。例如,假设您的扩展程序中有如下代码:
<html> <head> <script> function myFunc() { ... } </script> </head> </html>
这一代码在运行时会产生错误。要修复它,请将<script>
标签的内容移至外部文件,并使用src=’文件路径.js’
属性引用它们。
类似的,常见并且许多Web开发者为方便而使用的内嵌事件处理器不会执行。例如,考虑如下常见情况:
<body onload=”initialize()”> <button onclick=”handleClick()” id=”button1”>
这些不能在清单文件版本2的扩展程序中工作。移除内嵌事件处理器,将它们放在您的外部JS文件中,并改用
addEventListener()
为它们注册事件处理器。例如,在您的JavaScript代码中使用:
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代码。有两种方式可以实现:
{ // 清单文件 ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", ... }
也许在新的清单文件版本2架构中最大的变化之一就是扩展程序不能继续使用动态脚本求值技术,例如eval
或new Function()
或者将JavaScript代码字符串传递给会使用eval()
的函数,例如setTimeout()
。此外,已知某些常用的JavaScript库,例如Google Maps以及一些模板库,会使用这些技术。
Chrome浏览器为页面提供了沙箱,用于在它们自己的来源中运行,拒绝访问chrome.* API。为了在新的内容安全策略下使用eval()
及类似技术:
sandbox
项。postMessage()
使用消息传递来跟沙箱中的页面通信。有关如何做这些的更多详情,请参见受沙箱保护的eval文档。
清单文件版本2带来的更改是为了引导开发人员建立更安全、架构健壮的扩展程序和应用程序。要查看清单文件版本1至版本2的完整更改列表,请参见 清单文件版本文档。 有关使用沙箱隔离不安全代码的更多信息,请阅读受沙箱保护的eval文章。 您可以访问我们与扩展程序相关的教程以及 HTML5Rocks上一个很棒的简介(英文)了解有关内容安全策略的更多内容。