我在我的Windows机器上映射了一个自定义方案:"dbn"。
因此,当我dbn:/some/arguments
放入Firefox地址栏(或单击此类链接(时,它会在另一个应用程序中启动。这很好用。
但是,在Firefox扩展中,我不知道如何"调用"或"激活"此自定义方案,除非打开一个新选项卡,如下所示:
browser.tabs.create({ url: 'dbn:/some/arguments' });
这工作正常,除了现在我有一个打开的选项卡,其中dbn:/some/arguments
作为 URL。我试图随后从我的扩展中关闭它,但我不能,因为:
错误:缺少选项卡的主机权限
我的扩展没有该"主机"的权限。
我试图通过match_patterns
值dbn:*
授予它权限,但是当我尝试重新加载扩展时会引发错误,因为这些值显然必须使用预期的方案之一(http、https、ftp 等(。
我最终只需要手动关闭选项卡,这并不可怕,但显然是次优的。
所以,有两个问题:
- 是否可以在不打开选项卡的情况下以这种方式"调用"URL,以在Windows上激活自定义映射方案?我能想到以激活我的映射命令的方式执行此操作的唯一方法是打开一个选项卡,但是还有其他方法吗?
- 如果打开新选项卡是唯一的方法,那么如何在没有上面提到的权限问题的情况下关闭刚刚打开的选项卡?
更新
我认为这不再是权限了。承诺根本无法解决。
browser.tabs.create({ url: "some/url" })
.then(tab => console.error("I never get here"));
我已经调试了向上、向下和横向。新选项卡打开,我可以写入该操作的日志,但无论我在其中输入什么,then
中的代码都不会执行。我试图用try...catch
捕获错误,但这并没有捕获任何东西。
我现在认为上面的权限来自不同的扩展名,而不是我的扩展名。我认为这与主持人没有任何关系。
AFA 自定义方案,有一个开放的错误: 扩展匹配模式以处理自定义协议方案
你可以通过从tabs.create((获得的ID来tabs.remove((。
async function fun() {
// note this is async
const tab = await browser.tabs.create({url: 'dbn:/some/arguments'});
// later remove it
browser.tabs.remove(tab.id);
}
// or
browser.tabs.create({url: 'dbn:/some/arguments'})
.then(tab => {
// do what is needed
// later remove it
browser.tabs.remove(tab.id);
});
更新:
关于承诺,没有足够的信息来确定问题。
设置了哪些权限?
代码在哪里运行?
使用catch
获取有关承诺失败的详细信息:
browser.tabs.create({url: "some/url"})
.then(tab => console.log(`Created new tab: ${tab.id}`))
.catch(error => console.log(error.message));