Могу ли я передать весь объект window в мою компоненту? если да то как?... или я могу передать объект nsIDOMWindow - но если получить его в JS, то не представляю как его передать и потом как с ним работать (была бы благодарна если бы скинули какую-то ссылку на исходники компоненты, в которую передается один из интерфейсов "nsI")....

Aerina
Вы бы написали цель всех Ваших махинаций, вдруг есть решение проще?

Могу ли я передать весь объект window в мою компоненту?

-- откуда,
-- в какую компоненту,
-- для чего?

Mash пишет

Могу ли я передать весь объект window в мою компоненту?

-- откуда,
-- в какую компоненту,
-- для чего?

Моему приложению требуется обращаться к Mozilla и получать информацию о элементах на страничке, их значениях, позиции и т.д. Для IE я просто написала Hook.
Для Mozilla - написала компоненту и расширение. В расширении просто загружаю свою компоненту:
    const cid = "@mydomain.com/XPCOMSample/MyComponent;1";
                obj = Components.classes[cid].createInstance();
потом отлавливаю сообщение click и уже через компоненту переправляю необходимые данные в мое приложение (посылаю сообщение окну).
Но не все меня устраивает - например мне вообще не следует передавать управление Mozilla, то есть мое приложение не должно терять фокус.
Решила сделать так - при событии load - в компоненту передавать все данные об окне. А в компоненте создать окно и потом уже просто обмениваться через компоненту с приложением сообщениями - не обращаясь к расширению... А вот как все данные об окне передать не знаю....

Компонента, как я понимаю, написана на C++.

потом отлавливаю сообщение click и уже через компоненту переправляю необходимые данные в мое приложение (посылаю сообщение окну).

(я сам в cpp не силён и под рукой литературки нет, могу ошибиться в написании и не только) Речь идёт о всяких Post/SendMessage? А там разве нельзя передать сообщение приложению без передачи фокуса окну этого приложения?

Решила сделать так - при событии load - в компоненту передавать все данные об окне.

Здесь сразу возникает такой момент: не факт, что окно останется неизменным после "load".

Ладно.
Имеем, допустим, components/nsMyComponent.dll и chrome/../content/myWindowHandler.js. Если я правильно понял, то myWindowHandler.js отлавливает "load" и передаёт данные в nsMyComponent.dll. В духе "window.document.title", "window.location", "window.document.innerHTML" и т.д. Вы же хотите целиком передать window в компоненту и далее манупулировать этим объектом там.

В чём сложности? Не знаете что писать в IDL компоненты или дело в чём-то другом?

P.S. Ещё раз обращаю внимание на привязку к событию "load" -- если хотите получать "текущее" состояние документа, то подход нужно пересмотреть. В расширении можно оставить одну лишь компоненту. При "внешнем" обращении она должна найти текущую вкладку-->документ (если вас, конечно, интересует информация о просматриваемом в данный момент документе; если интересует последний загруженный документ, то можно и по "load", только получить нужно ссылку [у вас здесь загвоздка?], а не перечисление свойств в какой-то момент времени) и передавать его свойства.

Вот только общение между этими двумя программами я представляю смутно. Тема мне интересна, я бы поэкспериментировал, но, к сожалению, суток двое для этого не будет ни средств, ни времени; да и вряд ли помогу, т.к. знания cpp оставляют желать самого лучшего.

P.P.S. Если дело в IDL, то попробуйте что-нибудь в духе

Выделить код

Код:

#include "nsISupports.idl"
interface nsIDOMAbstractView;
[scriptable, uuid(........................................)]
interface nsIMyComponent : nsISupports
{
  //.......................
  void setWindow(in nsIDOMAbstractView aWindow);
};

В этом вопрос?

Спасибо всем кто ответил. Я в конце концов разобралась и добавляю так:

    const accServiceID = '@mozilla.org/accessibilityService;1';
    const accServiceIF = Components.interfaces.nsIAccessibilityService;
    const accService = Components.classes[accServiceID].getService(accServiceIF);
    var   acc = accService.getAccessibleFor(window.content.document);
    var dom_window = acc.QueryInterface(Components.interfaces.nsIAccessibleDocument);

    obj.SetBrWindow(dom_window); // obj- моя компонента

Надеюсь что правильно, вроде работает:) Я делаю это так еще из-за того, что хочу получить HWND окна, но это у меня и не работает, может кто-то подскажет, что делаю не так:

   HWND*  DocWindow;
   rv = g_window->GetWindowHandle((void**)&DocWindow);

Это уже в моей компоненте, написанной на С++. Почему-то оно или вылетает или *DocWindow равно нулю. g_window - это переданный из расширения элемент Components.interfaces.nsIAccessibleDocument.

Всю остальную схему реализовать удалось. Обмен сообщениями между приложениями тоже. Могу впринципе что-то описать подробнее, если кому-то интересно.

И еще один вопрос. Чтобы добавить мою компоненту в 1.0.6 - я удаляла файлы - compreg.dat и xpti.dat и потом добавляла в директорию components - два своих файла *.dll и *.xpt. Хочу проверить свою компоненту под Mozilla 1.5 - но эта схема не проходит... почему-то файлы compreg.dat и xpti.dat не обновляются...:(
не понимаю как подключить компоненту под Mozilla 1.5

Разобралась - обновляются файлы...(столько юзеров на компе - не разобралась не у того удаляла файлы... - не свой тесторский комп) но компонента почему-то все равно не работает... может что-то надо делать по другому в Mozilla 1.5?

Mozilla 1.5 -- достаточно старая версия, лучше делайте под 1.7+, не младше (если, конечно, в ТЗ обратное не указано чётко). Но знайте, что это просто моё сугубо личное мнение.

По остальному мне сказать что-то определённое достаточно сложно: с Accessible в js дел не имел, а уж про C++ вообще молчу в тряпочку.

obj.SetBrWindow(dom_window); // obj- моя компонента
Здесь "dom_window" существует? Я полагаю, что вы проверяли это, но просто уточнить, на всякий случай...

rv = g_window->GetWindowHandle((void**)&DocWindow);
Здесь тот же вопрос: "g_window" существует, с ним всё в порядке?

И ещё один: что у вас записано в IDL в плане этого самого "g_window"?

Aerina пишет

Всю остальную схему реализовать удалось. Обмен сообщениями между приложениями тоже. Могу впринципе что-то описать подробнее, если кому-то интересно.

Интересно, да. Если не сложно, то распишите; надеюсь, что модераторы с пониманием отнесутся даже к большому по объёму трактату, тем более, что самому сайту это описание только в плюс.