plan-detail-app.tsx
112 KB
-
fix(web): 嵌宿主 sandbox iframe 时新标签页被拦 → 逐级兜底;去掉预约成功 toast;回访→跟进 · 1402bb9f
## ① 内嵌宿主时控制台报错、点了没反应 线上(嵌在宿主 iframe 里)实测: Blocked opening '<url>' in a new window because the request was made in a sandboxed frame whose 'allow-popups' permission is not set. 宿主的 <iframe sandbox> 没给 allow-popups → window.open 直接被浏览器拦掉。 上一版(7-29 改新标签页)只写了一行 window.open,**连"被拦了"都不知道**,表现就是点了没反应。 openHostUrl 改成三级兜底:新标签页 → 顶层跳转(老 _top 行为)→ 本 frame 内跳转。 能开新页就开,开不了也得让人到得了那个页面。
⚠ ️ 检测"被拦"不能靠 window.open 的返回值配 noopener —— features 里带 noopener 时 **成功也返回 null**,永远分不清。改成先开同源 about:blank、拿到句柄手工断 opener 再导航, 效果同 noopener 但可检测。⚠ ️ 两个 a 标签(原始档案 / 原始病历)也改成 onClick 走 openHostUrl:声明式的 target="_blank" 在 sandbox 下同样被拦,而那条路我们既拦不到也补不了。href 保留让 右键"复制链接"仍可用。 根治仍在宿主侧 —— 注释和 console.warn 都写明了:请对接方给 iframe 加 allow-popups (想让新页不继承沙箱再加 allow-popups-to-escape-sandbox)。 ## ② 去掉「已在新标签页打开宿主预约页」toast 新标签页开出来用户自己看得见,再报一句是噪音。失败路径的提示都还在。 兜底路径也刻意不弹 toast:下一行就导航走了,提示根本来不及被看见。 ## ③ 顶栏「回访」按钮文案改「跟进」 这个按钮跳的是宿主侧动作页,落到宿主那边不一定叫回访;而 PAC 里「回访」已被 "诊所回访记录 / 历史联系"占着,同一个词指两件事。⚠ ️ 只改按钮字面,槽位 key(OPEN_RETURN_VISIT)不动 —— 那是宿主配置里的键名。 本地实测:打桩让 window.open 返 null(模拟 sandbox)→ 确实走兜底跳到了宿主页; 按钮 DOM 是 title="跟进" / 文案"跟进";预约不再弹成功 toast。⚠ ️ 未实测的:真 Chrome 里"正常开出新标签页"这一支 —— 内嵌浏览器面板本身拦弹窗, 两种 window.open 形式都返 null,证不了。697 tests / 45 suites + web typecheck 通过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed