尽管有@match和@include设置,但所有网页上的Chrome用户都会触发

时间:2013-05-06 16:37:26

标签: javascript google-chrome userscripts

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

如何在Chrome中将用户限制为一个域?

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

我的意思是:

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

1 个答案:

答案 0 :(得分:7)

  

注意:这个答案是在OP和Rob W.之间形成的   希望这个问题对其他人没有用   不得不筛选上面的评论链。


有两个问题。首先,a userscript header does not parse if a UTF8 BOM is present(Chromium bug 102667)。

其次,在用户名中使用@include@match时,Chrome误导性地报告该脚本可以“在所有网站上访问您的数据”,但事实并非如此。该脚本仅在include语句指定的那些站点上运行。

考虑(或制作)这三个脚本:

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+"!");


包括,不匹配.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个脚本都是相同的代码。只有@name和/或文件格式和/或@include@match不同。


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

ANSI plus match
该脚本可以正常运行和报告,并且符合预期。


匹配( UTF测试,UTF.user.js )的UTF-8脚本报告这些权限:

UTF plus match
权限报告不正确,与@match语句相矛盾。另请注意,文件名显示为URL编码,而不是@name指令。这些都是有些不对劲的线索。

更糟糕的是,此脚本将在所有网站上运行。也就是说,您将在所有非Yahoo网页上看到alert()。这显然是a bug


ANSI脚本包含( Include,not match.user.js )报告这些权限:

ANSI plus include
虽然这是一个误导性的报告,但该脚本实际上会正常运行。也就是说,它只会触发雅虎页面。

这部分归功于Chrome如何将用户脚本自动转换为扩展程序。 @match语句会直接转换为manifest.json的{​​{1}}属性,而matches语句会转换为@include个值。见Match patterns and globs。 权限报告关键include_globs数组。