2011-08-22 54 views
1

我上增加对Firefox 6的支持对我的附加在Mac OS,在下面的逻辑是通过工作内容的浏览器窗口在Firefox 4.5版本的工作,但无法在Firefox 6火狐6:问题的QueryInterface(nsIDOMWindow :: GetIID()的XPCOM组件,从JS

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是预期的,而不是零。

+1

这是不太可能关系到你的问题,但你应该考虑使用['do_QueryInterface'(https://developer.mozilla.org/en/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_do_QueryInterface。 28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29):'nsCOMPtr的 PWIN(do_QueryInterface(pSubject));' –

+0

我注意到你'Observe'函数使用参数名称为'aSubject',但函数内的代码使用'pSubject'来代替。这可能只是一个复制粘贴错误,或者它可能是您的实际代码中的严重问题。 –

+0

感谢您指出,这是帖子中的复制粘贴错误。 – Swetha

回答

1

直接的问题似乎是,无论对象是作为aSubject交付,不会实现nsIDOMWindow接口,这自然会导致QueryInterface失败并产生空值。你不能将一个对象指向一个没有实现的接口,并且你不能对任何东西QI为null。

我不知道离手什么causred这种变化,但这里有一些东西来检查,可以帮助你找到真正的问题:

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

看起来好像代码没有问题。我无法准确找出解决问题的方法,但是为此dylib删除binarycomponent指令已解决了问题。 由于在chrome.manifest(二进制组件组件/ XXX5.dylib appversion> = 5.0,二进制组件组件/ XXX6.dylib appversion> = 6.0)中指定了binarycomponent伪指令,因为对于ver5和6的FF6 dylib而言,虽然正确的dylib的代码正在执行(从组件中删除FF5dylib,它的工作原理)。正确版本的这个dylib加载另一个dylib,因此不需要在chrome中输入。 – Swetha

0

我没有太多熟悉的附加开发。但是这在我的应用程序(C++)中适用于我。

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

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