2014-02-07 68 views
2

很多時候我遇到過問題併發帖尋求幫助,QueryInterface是這麼多次的解決方案。我已經很長一段時間的插件編程,但從來沒有理解QueryInterface。它看起來像魔術,就像它擁有一切的解決方案。QueryInterface上的一些詞magic

喜歡:

window.QueryInterface(Ci.nsIInterfaceRequestor) 
         .getInterface(Ci.nsIWebNavigation) 
         .QueryInterface(Ci.nsIDocShellTreeItem) 
         .rootTreeItem 
         .QueryInterface(Ci.nsIInterfaceRequestor) 
         .getInterface(Ci.nsIDOMWindow); 

所以我的問題是我看到一個QueryInterface鏈,我不明白爲什麼鏈條,我絕對沒有得到如何創建自己的鏈。我不明白你怎麼知道從nsiInterfaceRequester鏈接到nsiWebNavigation而不是從nsiInterfaceRequester直接到nsiDOMWindow

回答

1

這裏沒有什麼特別的。 DOM窗口實現了允許獲取相關對象的接口nsIInterfaceRequestor。其中一個目標是與窗口關聯的文檔外殼 - 您可以通過詢問nsIWebNavigation界面獲得它,但它也實現了nsIDocShellnsIDocShellTreeItem界面 - 和nsIInterfaceRequestor。儘管chrome和內容之間存在安全邊界,但當前窗口的文檔可以讓您訪問頂層窗口的docshell。在那裏,您可以再次使用nsIInterfaceRequestor界面向docshell詢問與其關聯的窗口。

您可以簡單地在您的XPCOM組件中實現nsIInterfaceRequestor接口,就像任何其他接口一樣。然而,我沒有看到有任何理由要這樣做,從DOM中隱藏與窗口相關的內部接口是一件很醜惡的事情。

+0

非常感謝這個回覆我一直想要一個,但我開始覺得我是這個世界上最棘手的傢伙哈哈,我就是這樣,不能是真的因爲我吸哈哈。我的意思是魔術就像用QueryInterface有沒有辦法找到另一個選項卡是從哪裏打開?就像你知道選項卡打開相對正確,我看到了某處,但不記得他們是如何做的,這就像魔術。 – Noitidart

+0

你怎麼現在DOM窗口實現'nsIInterfaceRequestor'?因爲當我去'''Services.appShell.hiddenDOMWindow.console.log(window);''',然後點擊瀏覽器控制檯中的,然後在通過nsI的VariableViewer篩選器中,我看不到任何地方有nsIInterfaceRequestor的圖像[這裏](http://img.photobucket.com/albums/v135/noitidart/i20dont20see20nsIInterfaceRequestor_zps7bfc9d43.png) – Noitidart

+0

@Noitidart:要檢查窗口是否實現了'nsIInterfaceRequestor',你需要'window instanceof Ci.nsIInterfaceRequestor' - 這將調用QueryInterface ()'隱式地,你不能通過查看對象的屬性來檢查支持的接口。對於支持的接口的完整列表,您必須轉到源代碼。 –