我正在为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
符合预期,而不是零。
答案 0 :(得分:1)
当前的问题似乎是,无论以aSubject
传递什么对象都没有实现nsIDOMWindow
接口,这自然会导致QueryInterface
失败并产生空值。你不能QI一个它没有实现的接口的对象,你不能QI null到任何东西。
我不知道这种变化会产生什么影响,但这里有一些可以帮助您找到真正问题的事情:
nsIDOMWindow
。aTopic
是否包含您期望的值,而不是其他一些事件字符串。答案 1 :(得分:0)
我对附加开发并不熟悉。但这在我的应用程序(C ++)中对我有用。
nsCOMPtr<nsIDOMWindow> domWindow;
nsresult rv = mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindow));
nsCOMPtr<nsIDOMWindowUtils> windowUtils(do_GetInterface(domWindow));