Firefox 6: проблема с QueryInterface (nsIDOMWindow :: GetIID () в компоненте XPCOM для окна содержимого браузера, переданного из js - PullRequest
1 голос
/ 22 августа 2011

Я работаю над добавлением поддержки Firefox 6 для моего дополнения в Mac OS, где следующая логика работает в версиях Firefox 4,5, но не работает в Firefox 6.

Компонент XPCOM имеет подклассIObserverClient и добавляет себя в качестве наблюдателя для пользовательского события.Это пользовательское событие отправляется из браузера overlay.js, пропуская окно содержимого выбранного браузера.

var observerService = Components.classes["@mozilla.org/observer-service;1"]
                                .getService(Components.interfaces.nsIObserverService);
if (observerService) {
    var data =  gBrowser.selectedBrowser.contentWindow.location.href;

    observerService.notifyObservers(gBrowser.selectedBrowser.contentWindow, JSEventTopic, data);
}

В обработчике компонентов XPCOM пытается получить интерфейс nsIDOMWindow из nsISupports

void XXX::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *aData)
{
    nsCOMPtr<nsIDOMWindow> pWin;
    aSubject->QueryInterface(nsIDOMWindow::GetIID(), getter_AddRefs(pWin));
}

Проблема в том, что с Firefox 6 pWin ноль.В Firefox 4 и 5 pWin - это как ожидалось, а не ноль.

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Непосредственной проблемой является то, что любой объект, доставляемый как aSubject, не реализует интерфейс nsIDOMWindow, что, естественно, приводит к сбою QueryInterface и выдаче нулевого значения.Вы не можете QI объект к интерфейсу, который он не реализует, и вы не можете QI нулевой к чему-либо.

Я не знаю, что вызвало это изменение, но вотНесколько вещей, которые нужно проверить, которые могут помочь вам найти реальную проблему:

  • Убедитесь, что объект, который вы получаете, не является нулевым, и что указатель, на который вы пытаетесь ответить QI, является аргументом, полученнымметод слушателя.
  • В своем коде JavaScript проверьте, что передаваемый вами объект окна не равен nil, и что он должен реализовывать nsIDOMWindow.
  • Убедитесь, что aTopic содержит ожидаемое вами значение, а не какую-либо другую строку события.
0 голосов
/ 07 сентября 2011

Я не очень знаком с разработкой дополнений. Но это работает для меня в моем приложении (C ++).

nsCOMPtr<nsIDOMWindow> domWindow; 
nsresult rv = mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));

nsCOMPtr<nsIDOMWindowUtils> windowUtils(do_GetInterface(domWindow)); 
...