Firefox 6:QueryInterface问题(XPCOM组件中的nsIDOMWindow :: GetIID(),用于从js传递的浏览器内容窗口

时间:2011-08-22 12:37:37

标签: firefox-addon xpcom gecko

我正在为Mac OS上的插件添加对Firefox 6的支持,其中以下逻辑在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 个答案:

答案 0 :(得分:1)

当前的问题似乎是,无论以aSubject传递什么对象都没有实现nsIDOMWindow接口,这自然会导致QueryInterface失败并产生空值。你不能QI一个它没有实现的接口的对象,你不能QI null到任何东西。

我不知道这种变化会产生什么影响,但这里有一些可以帮助您找到真正问题的事情:

  • 确保您收到的主题不为空,并且您尝试QI的指针是侦听器方法收到的参数。
  • 在您的JavaScript代码中,检查您传递的窗口对象是否为零,实际上应该实现nsIDOMWindow
  • 检查aTopic是否包含您期望的值,而不是其他一些事件字符串。

答案 1 :(得分:0)

我对附加开发并不熟悉。但这在我的应用程序(C ++)中对我有用。

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

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