2010-09-22 16 views
10

Estoy trabajando en un complemento de Firefox que contiene un archivo que contiene algunos datos HTML. ¿Cómo cargo en este archivo como una cadena?Cómo cargar archivos desde el complemento de Firefox

que puedo hacer

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

pero que luego trata de ejecutar el archivo XML como Javascript. ¡Solo quiero sus contenidos!

Respuesta

6

Para las interacciones del sistema de archivos en Firefox, utilice los componentes de Mozilla XPCOM. Hay algunas envolturas de componentes XPCOM O I/como JSLib y io.js

Uso io.js que sería algo así como:

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); 
+0

componentes que XPCOM? Realmente no puedo entender la documentación de Firefox, que parece no tener ningún índice de componentes disponibles. Además, si especifico una ruta relativa en FileIO.open, ¿dónde se enrutará? – Zarkonnen

+0

@Zarkonnen Actualizado el código de muestra. Necesita componentes Mozilla I/O XPCOM (@ mozilla.org/file/*) – racetrack

0

Components.utils.import se utiliza para los módulos de código de Javascript.

Si desea utilizar ese comando, debe almacenar los datos como JSON.

JSON es algo similar a XML, ya que está diseñado para datos, pero JSON se integra fácilmente con código JavaScript.

10

Al usar esta función, puede leer archivos dentro del alcance de 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"); 

Example loading CSS content and injecting on a page.

EDIT:

Sólo para actualizar esto porque es poco práctico!

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; 
} 
+0

Gracias por esta respuesta, que es muy útil, y la correcta, pero terminé encontrando mi solución a través de la respuesta del circuito, así que les dio la recompensa. – Zarkonnen

+0

Este es el mejor answare para mí –

3

solución asincrónica utilizando XPCOM que puede leer desde cualquier esquema (chrome: //, de recursos: // 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 
    ); 
} 

Uso:

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

para mí, la solución de BunoLM funcionó (¡gracias un millón!) Pero solo después de usar el protocolo "resource" mientras pasaba la URL del archivo a la función Read, por los motivos explained elsewhere.

estoy añadiendo aquí porque me tomó un tiempo para resolver esto, así que espero que va a ayudar a algunos otros;)

Cuestiones relacionadas