← Back to release summary

Popup Capability Delegation

Category
Capabilities (Fugu)
Type
New or changed feature
Status
Proposed (Chrome Proposed)
Intent stage
None

WPT details: Frame-to-frame restriction is tested in WPT: https://wpt.fyi/results/html/capability-delegation/frame-capability-delegation-popup-blocked.tentative.html?label=experimental&label=master&aligned End-to-end Service Worker notificationclick popup delegation is tested in Chromium Blink web tests (http/tests/serviceworker/clients-capability-delegation.html) and unit/browser tests (WebFrameTest.CapabilityDelegation*, SecurityExploitBrowserTest) because WPT test_driver does not currently support simulating web notification clicks (testRunner.simulateWebNotificationClick).

Summary

Allows Service Workers to delegate their transient popup capability (acquired from a user interaction like a notification click) to same-origin client windows. This enables client windows to open child (pop-up) windows, such as email previews or chat windows, without being blocked by the popup blocker. This allows developers to take advantage of frame state-sharing performance (e.g. sharing in-memory state via `window.opener`), instead of requiring a new top-level browsing context (which is what `Clients.openWindow` does).

Motivation

Modern web applications rely on Service Worker Notifications to handle background messaging and push notifications. However, this has introduced a capabilities gap compared to the legacy, document-bound Notifications API. In the legacy API, clicking a notification dispatched an `onclick` event directly in the `Window` context, which automatically granted transient user activation to the page, allowing it to call `window.open()` and share application state. With Service Worker notifications, the interaction event runs in the background worker context. If the Service Worker wants an existing tab to open an auxiliary view (such as an email preview or chat popup) that shares live in-memory state, active caches, and WebAssembly modules with the main window, the client window cannot call `window.open()` because it lacks user activation. `Clients.openWindow()` only allows opening a new top-level browsing context, which requires a full cold-start bootstrap. This feature bridges this gap, enabling high-performance, state-sharing popup flows directly from notification clicks without requiring a full page load.

Standards & signals

Ecosystem

Docs: https://github.com/WICG/capability-delegation/blob/main/explainers/popup-delegation.md

Samples: https://googlechrome.github.io/samples/service-worker/capability-delegation-popup/index.html

Explainers: https://github.com/WICG/capability-delegation/blob/main/explainers/popup-delegation.md

View on chromestatus.com