Как узнать к какому классу относится интерфейс, например, nsIFile?

Можно тут посмареть : http://www.oxymoronical.com/experiments/xpcomref/applications/Firefox/3.5/interfaces/
Если имеллось в виду Components.classes[""]...

Хочу получить простой, но полный список классов и компонентов.
Код примерно такой:

Выделить код

Код:

for(var Cc in Components.classes)
{
document.writeln(Cc.name +"  "+ Cc.number);
}

Но я застрял в самом... странном месте.
Как вывести текст, чтобы его потом скопировать?

"document.writeln" для XUL не существует.

Начал искать вариант и наткнулся на объект EDITOR, но так и не понял, как текст в него пихать.

Keepun

Keepun пишет

Как вывести текст, чтобы его потом скопировать?

dump и включить консоль.
Ещё можно в файл писать.

Можно открыть пустую вкладку (руками) и дописывать в нее:

Выделить код

Код:

win.gBrowser.contentDocument.body.innerHTML += "yourtext"

А вообще в Extension Developer есть JavaScript shell - очень удобно в таких случаях.

OK, c Javascript Shell разобрался...

Такой код:

Выделить код

Код:

var CInf = Components.classes['@mozilla.org/timer;1'].QueryInterface(Components.interfaces.nsIClassInfo);
var CiC, CiR;
CInf.getInterfaces(CiC, CiR);
document.writeln("+++ "+ CiC +"<br>");

Ошибка:

Выделить код

Код:

NS_ERROR_XPC_NEED_OUT_OBJECT on line 3: 'Out' argument must be an object arg 0 [nsIClassInfo.getInterfaces

Что ему надо? Какой объект?

Выделить код

Код:

void getInterfaces(out PRUint32 count, [array, size_is(count), retval] out nsIIDPtr array);

Второй параметр out+retval, т.е. из JavaScript он будет виден не как второй параметр функции, а как её возвращаемое значение.

Чтобы получить первый out-параметр, надо передать этой функции объект, и она заполнит в нем поле value в данном случае размером массива (иммитация передачи по ссылке, используемая XPConnect при вызове методов XPCOM-интерфейса из JavaScript). Но в JavaScript не нужно отдельно знать размер массива - он будет в CiR.length автоматически (XPConnect всё сделает сам), поэтому передаем пустой анонимный объект.

Выделить код

Код:

var CInf = Components.classes['@mozilla.org/timer;1'].QueryInterface(Components.interfaces.nsIClassInfo);
var CiR = CInf.getInterfaces({});
document.writeln("+++ "+ CiC +"<br>");

Не пашет CInf.getInterfaces({})... одно и тоже выдает

Выделить код

Код:

var CInf = Components.classes['@mozilla.org/file/local;1'].QueryInterface(Components.interfaces.nsIClassInfo);
for each(var Cc in CInf.getInterfaces({}))
document.writeln("+++ "+ Components.interfacesByID[Cc].name +" ::: "+ Cc +"<br>");

Независимо от класса получу:

Выделить код

Код:

+++ nsIJSID ::: {baedc96a-9cee-4b6b-9160-90d257b3c8ef}
+++ nsIJSCID ::: {26b2a374-6eaf-46d4-acaf-1c6be152d36b}

Надо же еще получить сам объект:

Выделить код

Код:

Components.classes["@mozilla.org/browser/sessionstore;1"].getService(Components.interfaces.nsIClassInfo).getInterfaces({})

Причем для некоторых компонентов надо вызывать createInstance, а не getService. И похоже, большинство компонентов, написанных на С++, не поддерживают nsIClassInfo.