Firefox插件,如何跟踪新标签页的来源?

3

我正在使用addon-SDK构建Firefox插件。我需要跟踪新标签并找出它们是否是通过“在新标签中打开链接”选项从另一个标签中打开的。从主脚本跟踪新标签非常容易:

var tabs = require("sdk/tabs");

tabs.on('open', function(tab){

  tab.on('ready', function(tab){
  //do stuff with the new tab
  }

}

但我无法弄清楚是否有任何方法可以找出例如选项卡的起源。我曾考虑过在所有选项卡中插入一个脚本,监听上下文菜单事件或类似事件,但这感觉更像是一种hack而不是解决方案。我是否因为无知而错过了一些明显的东西?

3个回答

0

上面用户Willma和Kapep推荐的两种方法都有缺陷。

第一步是识别所有可以打开新标签页(也可能是新窗口)的方法。

以下是打开新标签页的不同情况:

  1. 用户从搜索栏中间点击搜索图标或从URL栏中间点击转到图标
  2. 用户从搜索栏或URL栏按下Alt+Enter键
  3. 用户安装了插件,如果在搜索栏或URL栏中右键单击,然后中键单击并选择“粘贴并搜索”,它将在新标签页中打开
  4. 用户按Tab键跳转到链接,然后按Ctrl+Enter键在新标签页中打开它
  5. 用户右键单击链接并点击在新标签页中打开
  6. 用户使用TabSubmit插件并中键单击按钮以在新标签页中打开(可能使用Ctrl+Enter键在按钮上打开新标签页)
  7. 第三方应用程序在Firefox中打开链接(新标签页或新窗口)

如果用户右键单击链接并选择在新窗口中打开,您会将该窗口的父级设置为选项卡吗?我确定有一个Firefox XPCOM函数可以保存打开者窗口,因此您可以找到父窗口。

在此列表中添加其他打开新窗口/选项卡的方法,然后我们将寻找它们之间的共同点。我考虑使用http-channel-modify-request上的引用者和最后活动选项卡(由kapep推荐)。

我可能想得太多了,不确定。


我的主要关注点是跟踪用户通过点击链接打开新标签页的情况,主要是列表中的第4或第5种情况。其他情况我现在可以忽略。我将研究一下你评论的xpcom函数,看看能否想出什么办法。 - sajirdalas
这将是一个不完整的插件,你会收到投诉。个人建议列出所有问题并找到适合所有问题的解决方案,而不是只为4和5编写代码,然后再回头为其他问题编写代码。这样做容易导致代码质量下降(可能还会有漏洞),但最终决定权在你手中。 - Blargh
好的,我会仔细查看您的清单,并尝试找到适用于所有情况的某种触发器。 - sajirdalas
很酷的举动,伙计。如果你想到任何其他情况可以添加到列表中,请告诉我,我会进行编辑。这对我来说是一个有趣的主题。 - Blargh

0

在大多数情况下,我希望当前活动的选项卡是任何新选项卡的起点:

tabs.on('open', function(tab) {
  var origin = tabs.activeTab;
  // do something 
}

我不确定这是否涵盖了所有情况。您可能需要测试一些内容,例如打开并激活新选项卡的链接或异步打开的选项卡(默认情况下被阻止)。


这是我考虑过的另一种解决方案,但使用 Ctrl + T 打开的选项卡会触发相同的事件,并且使用此方法保存时会带有错误的来源。Ctrl + T 选项卡不应该有来源。 - sajirdalas

0

虽然我没有测试过,但你可以尝试在上下文菜单上创建一个监听器,像这样:

const doc = require('sdk/window/utils').getMostRecentBrowserWindow().document;
var openInTab = doc.getElementById('context-openlinkintab');
openInTab.addEventListener('click', callback);

这假设默认的事件监听器允许冒泡,假设元素在使用之间隐藏和显示而不是销毁和重新创建,并且可能不会在用户cmd/ctrl点击链接时触发,但这是我认为将是一个hacky解决方案的一步。

当单击该元素时触发的函数的名称为gContextMenu.openLinkInTab()。如果您可以使您的函数在该函数运行时运行,那么您就成功了。不太确定如何实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接