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

Я работаю над добавлением поддержки 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 соответствует ожиданиям, а не нулю.


person Swetha    schedule 22.08.2011    source источник
comment
Маловероятно, что это связано с вашей проблемой, но вам следует подумать об использовании _ 1_: nsCOMPtr<nsIDOMWindow> pWin(do_QueryInterface(pSubject));   -  person Wladimir Palant    schedule 22.08.2011
comment
Я заметил, что ваша функция Observe использует имя параметра aSubject, но код внутри функции использует вместо этого pSubject. Это может быть просто ошибка копирования и вставки, или это может быть серьезная проблема в вашем реальном коде.   -  person Stuart Cook    schedule 22.08.2011
comment
Спасибо за указание, это сообщение об ошибке копирования и вставки.   -  person Swetha    schedule 23.08.2011


Ответы (2)


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

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

  • Убедитесь, что объект, который вы получаете, не равен нулю, и что указатель, на который вы пытаетесь указать QI, является аргументом, полученным методом слушателя.
  • В вашем коде JavaScript убедитесь, что объект окна, который вы передаете, не равен нулю и действительно должен реализовывать nsIDOMWindow.
  • Убедитесь, что aTopic содержит ожидаемое значение, а не какую-либо другую строку события.
person Stuart Cook    schedule 22.08.2011
comment
Похоже, с кодом все в порядке. Я не могу точно понять, что устранило проблему, но удаление директивы binarycomponent для этого dylib устранило проблему. С директивой binarycomponent, указанной в chrome.manifest (binary-component components / XXX5.dylib appversion ›= 5.0, binary-component components / XXX6.dylib appversion› = 6.0), поскольку обе верны для загружаемых файлов FF6 dylib версий 5 и 6, хотя выполняется правильный код dylib. (удаляя FF5dylib из компонентов, он работает). Правильная версия этого dylib загружается в другой dylib, поэтому запись в chrome не требуется. - person Swetha; 24.08.2011

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

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

nsCOMPtr<nsIDOMWindowUtils> windowUtils(do_GetInterface(domWindow)); 
person Karthik Mahalingam    schedule 07.09.2011