【发布时间】:2015-02-16 20:57:53
【问题描述】:
对于我创建的即将发布的插件版本,我想检测从哪个选项卡(如果有)在新选项卡或窗口中打开了链接。
我的插件是一个缩放插件,如果用户在新选项卡或窗口中打开链接,我希望能够复制原始选项卡的缩放级别。
我已经想出了如何在 content-JavaScript 中使用window.open() 打开链接时如何检测打开器(这相当容易),但是我不知道如何确定是否有新的选项卡/窗口从上下文菜单(在新选项卡/新窗口中打开链接)或 Ctrl/⌘/Shift+单击打开。
为了检测它是否是从 content-Javascript 打开的,我使用:
const Cc = Components.classes;
const Ci = Components.interfaces;
let windowTracker = {
observe: function( subject, topic, data ) {
if( 'chrome-document-global-created' == topic && subject instanceof Ci.nsIDOMWindow ) {
// here I can use subject.opener
}
}
}
let observerService = Cc[ '@mozilla.org/observer-service;1' ].getService( Ci.nsIObserverService );
observerService.addObserver( this, 'chrome-document-global-created', false );
为了检测任何可能的非内容 JavaScript 开启器,我在 observe() 中尝试过这个:
let windowTracker = {
observe: function( subject, topic, data ) {
if( 'chrome-document-global-created' == topic && subject instanceof Ci.nsIDOMWindow ) {
let topWindow = subject.QueryInterface( Ci.nsIInterfaceRequestor )
.getInterface( Ci.nsIWebNavigation )
.QueryInterface( Ci.nsIDocShellTreeItem )
.rootTreeItem
.QueryInterface( Ci.nsIInterfaceRequestor )
.getInterface( Ci.nsIDOMWindow );
// here I tried topWindow.opener, with mixed results
}
}
}
...但结果好坏参半。
当我使用上下文菜单或 Ctrl/⌘/Shift+单击在新选项卡或窗口中打开链接时,@987654327 @ 等于 null,但如果我用 Ctrl+Shift+A 打开插件管理器,topWindow.opener将是ChromeWindow 的一个实例。
所以,我似乎走在了正确的轨道上,但并不完全正确,因为我只对用户在新标签页或窗口中打开内容链接感兴趣。
我所追求的可行吗?
在检查 Firefox 的源代码时,我注意到可能有一种方法(除非我误解了它的目的)可以满足我的需求:getOpener() in nsIDocShell。但是,该方法并未在脚本 API 中公开。
有什么类似的东西我可以利用吗?
【问题讨论】:
标签: javascript firefox firefox-addon xul