Session resume does not restore the first reload of a tab that Chrome prerendered (7.0-dev)

该报错出现在 Gradio 7.0-dev 的会话恢复(session resume)功能中:当 Chrome 对地址栏输入的 URL 进行预渲染(prerender),页面首次重载时无法恢复上次的组件状态,之后的每次重载则正常。优先排查 Chrome 预渲染导致的 sessionStorage 写

快速结论:该报错出现在 Gradio 7.0-dev 的会话恢复(session resume)功能中:当 Chrome 对地址栏输入的 URL 进行预渲染(prerender),页面首次重载时无法恢复上次的组件状态,之后的每次重载则正常。优先排查 Chrome 预渲染导致的 sessionStorage 写入丢失,而不是 Gradio 应用代码本身。

适用环境:Gradio 7.0-dev @ 121688c15(版本号报告为 6.31.0);浏览器为桌面版 Chrome,使用默认预渲染设置。Issue 未提供操作系统、Python、CUDA、显卡等环境信息。

最快修复方案:升级到包含 #14029 修复的 7.0-dev 版本(该 PR 已合入 7.0-dev)。

注意事项:该问题只在 Chrome 实际触发预渲染时出现,具有时序依赖,普通无头测试(如 Playwright)不会预渲染,因此无法复现,不能用无头测试确认修复。Issue 未说明修复后对“从未展示的预渲染仍会创建服务端会话并执行 load 事件”这一附带行为做了何种处理。

问题场景

使用 Gradio 7.0-dev 启动一个带有输入/输出组件的应用,并启用会话恢复(#13585 引入)。在 Chrome 中通过地址栏打开页面(Chrome 已对该 URL 给出建议,因此会提前预渲染),在 “Input” 中输入内容并触发事件后刷新标签页,首次刷新两个文本框都恢复为空;再次触发事件后刷新则恢复正常。

报错原文

Session resume does not restore the first reload of a tab that Chrome prerendered (7.0-dev)

原因分析

根据 Issue 作者的分析,原因是 Chrome 预渲染:当 Chrome 预测用户在地址栏输入的 URL 时,会在按下回车前就加载页面,此时导航记录的 activationStart 大于 0。预渲染页面拿到的是 sessionStorage 的一份副本,页面真正展示时,此前写入的内容会被丢弃(参见 whatwg/storage#119)。Client.connect 在预渲染期间执行,track_session 写入的指针(包含 pages 和 in_use)因此丢失;随后首个事件通过 track_resumable_event 写入了一个不含 pages 的指针,导致下次刷新时 has_shown_page 为 false,无法恢复。该次刷新不是预渲染,会重新写入 pages,所以之后的重载都正常。

是否出现取决于时序:只有页面展示前写入的内容会丢。本地应用连接很快,因此大多数加载都能看到该现象;较慢的宿主(例如带 SSR 的 Space)则需要在 Chrome 给出 URL 建议后等待几秒再按回车才容易触发。

环境排查

  • 确认 Gradio 是否为 7.0-dev,提交版本是否为 121688c15 或在此之前。
  • 确认浏览器为桌面版 Chrome,且未关闭默认预渲染设置。
  • 排查时关闭 DevTools 观察;Issue 指出打开 DevTools 时首次刷新反而能恢复,会干扰判断。
  • 确认应用是否启用会话恢复功能(#13585)。
  • Issue 未提供 Python、CUDA、PyTorch、显卡等信息,无需纳入排查。

解决步骤

  1. 确认当前 Gradio 版本为受影响的 7.0-dev(121688c15 或期间版本)。
  2. 升级到包含 #14029 修复的 7.0-dev(该 PR 已合并到 7.0-dev)。
  3. 如暂时无法升级,可优先尝试:① 在 Chrome 中关闭预渲染;② 在地址栏输入后等待页面不再变化再按回车,减少预渲染窗口;③ 若必须依赖首次刷新恢复,改用本地运行并缩短连接时间。这些均为绕过思路,Issue 未声明其经过验证。
  4. 修复或绕过完成后,按复现步骤重新测试首次刷新恢复。

验证方法

在 Chrome 中关闭 DevTools,新开标签页,在地址栏输入一个 Chrome 会建议的本地应用 URL,等待一两秒后回车;在 “Input” 输入内容并点击 “Copy”,然后刷新标签页。若两个文本框都能恢复上次的值,说明首次刷新恢复已正常。建议再刷新一次,确认后续刷新也保持正常。

参考来源

gradio-app/gradio #14028

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31527

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注