父框架如何中断Origin-Agent-Cluster隔离子框架的window.prompt?
背景
当前正在调试框架间干扰问题:启用Origin-Agent-Cluster:?1做性能隔离的子框架,其window.prompt/alert等模态弹窗会被父框架或兄弟框架中的未知代码无用户交互突然关闭,同时onbeforeunload触发的“确定要离开吗?”确认弹窗也会被破坏。
该现象至少在Chrome Linux 123.0.6312.105中存在,Android Chrome也有用户报告,多在广告框架加载/刷新时出现,还会伴随聚焦的textarea失焦。由于触发源可能是第三方广告代码,近月仅出现几次且频率略有上升,无法稳定复现。
已知信息
- 任意框架调用
prompt/alert,可中断其他Origin-Agent-Cluster隔离框架的同类弹窗(关闭旧弹窗,弹出新弹窗),与框架父子关系无关 - 父框架执行导航操作(如
window.location.reload()、window.location.href=...)可中断子框架的模态弹窗 window.focus()不会中断其他框架的模态弹窗- 同一触发因素会破坏
onbeforeunload的确认弹窗
已排除情况
- 父框架的导航行为
- 父/兄弟框架调用
prompt/alert的情况(中断发生时无新弹窗出现) - 浏览器扩展DarkReader(问题发生时处于关闭状态)
经测试可行的干扰方法(Chrome环境)
以下方法均无需触发导航或新网页级弹窗,即可中断其他框架的模态弹窗:
模拟ESC键盘事件:父/兄弟框架触发顶层窗口的ESC键事件,可直接关闭激活状态的模态弹窗。示例代码:
window.top.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true, cancelable: true, keyCode: 27, which: 27 }))验证:子框架弹窗激活时执行上述代码,弹窗会立即关闭,无额外弹窗或导航行为。
调用
window.print():父/兄弟框架调用window.print()会触发Chrome打印对话框,此时所有已打开的模态弹窗会被自动关闭。部分广告代码可能通过快速切换焦点隐藏打印对话框,实现“无可见弹窗”的干扰。示例代码:window.print(); window.focus(); // 尝试隐藏打印对话框(部分场景有效)临时打开并关闭空白窗口:打开新空白窗口会短暂抢占系统焦点,在Chrome 123.x等版本中可导致原模态弹窗关闭,无持久化新窗口或导航。示例代码:
const tempWin = window.open('about:blank'); tempWin.close();触发
beforeunload结合页面终止:通过触发beforeunload事件并配合window.stop(),可间接干扰页面状态,导致模态弹窗关闭。该方法稳定性较低,需特定环境配合。示例代码:window.top.dispatchEvent(new Event('beforeunload', { bubbles: true })); window.stop();
内容的提问来源于stack exchange,提问作者joe

