2011-08-22 55 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));