grant介绍,none与unsafeWindow
介绍 grant
属性,包括 none
和 unsafeWindow
grant
这个属性可用来申请GM_*函数
和unsafeWindow
权限。相当于 放在脚本header
里面告诉油猴扩展,你需要用些什么东西,然后它就会给你相应的权限。
更加详细的列表:
none和unsafeWindow
简单来说:
none
就是直接运行在前端页面中,否则就是运行在一个沙盒环境,需要使用unsafeWindow
去操作前端的元素。
除了GM_*
函数外,还有两个特殊的权限,就是none
和unsafeWindow
。
默认的情况下,你的脚本运行在油猴给你创建的一个沙盒环境下,这个沙盒环境无法访问到前端的页面,也就无法操作前端的一些元素等。
如果在页面最前方声明// @grant none
,那么油猴就会将你的脚本直接放在网页的上下文中执行,这是的脚本上下文(window
)就是前端的上下文。但是这样的话就无法使用GM_*
等函数,无法与油猴交互,无法使用一些更强的功能。
所以一般写脚本的时候是使用unsafeWindow
与前端交互,而不使用,这样就可以使用// @grant none
grant
去申请油猴的一些更强的函数功能。
在沙盒环境中,有一些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
具有更高的权限执行)执行其作者或用户不想做的事情。
更详细的分析请参考下一章:沙盒机制的前世今生