【问题标题】:Chrome extension .json file error when uploading上传时 Chrome 扩展 .json 文件错误
【发布时间】:2023-03-29 02:00:01
【问题描述】:

我有一个像这样的manifest.json 文件:

{
  "name": "YouTube Trending to Paid promotion!",
  "manifest_version": 2,
  "version": "1.0",
  "description": "Change Trending to Paid promotion!",
  "permissions": ["tabs", "*://*.youtube.*/*"],
    "browser_action": {
    "default_icon": "icon.png"
  },
  "content_scripts": [
    {
      "matches": ["*://*.youtube.*/*"],
      "js": ["popup.js"]
    }
  ]
}

对于我的 JS 扩展,它只找到第 41 个 <span> 并重命名内容。当我直接注入它时,它工作正常。但是当我尝试上传它时,Chrome 给了我这个错误信息:Invalid value for 'content_scripts[0].matches[0]': Invalid host wildcard.

我的 JS 如下:

document.getElementsByTagName("span")[39].textContent="Paid promotion!";

有人知道是什么导致了错误吗?

【问题讨论】:

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


    【解决方案1】:

    如错误所示,问题在于您的 matches 值无效。 Match Patterns 文档解释说,* 在用于主机部分时具有以下要求:

    主机中的* 后面只能跟./
    如果*在主机中,则必须是第一个字符

    因此,您的匹配模式为:

    "matches": ["*://*.youtube.*/*"],
    

    无效,因为不允许使用第二个 * (youtube.*)。

    明确列出您希望匹配的顶级域 (TLD)

    您需要明确确定要匹配的 TLD,然后在 matches 数组中包含它们的列表。例如:

    "matches": [
        "*://*.youtube.com/*",
        "*://*.youtube.co.uk/*"
    ],
    

    但是,对于 YouTube,它们似乎将所有流量重定向到 youtube.com。因此,您可能会很好地使用:

    "matches": ["*://*.youtube.com/*"],
    

    此匹配限制是设计使然。有一个large number of TLDs,未来可能会创建更多。无法保证您希望匹配的特定站点当前在每个 TLD 中都有一个域,也不保证他们会在每个创建的新 TLD 中获得一个域。因此,更好的解决方案是在指定主机的一部分时不允许 TLD 使用通配符。

    或者,使用include_globs,但可能会出现错误匹配

    您可以使用include_globs 来获取您想要的内容,但这样做存在安全风险,因为可能存在错误匹配。你需要类似的东西:

    "content_scripts": [
      {
        "matches": ["*://*/*"],
        "js": ["popup.js"],
         "include_globs": [
           "http://*.youtube.*/*",
           "https://*.youtube.*/*"
         ]
      }
    ]
    

    这仍然不完美,因为它会匹配在其 URL 中任何位置包含 .youtube.*/* 的 URL(例如 http://foo.example.com/clone/www.youtube.com/myVideo)。不幸的是,因为include_globs 是一个glob,而不是一个完整的正则表达式,所以您不能指定要匹配除/ 之外的所有字符,您可以在正则表达式中执行此操作(例如[^/])。总体而言,您最好明确确定要匹配的 TLD,然后在 matches 数组中包含它们的列表。

    注意:在上面的示例中,您的 matches 模式可以是 "*://*/*""<all_urls>"。不同之处在于"<all_urls>" 还匹配“file:”和“ftp:”URL,然后由include_globs 排除。

    【讨论】:

      【解决方案2】:

      似乎内容脚本匹配略有不同。

      查看 chrome https://developer.chrome.com/extensions/match_patterns 中允许的问题

      "content_scripts": [
          {
            "matches": ["*://*.youtube.com/*"],
            "js": ["popup.js"]
          }
        ]
      

      或使用"matches": ["<all_urls>"]

      参考:Chrome Extension Manifest 'Matches' stackoverflow 已经讨论过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-14
        • 2021-10-06
        • 2014-09-13
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 2018-07-23
        相关资源
        最近更新 更多