Асинхронное решение с использованием 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);
}
);