Contact emails
dmu...@google.com
Explainer
https://github.com/WICG/capability-delegation/blob/main/explainers/popup-delegation.md
Specification
No information provided
Design docs
https://github.com/WICG/capability-delegation/blob/main/explainers/popup-delegation.md
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).
Blink component
UI>Notifications
Web Feature ID
Missing feature
Search tags
capability delegation,
popup,
notification,
pop-up
Goals for experimentation
None
Risks
Interoperability and Compatibility
Low compatibility risk: this is an opt-in extension ({delegate: 'popup'}) to ServiceWorkerClient.postMessage(). Existing callers are unaffected, and developers can gracefully fall back to clients.openWindow() inside a try/catch if the browser does not support popup capability delegation. Interoperability risk is that other browser engines have not yet implemented the Capability Delegation API or its Service Worker extension (
https://github.com/WICG/capability-delegation/issues/42).
Gecko: No signal
WebKit: No signal
Web developers: Positive (
https://github.com/WICG/capability-delegation/issues/42) Directly requested by web application partners (e.g., email and chat applications) that need certain notification clicks to open lightweight auxiliary/preview popup windows sharing state with an existing client window rather than forcing a full top-level navigation via clients.openWindow().
Other signals:
Ergonomics
None. Used in tandem with the Notifications API (notificationclick in Service Workers), Clients.matchAll(), WindowClient.focus(), and window.open() on the receiving Window. Calling await client.focus() is explicitly decoupled from the popup delegation token so focusing the client window first does not consume the popup capability.
Activation
Low. Feature detection and fallback are straightforward: if client.postMessage(msg, {delegate: 'popup'}) throws NotSupportedError (or if no WindowClient is open), the Service Worker can fall back to clients.openWindow(url).
Security
Popup capability delegation is restricted strictly to Service Workers with active transient window-interaction privileges (e.g., during a notificationclick event) posting to a same-origin WindowClient:
- Delegating 'popup' from a Window (window.postMessage) is rejected with NotSupportedError and enforced in the browser process (RenderFrameProxyHost::RouteMessageEvent / ServiceWorkerContainerHostForClient::PostMessageToClient).
- Delegating 'popup' without an active notification click throws NotAllowedError.
- Both the Service Worker sender token (5s window) and the client window receiver token (1s window) are single-use and short-lived.
WebView application risks
Does this intent deprecate or change behavior of existing APIs,
such that it has potentially high risk for Android WebView-based
applications?
No information provided
Debuggability
Standard DevTools console and exception debugging apply when postMessage(..., {delegate: 'popup'}) throws NotSupportedError (unsupported context/target) or NotAllowedError (missing or already-consumed transient activation).
Will this feature be supported on all six Blink platforms
(Windows, Mac, Linux, ChromeOS, Android, and Android WebView)?
Yes
The Blink and //content capability delegation plumbing is enabled across all platforms, though opening auxiliary popup windows via window.open() from an existing client window is primarily targeted at desktop platforms where multi-window popups are used alongside persistent web clients.
No
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).
DevTrial instructions
https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/capability-delegation-popup/README.md
Flag name on about://flags
enable-experimental-web-platform-features
Finch feature name
CapabilityDelegationPopup
Requires code in //chrome?
False
Tracking bug
https://issues.chromium.org/issues/542314185
Estimated milestones
| DevTrial on desktop | 157 |
| DevTrial on Android | 157 |
Link to entry on the Chrome Platform Status
https://chromestatus.com/feature/5091965583622144
Links to previous Intent discussions
Intent to Prototype:
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/6a711a6f.b7546e61.256888.01d2.GAE%40google.com