Дополнение для открытия локальных папок в Firefox - PullRequest
2 голосов
/ 26 февраля 2012

Я только начал создавать дополнение для 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 не построен».Это журнал:

GET 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 Ответ

2 голосов
/ 27 февраля 2012

Веб-приложение Add-on Builder предназначено для упаковки вашего кода и создания расширения - Firefox просто устанавливает расширение, как только это будет сделано. У вас проблема с компоновщиком надстроек, а не с Firefox. Я могу только рекомендовать вам подать отчет об ошибке .

Однако у вашего кода много проблем:

  • Похоже, что вы хотите показать свой элемент контекстного меню на страницах, использующих схему URL file:///, а не на ссылках, указывающих на файлы. Для этого нет предопределенного контекста, вам придется использовать скрипт контента (см. Указание контекстов> В скриптах контента . Что-то вроде:
self.on("context", function(node)
{
  return node.ownerDocument.URL.indexOf("file:///") == 0;
});
  • Функция openDir() не определена в скрипте содержимого, она определена в вашем расширении. Это означает, что вам необходимо отправить обратно на ваш внутренний номер сообщение с URL-адресом (см. Последний пример в Обработка щелчков пунктов меню ). Примерно так:
contentScript: 'self.on("context", ...);' +
               'self.on("click", function(node, data)' +
               '{' +
               '  self.postMessage(node.ownerDocument.URL);' +
               '});',
onMessage: function(url)
{
  openDir(url);
}
  • Проверять, работает ли ваш код в Firefox, бессмысленно - в настоящее время SDK для дополнений поддерживает только Firefox.
  • Не следует использовать устаревший метод PrivilegeManager.enablePrivilege - ваш код уже работает с наивысшими привилегиями. Вам нужно будет использовать полномочия Chrome , однако расширения, созданные с помощью SDK надстройки по умолчанию, не могут получить доступ к низкоуровневой функциональности.
  • Вы не должны запускать Windows Explorer напрямую, используйте nsILocalFile.launch () , для каталогов он будет запускать Windows Explorer (или любое другое действие, определенное в операционной системе для открытия каталогов). В целом код в 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();

Документация: nsIIOService , nsIFileURL .

...