注意:这个答案是在 OP 和 Rob W 之间开发的。把它放在这里是希望这个问题可能对其他人有用,而不必筛选上面的评论链。
有两个问题。首先,如果存在 UTF8 BOM,则不会解析用户脚本标头(Chromium 错误 102667)。
其次,当在用户脚本中使用@include
vs@match
时,Chrome 会误导性地报告该脚本可以“访问您在所有网站上的数据”,但事实并非如此。该脚本将仅在包含语句指定的那些站点上运行。
考虑(或制作)这三个脚本:
UTF 测试,而不是 UTF.user.js(使用 ANSI 编码保存):
// ==UserScript==
// @name Not UTF source file
// @match http://www.yahoo.com/*
// ==/UserScript==
if (location.hostname != 'www.yahoo.com')
alert ("This script should not run on "+location.hostname+"!");
UTF 测试,是 UTF.user.js(用 UTF-8 编码保存,包括 BOM):
// ==UserScript==
// @name Is UTF source file
// @match http://www.yahoo.com/*
// ==/UserScript==
if (location.hostname != 'www.yahoo.com')
alert ("This script should not run on "+location.hostname+"!");
包括,而不是 match.user.js(使用 ANSI 编码保存):
// ==UserScript==
// @name Use include, not match
// @include http://www.yahoo.com/*
// ==/UserScript==
if (location.hostname != 'www.yahoo.com')
alert ("This script should not run on "+location.hostname+"!");
请注意,所有 3 个脚本都是相同的代码。只有 the@name
和/或文件格式和/或@include
vs@match
不同。
ANSI 脚本,匹配(UTF 测试,而不是 UTF.user.js)报告这些权限:
此脚本按预期正确运行和报告。
带有匹配项(UTF 测试,是 UTF.user.js)的 UTF-8 脚本报告以下权限:
权限报告不正确,与@match
声明相矛盾。另请注意,显示的文件名是 URL 编码的,而不是@name
指令。这些都是有问题的线索。
更糟糕的是,此脚本将在所有站点上运行。 也就是说,您将alert()
在所有非雅虎页面上看到 。这显然是一个错误。
带有 include ( Include, not match.user.js ) 的 ANSI 脚本报告这些权限:
虽然这是一个误导性的报告,但该脚本实际上会正确运行。也就是说,它只会触发 yahoo 页面。
这部分是由于 Chrome 如何将用户脚本自动转换为扩展程序。 @match
语句直接转换为manifest.json
' 的matches
属性,而@include
语句则转换为include_globs
值。请参阅匹配模式和 glob。权限报告键关闭matches
阵列。