Как загрузить файл из плагина Firefox

Я работаю над плагином Firefox, который содержит файл, содержащий некоторые данные HTML. Как загрузить в этом файле строку?

Я могу сделать

var contents = Components.utils.import("resource://stuff.html");

но затем пытается выполнить XML файл как Javascript. Я просто хочу его содержимое!

Ответ 1

Для взаимодействия файловой системы в Firefox используйте компоненты Mozilla XPCOM. Для компонентов ввода/вывода XPCOM есть несколько оболочек, таких как JSLib и io.js

Используя io.js, это будет что-то вроде:

var file = DirIO.get("ProfD"); // Will get you profile directory
file.append("extensions"); // extensions subfolder of profile directory
file.append("{1234567E-12D1-4AFD-9480-FD321BEBD20D}"); // subfolder of your extension (that your extension ID) of extensions directory
// append another subfolder here if your stuff.xml isn't right in extension dir
file.append("stuff.xml");
var fileContents = FileIO.read(file);
var domParser = new DOMParser();
var dom = domParser.parseFromString(fileContents, "text/xml");
// print the name of the root element or error message
dump(dom.documentElement.nodeName == "parsererror" ? "error while parsing" : dom.documentElement.nodeName);

Ответ 2

С помощью этой функции вы можете читать файлы с хромовой областью.

function Read(file)
{
    var ioService=Components.classes["@mozilla.org/network/io-service;1"]
        .getService(Components.interfaces.nsIIOService);
    var scriptableStream=Components
        .classes["@mozilla.org/scriptableinputstream;1"]
        .getService(Components.interfaces.nsIScriptableInputStream);

    var channel=ioService.newChannel(file,null,null);
    var input=channel.open();
    scriptableStream.init(input);
    var str=scriptableStream.read(input.available());
    scriptableStream.close();
    input.close();
    return str;
}

var contents = Read("chrome://yourplugin/stuff.html");

Пример загрузки содержимого CSS и ввода на страницу.

EDIT:

Просто обновить это, потому что это удобно!

let { Cc, Ci } = require('chrome');
function read(file){
    var ioService = Cc["@mozilla.org/network/io-service;1"]
        .getService(Ci.nsIIOService);
    var scriptableStream = Cc["@mozilla.org/scriptableinputstream;1"]
        .getService(Ci.nsIScriptableInputStream);

    var channel = ioService.newChannel2(file, null, null, null, null, null, null, null);
    var input = channel.open();
    scriptableStream.init(input);
    var str = scriptableStream.read(input.available());

    scriptableStream.close();
    input.close();
    return str;
}

Ответ 3

Я думаю, что эти ссылки были бы довольно хороши... Они рассказывают, как реализовать Json, а также некоторые вещи об интерфейсах firefox

http://www.json.org/js.html

https://developer.mozilla.org/en/JSON

Надеюсь, это поможет:)

Ответ 4

Асинхронное решение с использованием XPCOM, которое может читать любую схему (chrome://, resource://, http://,...):

const Cc = Components.classes;
const Ci = Components.interfaces;
const nsIIOService = Cc["@mozilla.org/network/io-service;1"]
                     .getService(Ci.nsIIOService);
function get_url_async(_url, /* function(data) */ _callback_success, /* function(status) */ _callback_fail)
{
    var channel=nsIIOService.newChannel(_url,null,null);
    channel.asyncOpen(
        {
            buffer:null,
            onStartRequest: function(/*in nsIRequest*/ aRequest, /*in nsISupports*/ aContext)
            {
                this.buffer = "";
            },
            onStopRequest: function(/*in nsIRequest*/ aRequest, /*in nsISupports*/ aContext, /*in nsresult*/ aStatusCode)
            {
                if(aStatusCode === Cr.NS_OK)
                    _callback_success(this.buffer);
                else
                    _callback_fail(aStatusCode);
            },
            onDataAvailable: function(/*in nsIRequest*/ aRequest, /*in nsISupports*/ aContext, /*in nsIInputStream*/ aInputStream, /*in unsigned long*/ aOffset, /*in unsigned long*/ aCount)
            {
                var scriptable_in_stream = Cc["@mozilla.org/scriptableinputstream;1"]
                                           .createInstance(Ci.nsIScriptableInputStream);
                scriptable_in_stream.init(aInputStream);
                this.buffer += scriptable_in_stream.read(aCount);
                scriptable_in_stream.close();
            }
        }, 
        /* context */ null
    );
}

Использование:

get_url_async(
    "resource://stuff.html", 
    function success(html)
    {
        // actions with html
    },
    function fail(status)
    {
        dump("Cannot get resource://stuff.html status code:"+status);
    }
);

Ответ 5

Components.utils.import используется для модулей кода JavaScript.

Если вы хотите использовать эту команду, вам необходимо сохранить данные как JSON.

JSON несколько похож на XML, поскольку он предназначен для данных, но JSON легко интегрируется с Javascript-кодом.

Ответ 6

Я думаю, что вы ищете nsILocalFile.

Ответ 7

для меня решение BunoLM работало (спасибо миллион!), но только после использования протокола "ресурса" при передаче файла url функции Read, что касается причин объясняется в другом месте.

Я добавляю это здесь, потому что мне потребовалось некоторое время, чтобы понять это, поэтому, надеюсь, это поможет некоторым другим;)