排查客户端内网页布局抖动 #250

Closed
opened 2026-09-02 16:19:07 +08:00 by kdletters · 2 comments
Member

浏览器内打开正常,但是客户端内会疯狂抖动。

工程在附件,自取

浏览器内打开正常,但是客户端内会疯狂抖动。 <video src="attachments/84ffbee2-1c3b-4da6-bd63-6a8d18a5b439" title="1933398cf22b97cedea42132a508701f.mp4" controls></video> 工程在附件,自取
suzmii self-assigned this 2026-09-02 16:20:20 +08:00
suzmii added the due date 2026-09-02 2026-09-02 16:20:25 +08:00
Member

已开始排查。初步从附件工程和当前实现定位到一个尺寸反馈环风险:运行视窗根据 iframe 上报的内容宽高改写 iframe viewport;注入的尺寸桥又在新 viewport 下重新测量并继续上报。附件页面使用 body { min-height: 100vh },当前宿主虽然过滤重复尺寸和陈旧 viewport,但仍会接受“当前适配 viewport 下变化的内容尺寸”,缺少保证收敛的约束,因此可能在两个高度之间反复调整。

计划:

  1. 用附件工程补一条覆盖 100vh / 响应式布局的真实收敛回归,记录每轮 viewport、content size 和宿主 fit 决策;
  2. 在不破坏真实动态内容更新的前提下,切断由宿主自身改写 viewport 产生的回灌振荡;
  3. 验证浏览器原生展示不受影响,AGC 客户端 WebView 内画面稳定、完整居中且无滚动条;
  4. 运行相关 TypeScript、Rust、编码与 diff 门禁。

对应需求表已登记,开发分支将使用 fix/preview-iframe-resize-loop

已开始排查。初步从附件工程和当前实现定位到一个尺寸反馈环风险:运行视窗根据 iframe 上报的内容宽高改写 iframe viewport;注入的尺寸桥又在新 viewport 下重新测量并继续上报。附件页面使用 `body { min-height: 100vh }`,当前宿主虽然过滤重复尺寸和陈旧 viewport,但仍会接受“当前适配 viewport 下变化的内容尺寸”,缺少保证收敛的约束,因此可能在两个高度之间反复调整。 计划: 1. 用附件工程补一条覆盖 `100vh` / 响应式布局的真实收敛回归,记录每轮 viewport、content size 和宿主 fit 决策; 2. 在不破坏真实动态内容更新的前提下,切断由宿主自身改写 viewport 产生的回灌振荡; 3. 验证浏览器原生展示不受影响,AGC 客户端 WebView 内画面稳定、完整居中且无滚动条; 4. 运行相关 TypeScript、Rust、编码与 diff 门禁。 对应需求表已登记,开发分支将使用 `fix/preview-iframe-resize-loop`。
Member

修复已推送到 PR #252,最新提交为 9599abb66

本次处理不只修复 Issue 原始录屏中的“预览静止后在两个缩放档位之间反复调整”,还补充修复了拖动客户端窗口时的闪烁:此前 ResizeObserver 每次收到容器尺寸变化都会清空已测内容尺寸和 viewport 观察值,使 iframe 在拖动过程中反复经历“恢复原生尺寸 → 再次 fit”;现在窗口 resize 期间保留当前内容尺寸和已观察 viewport,只按新的可用空间连续重算缩放,preview URL 切换时才重置。

验证结果:

  • LocalGamePreviewFrame 组件级测试确认容器从 800×500 调整到 1000×600 时,iframe 不会恢复到原生高度;
  • 12 个相关前端用例通过;
  • AGC typecheck、skill-pack、定向 ESLint、编码检查、git diff --check 均通过;
  • Rust preview 尺寸桥目标测试 1/1 通过;
  • 使用 Issue 附件 gameagent-2873e5ac 做浏览器宿主收敛验证:初始反馈环收敛,容器 resize 后 fit 连续变化,没有再切回 1:1

请重点验收两种场景:进入运行预览后静置,以及持续拖动客户端窗口边缘改变窗口大小。

修复已推送到 PR #252,最新提交为 `9599abb66`。 本次处理不只修复 Issue 原始录屏中的“预览静止后在两个缩放档位之间反复调整”,还补充修复了拖动客户端窗口时的闪烁:此前 `ResizeObserver` 每次收到容器尺寸变化都会清空已测内容尺寸和 viewport 观察值,使 iframe 在拖动过程中反复经历“恢复原生尺寸 → 再次 fit”;现在窗口 resize 期间保留当前内容尺寸和已观察 viewport,只按新的可用空间连续重算缩放,preview URL 切换时才重置。 验证结果: - `LocalGamePreviewFrame` 组件级测试确认容器从 `800×500` 调整到 `1000×600` 时,iframe 不会恢复到原生高度; - 12 个相关前端用例通过; - AGC typecheck、skill-pack、定向 ESLint、编码检查、`git diff --check` 均通过; - Rust preview 尺寸桥目标测试 1/1 通过; - 使用 Issue 附件 `gameagent-2873e5ac` 做浏览器宿主收敛验证:初始反馈环收敛,容器 resize 后 fit 连续变化,没有再切回 `1:1`。 请重点验收两种场景:进入运行预览后静置,以及持续拖动客户端窗口边缘改变窗口大小。
Sign in to join this conversation.
2 Participants
Notifications
Due Date
2026-09-02
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#250