用户脚本的 grant 权限声明与 none 模式的含义
@grant 是脚本头部里「要什么权限」的声明。官方文档的定义:**用于把 GM_* 函数、unsafeWindow 对象以及部分强大的 window 函数加入白名单**。
声明写法
脚本要用什么,就列什么:
// @grant GM_setValue
// @grant GM_getValue
// @grant GM.setValues
// @grant GM_setClipboard
// @grant unsafeWindow
// @grant window.close
// @grant window.focus
// @grant window.onurlchange
官方特别说明:关闭标签页、聚焦窗口这类「强力」的 window 能力,也要走 @grant 声明。
grant none:关闭沙箱
// @grant none
none 的含义是沙箱被关闭:
- 脚本直接运行在页面环境里,与页面自身的脚本同处一个世界;
- 代价:所有 GM 函数不可用(唯一例外是只读的
GM_info); - 收益:代码可以直接访问页面的全局变量与函数,像页面自己的脚本一样写。
不写 grant 会怎样
官方文档明确区分了「不写」与「none」:不写 @grant 视为空列表,这与 none 不同——空列表意味着脚本仍运行在沙箱里,只是没申请任何 GM 函数,GM_setValue 之类的调用会失败。
选择标准
| 脚本要做什么 | grant 选择 |
|---|---|
| 只改 DOM、改样式 | none 或空列表 |
| 存数据、跨域请求、剪贴板、通知 | 列出对应 GM 函数 |
| 要读页面自己的 JS 变量 | unsafeWindow(运行环境细节见官方文档 @sandbox 条目) |
安装确认页与 grant 的关系
安装脚本时确认页展示的「权限」就是 @grant 列表:列表越长,脚本对浏览器能力的索取越多。看到与脚本功能明显无关的申请(一个改字体的脚本要跨域请求),按脚本安全判断的要求多留个心眼。