我正在构建an extension,需要访问历史记录才能提供其中一项功能。
发布一个包含权限的版本作为强制性版本并因此丢失了部分用户,因为他们被大警报吓跑了,说扩展程序可能会窥探他们的历史记录(我真的没有计划这样做,我决定发布一个版本,删除违规部分,并禁用许可作为临时修复。
我想使用optional permissions重新实现此功能 首先,我在清单文件中添加了新的可选权限:
...
"permissions": [
"https://news.ycombinator.com/",
"http://news.ycombinator.com/"
],
"optional_permissions": [ "history" ],
...
然后,我构建了一个函数来请求处理扩展程序设置的脚本的权限:
Settings.prototype.applyPermissions = function (permissions, map) {
Object.keys(permissions).forEach(function (key) {
if (map[key]) {
var checkbox = map[key].getElementsByTagName("input")[0];
checkbox.addEventListener("change", function (e) {
if (this.checked) {
chrome.permissions.request(permissions[key], function(granted) {
if (granted) {
// Permission has been granted
} else {
// Not granted
}
});
}
});
}
});
};
这里的关键部分是:
checkbox.addEventListener("change", function (e) {
if (this.checked) {
chrome.permissions.request(permissions[key], function(granted) {
if (granted) {
// Permission has been granted
} else {
// Not granted
}
});
}
});
我对由用户交互引起的事件执行请求(指南指出它不会起作用),并传递permissions[key]
,这是我的扩展程序设置中指定的对象,如下所示:
"permissions": {
"mark_as_read": {
"permissions": ["history"]
}
}
以permissions[key]
访问它时,我得到了这一部分:
{
"permissions": ["history"]
}
这基本上是文档针对此类请求显示的格式。
如果我运行此代码并切换应启用该功能的复选框,并查看错误日志,我会看到此错误:
chrome.permissions不可用:您没有权限 访问此API。确保所需的权限或清单 属性包含在manifest.json中。
我还尝试从后台页面访问此API,它实际上可用,但我不允许使用,因为Chrome要求您从用户交互中访问它,如果您向其发送消息,此类交互将丢失内容脚本中的后台页面,用于请求激活。
我错过了一些明显的东西吗?也许我需要在清单中添加一些内容,但我找不到任何关于它的明确文档。
答案 0 :(得分:0)
我假设您正在尝试从内容脚本执行此操作。您无法从内容脚本访问大多数chrome.*
API,包括chrome.permissions
。但是,您已正确指出后台页面也不合适,因为权限更改需要用户直接操作。
幸运的是,我们几乎没有用尽我们的选择。您可以在以下位置设置权限:
chrome-extension://
计划提供,前提是您在清单中包含了web_accessible_resources
页面和必要的子资源在最后一种情况下,使用chrome.extension.getURL
获取网址。如果您不希望权限请求接口与当前页面分开,则可以使用iframe将其直接注入页面。
因此,事实上,内容脚本和背景页面是您无法使用chrome.permissions
的唯一两个扩展上下文。