6

我使用 match 来限制我的脚本只能在一个域中工作,但 chrome 在每个域中都运行它。我试过了@include@match当我尝试安装它并在所有网站上运行它时,它显示“访问所有网站上的数据”。

如何将用户脚本限制为 chrome 中的一个域?

元数据与此页面相同:http: //www.chromium.org/developers/design-documents/user-scripts

我的意思是:

// @match http://*.google.com/*
// @match http://www.google.com/*
4

1 回答 1

7

注意:这个答案是在 OP 和 Rob W 之间开发的。把它放在这里是希望这个问题可能对其他人有用,而不必筛选上面的评论链。


有两个问题。首先,如果存在 UTF8 BOM,则不会解析用户脚本标头(Chromium 错误 102667)。

其次,当在用户脚本中使用@includevs@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和/或文件格式和/或@includevs@match不同。


ANSI 脚本,匹配(UTF 测试,而不是 UTF.user.js)报告这些权限:

ANSI 加匹配
此脚本按预期正确运行和报告。


带有匹配项(UTF 测试,是 UTF.user.js)的 UTF-8 脚本报告以下权限:

UTF加匹配
权限报告不正确,与@match声明相矛盾。另请注意,显示的文件名是 URL 编码的,而不是@name指令。这些都是有问题的线索。

更糟糕的是,此脚本将在所有站点上运行。 也就是说,您将alert()在所有非雅虎页面上看到 。这显然是一个错误


带有 include ( Include, not match.user.js ) 的 ANSI 脚本报告这些权限:

ANSI 加包括
虽然这是一个误导性的报告,但该脚本实际上会正确运行。也就是说,它只会触发 yahoo 页面。

这部分是由于 Chrome 如何将用户脚本自动转换为扩展程序。 @match语句直接转换为manifest.json' 的matches属性,而@include语句则转换为include_globs值。请参阅匹配模式和 glob。权限报告键关闭matches阵列。

于 2013-05-07T07:25:01.867 回答