跳转至

网站运行时源代码归属

REA 通过两个可组合工具整合原生 Chrome DevTools Protocol 检查与精确的 V8 覆盖。提供现有的回环 CDP 端点以及来自 list_browser_targets 的页面目标。若省略源,REA 会选择页面当前的 HTTP(S) 源。浏览器和页面仍由外部所有。

观察执行

rea observe-web-execution http://127.0.0.1:9222 TARGET_ID \
  --observation-ms 10000 --json

MCP:observe_web_execution,参数包括 cdp_endpoint、target_id、可选的 allowed_origins 和可选的 observation_ms(默认 10000)。该操作自身选择插桩方式;无需额外的批准标志。

开始精确覆盖会重置计数器,并阻止优化执行,直到 REA 停止它。这会改变时序/JIT 行为。REA 请求精确的调用计数和详细范围,采集一次重置样本,停止覆盖,禁用已启用的域,并断开自身的连接。它不会导航、点击、评估选定的应用程序代码或关闭页面。

在执行操作前,请等待实际的布防进度事件。MCP 发出协商好的进度通知;CLI 在 stderr 上发出 rea_progress JSON,而 Evidence 结果保持在 stdout 上。使用普通命令、脚本或用户操作来触发行为。CLI SIGINT/SIGTERM 与 MCP 取消都会等待插桩清理;未确认的清理会作为错误返回,其中包含目标、失败的命令以及之前的失败。

结果保留:

  • 选定的目标、frame 和文档加载器身份;本地布防/结束时间戳,以及独立的后端单调覆盖时间戳。
  • 每个被接纳的生产者函数/块范围、排他结束偏移量以及以 UTF-16 代码单元计的执行次数;当精确文本可用时,其边界已得到验证。嵌套/重叠的计数会被保留,不得求和。
  • 主文档脚本清单、精确的会话脚本 ID、资源起始坐标、sourceURL/source-map 声明、生产者哈希以及独立计算的 UTF-8 文本摘要。
  • 来自选定主 frame 和选定源的布防窗口请求、完整报告的发起者对象(包括堆栈层级/描述)、推导出的调用点、精确的脚本 ID 关联以及未解析的异步父 ID。源关联并不确立 UI 因果关系。调用点和监听器的 line_number/column_number 值是 CDP 的零基行和 UTF-16 列,位于 url 命名的资源中。当存在 script_id 时,该资源就是脚本的封闭资源:外部脚本对应的脚本文件,或内联脚本对应的 HTML 文档。resource_start 是脚本文本在该资源中开始的位置。带有空 script_id 的调用点来自请求所报告的发起者,而非脚本调用帧,例如解析器在文档中读取的标记,或脚本文件中的模块导入。它仍然定位 url 中的一个位置,但没有会话脚本关联,因此无法与捕获的源代码或 resource_start 连接。trace_web_source_location 接受从 1 开始、相对于脚本的行,以及零基的 UTF-16 列。

对于外部脚本(url 为脚本文件),使用 line = line_number + 1,并保留 column = column_number;这也适用于脚本文件中具有空 script_id 的发起者位置。对于内联脚本(需要 script_id 及其 resource_start),使用 line = line_number - resource_start.line_number + 1。仅当 line_number === resource_start.line_number 时,才从 column_number 中减去 resource_start.column_number;在后续行中保留所报告的列。列仍然是零基的。此转换需要已知的源代码起始坐标和列坐标;对于不可用的坐标,请将其保留为未知。

覆盖计数器间隔在后端接受时开始(早于布防回执),并在本地计时器之后的重置样本处结束。计数可能包含这些命令间隔期间的执行;请求事件被限制在本地布防窗口内。结果同时保留后端时间戳和独立的本地时钟。

源代码元数据会一直收集到收到重置样本为止,包括在最终命令期间解析的脚本。REA 随后冻结此清单以用于源代码连接。即使没有未完成的命令,致命的协议解析失败也会终止观察器;监听器检查会在其最终文档断言之后检查生产者失败。

文档替换会结束窗口;此时最终覆盖仍不可用。缺失的覆盖是未知的:已加载的脚本可能不在某个样本中。详细请求也不能保证已编译函数具有块粒度。如果 is_block_coverage 为 false,则只能观察到函数级范围,分支执行仍属未知。原生 Chrome 验证在第一个窗口中复现了块覆盖,并在后续窗口中复现了函数级覆盖,包括没有 REA 的情况。

当 frame 和已知加载器身份保持稳定且当前源被允许时,同文档导航(如 history.pushState())仍然有效。未知的加载器身份会保留保守的 URL 检查;新报告或替换的加载器会被拒绝。格式错误的生产者事件会立即结束布防窗口并触发清理,与所选持续时间无关。

目标分离会以 session_detached 结束窗口,即使浏览器的根连接保持打开也是如此。Inspector.targetCrashed 事件会以 target_terminated 结束窗口。传输丢失会在浏览器观察中记录 transport_disconnected;执行捕获会返回带类型的传输失败。这些结果会保留选定的目标和所观察到的生命周期事实。

当已结束的会话无法确认清理时,操作会返回失败,其中包含失败的命令和原始的带类型生产者原因。该失败所保留的已完成捕获事实会将清理报告为 unconfirmed;只有会话清理所有者才能将成功结果标记为 confirmed。此类保留的 Evidence 会保存覆盖、源代码、目标和监听器事实,而不会成为成功操作。当不完整的保留快照无法提升为完成的 Evidence 时,调用方取消仍然是主要原因。覆盖停止失败也会在其诊断信息中保留所观察窗口的结束原因;在所属会话解决之前,清理保持 unconfirmed。

子 frame、worker、service worker、WebAssembly、时间顺序执行顺序以及框架特定的因果解释不在本次操作范围内。脚本所有权来自 frame/上下文元数据,而绝不是 URL 相等性。因此,重复的 URL 和合成名称会保留各自独立的身份。

当所有权未知时,已观察到的脚本元数据仍然可用;源代码文本和源代码关联仍保持排除或未知状态。请求/发起方资源 URL 会省略传输层用户信息(userinfo)。堆栈和脚本 URL 也可能是惰性的 sourceURL 名称:REA 会保留声明的名称和未知表示形式,并且仅在稳定的生产者元数据明确报告 hasSourceURL: false 时才移除脚本 URL 中的用户信息。此策略也适用于元数据在请求之后才到达的情况。未知的生产者扩展字段和 source-map 声明都会被保留。

检查节点的监听器

rea inspect-web-event-listeners http://127.0.0.1:9222 TARGET_ID '#submit' --json

MCP:inspect_web_event_listeners 使用相同的作用域和显式 CSS selector。原生 DOM 选择会检查主文档中第一个匹配的节点。如果没有匹配项,则结果是显式的空结果。

结果包含直接注册的监听器类型/标志、回调坐标、源身份/文本/摘要以及执行未知项。REA 使用原生 DOM/DOMDebugger 操作,并释放自己的远程对象组。它绝不会调用监听器或派发事件。委托的祖先监听器、后代节点、已关闭的 shadow root 以及框架注册表不会被枚举。

边界与验证

每条协议消息有 64 MiB 的预算;脚本/上下文元数据和请求元数据各有 8 MiB 的保留预算。请求保留将计入预估的请求和发起方事实,包括最终源绑定;被丢弃的请求体和请求头不会消耗该保留额度。完整保留的源代码文本有 32 MiB 的预算。保留超限会返回一个带类型的资源约束,其中标明额度、观察到的字节数和固定限制;格式错误的证据仍属于输出失败。两种情况都不会返回部分成功。每个命令以及完整的检查/源关联阶段都使用 command_timeout_ms(默认 20000)。清理阶段使用单独的 5000 ms 宽限期;command_timeout_ms 不会延长或缩短该宽限期,且此版本没有针对该宽限期的运行时覆盖项。传输关闭在宽限期之后进行。CLI 和 MCP 都使用相同的正 32 位毫秒观察时长约定。REA 不控制外部所拥有的浏览器的 CPU 或内存。

npm run verify:browser:runtime 使用调用方提供的 REA_BROWSER_EXECUTABLE 和 Linux/macOS 上的原生 ps 命令,针对自有合成 fixture,通过真实的公共 CLI 和 stdio MCP 运行。它会检查精确的 Unicode/CRLF 文本/摘要、相同 URL 身份、同一文档内导航、惰性声明名称、已执行和零计数分支、重复观察中仅函数的未知项、监听器选择、发起方关联、实际激活以及对外部页面的保留。一个独立的 fixture 页面会在已激活的 MCP 窗口期间关闭,以验证迅速终止和内联清理诊断。scripts/verify-browser-runtime.mjs 的可选位置参数入口允许针对隔离安装的 tarball 执行相同的检查。

真实工作流覆盖范围为 Linux x64 / Chrome 153 / Node 24。其他浏览器引擎和主机工作流仍未经验证。条件性的 real-web-runtime CI 通道仅针对相关变更获取 Chrome;普通单元/静态检查不需要浏览器。

主要协议参考:Profiler 和 Debugger、DOMDebugger。

源所有权要求同时具备所选的主 frame 及其默认执行世界的生产者证据。扩展/自动化隔离世界、worker 世界和未知世界无法建立网站源关联。相互矛盾的世界元数据会保持无主状态。被引用的源记录会保留所报告的执行上下文和脚本辅助上下文元数据;仅对已证实的主文档默认世界读取源文本。

已知的脚本/上下文身份会通过异步源完成过程在采样截止点之后继续被监控。身份一旦改变,其保留文本、frame 归属、覆盖信息以及请求/源关联都会被排除。Chromium 特有的原生 CSS 语法拒绝会对 selector 返回输入错误,包括所选目标;不相关的节点、命令和传输失败则保留其原始类别。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea