我有一个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!";
任何人都知道导致错误的原因是什么?
答案 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,然后在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>"
排除。