用于在Firefox中打开本地文件夹的附加组件

时间:2012-02-26 14:13:27

标签: firefox firefox-addon firefox-addon-sdk

我刚刚开始使用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();
        }
    }

1 个答案:

答案 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);
}
  • 检查您的代码是否在Firefox中运行是没有意义的 - 目前,Add-on SDK仅支持Firefox。
  • 您不应使用已弃用的PrivilegeManager.enablePrivilege方法 - 您的代码已经以最高权限运行。您需要use chrome authority但是,默认情况下使用附加SDK构建的扩展无法访问低级功能。
  • 您不应直接运行Windows资源管理器,使用nsILocalFile.launch(),运行Windows资源管理器的目录(或在操作系统中定义的任何操作来打开目录)。 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();

文档:nsIIOServicensIFileURL