关于QueryInterface魔术的一些话

时间:2014-02-07 13:37:45

标签: firefox-addon xpcom

我多次遇到问题并发帖寻求帮助,而且很多时候QueryInterface都是解决方案。我已经有很长一段时间的插件编程,但从来没有理解QueryInterface。它似乎很神奇,就像它能解决所有问题一样。

像:

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

所以我的问题是我看到一个QueryInterface链,我不明白为什么链,我绝对不知道如何创建我自己的链。我不知道怎么知道从nsiInterfaceRequester链接到nsiWebNavigation而不是从nsiInterfaceRequester直接链接到nsiDOMWindow

1 个答案:

答案 0 :(得分:1)

这里真的没什么特别的。 DOM窗口实现允许获取相关对象的nsIInterfaceRequestor接口。一个这样的对象是与窗口关联的docshell - 您通过询问nsIWebNavigation接口获得它,但它还实现了nsIDocShellnsIDocShellTreeItem接口 - 以及nsIInterfaceRequestor 。尽管chrome和内容之间存在安全边界,但当前窗口的docshell允许您访问顶部窗口的docshell。在那里,您可以再次使用nsIInterfaceRequestor界面向docshell询问与之关联的窗口。

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