【问题标题】:"chrome.permissions is not available" when requesting optional permissions for my extension为我的扩展请求可选权限时“chrome.permissions 不可用”
【发布时间】:2013-08-13 23:38:10
【问题描述】:

我正在构建 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 要求您从用户交互中访问它,如果您向来自您的内容脚本的后台页面以请求激活。

我在这里遗漏了什么明显的东西吗?也许我需要在清单中添加一些内容,但我找不到任何关于它的明确文档。

【问题讨论】:

  • 您并没有因为历史警告而失去用户,而是因为您请求了导致新警告的权限。由于出现了新的警告,您的扩展程序将被禁用,直到用户批准新权限(或轻松释放用户,因为卸载只需单击“批准”按钮旁边)。一些升级权限的扩展程序开发人员报告说,他们在请求新权限后失去了大量用户。

标签: javascript google-chrome google-chrome-extension permissions


【解决方案1】:

我假设您正在尝试从内容脚本执行此操作。您无法从内容脚本访问大多数chrome.* API,包括chrome.permissions。但是,您正确地指出背景页面也不合适,因为您的权限更改需要用户直接操作。

幸运的是,我们几乎没有用尽我们的选择。您可以在以下位置设置权限:

在最后一种情况下,使用chrome.extension.getURL 获取 URL。如果您不希望权限请求接口与当前页面分离,您可以使用 iframe 将其直接注入页面。

所以,事实上,内容脚本和背景页面是仅有的两个不能使用chrome.permissions 的扩展上下文。

【讨论】:

  • 在阅读您说我可以使用带有 web_accessible_resource 页面的 iframe 来设置选项的部分之前,我对阅读您的回答感到绝望。这是否意味着如果我的菜单集成在页面本身中(通过内容脚本),我将能够以某种方式在页面中注入一个 iframe 并通过监听我已植入的复选框上的更改事件来执行魔术页面并以某种方式将其传递给 iframe?
  • @GabrieleCirulli 不完全是,但差不多。该复选框需要位于 iframe 内部。当用户点击 iframe 内的复选框时,iframe 页面会触发权限请求。它还可以使用扩展消息传递来提醒内容脚本该复选框已被单击。
  • 从浏览器操作弹出窗口中我似乎无法获得权限 - 有什么想法吗? stackoverflow.com/questions/27669590/…
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2011-11-03
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多