SDK还不能为火狐浏览器提供一个API添加新的菜单项。但它是可扩展的设计,所以任何人都可以建立和发布模块,使用插件开发者。幸运的是,埃里克沃尔德写的MenuItems模块,能够使我们添加菜单项。
本教程有双重的责任。它描述的一般方法,使用一个外部的,在你的插件的第三方模块,并描述了如何使用特别的MenuItems模块添加一个菜单项。
首先,创建一个新的扩展程序。创建一个目录名称为“clickme”(名称随意),找到它并运行cfx init
初始化。
mkdir clickme cd clickme cfx init
通常将创建目录结构:
- clickme
- data
- docs
- main.md
- lib
- main.js
- package.json
- README.md
- tests
- test-main.js
安装 menuitems
在 "clickme"下创建一个名称为"packages"的目录. 从 https://github.com/mykmelez/menuitems-jplib 下载 menuitems 并展开到刚才创建的
"packages" 目录下:
mkdir packages cd packages tar -xf ../erikvold-menuitems-jplib-d80630c.zip
模块依赖
如果第三方模块只取决于SDK模块,你可以马上使用它们,但如果他们依赖于其他第三方模块,你需要安装的依赖以及。
在软件包的主目录,你会发现一个叫做 "package.json"的文件. 打开它,看看一个名称"dependencies"的入口. menuitems
包的入口:
"dependencies": ["vold-utils"]
这告诉我们需要安装 vold-utils
包, 我们可以从https://github.com/mykmelez/vold-utils-jplib 下载,并添加到 packages
目录下的旁边的menuitems
.
使用menuitems
Menuitems
模块文档 告诉使用MenuItem()创建一个新的菜单项
. MenuItem()可接受的附加选项
, 我们将使用最迷你的配置:
id
: 菜单项标示符label
:菜单项线上的文本command
: 用户选择菜单项的响应函数menuid
: 菜单项的父类标示符insertbefore
: 我们希望出现的标示符之前的位置
var menuitem = require("menuitems").Menuitem({ id: "clickme", menuid: "menu_ToolsPopup", label: "Click Me!", onCommand: function() { console.log("clicked"); }, insertbefore: "menu_pageInfo" });
接下来, 我们将声明menuitems
的依赖包. 在你的add-on's package.json文件添加一行
:
"dependencies": "menuitems"
Note that due to bug 663480, if you add a dependencies
line to package.json
, and you use any modules from the SDK, then you must also declare your dependency on that built-in package, like this:
"dependencies": ["menuitems", "addon-sdk"]
现在我们要做的。运行插件,你会看到新的项目出现在工具菜单:选择它,你会看到info: clicked
出现在控制台。
Caveats
第三方模块使用不直接支持的SDK功能的好方法,但由于第三方模块通常使用低级别的API,它们可以通过Firefox的新版本了。