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

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

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

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

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

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

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

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

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

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

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

Выделить код

Код:

nsIDOMHTMLObjectElement
nsIDOMHTMLFrameElement
nsIDOMHTMLIFrameElement

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

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., кто может.

Вероятно, 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.

Elexander пишет

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

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

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

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