目标:微软/ playwright
问题:微软/playwright#39948
状态:已准备并验证本地补丁
补丁提交:269228a88 — 修复(铬内核):解决工作线程响应头挂起问题
此次现场测试针对的是 Playwright 在铬内核浏览器中的一个挂起问题,即在 iframe 中加载的工作线程脚本调用 response.allHeaders() 时可能会发生挂起。
该问题的表现形式非常明确:
在 iframe 中加载了一个工作线程脚本
响应对象存在
调用了 response.allHeaders()
承诺(Promise)从未结算
这是一个严重的应用程序接口边界故障。一个请求响应头的公共应用程序接口要么应该返回头信息,要么应该失败。它不应该因为底层浏览器/会话路径未产生与普通请求相同的元数据事件而无限期等待。
故障形态
故障路径涉及通过工作线程帧会话完成的主工作线程脚本响应。
在该路径中,Playwright 可能会持续等待从未到达的铬内核额外信息事件。
结果导致了挂起。
这不是一个通用的超时问题。
这是一个响应元数据完成问题。
当工作线程帧路径未产生匹配的额外信息事件时,应用程序接口拥有足够的响应信息,可以使用临时的原始头信息来完成操作。
边界
这里的边界是:
普通铬内核请求的响应元数据
versus
工作线程帧会话中的主工作线程脚本响应元数据
对于普通请求,Playwright 应继续使用现有的额外信息行为。
但对于这种主工作线程脚本 iframe 的情况,无限期等待从未到达的额外信息违反了应用程序接口的完成契约。
修复措施保持了正常路径不变,并为主工作线程脚本情况添加了一个有界回退机制。
变更内容
补丁更新了以下文件中的铬内核网络响应处理逻辑:
packages/playwright-core/src/server/chromium/crNetworkManager.ts
该变更允许通过工作线程帧会话完成的主工作线程脚本响应,在无法获取匹配的铬内核额外信息事件时,使用临时的原始头信息来完成头信息解析。
在以下文件中添加了针对性的回归测试:
tests/page/workers.spec.ts
该回归测试涵盖了在 iframe 中加载的工作线程脚本的 response.allHeaders() 调用。
验证
在没有源代码修复的情况下,针对性回归测试失败;应用修复后,测试通过。
验证通过:
npm run ctest -- tests/page/workers.spec.ts --workers=1 --reporter=line
npm run ctest -- tests/page/page-network-response.spec.ts --workers=1 --reporter=line
npx eslint packages/playwright-core/src/server/chromium/crNetworkManager.ts tests/page/workers.spec.ts
npm run tsc
npm run lint
git diff --check
现场测试结果
这是一次针对狭窄的铬内核响应元数据边界的干净本地修复。
问题归结为:
普通请求应保持现有的额外信息路径
当额外信息未到达时,主工作线程脚本 iframe 响应不应无限期挂起
在那种有界的工作线程帧情况下,response.allHeaders() 应使用可用的临时原始头信息进行结算
针对性的工作线程覆盖测试证明了故障的存在及修复的有效性
这类错误看起来像是“Playwright 挂起”,但实际的修复更小且更精确:
响应元数据完成在工作线程帧路径中失去了所有权。
该补丁恢复了确定性完成,同时未改变普通响应的等待语义。
公开声明
此次现场测试的正确声明是:
Scarab/SDS
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。