我正在使用记录HERE
的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
?答案 0 :(得分:2)
是否有良好的解决方法"
我想通过一些代码示例添加安德鲁的答案。
事实证明,承诺链破坏了浏览器关于用户输入处理程序触发和不触发的概念。拿下面的代码,例如:
document.getElementById('foo').addEventListener('click', event => {
browser.permissions.request({origins: ["https://google.com/*"]})
})
此代码按预期工作。我最初认为是Vue.js独特的事件处理框架正在吃我的浏览器事件&#34;,例如当你<div @click="somefunc"></div>
时。只要您将权限请求放在somefunc
。
现在变得有趣。如果您将权限请求替换为解析然后执行权限请求的承诺,VIOLA!
Promise.resolve('foobar').then(foobar => {
browser.permissions.request({origins: ["https://google.com/*"]})
})
结果:
Error: permissions.request may only be called from a user input handler
为什么会这样?
我猜它与堆栈跟踪有关。如果权限请求发生在promise链中,Firefox无法检测到权限来自堆栈的用户输入事件。
我认为这是一个非常令人震惊的设计选择。我的应用程序很大(> 4K LoC)并且为了保持简单,我依靠承诺链来保持意大利面。这削弱了我编写干净代码的能力,因此,我已经从请求optional_permissions
开始,然后仅在需要时才提示用户权限,以便在安装时过度宽松。
GG,Firefox。
答案 1 :(得分:0)
什么算作用户输入处理程序?
对应于用户输入的DOM事件处理程序(例如,target.addEventHandler("click", ...)
或对应于用户输入的WebExtension事件侦听器(例如,browser.browserAction.onClicked.addListener(...)
为什么它会像这样工作?
部分用于基本的用户体验(如果用户没有直接与扩展程序交互并且扩展程序的提示突然提示,它可能很容易混淆他们),而且还要避免点击劫持攻击时小心地提示提示当用户可能期待一些无关的提示时,选择的那一刻。
有没有好的解决方法?
我认为只是组织代码以便您从用户输入处理程序请求权限可能是您最好的选择。