grant介绍,none与unsafeWindow
介绍 grant 属性,包括 none 和 unsafeWindow
grant
这个属性可用来申请GM_*函数和unsafeWindow权限。相当于 放在脚本header里面告诉油猴扩展,你需要用些什么东西,然后它就会给你相应的权限。
更加详细的列表:
none和unsafeWindow
简单来说:
none就是直接运行在前端页面中,否则就是运行在一个沙盒环境,需要使用unsafeWindow去操作前端的元素。
除了GM_* 函数外,还有两个特殊的权限,就是none和unsafeWindow。
默认情况下,你的脚本运行在油猴给你创建的一个半沙盒环境中,在这个沙盒环境中,你可以访问到页面上的元素,但是页面上的元素无法访问到脚本中的内容,用来隔离两个环境。
b = 123;// 脚本中未定义b,会击穿沙盒到页面中去,此时 :window.b=undefind,unsafeWindow=123;
console.log(window.b, unsafeWindow.b);
window.b = 234;// 在脚本的window中定义b,后续对b的操作都是在脚本的上下文中进行的,此时:window.b=234,unsafeWindow=123;
console.log(window.b, unsafeWindow.b);
b = 345; // 已经在脚本上下文中定义b了,效果同上,此时:window.b=345,unsafeWindow=123;
console.log(window.b, unsafeWindow.b);
unsafeWindow.b = 456; // 这里操作的是页面的对象,此时:window.b=345,unsafeWindow.b=456;
console.log(window.b, unsafeWindow.b);
如果在页面最前方声明// @grant none,那么油猴就会将你的脚本直接放在网页的上下文中执行,这是的脚本上下文(window)就是前端的上下文。但是这样的话就无法使用GM_*等函数,无法与油猴交互,无法使用一些更强的功能。
所以一般写脚本的时候是使用unsafeWindow与前端交互,而不使用,这样就可以使用// @grant nonegrant去申请油猴的一些更强的函数功能。
在沙盒环境中,有一些window的操作也无法处理,需要使用grant来获取,例如TamperMonkey文档中给出的:window.onurlchange、window.close 和 window.focus
TamperMonkey文档中提供的例子:
- window.onurlchange
- window.close
- window.focus
// ==UserScript==
...
// @grant window.onurlchange
// ==/UserScript==
if (window.onurlchange === null) {
// feature is supported
window.addEventListener('urlchange', (info) => ...);
}
// ==UserScript==
...
// @grant window.close
// ==/UserScript==
if (condition) {
window.close();
}
// ==UserScript==
...
// @grant window.focus
// ==/UserScript==
if (condition) {
window.focus();
}
这种做法是为了避免恶意网页可以直接的使用GM_*函数,也可以避免被网页检测到GM_*插件的存在
GM文档中的说明:
unsafeWindow绕过Greasemonkey的安全模型,该模型的存在是为了确保恶意网页不能以这样的方式修改对象,从而使用户脚本(比在网页中运行的普通JavaScript具有更高的权限执行)执行其作者或用户不想做的事情。
更详细的分析请参考下一章:沙盒机制的前世今生