给定一个moz-extension://由书签打开的URL,如何使用扩展代码切换到标签?

时间:2017-01-13 13:26:25

标签: firefox-webextensions

这与我正在处理的其他一些问题有关。

说出,无论出于何种原因,用户已将要从浏览器操作上下文菜单中打开的页面(称为pageURL)打印为标签,并在选项卡中打开它,然后打开许多其他标签和可能的其他窗口。用户知道扩展选项卡存在于某处并且不想继续打开新书签,因此希望使用加载项的浏览器操作上下文菜单来查找扩展页面的选项卡。同样,我不希望我的插件打开重复的标签。

问题是,由于加载项没有创建标签(书签没有),我没有标签ID可以传递给browser.tabs.update( WebExtTab.id, { active: true } )或窗口ID传递给browser.windows.update( WebExtWindow.id, { focused: true } )。 (moz-extensions://MY-OWN-WEBEXT-ID/*引用WebExtensions browser.windows.Window对象,而不是browser window对象。

我可以使用browser.extension.getViews( )生成一个浏览器窗口对象列表(也就是标签),并检查每个WebExtWindow发现确实存在URL(以及标签)确实存在(某处),但我不能使用该窗口对象来关注选项卡,也不能使用window.location.href的选项卡ID。

在多个浏览器窗口的情况下,由于getViews返回的browser.tabs.update()对象没有window属性,我甚至无法在给定窗口对象的情况下获得正确的浏览器窗口。致电id。与标签问题类似。

最后,我无法使用browser.tabs.query( { 'url': pageURL } )来查找标签ID,因为browser.windows.update()选项必须符合使用url方案进行FORBID的match patterns。< / p>

如果WebExtensions API允许扩展程序查找属于其自身的所有页面的选项卡和窗口,无论这些页面是由加载项打开,手动输入,书签还是单击,这将是非常有用的。链接。

例如,如果pageURL符合moz-extension://,则可以在与上述模式匹配的网址上执行moz-extension://MY-OWN-WEBEXT-ID/*和/或browser.tabs.query,并返回WebExt标签/窗口对象,分别。如果WebExt API(即书签)没有打开这样的选项卡/窗口,则生成一个新对象(即伪创建),以填充现有数据(即location.href,状态标志等)并生成新的根据需要使用数据(即ID号),以便返回的对象可以在API的上下文中使用。

这将填补API覆盖范围的空白,其中某些方法(即browser.windows.query)返回没有挂钩且没有与WebExt API连接的死端浏览器对象,因此几乎没用。

1 个答案:

答案 0 :(得分:0)

答案简单:++ RTFM。 browser.windows.getAll()将允许您使用选项卡信息填充Windows对象。您需要permissions: [ "tabs" ]中的manifest.json才能获得tab.url媒体资源。但除此之外,所有的窗口和标签对象都有一个ID,这样你就可以轻松地对焦窗口并切换活动标签!

注意:这需要Firefox 52.0+才能使用async / await功能。否则,您只需使用函数生成器和承诺。另外,出于演示目的,我省略了任何错误检查,但最好将它们放回去。

async function tabCreate ( opts ) {
    var pageURL = browser.runtime.getURL( opts.page + '.html' );
    var extWins = await browser.windows.getAll( { populate: true, windowTypes: [ 'normal' ] } );

    // Look for tab by comparing url, if url matches (i.e. tab exists), then focus window and make tab active.
    for ( var extWin of extWins ) {
        for ( var extTab of extWin.tabs ) {
            if ( pageURL === extTab.url ) {
                console.log( `My Extension->tabCreate(): Window ${extWin.id}, Tab ${extTab.id}:\n\t${extTab.url}` );
                browser.windows.update( extWin.id, { focused: true } );
                browser.tabs.update( extTab.id, { active: true } );
                return;
            }
        }
    }

    // Otherwise, create tab.
    browser.tabs.create( { url: pageURL } );
}

意见:我希望我不必仅为此功能放弃标签权限。如果我们总是为其他标签提供我们自己的moz-extension://MY-OWN-WEBEXT-ID/*网址和null网址,而没有访问所有标签的权限,那就太好了。但是很好。

示例用法:

function myWebExt_Options ( ) {
    tabCreate( {
        'page': 'options',
        'panel': 1
    } );
}

browser.contextMenus.create( {
    title: 'Options',
    contexts: [ 'browser_action' ],
    onclick: myWebExt_Options
} );

注意:我已实现此功能,以期望opts对象中具有page属性的选项,我将其用作生成整页网址的简写。这是因为另一个问题需要将消息传递给页面,我将其存储在opts.panel中。但这些都不是必要的。它可以改为扁平字符串,也可以使用完整的“getURL”字符串。在别处生成的参数。根据您的需要和风格进行更改。