使用 Permissions API 从 Firefox 中的 <select> onchange 处理程序请求权限
Request permissions using the Permissions API from a <select> onchange handler in Firefox
我目前正在开发一个 Firefox 附加组件,它利用权限 API 根据 <select>
的值根据需要为特定来源动态请求权限,因为用户更改值,而无需单独的提交按钮。当我调用 browser.permissions.request
时,promise 立即被拒绝并出现错误:
permissions.request may only be called from a user input handler
相关的HTML和JS代码如下。我想避免使用单独的保存按钮,但我不知道如何实现。这可能吗?如果可能,怎么做?
<div id="domain-settings">
Choose your preferred domain:
<select>
<option>example.com</option>
<option>one.example.com</option>
<option>other.example.com</option>
</select>
</form>
const settings = { domain: 'example.com' };
const $select = $('#domain-settings').find('select');
$select.on('change',function(e){
e.stopPropagation();
const oldValue = settings.domain;
const perm = { origins: [ `https://${$select.val()}/` ] };
browser.permissions.contains(perm)
.then(result => {
if (result)
someFunction();
else browser.permissions.request(perm)
.then(granted => {
if (granted)
someFunction();
else $select.val(oldValue);
});
})
})();
几天前,当我在我的代码库中重新发现这个错误时,我不知何故偶然发现了 ,甚至不记得我在这里发布过它。这个问题的答案几乎相同,但就我而言,问题具体在于我在尝试请求之前检查了权限,事实证明,这是完全没有必要的。
同样的解释也适用于此。 Firefox 未将处理程序识别为来自用户输入,因为它被链接在一个 promise 调用中,这破坏了它可以用来验证这一点的调用堆栈。如果 permissions.request
调用链接在任何承诺之后,它将不会通过此验证。
我的解决方案:删除 permissions.contains
检查。现在一切正常。
const settings = { domain: 'example.com' };
const $select = $('#domain-settings').find('select');
$select.on('change',function(e){
e.stopPropagation();
const oldValue = settings.domain;
const perm = { origins: [ `https://${$select.val()}/` ] };
browser.permissions.request(perm)
.then(granted => {
if (granted)
someFunction();
else $select.val(oldValue);
});
})();
我目前正在开发一个 Firefox 附加组件,它利用权限 API 根据 <select>
的值根据需要为特定来源动态请求权限,因为用户更改值,而无需单独的提交按钮。当我调用 browser.permissions.request
时,promise 立即被拒绝并出现错误:
permissions.request may only be called from a user input handler
相关的HTML和JS代码如下。我想避免使用单独的保存按钮,但我不知道如何实现。这可能吗?如果可能,怎么做?
<div id="domain-settings">
Choose your preferred domain:
<select>
<option>example.com</option>
<option>one.example.com</option>
<option>other.example.com</option>
</select>
</form>
const settings = { domain: 'example.com' };
const $select = $('#domain-settings').find('select');
$select.on('change',function(e){
e.stopPropagation();
const oldValue = settings.domain;
const perm = { origins: [ `https://${$select.val()}/` ] };
browser.permissions.contains(perm)
.then(result => {
if (result)
someFunction();
else browser.permissions.request(perm)
.then(granted => {
if (granted)
someFunction();
else $select.val(oldValue);
});
})
})();
几天前,当我在我的代码库中重新发现这个错误时,我不知何故偶然发现了
同样的解释也适用于此。 Firefox 未将处理程序识别为来自用户输入,因为它被链接在一个 promise 调用中,这破坏了它可以用来验证这一点的调用堆栈。如果 permissions.request
调用链接在任何承诺之后,它将不会通过此验证。
我的解决方案:删除 permissions.contains
检查。现在一切正常。
const settings = { domain: 'example.com' };
const $select = $('#domain-settings').find('select');
$select.on('change',function(e){
e.stopPropagation();
const oldValue = settings.domain;
const perm = { origins: [ `https://${$select.val()}/` ] };
browser.permissions.request(perm)
.then(granted => {
if (granted)
someFunction();
else $select.val(oldValue);
});
})();