上传时Chrome扩展程序.json文件错误

时间:2016-11-30 17:04:17

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

我有一个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!";

任何人都知道导致错误的原因是什么?

2 个答案:

答案 0 :(得分:1)

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

请参阅Chrome https://developer.chrome.com/extensions/match_patterns

中允许的事项
"content_scripts": [
    {
      "matches": ["*://*.youtube.com/*"],
      "js": ["popup.js"]
    }
  ]

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

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

答案 1 :(得分:0)

正如错误所述,问题是您的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.*/*"
     ]
  }
]

这仍然不完美,因为它会匹配其网址中包含.youtube.*/*的网址(例如http://foo.example.com/clone/www.youtube.com/myVideo)。不幸的是,因为include_globs是一个glob,而不是一个完整的正则表达式,所以你不能指定你想匹配除/之外的所有字符,你可以在正则表达式中进行匹配(例如{{1} })。总的来说,最好明确确定您希望匹配的TLD,然后在[^/]数组中包含它们的列表。

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