Всем доброго времени суток

Учусь писать плагины
Сейчас пишу загрузчик музыки из vk (для себя)

url файла и его имя есть, нужно открыть стандартный диалог сохранения файла
пытался сделать так

Выделить код

Код:

function download(url, name) {
    var link = document.createElement("a");
    link.download = name;
    link.href = url;
    link.click();
}

не работает
функция расположена в "myplugin\data\VKdownload.js"
вызов скрипта VKdownload идет из "myplugin\lib\main.js"

Выделить код

Код:

pageMod.PageMod({
    include: "https://vk.com/*",
    contentScriptFile: [self.data.url("jquery.js"), self.data.url("VKdownload.js")]
});

плагин собираю с помощью cfx
по этому туториалу https://developer.mozilla.org/en-US/Add … stallation , https://developer.mozilla.org/en-US/Add … ng_started

помогите открыть стандартный файловый диалог

Подсказали код (спасибо Michael72):

Выделить код

Код:

function InputFileName(filename='') {
    var utils = require('sdk/window/utils');
    var nsIFilePicker = Ci.nsIFilePicker; 
    var fp = Cc['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);    
    fp.init(utils.getMostRecentBrowserWindow(), 'Сохранить файл', nsIFilePicker.modeSave);
    fp.appendFilter('mp3','*.mp3');
    fp.defaultString = filename;
    var fp_result = fp.show();
    if (fp_result == nsIFilePicker.returnOK || fp_result == nsIFilePicker.returnReplace) {
        var path = fp.file.path;
        return path;
    }
    else if (fp_result == nsIFilePicker.returnCancel) {
        return 'cancel';
    }
    
}

Более подробно тут https://developer.mozilla.org/en-US/doc … FilePicker
там же подробности о фильтрах

// код тестировал в lib\main.js

Вроде бы здесь есть какой-то ответ на проблему в виде сообщения "window is not defined". Пишется, что надо использовать nsIWindowMediator. Я бы попробовал заменить window (см. строку 4 в коде) на Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator)

Michael72, спасибо большое, разобрался с вызовом из main.js,
но в скриптах расположенных в "myplugin\data\" не открывает
Не срабатывает строка const {Cc} = require("chrome");
видимо ограничен круг видимости этих скриптов

Теперь вопрос: как вызвать функцию в "myplugin\lib\main.js" из скриптов расположенных в "myplugin\data\" ?

В плагинах под chromium была конструкция:
В скрипте бекграудна (с доступом к фичам браузера) была функция приемник:

Выделить код

Код:

chrome.extension.onRequest.addListener(function (request, sender, callback) {
    var action = request.action;
    if (action == 'download_from_vk') {
        chrome.downloads.download({ url: request.url, saveAs: false, filename: request.name });
        returnMessage(request.message);
    }
}

Из локальных (под каждую страницу свой) скриптов обращался к функции так

Выделить код

Код:

chrome.extension.sendRequest({action: 'download_from_vk', url: url, name: name});

Нужен аналогичный код для firefox

Разобрался

Для общения между скриптами, например lib\main.js и data\my-script.js
используется "port"
content-scripting-events.png
Как это работает - https://developer.mozilla.org/en-US/Add … using_port