Пытаюсь использовать эту штуку для проверки валидности урла и вытаскивания из него имени домена.

Выделить код

Код:

var uri = Components
	.classes["@mozilla.org/network/simple-uri;1"]
	.createInstance(Components.interfaces.nsIURI);
uri.spec = "http://infoman.local/sidebartest.html";
try
{
	alert(uri.host);
}
catch (e)
{
	var txt = "";
	for (var i in e)
	{
		txt += i + ": " + e[i] + "\n";
	}
	alert(txt);
}

В алерте получаю:

Выделить код

Код:

QueryInterface: function QueryInterface() {
    [native code]
}
message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIURI.host]
result: 2147500037
name: NS_ERROR_FAILURE
filename: chrome://extname/content/browserOverlay.js
lineNumber: 128
columnNumber: 0
location: JS frame :: chrome://extname/content/browserOverlay.js :: anonymous :: line 128
inner: null
data: null
initialize: function initialize() {
    [native code]
}

Вопрос: почему может не срабатывать? гугл не особо помогает, судя по http://developer.mozilla.org/en/docs/nsIURI должно возвращать хост, однако выдаёт ошибку.

Выделить код

Код:

var uri = makeURI("http://infoman.local/sidebartest.html");
alert(uri.host);

Но надо проверять, где именно определена функция makeURI.

Вот здесь: http://www.xulplanet.com/references/xpcomref/ifaces/nsIURI.html написано:

An object of this interface must be created in the following way:

ioService.newURI(uri, charset, baseuri);

Похоже, в этом всё дело - если создать nsIURI через nsIIOService, ошибка не появляется.

А, нашел.
chrome://global/content/contentAreaUtils.js (Firefox 2.0.0.х, 3.0; другие не проверял)

Выделить код

Код:

function makeURI(aURL, aOriginCharset, aBaseURI)
{
  var ioService = Components.classes["@mozilla.org/network/io-service;1"]
                            .getService(Components.interfaces.nsIIOService);
  return ioService.newURI(aURL, aOriginCharset, aBaseURI);
}
Anton пишет

Похоже, в этом всё дело - если создать nsIURI через nsIIOService, ошибка не появляется.

Спасибо, помогло.

Выделить код

Код:

var util = Components
	.classes["@mozilla.org/network/util;1"]
	.getService(Components.interfaces.nsIIOService);
uri = util.newURI("http://infoman.local/sidebartest.html", null, null);