我刚刚开始使用Firefox制作插件。编写此附加组件是为了打开FF外部的本地文件夹。该文件夹已由浏览器打开。在上下文菜单中,您将看到一个打开浏览器外部文件夹的选项(我使用Win7)。 这是我使用的代码:
var contextMenu = require("context-menu");
var menuItem = contextMenu.Item({
label: "Open Local File",
context: contextMenu.URLContext("file:///*"),
contentScript: 'self.on("click", function() {'+
'openDir(document.URL);'+
'});',
});
function openDir(val)
{
if (val == "")
{
alert("Directory not defined");
return;
}
if(navigator.userAgent.indexOf("Firefox") == -1)
{
alert("Currently active folder links supported only for Mozilla Firefox web browser");
return;
}
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var localFile =
Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
var env =
Components.classes["@mozilla.org/process/environment;1"]
.createInstance(Components.interfaces.nsIEnvironment);
var systemRoot = env.get("SystemRoot");
if (systemRoot == "")
{
alert("Unable to retrieve SystemRoot environment variable");
}
localFile.initWithPath(systemRoot + "\\explorer.exe");
var process =
Components.classes["@mozilla.org/process/util;1"]
.createInstance(Components.interfaces.nsIProcess);
process.init(localFile);
process.run(false, Array(val), 1);
}
现在的问题是,当我在http://builder.addons.mozilla.org/下保存加载项时...它无法编译。相反,红色框显示消息“XPI not built”。这是日志:
获取https://builder.addons.mozilla.org/xpi/test/.../ 404未找到236毫秒
我该怎么办?
修改后的代码:
var contextMenu = require("context-menu");
var menuItem = contextMenu.Item({
label: "Open Local File",
contentScript: 'self.on("context", function(node)'+
'{'+
' return node.ownerDocument.URL.indexOf("file:///") == 0;'+
'});'+
'self.on("click", function(node)' +
'{' +
' self.postMessage(node.ownerDocument.URL);' +
'});',
onMessage: function(url)
{
openDir(url);
}
}) ;
function openDir(val)
{
var {Cc, Ci} = require("chrome");
var ioService = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService);
var uri = ioService.newURI(val, null, null);
if (uri instanceof Ci.nsIFileURL && uri.file.isDirectory())
{
uri.file.QueryInterface(Ci.nsILocalFile).launch();
}
}
答案 0 :(得分:2)
Add-on Builder Web应用程序可用于打包代码并创建扩展程序 - Firefox只需在完成后安装扩展程序。您的加载项生成器存在问题,而不是Firefox的问题。我只能推荐你file a bug report。
您的代码有很多问题:
file:///
URL方案在页面上显示上下文菜单项,而不是在指向文件的链接上显示。没有预定义的上下文,您必须使用内容脚本(请参阅Specifying Contexts > In Content Scripts。类似于:self.on("context", function(node)
{
return node.ownerDocument.URL.indexOf("file:///") == 0;
});
openDir()
未在内容脚本中定义,它在您的扩展程序中定义。这意味着您必须使用URL将消息发送回您的扩展程序(请参阅Handling Menu Item Clicks中的最后一个示例)。这样的事情:contentScript: 'self.on("context", ...);' +
'self.on("click", function(node, data)' +
'{' +
' self.postMessage(node.ownerDocument.URL);' +
'});',
onMessage: function(url)
{
openDir(url);
}
PrivilegeManager.enablePrivilege
方法 - 您的代码已经以最高权限运行。您需要use chrome authority但是,默认情况下使用附加SDK构建的扩展无法访问低级功能。openDir()
中的代码应该如下所示:var {Cc, Ci} = require("chrome");
var ioService = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService);
var uri = ioService.newURI(val, null, null);
if (uri instanceof Ci.nsIFileURL && uri.file.isDirectory())
uri.file.QueryInterface(Ci.nsILocalFile).launch();