fencedframe 标签及config属性已彻底失效:Chrome 116+移除实现,W3C弃用提案,DOM中不创建节点、不发起请求;opaque URL无载体,Protected Audience API是唯一支持隐私沙盒的生产方案。

fencedframe 标签及其 config 属性已完全失效,无法用于导航或加载任何内容——Chrome 自 116 版(2023 年中)起彻底移除该标签实现,W3C 也已正式弃用整个提案。你写 <fencedframe config="..."></fencedframe> 或 <fencedframe src="https://..."></fencedframe>,浏览器不会报错,但也不会创建 DOM 节点、不发起网络请求、不渲染内容,document.querySelector('fencedframe') 返回 null。
为什么 config 属性根本不存在于实际运行环境
所谓 config 属性从未进入任何浏览器的稳定实现:
- 它只出现在早期 WICG 草案和 Chromium 实验 flag(如 chrome://flags/#enable-fenced-frames)中,且仅支持极简的 opaque URL 编码逻辑;
- 即使在 Chrome ≤115 中启用 flag,config 也无法被 JavaScript 读取或修改,也不接受 JSON 字符串或对象字面量;
- 所有声称“通过 config 设置 opaque URL”的代码示例,都依赖已下线的 Blink 内部 API(如 FencedFrameConfig 构造函数),现代 DevTools 中无法访问;
- 当前所有主流浏览器(Chrome ≥116、Edge、Firefox、Safari)均不解析 fencedframe 标签,更不识别 config 属性。
opaque URL 本身也已无实际载体
opaque URL(形如 fence://abcd1234)是为绕过 src 明文泄露设计的,但它必须由浏览器内核生成并绑定到 fencedframe 实例。由于该标签已被删除:
- 没有 API 可调用 new FencedFrameConfig() 或 document.createFencedFrameConfig();
- navigationId、opaqueSrc 等配套字段全部不可用;
- 即使你手动拼出 fence://... 字符串,传给任何现存 HTML 元素(包括 iframe)都会被当作非法协议直接拦截或静默失败;
- 服务端返回 Content-Type: document-Fenced-Frame-HTML 也毫无意义——没有宿主元素去消费它。
真正能触发隐私沙盒环境的唯一路径
当前唯一被 Chrome/Edge 生产环境支持、且具备 opaque 导航等效效果的机制,是 Protected Audience API 的动态 iframe 加载流程:
- 主站调用 navigator.joinAdInterestGroup() 注册兴趣组(需用户授权);
- 广告/推荐服务端响应必须带两个 header:Content-Type: document-Fenced-Frame-HTML 和 Permissions-Policy: interest-cohort=();
- 用 JavaScript 动态创建 iframe,设置 src 为广告端点 URL(不是 opaque URL,而是真实 HTTPS 地址);
- 浏览器自动将其升级为隐私沙盒环境:脚本无法读取 document.cookie 或 navigator.userAgent,但可调用 document.interestCohort() 获取模糊 topic;
- 所有通信必须通过 postMessage 显式声明能力,且父页面无法从 DOM 中推断用户兴趣(因为 src 是固定端点,个性化逻辑在沙盒内完成)。
别再尝试还原已删除的机制
试图用 polyfill、Shadow DOM 模拟或重写 fencedframe 行为,既无法触发浏览器级隔离,也无法通过广告平台审核(Google Ad Manager、Amazon TAM 已拒绝所有非 Protected Audience API 流量)。真正的“opaque”效果来自浏览器内建的沙盒调度,而非 URL 字符串本身——这个逻辑现在只存在于 Protected Audience API 的竞价与渲染阶段,不在 HTML 层暴露。



















