← 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”:

DisplayOverrideEntryObject members (spec definition)
displayA 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.

Source: Manifest Incubations — display_override member, DisplayOverrideEntryObject; unframed explainer — manifest changes; URL Pattern Standard

Inputs

Inputs
MemberType / constraints / default
displayRequired 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_patternsOptional. 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)
Source: Manifest Incubations — processing the display_override member; unframed explainer — manifest changes

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:

  1. For each entry of the manifest's display_override member: let candidate display mode be null.
  2. If the entry is a display mode (string): set candidate display mode to the entry.
  3. Else if the entry is a DisplayOverrideEntryObject: if its url_patterns is empty, set candidate display mode to the entry's display; else if the document URL is not null, for each pattern of url_patterns: if the pattern matches the document URL, set candidate display mode to the entry's display and break.
  4. If candidate display mode is null, continue to the next entry.
  5. If the display modes list contains the candidate, return it. (For extensions, the spec adds per-mode gates: unframed is 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).

Source: Manifest Incubations — determining the chosen display mode; unframed explainer — goals (mix regular windows alongside unframed windows)

Errors

Error and edge behaviour
SituationBehaviour
url_patterns present but not a listDuring 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 URLNo 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 expressionOutside 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 usableThe 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”)
Source: Manifest Incubations — processing the display_override member, determining the chosen display mode; unframed explainer — manifest changes

Context and exposure

Source: unframed explainer — manifest changes; Manifest Incubations — determining the chosen display mode

Lifecycle

  1. Manifest processing (install/update): each object entry is converted to a processed override object (display, plus url_patterns when present and a list); malformed entries are skipped.
  2. 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”.
  3. Fixed thereafter: the decision is made once per window. Later navigations or history.pushState()/window.location URL changes do not re-evaluate the patterns — the window keeps the mode it was created with for its whole lifetime.
Source: Manifest Incubations — processing the display_override member; unframed explainer — window creation, window navigation or URL change

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.

Source: unframed explainer — proposed solution

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.

Interim compatibility (source-derived)
Browser / platformSupportEvidence
Chrome desktop152 — listing: “Enabled by default” + “Stepped rollout”; detail record: developer trial behind a flagmilestone=152 listing; ChromeStatus API record
Chrome Android / WebView / iOSNo milestone — not applicableChromeStatus API record
EdgeNot separately reportedChromium-based; no separate position on the record
FirefoxNo signalChromeStatus API record vendor views
SafariN/AChromeStatus API record vendor views

Full analysis and evidence links: overview — browser compatibility.

Source: chromestatus.com/feature/5551475195904000

Security and privacy

Source: unframed explainer — manifest changes, out-of-scope navigation