v8访问DOM

问题描述 投票:0回答:2

我想更改v8引擎,以便能够拦截对DOM元素的每次访问。如您所知,v8不会创建DOM树。浏览器创建DOM树。

  • 我的问题1:在v8源代码中,如何/在何处将DOM内存结构传递到v8。
  • 我如何以最小的努力进行拦截?
dom v8
2个回答
3
投票

向V8注册DOM元素的代码不在V8源代码中,而是在Chromium源的另一部分中:third_party / WebKit / Source /

其中可能有一些您可能感兴趣的部分:

  • core / dom:此目录包含基本DOM类的实现,以及用于生成V8接口的IDL定义
  • core / html:相同,但适用于HTML特定的类
  • 绑定/脚本:我相信这是将IDL转换为与V8接口的C源代码的脚本所在的地方(我没有对此进行详细介绍)
  • bindings / core / v8:这是实际调用V8以执行脚本等的代码的位置

编辑(2020-05-27):在最近版本的Chromium中,这些内容已经出现。从铬83开始(我认为至少可以回到75左右),现在处于:

  • third_party / blink / renderer / core / dom /
  • third_party / blink / renderer / core / html /
  • third_party / blink / renderer / bindings / scripts /
  • third_party / blink / renderer / bindings / core / v8 /

1
投票

我无法确切地告诉您DOM在V8中的注册位置,但是对于您可以从哪里开始搜索,我有一些提示。首先,在浏览器创建DOM时,您还应该在浏览器中浏览,而不是v8。如果找到在V8中注册DOM的位置,您还将看到为此在V8中调用了什么代码。

在铬中,Frame是包含网页的类。在创建过程中,它会实例化一个ScriptController对象,该对象本身会创建一个V8DOMWindowShell。传入的DOMWrapperWorld及其DOMDataStore维护从DOM到JS对象的映射。

这并不能完全告诉您DOM在V8中的注册位置,但是您应该可以在周围找到它。使用Eclipse并让其搜索Chrome项目中看似有趣的方法的引用或列出调用层次结构,是进行此类研究的好工具。

P.S。:由于我自己需要类似的东西,因此我遇到了/src/out/Debug/gen/webcore/bindings,该目录在Chromium的编译过程中创建并填充了DOM对象的所有模板。您可以根据需要对其进行编辑,然后重新进行更改。

如果找到生成它们的脚本,则可以一次为它们附加拦截器。

© www.soinside.com 2019 - 2024. All rights reserved.