跳到主要内容

grant介绍,none与unsafeWindow

介绍 grant 属性,包括 noneunsafeWindow

grant

这个属性可用来申请GM_*函数unsafeWindow权限。相当于放在脚本header里面告诉油猴扩展,你需要用些什么东西,然后它就会给你相应的权限。

更加详细的列表:

none和unsafeWindow

简单来说: none就是直接运行在前端页面中,否则就是运行在一个沙盒环境,需要使用unsafeWindow去操作前端的元素。

除了GM_* 函数外,还有两个特殊的权限,就是noneunsafeWindow

默认情况下,你的脚本运行在油猴给你创建的一个半沙盒环境中,在这个沙盒环境中,你可以访问到页面上的元素,但是页面上的元素无法访问到脚本中的内容,用来隔离两个环境。

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 none,这样就可以使用grant去申请油猴的一些更强的函数功能。

在沙盒环境中,有一些window的操作也无法处理,需要使用grant来获取,例如TamperMonkey文档中给出的:window.onurlchangewindow.closewindow.focus

信息

TamperMonkey文档中提供的例子:

// ==UserScript==
...
// @grant window.onurlchange
// ==/UserScript==

if (window.onurlchange === null) {
// feature is supported
window.addEventListener('urlchange', (info) => ...);
}

这种做法是为了避免恶意网页可以直接的使用GM_*函数,也可以避免被网页检测到GM_*插件的存在

信息

GM文档中的说明:

unsafeWindow绕过Greasemonkey的安全模型,该模型的存在是为了确保恶意网页不能以这样的方式修改对象,从而使用户脚本(比在网页中运行的普通JavaScript具有更高的权限执行)执行其作者或用户不想做的事情。

更详细的分析请参考下一章:沙盒机制的前世今生