unsafeWindow是如何通过用户脚本扩展来实现的?

The*_*der 6 javascript monkeypatching google-chrome-extension tampermonkey firefox-addon-webextensions

今天我遇到了一种情况,我需要进行扩展以对网页中的某些对象进行猴子修补。

然而,我几乎没有找到关于如何实际实现它的文档,我尝试使用该userScriptsAPI(目前仅适用于 Firefox),但该对象与页面的 HTML DOM 上的window上下文隔离。window

我知道这是可能的,因为像 GreaseMonkey 这样的用户脚本管理器实现了一个unsafeWindow对象,该对象使脚本可以直接访问网页的非隔离上下文中的对象,从而使猴子修补变得非常容易。

所以我想知道这是如何实现的。我试图研究名为ViolentMonkey的用户脚本管理器的源代码,我发现它定义unsafeWindowsrc/injected/web/gm-api-wrapper.js:53global对象的引用,但我无法找到它在源代码中定义的位置。

我知道这不是通过简单地<script>在页面中注入一个元素来实现的,因为根据我的检查,页面的 DOM 中没有可见的元素。

我对这个很酷的机制的实现很好奇,我很确定我错过了一些明显的东西,所以我需要你的帮助来摘掉我的眼罩!

小智 -1

您需要做的基本上是加载 DOM 并修改注入内容脚本的内容。

例如修改以下 HTML:

<html>
     <button id="mybutton">click me</button>
     <script>
        var greeting = "hello, ";
        var button = document.getElementById("mybutton");
        button.person_name = "Bob";
        button.addEventListener(
            "click", () => alert(greeting + button.person_name + "."), false);
      </script>
</html>
Run Code Online (Sandbox Code Playgroud)

您可以注入此代码:

var greeting = "hola, ";
var button = document.getElementById("mybutton");
button.person_name = "Roberto";
button.addEventListener(
    "click", () => alert(greeting + button.person_name + "."), false);
Run Code Online (Sandbox Code Playgroud)

您可以在 Chrome 扩展程序上注入带有动态或静态声明的脚本。

以下是使用静态声明的示例 manifest.json:

{
 "name": "My extension",
 ...
 "content_scripts": [
   {
     "matches": ["https://*.nytimes.com/*"],
     "css": ["my-styles.css"],
     "js": ["content-script.js"]
   }
 ],
 ...
}
Run Code Online (Sandbox Code Playgroud)

另外,您可以查看[Chrome扩展程序的文档]以获取更多信息。