从页面操作中获取标签网址(WebExtensions,Android)

问题描述 投票:7回答:2

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

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

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

还有什么我能做的吗?

javascript android google-chrome-extension tabs firefox-webextensions
2个回答
7
投票

Current (Firefox 54 and later)

从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;
});

Prior to Firefox 54

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

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

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

A more accurate URL (and active tab determination) requires using a content script

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

使用页面/浏览器操作onClicked

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


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


0
投票

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

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

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

我希望这能帮到您,

© www.soinside.com 2019 - 2024. All rights reserved.