# NPAPI 插件
使用HTML和JavaScript开发新扩展是十分容易的事情,不过如果你想在扩展中重用已经开发完成的代码和功能,你可以通过使用NPAPI插件到达目的。NPAPI插件使JavaScript代码能够调用本地二进制代码。
## 警告
**NPAPI 是重型武器,当别的方法无法到达你的目的时,才建议使用。**
运行在NPAPI插件中的代码拥有当前用户的全部权限,不能利用Google Chrome 的沙箱技术和其他安全防护技术。 在处理不可信任的输入, 如[content scripts](content_scripts.html#security-considerations)和XMLHttpRequest 时,你必须格外小心。
鉴于使用NPAPI可能引入的风险,使用了NPAPI的扩展在提交给[web store](https://chrome.google.com/webstore)或者[extension gallery](https://chrome.google.com/extensions) 时要经过人工审核。
## 更多信息
如何开发一个NPAPI插件超出了本文的范畴,具体请参看:[Mozilla's NPAPI plugin reference](https://developer.mozilla.org/en/Plugins)以获得更多帮助。
如果你已经拥有一个NPAPI插件,通过如下步骤,你的扩展将能够调用它。
1. 在你扩展的manifest.json文件中加入一个节,描述如何找到你的插件,以及其他一些信息,:
```
{
"name": "My extension",
...
**"plugins": [
{ "path": "content_plugin.dll", "public": true },
{ "path": "extension_plugin.dll" }
]**,
...
}
```
"path" 属性用于描述如何找到你的插件,路径是相对于manifest文件位置的。 "public" 属性指明是否允许普通页面加载你的插件,默认是false,也就是只有你的扩展才能加载这个插件。
2. 创建一个HTML文件,mime-type为:application/x-my-extension" ,用于加载你的插件。
```
<embed type="application/x-my-extension" id="pluginId">
<script>
var plugin = document.getElementById("pluginId");
var result = plugin.myPluginMethod(); // call a method in your plugin
console.log("my plugin returned: " + result);
</script>
```
这个页面可以被后台页面包含,或者任何你扩展会用到的其他页面。如果你的插件的 "public" 属性是true,,你可以通过脚本在页面中直接使用它。
## 安全注意事项
在你的扩展中包含一个NPAPI插件是一件危险的事情。因为NPAPI插件拥有访问你本地机器的完全权限而不受控制。如果你的插件不够健壮,包含漏洞,黑客可以通过溢出攻击利用漏洞来安装恶意软件到用户的机器。 有鉴于此,请尽可能的避免在扩展中使用NPAPI插件。
将NPAPI的 "public" 属性设置为true,也会增加你扩展受到攻击的可能性。因为这样一来,插件直接暴露给了页面内容,恶意网站能通过页面直接操纵你的插件。有鉴于此,尽量避免将"public"属性设置为true。
- 基础文档
- 综述
- 调试
- 格式:Manifest文件
- 模式匹配
- 改变浏览器外观
- Browser Actions
- Context Menus
- 桌面通知
- Omnibox
- Override替代页
- Page Actions
- 主题
- 与浏览器交互
- 书签
- Cookies
- chrome.devtools.* APIs
- Events
- chrome.history
- Management
- 标签
- 视窗
- 实现扩展
- 无障碍性(a11y)
- 背景页
- Content Scripts
- 跨域 XMLHttpRequest 请求
- 国际化 (i18n)
- 消息传递
- Optional Permissions
- NPAPI 插件
- 完成并发布应用
- 自动升级
- 托管
- 打包
- 规范和协议
- 应用设计规范
- 开发人员协议
- 免责声明