Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№130-10-2009 14:40:38

tpb12
Участник
 
Группа: Members
Зарегистрирован: 30-10-2009
Сообщений: 4
UA: Firefox 3.5

XPCOM C++

Добрый день, уважаемые специалисты!

Проблема в следующем. Пишу на С++ XPCOM, а точнее переписываю на плюсах скриптовый код для запуска sidebar-а. Все шло хорошо, пока я не наткнулся на следующий код:

например - if (sidebar.contentDocument.location.href != url)

sidebar - это nsCOMPtr<nsIDOMElement> sidebar; получается он так:

document->GetElementById( nsString(L"sidebar"), getter_AddRefs(sidebar))))

а что такое contentDocument (бывает еще contentWindow) ? Как его получить? Перерыл весь интернет, ничего толком не нашел.

Заранее спасибо.

Отсутствует

 

№230-10-2009 15:11:15

igorsub
бедняжечка бедняжная
 
Группа: Extensions
Откуда: Мурманск
Зарегистрирован: 03-04-2005
Сообщений: 6373
UA: Firefox 3.5
Веб-сайт

Re: XPCOM C++

Вообще есть целый сайт - http://developer.mozilla.org.

Вот результаты поиска.


От оно че!

Отсутствует

 

№330-10-2009 19:43:55

Al_H
Away
 
Группа: Members
Откуда: SPb
Зарегистрирован: 10-06-2005
Сообщений: 5508
UA: Shiretoko 3.5

Re: XPCOM C++

contentDocument - документ, содержащийся в окне или фрейме.

Отсутствует

 

№431-10-2009 11:15:26

Elexander
Участник
 
Группа: Members
Зарегистрирован: 06-10-2008
Сообщений: 54
UA: Opera 10.0

Re: XPCOM C++

Попробуйте через QueryInterface попросить у sidebar один из этих интерфейсов.

Выделить код

Код:

nsIDOMHTMLObjectElement
nsIDOMHTMLFrameElement
nsIDOMHTMLIFrameElement

Только в них есть свойство contentDocument.

Отсутствует

 

№509-11-2009 12:30:52

tpb12
Участник
 
Группа: Members
Зарегистрирован: 30-10-2009
Сообщений: 4
UA: Firefox 3.5

Re: XPCOM C++

Elexander пишет

Попробуйте через QueryInterface попросить у sidebar один из этих интерфейсов.

Выделить код

Код:

nsIDOMHTMLObjectElement
nsIDOMHTMLFrameElement
nsIDOMHTMLIFrameElement

Только в них есть свойство contentDocument.

Приветствую всех!

Попробовал запросить все три интерфейса для sidebar следующим образом (подставляя нужный интерфейс):

nsCOMPtr<nsIDOMHTMLObjectElement> htmlobj;
nsresult rv = sidebar->QueryInterface(NS_GET_IID(nsIDOMHTMLObjectElement), getter_AddRefs(htmlobj));

Во всех трех случаях получил NS_FAILED(rv).

Сам sidebar - это:

nsCOMPtr<nsIDOMElement> sidebar;
document->GetElementById( nsString(L"sidebar"), getter_AddRefs(sidebar));

Возможно, я что-то делаю не так, подскажите, pls., кто может.

Отсутствует

 

№613-11-2009 18:29:49

Elexander
Участник
 
Группа: Members
Зарегистрирован: 06-10-2008
Сообщений: 54
UA: Opera 10.0

Re: XPCOM C++

Вероятно, contentDocument - это XBL-свойство sidebar. В таком случае я бы вызывал JavaScript из XPCOM. Для этого нужно реализоть на JS объект со всем необходимым функционалом и передать ссылку на него в XPCOM-компонент.

JavaScript:

Выделить код

Код:

var CallbackObject = 
{
    getSidebarURL: function()
    {
               return sidebar.contentDocument.location.href;
    }
}

var Component = Components.classes["@example.com/component;1"]
    .createInstance().QueryInterface(Components.interfaces.IMyInterface);
Component.setCallback(CallbackObject);

IDL:

Выделить код

Код:

[scriptable, uuid(8CECF414-495D-48FF-BEC4-F4ED2809AAEC)]
interface ICallbackObject : nsISupports 
{
    AString getSidebarURL();
};

[scriptable, uuid(90758A97-A6F3-4ea4-8953-16BD2EE3A977)]
interface IMyInterface : nsISupports
{
    void setCallback(in ICallbackObject aCallback);
};

После вызова setCallback в компоненте можна запоминать и использовать интерфейс ICallbackObject.

Отсутствует

 

№716-11-2009 18:43:39

tpb12
Участник
 
Группа: Members
Зарегистрирован: 30-10-2009
Сообщений: 4
UA: Firefox 3.5

Re: XPCOM C++

Elexander пишет

Вероятно, contentDocument - это XBL-свойство sidebar. В таком случае я бы вызывал JavaScript из XPCOM. Для этого нужно реализоть на JS объект со всем необходимым функционалом и передать ссылку на него в XPCOM-компонент.

После вызова setCallback в компоненте можна запоминать и использовать интерфейс ICallbackObject.

Что-то у меня при вызове Java-функции из С++ происходит падение. Т.е я в setCallback запоминаю адрес объекта и затем делаю вызов object->getSidebarURL() - падение. Может быть у тебя есть какой-нибудь работающий пример (или кусок примера) ? Буду премного благодарен.

Отсутствует

 

№817-11-2009 17:51:33

Elexander
Участник
 
Группа: Members
Зарегистрирован: 06-10-2008
Сообщений: 54
UA: Opera 10.0

Re: XPCOM C++

Мы с вами не знакомы, так что давайте "на вы".
Примера нет. Но если приведете минимальный код в котором наблюдается падение, может еще чем-то смогу помочь.
Вот еще: http://groups.google.ru/group/netscape. … um=3&pli=1. Там с примером и детально.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]