Firefox addon 关于QueryInterface魔法的几句话

Firefox addon 关于QueryInterface魔法的几句话,firefox-addon,xpcom,Firefox Addon,Xpcom,很多时候,我遇到了一个问题,并张贴了帮助,所以很多时候,QueryInterface就是解决方案。我已经从事插件编程很长时间了,但从未理解QueryInterface。它看起来像魔法,好像它能解决一切问题 比如: 所以我的问题是,我看到一个查询接口链,我不知道为什么会有这个链,我也不知道如何创建自己的链。我不知道您如何知道如何从NSIInteraceRequester链接到nsiWebNavigation,而不是从NSIInteraceRequester直接链接到nsiDOMWindow,这里真

很多时候,我遇到了一个问题,并张贴了帮助,所以很多时候,QueryInterface就是解决方案。我已经从事插件编程很长时间了,但从未理解QueryInterface。它看起来像魔法,好像它能解决一切问题

比如:


所以我的问题是,我看到一个查询接口链,我不知道为什么会有这个链,我也不知道如何创建自己的链。我不知道您如何知道如何从NSIInteraceRequester链接到nsiWebNavigation,而不是从NSIInteraceRequester直接链接到nsiDOMWindow,这里真的没有什么特别之处。DOM窗口实现允许获取相关对象的
nsinterfacerequestor
接口。其中一个对象是与窗口关联的docshell—您可以通过请求
nsIWebNavigation
接口获得它,但它也实现了
nsidochell
nsidochelltreeitem
接口—和
nsidochelleRequestor
。当前窗口的docshell允许您访问顶部窗口的docshell,尽管chrome和内容之间存在安全边界。在那里,您可以再次使用
nsinterfacerequestor
界面向docshell请求与其关联的窗口


您可以简单地在XPCOM组件中实现
nsIInterfaceRequestor
接口,就像任何其他接口一样。我看不出有任何理由这样做,但是,对DOM隐藏内部窗口相关接口是一个丑陋的黑客行为。

非常感谢wlad的回复,我一直想要一个,但我开始觉得我是这里最受欢迎的ff家伙,哈哈,我觉得那不可能是真的,因为我很烂哈哈。我所说的魔法就像查询界面,有没有办法找到另一个标签打开的标签?正如你所知,选项卡是相对打开的,我在某处看到过,但记不起它们是如何做到的,这就像魔术一样。你现在是如何实现DOM windows的
nsIInterfaceRequestor`?因为当我转到Services.appShell.hiddenDOMWindow.console.log(window);`然后在浏览器控制台中单击该按钮,然后在VariableViewer filter by nsI中我看不到nsIInterfaceRequestor的任何地方image@Noitidart:检查窗口是否实现了
nsIInterfaceRequestor
您可以
Ci的窗口实例。nsIInterfaceRequestor
-这将隐式调用
QueryInterface()
,您不能仅仅通过查看对象的属性来检查支持的接口。对于支持的接口的完整列表,您必须转到源代码。啊,我知道了,谢谢Wlad!但即使没有实现这个功能,人们也可以通过一些技巧来使用QueryInterface,对吗?@Noitidart:这是XPCOM的基础知识。也许想读书?
window.QueryInterface(Ci.nsIInterfaceRequestor)
                         .getInterface(Ci.nsIWebNavigation)
                         .QueryInterface(Ci.nsIDocShellTreeItem)
                         .rootTreeItem
                         .QueryInterface(Ci.nsIInterfaceRequestor)
                         .getInterface(Ci.nsIDOMWindow);