【问题标题】:Chrome Extension - asking for new permissionsChrome 扩展程序 - 请求新权限
【发布时间】:2017-04-01 16:34:26
【问题描述】:

我已经在商店中有一个 chrome 扩展,我需要向其添加更多权限,因为我想将它应用到更多网站。但是将它们放入权限数组会禁用扩展,并且它需要新权限的唯一指示是在汉堡菜单下,这完全没用。

这是原件,由于它位于 content_scripts 对象中,因此似乎具有隐含的“https://mail.google.com”权限:

{
  "manifest_version": 2,
  "name": "My Extension",
  "short_name": "Extension",
  "version": "1.5.16",
  "description": "Description here",
  "homepage_url": "https://test.com/",
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },
  "content_scripts": [
    {
      "matches": [
        "https://mail.google.com/*"
      ],
      "js": [
        "injector.js"
      ],
      "css": [
        "style.css"
      ]
    }
  ],
  "web_accessible_resources": [
    "app.js",
    "libs.js"
  ]
}

在理想情况下,我只需添加额外的“content_scripts”对象,但由于对新网站域的隐含权限,这会禁用扩展。

输入 "optional_permissions": ["https://hangouts.google.com"] 仍然会禁用插件并且不会通知用户。

如果我将任何代码放入后台脚本,请说出以任何方式访问 chrome.tabs 的内容... BOOM!这是隐含的权限,并且扩展程序被禁用。

我应该如何在不禁用扩展程序的情况下获得新权限?请求许可的弹出窗口将是一个完美的解决方案,但这不是我所提供的。

【问题讨论】:

  • 其他可选权限不会禁用它。并且没有隐含许可之类的东西,大多数 chrome.tabs 也不需要任何许可。添加背景页面不是问题。
  • 但是将新域添加到“content_scripts”会禁用它。也许我把lede埋在这里了,但是当我执行这个简单而最明显的动作时,它完全按照我所说的那样做。使用“optional_permissions”是为了解决这个问题。
  • 是的,新的内容脚本会禁用。除了使用可选权限和编程注入之外,您无法真正阻止它。

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


【解决方案1】:

撇开内容脚本的问题不谈,在大多数情况下,可选权限不值得将权限列表从一个固定列表修补到另一个。

您将使现有用户和新用户都通过运行时权限对话框,这让新用户感到困惑。

可选权限的真正目的是允许用户在运行时未知的域中进行选择。

最好咬紧牙关,冒着禁用扩展的风险。

如果您愿意,您可以发布具有新权限的第二个扩展,将第一个不列出,然后发布更新以促使用户安装新扩展。

有些用户可能更喜欢这个,有些用户可能会更恼火 - 从一开始就是双输局面,您不会留住所有用户。但是,使用迁移路线,您将失去商店中的累积评分。


添加内容脚本实际上是对主机权限的隐式授予。以及在运行时更改内容脚本配置的声明式 API never became supported/stable

因此,如果您绝对决定采用可选权限路线,则需要(效率低下,有限制)执行programmatic injection

【讨论】:

  • 感谢您确认我怀疑的情况。
【解决方案2】:

除了现有的答案(这是完全有效的),我会建议如何处理可选权限,以防您决定避免在 manifest.json 中添加新权限

程序化脚本注入

获得许可后,您可以使用新的contentScripts.register() API 在新域上有效地注册脚本。

browser.contentScripts.register({
    matches: ['https://your-dynamic-domain.example.com/*'],
    js: [{file: 'content.js'}]
});

此 API 仅在 Firefox 中可用,但您可以使用 Chrome polyfill

获取新权限

您可以使用 chrome.permissions.request 让用户按需添加新域,或者您可以安装我最近编写的模块 (webext-domain-permission-toggle) 以提供简单的 UI 来切换任何域的权限。

使用together with webext-dynamic-content-scripts时,您可以添加任何域,模块会自动在其上注册您现有的content_scripts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多