0

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

  • 我的问题 1:在 v8 源代码中如何/在哪里将 DOM 内存结构传递到 v8。
  • 我怎样才能以最小的努力进行拦截?
4

2 回答 2

3

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

里面有一些你可能感兴趣的部分:

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

编辑(2020-05-27):这些东西在最近版本的 Chromium 中已经发生了变化。从铬 83 开始(我认为至少回到铬 75 左右),它现在处于:

  • 第三方/闪烁/渲染器/核心/dom/
  • 第三方/闪烁/渲染器/核心/html/
  • 第三方/闪烁/渲染器/绑定/脚本/
  • 第三方/闪烁/渲染器/绑定/核心/v8/
于 2016-01-11T12:18:52.023 回答
1

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

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

这并不能准确地告诉您 DOM 在 V8 中注册的位置,但您应该在附近的某个地方找到它。使用 Eclipse 并让它在 chromium 项目中搜索看似有趣的方法的引用或列出调用层次结构是此类研究的好工具。

PS:因为我自己也需要类似的东西,所以我遇到/src/out/Debug/gen/webcore/bindings了一个目录,该目录在 Chromium 编译期间创建并填充了 DOM 对象的所有模板。您可以根据需要编辑它们并使用您的更改重新编译。

如果您找到生成它们的脚本,您可能会同时为它们附加拦截器。

于 2012-10-06T08:20:51.527 回答