我多次遇到问题并发帖寻求帮助,而且很多时候QueryInterface都是解决方案。我已经有很长一段时间的插件编程,但从来没有理解QueryInterface。它似乎很神奇,就像它能解决所有问题一样。
像:
window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
所以我的问题是我看到一个QueryInterface链,我不明白为什么链,我绝对不知道如何创建我自己的链。我不知道怎么知道从nsiInterfaceRequester链接到nsiWebNavigation而不是从nsiInterfaceRequester直接链接到nsiDOMWindow
答案 0 :(得分:1)
这里真的没什么特别的。 DOM窗口实现允许获取相关对象的nsIInterfaceRequestor
接口。一个这样的对象是与窗口关联的docshell - 您通过询问nsIWebNavigation
接口获得它,但它还实现了nsIDocShell
和nsIDocShellTreeItem
接口 - 以及nsIInterfaceRequestor
。尽管chrome和内容之间存在安全边界,但当前窗口的docshell允许您访问顶部窗口的docshell。在那里,您可以再次使用nsIInterfaceRequestor
界面向docshell询问与之关联的窗口。
您可以像在任何其他界面中一样在XPCOM组件中简单地实现nsIInterfaceRequestor
接口。我没有看到任何理由这样做,但是从DOM隐藏内部窗口相关接口是一个丑陋的黑客。