嵌入式框架通信

本文档提供了关于嵌入器(embedder)和嵌入在不同类型框架(例如,<iframe><fencedframe>)中的内容之间通信方式的差异,以及如何存储传递的数据的信息。

如何实现嵌入器与 <iframe> 之间的通信

Diagram illustrating the difference between local storage and shared storage and communication with an iframe, as explained below

当第三方代码嵌入在 <iframe> 中时,<iframe> 和嵌入器可以自由地相互发送消息,以请求将数据写入它们客户端的 共享存储。嵌入器可以使用跨文档通信通道,通过 Window.postMessage()<iframe> 发送请求,要求其将数据写入自身的第三方存储。第三方也可以向嵌入器发送 postMessage() 请求。

<iframe> 中,您可以监听来自嵌入器的 message 事件。当嵌入器使用 postMessage()<iframe> 分派消息时,<iframe> 可以获取该数据并将其存储在自身的客户端共享存储中。反之,<iframe> 也可以分派一个嵌入器可以监听的消息,并通过将数据写入其共享存储来响应。

如何实现嵌入器与 <fencedframe> 之间的通信

<fencedframe> 用于显示通过 Protected Audience APIWindowSharedStorage.selectURL() 选择的定向广告等场景。<fencedframe> 与页面上 <fencedframe> 之外的其他页面之间的通信被有意限制,但嵌入器和共享存储工作线程之间确实存在一种通信方式 — FencedFrameConfig.setSharedStorageContext()

注意:在同一个 <fencedframe> 树内,框架之间的通信是允许的。例如,根 <fencedframe> 可以向其自身树中的子 <iframe> 发送消息,子 <iframe> 也可以向父 <fencedframe> 发送消息。

让我们看一个更复杂的例子,该例子使用 Select URL 输出门操作在 <fencedframe> 中渲染广告。

A complex embedding situation with an embedder that is embedding an iframe, which is embedding a fencedframe, which is embedding an iframe

在此示例中,发布者要求第三方内容提供商在页面上渲染一些内容。使用 WindowSharedStorage.selectURL() 选择的内容将在 <fencedframe> 中渲染,该内容包含来自测量提供商的 <iframe>。请注意,发布者可以代表任何嵌入第三方 <fencedframe> 的实体。此外,测量提供商代表在不同第三方 <fencedframe> 中运行的任何嵌套第三方代码。

要将数据传递到 <fencedframe> 以便在共享存储工作线程中使用,嵌入器可以在 FencedFrameConfig 中设置数据。该值将在共享存储工作线程内的 WorkletSharedStorage.context 中可用。这些数据在工作线程之外不可用,并且只能在共享存储工作线程提供的安全私有环境中访问。

A publisher created a FencedFrameConfig using selectURL, which can set contextual data using setSharedStorageContext that will then be available in a shared storage worklet

selectURL() 调用返回 FencedFrameConfig 时,框架嵌入器可以通过调用 setSharedStorageContext(data) 来传入数据。

js
const fencedFrameConfig = await window.sharedStorage.selectURL(
  "creative-rotation",
  urls,
  {
    // …
    resolveToConfig: true,
  },
);

fencedFrameConfig.setSharedStorageContext("some-data");

// Navigate the fenced frame to the config.
document.getElementById("my-fenced-frame").config = fencedFrameConfig;

setSharedStorageContext(data) 必须在预期的 <fencedframe> 元素接收者将其 config 属性设置为 fencedFrameConfig 之前调用,因为这会触发框架导航。

在共享存储工作线程内部,可以访问 WorkletSharedStorage.context 来检索数据。

js
class ReportingOperation {
  async run() {
    sharedStorage.set("some-data-from-embedder", sharedStorage.context);
  }
}
register("send-report", ReportingOperation);