如何有效使用dartium等工具读取/调试客户端dart库?
How to use dartium and other tools effectively to read / debug client side dart library?
动机
阅读/理解 dart 库以覆盖/扩展 dart-sdk 中的 类。
我看到的障碍
动态方法调用
例如
appendChild_Callback_1_(mthis, __arg_0) =>
Blink_JsNative_DomException.callMethod(mthis,
"appendChild",[__arg_0]);
调试器很有用。然而,对于异步代码,我想它可能是数百个微任务循环。可能基于作用域或函数名称的观察点或断点?
或者有人正在研究它?或者使用正则表达式搜索文件的唯一方法?
Javascript 或本机代码
dart 的某些部分依赖于 javascript 或者看起来像编译 C 的东西,在那里我看到了一堵坚不可摧的墙:
例如
_callMethod(String name, List args) native "JsObject_callMethod";
Dartium 的调试器不会更深入。
我在做什么
我想了解当元素附加到另一个元素时如何设置 HtmlElement 的父值。
出于优化目的,我猜它是由浏览器端编译的C处理的。
问题
- 技巧
有没有比将 if("appendChild") == mthis) debugger();
添加到库中更好的方法?
- 除了 dartium 中的工具,还有哪些工具可用?
如果我想深入挖掘,在哪里可以找到资源和技巧?
- 什么时候放弃?
我怎样才能大致了解什么样的事情需要深入研究铬源代码?还是只需要尝试看看?
断点有点受限,但是当你看到_blink 库中的callMethod(mthis, "appendChild", ...)
正好调用JavaScript 方法appendChild
和接收者mthis
。你会看到围绕它的 wrap_jso 和 unwrap_jso 调用,它们正在为底层的 JavaScript 对象移除或添加 Dart 包装器。从 1.14 开始,(几乎?)Dartium 中的所有 HTML 调用都是通过 JS Interop 完成的。
如果您真的想知道 C 代码在两者之间做了什么,请在 SDK 结帐中查找 js_dartium.dart。但是对于大多数目的来说,知道它正在做它所说的并调用 JS 就足够了。也可以在devtools的JS端设置断点,然后断点通过
对于技术 - 您可以在闪烁库或 html 中设置断点,但没有任何元断点设施。您还可以查看未缩小的 dart2js 输出以了解实际情况,因为它应该非常相似。除了 运行 Dartium 或查看源代码之外,没有太多可用的工具或资源。 sdk/tools/dom
。大多数 html_dartium 和所有 _blink 都是使用来自 Chrome IDL 文件的 Python 脚本生成的。
回答你原来的问题 - 我很确定它是在浏览器 C 代码中设置的,从 JavaScript 调用。 Dart 与它无关。
动机
阅读/理解 dart 库以覆盖/扩展 dart-sdk 中的 类。
我看到的障碍
动态方法调用
例如appendChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendChild",[__arg_0]);
调试器很有用。然而,对于异步代码,我想它可能是数百个微任务循环。可能基于作用域或函数名称的观察点或断点?
或者有人正在研究它?或者使用正则表达式搜索文件的唯一方法?Javascript 或本机代码
dart 的某些部分依赖于 javascript 或者看起来像编译 C 的东西,在那里我看到了一堵坚不可摧的墙:
例如_callMethod(String name, List args) native "JsObject_callMethod";
Dartium 的调试器不会更深入。
我在做什么
我想了解当元素附加到另一个元素时如何设置 HtmlElement 的父值。 出于优化目的,我猜它是由浏览器端编译的C处理的。
问题
- 技巧
有没有比将if("appendChild") == mthis) debugger();
添加到库中更好的方法? - 除了 dartium 中的工具,还有哪些工具可用?
如果我想深入挖掘,在哪里可以找到资源和技巧? - 什么时候放弃?
我怎样才能大致了解什么样的事情需要深入研究铬源代码?还是只需要尝试看看?
断点有点受限,但是当你看到_blink 库中的callMethod(mthis, "appendChild", ...)
正好调用JavaScript 方法appendChild
和接收者mthis
。你会看到围绕它的 wrap_jso 和 unwrap_jso 调用,它们正在为底层的 JavaScript 对象移除或添加 Dart 包装器。从 1.14 开始,(几乎?)Dartium 中的所有 HTML 调用都是通过 JS Interop 完成的。
如果您真的想知道 C 代码在两者之间做了什么,请在 SDK 结帐中查找 js_dartium.dart。但是对于大多数目的来说,知道它正在做它所说的并调用 JS 就足够了。也可以在devtools的JS端设置断点,然后断点通过
对于技术 - 您可以在闪烁库或 html 中设置断点,但没有任何元断点设施。您还可以查看未缩小的 dart2js 输出以了解实际情况,因为它应该非常相似。除了 运行 Dartium 或查看源代码之外,没有太多可用的工具或资源。 sdk/tools/dom
。大多数 html_dartium 和所有 _blink 都是使用来自 Chrome IDL 文件的 Python 脚本生成的。
回答你原来的问题 - 我很确定它是在浏览器 C 代码中设置的,从 JavaScript 调用。 Dart 与它无关。