Как загрузить файл из плагина Firefox - PullRequest
10 голосов
/ 22 сентября 2010

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

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

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

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

Ответы [ 7 ]

10 голосов
/ 29 сентября 2010

Используя эту функцию, вы можете читать файлы в Chrome.

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;
}
6 голосов
/ 26 сентября 2010

Для взаимодействия с файловой системой в 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's 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);
4 голосов
/ 27 сентября 2010

Я думаю, что эти ссылки были бы весьма полезны ... В них рассказывается, как реализовать Json, а также рассказывается об интерфейсах Firefox

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

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

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

3 голосов
/ 20 августа 2013

Асинхронное решение с использованием 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);
    }
);
0 голосов
/ 20 февраля 2014

для меня решение от BunoLM сработало (спасибо миллион!), Но только после использования протокола «resource» при передаче URL-адреса файла в функцию Read, как объяснили причины в другом месте .

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

0 голосов
/ 26 сентября 2010

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

0 голосов
/ 26 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...