← Unframed display mode for Isolated Web Apps
v152 · manifest member · display_override
DisplayOverrideEntryObject
The object form of a display_override entry: an ordered map with a display member and an optional url_patterns member, letting an app request a display mode — such as unframed — only for windows whose URL matches given patterns.
Syntax
A display_override entry is either a display modes list value (a string, extensions like unframed included) or a DisplayOverrideEntryObject. The spec defines the object verbatim as “an ordered map with the following members”:
display | A display modes list value including extensions — for example "unframed", "window-controls-overlay", "standalone" |
|---|---|
url_patterns (optional) | A list of URL patterns. “Defaults to an empty list if omitted.” Intended for advanced cases where the developer wants explicit control over which windows get the mode |
"display_override": [
{
"display": "unframed",
"url_patterns": [
"/some/path/*",
{ "pathname": "/some/other/path/*" }
]
}
]
Each URL pattern may be a string (parsed relative to the manifest URL, per URL Pattern string semantics) or an object with component members such as pathname. The set of accepted patterns “is restricted to exclude patterns containing regular expressions” — a deliberate security choice that follows the service worker router rules.
Inputs
| Member | Type / constraints / default |
|---|---|
display | Required for the object to be useful. A display modes list value including display mode extensions (unframed, window-controls-overlay, tabbed) — not limited to the four base modes. During processing, an override object is created “with its display set to entry["display"]” |
url_patterns | Optional. Must be a list if present — a non-list value causes the whole entry to be skipped during processing. Items are URL pattern strings or objects; regular-expression patterns are excluded. Default: empty list (entry applies to every window) |
Outputs
The entry participates in determining the chosen display mode, which the spec extends to take an optional document URL. The algorithm, quoted from the spec:
- For each entry of the manifest's
display_overridemember: let candidate display mode be null. - If the entry is a display mode (string): set candidate display mode to the entry.
- Else if the entry is a
DisplayOverrideEntryObject: if itsurl_patternsis empty, set candidate display mode to the entry'sdisplay; else if the document URL is not null, for each pattern ofurl_patterns: if the pattern matches the document URL, set candidate display mode to the entry'sdisplayand break. - If candidate display mode is null, continue to the next entry.
- If the display modes list contains the candidate, return it. (For extensions, the spec adds per-mode gates:
unframedis returned only “if the user agent supports this, and the application is an Isolated Web Application”.)
The observable output is the window's display mode: the first entry in the fallback chain that both matches the window's URL and is usable wins; matching windows open in unframed mode, non-matching windows fall through to later entries (mixing framed and unframed windows in one app).
Errors
| Situation | Behaviour |
|---|---|
url_patterns present but not a list | During processing of display_override: “if entry["url_patterns"] is not a list, iteration/continue” — the entry is dropped, remaining entries still processed. No exception; manifests fail soft. |
| Pattern does not match the window's document URL | No candidate is produced from this entry for that window; the chain continues to the next entry |
Candidate not usable (unsupported mode, or unframed for a non-IWA) | The candidate is not returned; processing continues down the chain and ultimately to the display member |
| Pattern containing a regular expression | Outside the accepted set (excluded for security, per the explainer); treated as not matching. The explainer does not define a console diagnostic — recorded as an open question in the critique |
Empty display_override / nothing usable | The display member decides (“this field overrides the display member; if the user agent does not support any of the display modes specified here, then it falls back to considering the display member”) |
Context and exposure
- The object form is valid only inside the manifest's
display_overridelist — there is no JavaScript surface. - The mechanism “is not specific to the new
unframeddisplay mode; the same idea can be leveraged by other display modes where it makes sense” (explainer). It builds on the earlier display-override proposal. - Choosing
unframedstill requires the surrounding unframed prerequisites — IWA package and thewindow-managementpermission; see the overview requirements. - Matching runs against the window's document URL — for an IWA that is an
isolated-app://URL — at window creation.
Lifecycle
- Manifest processing (install/update): each object entry is converted to a processed override object (
display, plusurl_patternswhen present and a list); malformed entries are skipped. - Window creation: the chosen-display-mode algorithm runs with the new window's document URL; a matching unframed entry makes the window open unframed “from the very beginning without flicker”.
- Fixed thereafter: the decision is made once per window. Later navigations or
history.pushState()/window.locationURL changes do not re-evaluate the patterns — the window keeps the mode it was created with for its whole lifetime.
Examples
The explainer's canonical example — unframed only under two path subtrees, everything else standalone:
{
// 1. Request the window-management permission policy.
"permissions_policy": { "window-management": ["self"] },
"display": "standalone",
// 2. Add a JSON object to the display_override list.
"display_override": [
{
// 3. Set display to unframed in the object.
"display": "unframed",
// 4. Set url_patterns to the URLs intended to be unframed.
"url_patterns": [
"/some/path/*",
{ "pathname": "/some/other/path/*" }
]
}
]
}
With this manifest: a window opened at /some/path/chat is created unframed; a window at /settings matches no pattern, so the chain falls through to "display": "standalone" and opens as a normal standalone window — the “mix regular windows alongside unframed windows” goal.
Browser compatibility
Interim table. No BCD or web-features entry covers DisplayOverrideEntryObject (2026-07-28), so the rows below are compiled from the linked primary sources; shipping status follows the parent feature.
| Browser / platform | Support | Evidence |
|---|---|---|
| Chrome desktop | 152 — listing: “Enabled by default” + “Stepped rollout”; detail record: developer trial behind a flag | milestone=152 listing; ChromeStatus API record |
| Chrome Android / WebView / iOS | No milestone — not applicable | ChromeStatus API record |
| Edge | Not separately reported | Chromium-based; no separate position on the record |
| Firefox | No signal | ChromeStatus API record vendor views |
| Safari | N/A | ChromeStatus API record vendor views |
Full analysis and evidence links: overview — browser compatibility.
Source: chromestatus.com/feature/5551475195904000Security and privacy
- No regular expressions — the accepted pattern set “is restricted to exclude patterns containing regular expressions. This avoids security concerns and follows other specs like service worker routes” (explainer), keeping matching cheap, predictable, and reviewable.
- Scope is inherent — patterns are evaluated inside one IWA's own package; they cannot affect other origins (an unframed window cannot navigate cross-origin at all — see the overview lifecycle).
- The unframed spoofing analysis and its mitigations are on the overview security section.