Firefox 扩展 API -permissions.request 只能从用户输入处理程序调用?

sub*_*vis 5 firefox firefox-addon firefox-addon-sdk firefox-addon-webextensions

我正在使用此处记录的 Firefox 权限 API

我在使用该request方法时遇到问题,其中我的所有权限请求都会导致:

Error: permissions.request may only be called from a user input handler

您可以通过调试任何插件或扩展并进入browser.permissions.request({origins: ["https://google.com/*"]})控制台在 firefox 中生成它。

我发现很难接受权限请求必须始终在父堆栈跟踪中具有用户输入事件回调。我正在使用 Vue.js,我的权限是由于用户交互,但我的用户交互与它们触发的事件分离。

  • 什么算作user input handler
  • 为什么它会这样工作?
  • 有没有好的解决办法?

sub*_*vis 5

有没有好的解决办法”

我想用一些代码示例添加安德鲁的答案。

事实证明,promise 链破坏了浏览器关于用户输入处理程序触发和不触发的概念。以下面的代码为例:

document.getElementById('foo').addEventListener('click', event => {
  browser.permissions.request({origins: ["https://google.com/*"]})
})
Run Code Online (Sandbox Code Playgroud)

此代码按预期工作。我最初认为是 Vue.js 独特的事件处理框架正在吞噬我的“浏览器事件”,例如当你这样做时<div @click="somefunc"></div>。这实际上工作得很好,只要你把你的权限请求放在somefunc.

现在它变得有趣了。如果您将您的权限请求替换为可解析的承诺,然后执行权限请求,VIOLA!

Promise.resolve('foobar').then(foobar => {
    browser.permissions.request({origins: ["https://google.com/*"]})
})
Run Code Online (Sandbox Code Playgroud)

结果是:

Error: permissions.request may only be called from a user input handler

为什么会发生这种情况?

我猜这与堆栈跟踪有关。如果权限请求发生在承诺链中,则 Firefox 无法检测到权限来自具有根用户输入事件的堆栈。

我认为这是一个非常恶劣的设计选择。我的应用程序很大(> 4K LoC),为了保持简单,我依靠承诺链来防止意大利面。这削弱了我编写干净代码的能力,因此,我已经从optional_permissions仅在需要时才要求然后提示用户授予权限转变为在安装时过于宽松。

GG,火狐。