一文搞懂油猴(篡改猴)脚本中window和unsafeWindow的关系
先看第一段代码:特点是grant none
// ==UserScript==
// @name test
// @match https://1.1.1.1/
// @grant none
// ==/UserScript==
(function(win){
console.log(window)
console.log(win)
})(unsafeWindow);
执行结果:Uncaught (in promise) ReferenceError: unsafeWindow is not defined
因为根本没有声明unsafeWindow,所以报错.把unsafeWindow替换为window后,执行正常如下图.

再看第2段代码:特点是grant unsafeWindow
// ==UserScript==
// @name test
// @match https://1.1.1.1/
// @grant unsafeWindow
// ==/UserScript==
(function(win){
console.log(window)
console.log(win)
console.log(window===win)
})(unsafeWindow);
执行结果如下:

可见,改为沙盒模式后,第一行输出的是油猴(篡改猴)扩展提供的"假窗口",第二行输出的才是真正的window,第三行则说明了二者根本不是一回事.
另外基于目前使用的油猴(篡改猴)v4.19.0补充3个小知识点:
1,GM_info无需授权就能使用;
2,把第二段代码中的@grant unsafeWindow换为任意的@grant GM_api,比如GM_log,GM_addStyle,...效果不变
3,关于标签页的GM_api应该这么授权:
// @grant GM.getTab
// @grant GM.saveTab
// @grant GM.getTabs
以下贴一段测试这些api的代码
// ==UserScript==
// @name Test GM tabs
// @match *://example.com/
// @match *://example.org/
// @grant GM.getTab
// @grant GM.saveTab
// @grant GM.getTabs
// ==/UserScript==
unsafeWindow.GM_getTab = GM.getTab;
unsafeWindow.GM_saveTab = GM.saveTab;
unsafeWindow.GM_getTabs = GM.getTabs;
GM.saveTab({href:location.href});
console.log("tabs:", await GM.getTabs());
GM_getTabs().then(function(obj) {
console.log(obj)
})```
一文搞懂油猴(篡改猴)脚本中window和unsafeWindow的关系的更多相关文章
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 一文搞懂 Prometheus 的直方图
原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 一文搞懂vim复制粘贴
转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...
- 一文搞懂所有Java集合面试题
Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
- 一文搞懂 js 中的各种 for 循环的不同之处
一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...
- 一文搞懂如何使用Node.js进行TCP网络通信
摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...
随机推荐
- .Net Core 管道底层源码实现
在 .NET Core 中,请求处理管道是一个中间件(Middleware)链,用于处理 HTTP 请求并生成响应.管道的底层实现基于 Microsoft.AspNetCore.Http 命名空间中的 ...
- C# 窗口鼠标穿透以及取消窗口鼠标穿透
private const int WS_EX_TRANSPARENT = 0x20; private const int GWL_EXSTYLE = -20; /// <summary> ...
- 简单了解RPC实现原理-copy
核心框架类 /* * Copyright 2011 Alibaba.com All right reserved. This software is the * confidential and pr ...
- 通过Nginx反向代理配置/.well-known/pki-validation/fileauth.txt步骤实例
最近在某云平台上申请了SSL证书(https),SSL证书申请或者续期过程中需要进行域名验证. 如果域名验证类型选择[文件]方式,等你提交申请后,要在目标域名对应的服务端上传一个文件(通常是一个.tx ...
- Superset config配置文件参数
superset配置文件config.py文件参数修改相关影响:1.如果让dashboard左侧出现筛选器,dashboard可交叉筛选,将以下三个参数设置为True "DASHBOARD_ ...
- OS:RAID
什么是RAID? 独立磁盘冗余阵列[磁盘阵列](Redundant Arrays of Independent Disks,RAID) 磁盘阵列: 由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用 ...
- 使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1
Chainlit是一个开源的 Python 包,用于构建可用于生产的对话式人工智能. DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题.在 RL 之前,D ...
- C/C++ 以及 Rust 中的 getch() 实现
getch 是一个在 C 语言编程中常用的函数,用于从键盘读取一个字符,但不回显到屏幕上. 在 Windows 环境下,getch 实现通常包含在 <conio.h> 头文件中.需要注意的 ...
- DeepSeek-V3 解读:优化效率与规模
DeepSeek-V3 是大语言模型(LLM)领域的一项变革性进展,为开源人工智能设定了新的标杆.作为一个拥有 6710 亿参数的专家混合(Mixture-of-Experts,MoE)模型,其中每个 ...
- 记一次golang项目context引发的OOM故障
之前写过一篇一种基于etcd实践节点自动故障转移的思路, 程序经历过一次线上进程内存持续上涨终OOOM的小事故, 本次技术复盘导致本次内存泄露的完整起因. 提炼代码: 业务函数etcdWatchLoo ...