Javascript 检测打开新选项卡/窗口的原点选项卡(如果有)

Javascript 检测打开新选项卡/窗口的原点选项卡(如果有),javascript,firefox,firefox-addon,xul,Javascript,Firefox,Firefox Addon,Xul,对于我创建的附加组件的下一个版本,我想检测在新选项卡或窗口中从哪个选项卡(如果有的话)打开了链接 我的加载项是缩放加载项,如果用户在新选项卡或窗口中打开链接,我希望能够复制“原点”选项卡的缩放级别 我已经知道了如何在contentjavascript中使用window.open()打开链接时检测开启器(这相当简单),但是我不知道如何从上下文菜单(在新选项卡/新窗口中打开链接)或Ctrl键打开新选项卡/窗口/⌘/按住Shift键并单击 为了检测它是否是从content Javascript打开的,

对于我创建的附加组件的下一个版本,我想检测在新选项卡或窗口中从哪个选项卡(如果有的话)打开了链接

我的加载项是缩放加载项,如果用户在新选项卡或窗口中打开链接,我希望能够复制“原点”选项卡的缩放级别

我已经知道了如何在contentjavascript中使用
window.open()
打开链接时检测开启器(这相当简单),但是我不知道如何从上下文菜单(在新选项卡/新窗口中打开链接)或Ctrl键打开新选项卡/窗口/⌘/按住Shift键并单击

为了检测它是否是从content Javascript打开的,我使用:

const Cc=Components.class;
const Ci=组件。接口;
让windowTracker={
观察:功能(主题、主题、数据){
if('chrome document global created'==Ci.nsIDOMWindow的主题和主题实例){
//在这里我可以使用subject.opener
}
}
}
让observerService=Cc['@mozilla.org/observer service;1'].getService(Ci.nsIObserverService);
addObserver(此“chrome文档全局创建”,false);
为了检测任何可能的非内容JavaScript开启器,我在
observe()
中尝试了以下方法:

让windowTracker={
观察:功能(主题、主题、数据){
if('chrome document global created'==Ci.nsIDOMWindow的主题和主题实例){
让topWindow=subject.QueryInterface(Ci.nsInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
根树
.QueryInterface(Ci.NSInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
//在这里,我尝试了topWindow.opener,结果好坏参半
}
}
}
。。。但结果好坏参半

使用关联菜单或Ctrl键在新选项卡或窗口中打开链接时/⌘/按住Shift键并单击,
topWindow。opener
等于
null
,但如果我,例如,用Ctrl+Shift+A打开加载项管理器,
topWindow。opener
将是
ChromeWindow
的实例

所以,看起来我的思路是对的,但不完全正确,因为我只对用户在新选项卡或窗口中打开内容链接感兴趣

我所追求的是可行的吗

在检查Firefox的源代码时,我注意到可能有一种方法(除非我误解了它的用途)可以让我得到我想要的:In。但是,该方法未在脚本API中公开

我可以利用类似的东西吗

但是,我不知道如何判断是否从上下文菜单(在新选项卡/新窗口中打开链接)或Ctrl键打开了新选项卡/窗口/⌘/按住Shift键并单击

在这种情况下,尤其是在新窗口中打开时,选项卡实际上没有所有者。它们被认为等同于用户只需在地址栏中键入URL


您可以在每个
窗口上安装用于冒泡的
单击
上下文菜单
提交
事件,检查目标是否为表单或链接,然后检查其目标url。如果新打开的选项卡的位置与上次单击/提交的链接相匹配,则它可能来自上一个选项卡。

我通过拦截对象成功地使其工作:

//窗口是一个顶级ChromeWindow
window.openLinkIn=新代理(window.openLinkIn{
应用:函数(目标、此参数、参数列表){
让url=argumentsList[0];
让where=argumentsList[1];
设params=argumentsList.length>2?argumentsList[2]:{};
//通过上下文菜单或Ctrl键打开的链接/⌘/按住Shift键并单击
//没有参数。fromChrome=true
如果(!url | | |!where | | params.fromChrome){
返回target.apply(thisArg,argumentsList);
}
开关(何处){
案例“选项卡”:
//故意遗漏
案例“Tabshift”:
让tabBrowser=window.gBrowser;
tabBrowser.tabContainer.addEventListener('TabOpen',函数onTabOpen(事件){
tabBrowser.tabContainer.removeEventListener('TabOpen',onTabOpen,true);
让tab=event.target;
//对新标签做些什么
},对);
打破
“窗口”案例:
让windowTracker={
init:function(){
addObserver(这是“顶级窗口就绪”,false);
},
销毁:函数(){
removeObserver(这是“顶级窗口就绪”);
},
观察:功能(主题、主题、数据){
让自我=这个;
让chromeWindow=主体;
if('toplevel window ready'==主题和(&C)Ci.nsIDOMWindow的窗口实例){
addEventListener('DOMContentLoaded',函数onChromeWindowDOMContentLoaded(事件){
this.removeEventListener('DOMContentLoaded',onChromeWindowDOMContentLoaded,true);
if('navigator:browser'==this.document.documentElement.getAttribute('windowtype')){
//用新的chromeWindow做点什么
//摧毁windowTracker
自我毁灭();
}
},对);
}
}
}
windowTracker.init();
打破
}
返回target.apply(thisArg,argumentsList);
}
} );
注:当然,当您的扩展被禁用时,请务必清理并重新安装原始功能。您可以通过以下方式执行此操作:

让originalOpenLinkIn=window.openLinkIn;
window.openLinkIn=新代理(window.openLinkIn{
应用:/*从上面实现*/
} );
//然后在清理时:
window.openLinkIn=originalOpen