Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对DOM的v8访问_Dom_V8 - Fatal编程技术网

对DOM的v8访问

对DOM的v8访问,dom,v8,Dom,V8,我想更改v8引擎,以便能够拦截对DOM元素的每次访问。 如您所知,v8并不创建DOM树。浏览器创建DOM树 我的问题1:在v8源代码中,DOM内存结构是如何/在哪里传递到v8的 我怎样才能用最少的努力进行拦截 我无法告诉您在V8中DOM的确切注册位置,但我有一些提示可以告诉您从哪里开始搜索。首先,当浏览器创建DOM时,您还应该查看浏览器,而不是v8。如果您找到了在V8中注册DOM的位置,您还将看到V8中为此调用了哪些代码 在chromium中,是包含网页的类。在整个创建过程中,它实例化了一个对

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

  • 我的问题1:在v8源代码中,DOM内存结构是如何/在哪里传递到v8的
  • 我怎样才能用最少的努力进行拦截

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

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

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

p.S.:由于我自己也需要类似的东西,我遇到了
/src/out/Debug/gen/webcore/bindings
,这是一个在编译过程中创建并填充DOM对象所有模板的目录。您可以根据需要编辑它们,并使用更改重新编译


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

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

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

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

p.S.:由于我自己也需要类似的东西,我遇到了
/src/out/Debug/gen/webcore/bindings
,这是一个在编译过程中创建并填充DOM对象所有模板的目录。您可以根据需要编辑它们,并使用更改重新编译


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

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

其中有几件您可能感兴趣:

  • core/dom:这个目录包含基本dom类的实现,以及它们的IDL定义,这些定义用于生成到V8的接口
  • core/html:相同,但适用于特定于html的类
  • 绑定/脚本:我相信这就是脚本所在的位置,它将IDL转换为与V8接口的C源代码(我没有详细介绍这一部分)
  • bindings/core/v8:这是实际调用v8以执行脚本等的代码所在的位置
编辑(2020-05-27):这些东西在Chromium的最新版本中有所改变。对于铬83(我认为至少回到铬75左右),它现在处于:

  • 第三方/blink/renderer/core/dom/
  • 第三方/blink/renderer/core/html/
  • 第三方/闪烁/渲染器/绑定/脚本/
  • 第三方/blink/renderer/bindings/core/v8/

用V8注册DOM元素的代码不在V8源代码中,而是在Chromium源代码的另一部分:第三方/WebKit/source/

其中有几件您可能感兴趣:

  • core/dom:这个目录包含基本dom类的实现,以及它们的IDL定义,这些定义用于生成到V8的接口
  • core/html:相同,但适用于特定于html的类
  • 绑定/脚本:我相信这就是脚本所在的位置,它将IDL转换为与V8接口的C源代码(我没有详细介绍这一部分)
  • bindings/core/v8:这是实际调用v8以执行脚本等的代码所在的位置
编辑(2020-05-27):这些东西在Chromium的最新版本中有所改变。对于铬83(我认为至少回到铬75左右),它现在处于:

  • 第三方/blink/renderer/core/dom/
  • 第三方/blink/renderer/core/html/
  • 第三方/闪烁/渲染器/绑定/脚本/
  • 第三方/blink/renderer/bindings/core/v8/

在v8的源代码中,在object.cc文件中,有一个名为SetProperty和Getproperty的方法数组。这些是我目前拦截的方法。我发现DOM在v8中以对象的形式保存。HERET maybeObject类中的对象,它们有一个属性、child等的哈希表。根对象是documnt,是DOM树的根。当然,也有一些缓存机制,但我无法找出确切的机制。不管怎么说,我已经能够进行一些原始的拦截。我不知道你想用你的拦截去哪里,但是当我寻找一种结合信息流跟踪的方法时,我也遇到了这些方法。我遇到的主要问题是,在截取的运行时,我对发生截取的上下文一无所知(是一个属性r)