v155 · privacy sandbox · feature removal
The frame that cannot navigate
A fenced frame can only ever be pointed at a FencedFrameConfig, and a config could only ever come from two APIs — the ones Chrome 152 removes. This page calls every route for real and counts how many hand back a config. The answer is zero, and it is zero for a different reason on each side of that removal.
Every route to a config
Each row is a way a page could obtain a FencedFrameConfig. Every one of them is called, not just probed for existence, and what comes back is printed verbatim. Nothing here is a lookup table.
| route | what it needs | present | what happened when this page called it |
|---|---|---|---|
| Press the button. | |||
The element itself
Attach a real <fencedframe> to this page and measure what it costs and what it does. A frame slot, a layout box, and no document.
Empty.
| measurement | fencedframe | iframe |
|---|---|---|
| Attach something. | ||
why the element goes too
Fenced frames existed to render content the embedding page must not be able to read or address — an ad chosen by an auction the page cannot see, a URL selected inside Shared Storage. The isolation was the point, and the price of it was that the embedder cannot set a src. It can only hand over an opaque config, and the config could only come from navigator.runAdAuction() or sharedStorage.selectURL().
Chrome 152 removes those two. From that point the element is reachable, constructible, layout-participating and permanently blank, because the constructor of FencedFrameConfig is not callable from script and no page can mint one itself. Chrome 154 turns the remaining surface into stubs so nothing throws, and Chrome 155 begins removing the element behind a field trial, at which point <fencedframe> parses to an HTMLUnknownElement like any other made-up tag.
On a browser that still has the producers, the table above is a weaker result than it looks and says so: an auction needs an https seller and enrolled participants, and selectURL needs a worklet module, so a page like this one cannot get a config out of them even where they exist. What it does establish is the shape of the dependency — every route runs through those two functions, and there is no fallback that does not.
the shape that is going away
// The only two producers, both removed in Chrome 152:
const config = await navigator.runAdAuction({ resolveToConfig: true, /* … */ });
const config = await sharedStorage.selectURL("pick", urls, { resolveToConfig: true });
// The only consumer:
const frame = document.createElement("fencedframe");
frame.config = config; // and there is no other way to point it anywhere
// What is left without them:
new FencedFrameConfig("https://example.com")
// TypeError: Failed to construct 'FencedFrameConfig': Illegal constructor