chrome插件中文开发文档(非官方)

教程:迁移到清单文件版本2

清单文件版本1在Chrome 18中弃用,对它的支持将根据 清单文件版本1支持计划逐渐减少。 从版本1到版本2的更改分为两大类:API更改和安全性更改。

该文档提供了将您的Chrome扩展程序从清单文件版本1迁移到版本2所需要做的事情清单,并提供有关这些改变会带来什么以及为什么作出这些改变的更多详细摘要。

API更改清单

安全性更改清单

API更改摘要

清单文件版本2引入了对浏览器按钮与页面按钮API的一些更改,并将少量旧的API用新的来代替。

对浏览器按钮的更改

浏览器按钮API引入了某些名称更改:

对页面按钮的更改

类似于浏览器按钮的更改,页面按钮API也有变化:

已移除与已更改的APIs

一些扩展程序API已经移除,并用对应的新API替换:

安全性更改摘要

清单文件版本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代码。有两种方式可以实现:

  1. 下载相关的库(例如jQuery)并将它与您的扩展程序一起打包。
  2. 您可以有限地放宽CSP(内容安全策略),在您的清单文件中“content_security_policy”部分将HTTPS来源加入白名单。要包含像Google Analytics之类的库,可以采用如下方式:
            { // 清单文件
              ...,
              "content_security_policy": "script-src 'self'
              https://ssl.google-analytics.com; object-src 'self'",
              ...
            }
          

使用动态脚本求值

也许在新的清单文件版本2架构中最大的变化之一就是扩展程序不能继续使用动态脚本求值技术,例如evalnew Function()或者将JavaScript代码字符串传递给会使用eval()的函数,例如setTimeout()。此外,已知某些常用的JavaScript库,例如Google Maps以及一些模板库,会使用这些技术。

Chrome浏览器为页面提供了沙箱,用于在它们自己的来源中运行,拒绝访问chrome.* API。为了在新的内容安全策略下使用eval() 及类似技术:

  1. 在您的清单文件中创建一个sandbox项。
  2. 在沙箱项中列出您希望在沙箱中运行的页面。
  3. 通过postMessage()使用消息传递来跟沙箱中的页面通信。

有关如何做这些的更多详情,请参见受沙箱保护的eval文档。

进一步的阅读

清单文件版本2带来的更改是为了引导开发人员建立更安全、架构健壮的扩展程序和应用程序。要查看清单文件版本1至版本2的完整更改列表,请参见 清单文件版本文档。 有关使用沙箱隔离不安全代码的更多信息,请阅读受沙箱保护的eval文章。 您可以访问我们与扩展程序相关的教程以及 HTML5Rocks上一个很棒的简介(英文)了解有关内容安全策略的更多内容。