【问题标题】:Get tab URL from page action (WebExtensions, Android)从页面操作获取标签 URL(WebExtensions,Android)
【发布时间】:2017-01-30 16:37:39
【问题描述】:

我想在页面操作弹出窗口中获取当前选项卡的 URL。
起初看起来很明显:只需使用tabs API。但是,如果我正确解读文档,这似乎在 Android 上不可用。于是我一直在寻找别的东西,发现了pageAction API的onClicked事件。

pageAction API 似乎被列为与 Android 兼容,并且 onClicked 事件被标记为受支持。这意味着它实际上会返回一个 tabs.Tab 对象。但真的吗?有人试过吗?

检索 URL 的最佳方法是什么?我知道我可以只使用一个内容脚本,让它在每个选项卡中运行,并创建一个长期存在的消息连接,以便在请求时将 URL 发送到页面操作弹出窗口。但这将非常低效,并且与使用选项卡 API 的简单程度相比,代码变得异常复杂。

还有什么我可以做的吗?

【问题讨论】:

  • 听起来您已经在编写代码,基本上包含测试pageAction.onClicked 事件是否提供tab.Tabs 对象所需的一切。你为什么要问有没有人试过而不是自己尝试?
  • 因为我现在没有安卓手机。

标签: javascript android google-chrome-extension tabs firefox-addon-webextensions


【解决方案1】:

当前(Firefox 54 及更高版本)

从 Firefox 54 开始,tabs API 在 Firefox for Android 中可用。这意味着您可以使用桌面 Firefox 可用的常规方法。具体来说,chrome.tabs.query() or browser.tabs.query()。但是,您将需要 activeTab 和/或 tabs permissions 在您的 manifest.json 中。

chrome.tabs.query:

chrome.tabs.query({active:true,currentWindow:true},function(tabs){
    //'tabs' will be an array with only one element: an Object describing the active tab
    //  in the current window.
    var currentTabUrl = tabs[0].url;
});

browser.tabs.query:

browser.tabs.query({active:true,currentWindow:true}).then(function(tabs){
    //'tabs' will be an array with only one element: an Object describing the active tab
    //  in the current window.
    var currentTabUrl = tabs[0].url;
});

Firefox 54 之前的版本

如果您定义了页面/浏览器操作弹出窗口

如果您为页面/浏览器操作定义了弹出窗口,则不会触发 onClicked 事件。您的弹出窗口在创建/显示时未传递任何信息。因此,您不会收到tabs.Tab 对象。获取标签信息的常规方法是从tabs.query,正如您已经确定的那样,它在 Firefox for Android 中(还)不可用。

APIs available to Firefox on Android 非常有限。对于您想要做的事情,使用webNavigation 事件来记录每个选项卡的第 0 帧 URL 将比每个页面中的内容脚本更有效。您可以根据需要使用webNavigation.onCommittedwebNavigation.onCompleted 事件。您需要假设当前窗口的活动选项卡是最近发生webNavigation 事件的选项卡,或者您也可以监视webRequest 事件。但是,无论您采取何种方式,您假设哪个选项卡是当前选项卡都只是一个假设,并且在某些情况下不准确。

更准确的 URL(和活动标签确定)需要使用内容脚本

如果正在访问的页面通过某种不会触发导航的方法更改选项卡的 URL,则使用 webNavigation 事件不会为您提供更新后的 URL。正如您所确定的,如果没有 tabs API,当您定义实际的页面/浏览器操作弹出窗口时,唯一确定您拥有选项卡当前 URL 的唯一方法(因此不会获得 tabs.Tab 对象),就是在每个页面中注入一个内容脚本。您将需要内容脚本来不断更新 URL,或者通过 storage.onChanged 侦听背景/弹出脚本中对该信息的请求。由于没有tabs API(即没有tabs.sendMessage),必须通过storage API 来完成后台/弹出脚本内容脚本的通信。

使用页面/浏览器操作onClicked

我还没有在 Android 上的 Firefox 上尝试过的另一种方法是不定义实际的页面/浏览器操作弹出窗口。如果您没有定义实际的弹出窗口,您会收到 onClicked 事件(获取带有活动选项卡 ID 和 URL 的 tabs.Tab 对象)然后可以open a pseudo-popup1


1。在我的链接答案中打开一个伪弹出窗口的实现使用了 tabswindows API,这两个 API 目前都不适用于 Firefox for Android。可以重写它以使用上面提到的webNavigation 侦听器来跟踪选项卡 URL,并使用window.open() 打开用于伪弹出窗口的窗口。同样,我还没有在 Android 上使用 Firefox 进行测试以确定它确实有效。

【讨论】:

【解决方案2】:

您可以通过 webextensions 以这种方式获得它。考虑到如果要调试弹出窗口,则必须“防止弹出窗口关闭”(浏览器工具箱右上角的 4 方形图标)

var activeTabPromise = browser.tabs.query({active: true, currentWindow: true});
      activeTabPromise.then((tabs) => {

          console.log(tabs[0].url);
      });

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2020-09-18
    • 2013-03-16
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多