Firefox 扩展 Manifest v3 - 请求在运行时“访问所有网站的数据”的权限

Hal*_*100 6 permissions firefox-addon firefox-addon-webextensions manifest.json

Manifest v3 Firefox 扩展可以在运行时"Access your data for all websites"请求用户的权限吗?

该选项通常在firefoxabout:addons内置页面中管理:

Firefox 关于:插件页面

我的扩展程序的某些功能需要此权限才能工作,如果尚未授予该权限,我想提示用户授予该权限。

所需的工作流程如下:

当用户单击按钮触发需要此权限的功能时,扩展程序会检查它是否有权访问所有网站的数据。

如果尚未授予权限,则扩展程序应向用户请求该权限。如果已授予权限,则应触发该功能。

我尝试过使用browser.permissionsAPI,但找不到在运行时请求此特定权限的方法。

是否有其他方法可以在运行时向用户请求此权限,或者根本不可能?

编辑:

不确定这是否是预期的行为,但发送仅包含“来源”且未指定“权限”密钥的权限请求似乎有效:

browser.permissions.request({origins: ['<all_urls>']})
Run Code Online (Sandbox Code Playgroud)

Hal*_*100 2

解决方案

发送“origins”参数设置为的权限请求"<all_urls>"相当于请求“访问所有网站的数据”权限:

browser.permissions.request({origins: ['<all_urls>']})
Run Code Online (Sandbox Code Playgroud)

为什么它有效?

MDN 权限文档指出和origins参数permissions都是可选的。

通过设置origins: <all_urls>,扩展程序实际上正在请求“访问所有网站的数据”的权限。

可以通过调用browser.permissions.getAll()并检查<all_urls>in的存在来检查此权限是否存在permissions.origins

实现示例:

const hasAllUrlsPermission = () => {
    return browser.permissions.getAll()
        .then(permissions => permissions.origins.indexOf("<all_urls>") > - 1);
}
Run Code Online (Sandbox Code Playgroud)

兼容性

该解决方案在 Firefox v.112 上进行了测试。

关于<所有_网址>

在 Firefox 扩展中授予<all_urls>权限可能会给安全和隐私带来风险。

因此,Mozilla 扩展研讨会建议

<all_urls>如果可以的话,避免获得主机许可。

在可能且适用的情况下,他们的建议是

使用activeTab而不是tabs和主机权限