javascript – 尽管有@match和@include设置,Chrome用户脚本仍会在所有页面上触发
作者:互联网
我使用match来限制我的脚本只能使用一个域,但chrome会在每个域中运行它.我试过@include和@match,当我尝试安装它并在所有网站上运行它时,它会说“在所有网站上访问你的数据”.
如何将用户脚本限制为chrome中的一个域?
元数据与此页面相同:http://www.chromium.org/developers/design-documents/user-scripts
我的意思是:
// @match http://*.google.com/*
// @match http://www.google.com/*
解决方法:
Note: this answer developed between the OP and Rob W. Placing it
here in the hopes that this question might be useful to others without
having to sift through the comment chain, above.
有两个问题.首先,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不同.
ANSI脚本与匹配(UTF测试,而不是UTF.user.js)报告这些权限:
此脚本按预期正确运行和报告.
具有匹配(UTF测试,UTF.user.js)的UTF-8脚本报告以下权限:
权限报告不正确,与@match语句相矛盾.另请注意,文件名显示为URL编码,而不是@name指令.这些都是有些不对劲的线索.
更糟糕的是,此脚本将在所有站点上运行.也就是说,您将在所有非Yahoo页面上看到alert().这显然是a bug.
ANSI脚本包含include(Include,not match.user.js)报告这些权限:
虽然这是一个误导性的报告,但该脚本实际上会正常运行.也就是说,它只会触发雅虎页面.
这部分是由于Chrome如何将用户脚本自动转换为扩展程序. @match语句直接转换为manifest.json的matches属性,而@include语句则转换为include_globs值.见Match patterns and globs.
权限报告键匹配数组.
标签:userscripts,javascript,google-chrome 来源: https://codeday.me/bug/20191002/1843461.html