Skip to content

New Feature: Add browser-level PWA install/launch/uninstall APIs (#15235) - #3523

Merged
kblok merged 1 commit into
masterfrom
implement-upstream-change-15235
Jul 28, 2026
Merged

kblok merged 1 commit into
masterfrom
implement-upstream-change-15235

Conversation

@kblok

@kblok kblok commented Jul 27, 2026

Copy link
Copy Markdown
Member

Summary

Wraps Chromium's browser-scoped PWA CDP domain so you can install, launch, inspect, and uninstall Progressive Web Apps without juggling raw CDP sessions.

var manifestId = await browser.InstallPWAAsync(new InstallPWAOptions
{
    ManifestId = "https://example.com/",
    InstallUrlOrBundleUrl = "https://example.com/index.html",
    DisplayMode = PWADisplayMode.Standalone,
});

var page = await browser.LaunchPWAAsync(new LaunchPWAOptions { ManifestId = manifestId });
var state = await browser.GetPWAStateAsync(new GetPWAStateOptions { ManifestId = manifestId });
await browser.UninstallPWAAsync(new UninstallPWAOptions { ManifestId = manifestId });

A few things worth calling out:

  • The PWA domain only exists over a pipe connection, so these methods require LaunchOptions.Pipe = true. It's unavailable over WebSocket.
  • LaunchPWAAsync gets back a tab target id from PWA.launch, which Puppeteer doesn't expose directly through Targets() — it resolves the tab's child page target instead and returns that Page.
  • BidiBrowser throws NotSupportedException for all four methods since WebDriver BiDi has no equivalent domain (matches how we handle Screens/Extensions today).

Ported from puppeteer/puppeteer#15235.

Test plan

  • dotnet build on PuppeteerSharp.csproj (net8.0/net10.0/netstandard2.0) — 0 warnings, 0 errors
  • New PWATests (install/uninstall, launch default url, launch explicit url, standalone display mode) pass under BROWSER=CHROME PROTOCOL=cdp
  • Existing BrowserTests/ExtensionsTests still pass
  • AOT JSON serialization regression test (SystemTextJsonSerializationContextTests) passes with the new PWA message types registered

…235)

Wraps Chromium's browser-scoped PWA CDP domain so callers can install, launch,
inspect, and uninstall Progressive Web Apps without managing raw sessions.

IBrowser gains InstallPWAAsync, UninstallPWAAsync, LaunchPWAAsync, and
GetPWAStateAsync. These only work over a pipe connection (LaunchOptions.Pipe),
matching Chromium's requirement that the PWA domain isn't exposed over
WebSocket. BidiBrowser throws NotSupportedException since WebDriver BiDi has
no equivalent domain.

LaunchPWAAsync resolves the tab target id returned by PWA.launch to its child
page target, since Puppeteer doesn't expose tab targets directly.

Ported from puppeteer/puppeteer#15235.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xquu2JupndMfRv6FkZwZUh
@kblok
kblok merged commit 2fece2d into master Jul 28, 2026
27 of 28 checks passed
@kblok
kblok deleted the implement-upstream-change-15235 branch July 28, 2026 12:47
sondresjolyst pushed a commit to sondresjolyst/garge-api that referenced this pull request Aug 10, 2026
Updated [PuppeteerSharp](https://github.com/hardkoded/puppeteer-sharp)
from 25.3.4 to 25.4.0.

<details>
<summary>Release notes</summary>

_Sourced from [PuppeteerSharp's
releases](https://github.com/hardkoded/puppeteer-sharp/releases)._

## 25.4.0

## What's Changed
* Roll Chrome to 151.0.7922.47 (#​15237) by @​kblok in
hardkoded/puppeteer-sharp#3524
* New Feature: Add browser-level PWA install/launch/uninstall APIs
(#​15235) by @​kblok in
hardkoded/puppeteer-sharp#3523
* New Feature: Expose Handled getter on Dialog (#​15225) by @​kblok in
hardkoded/puppeteer-sharp#3521
* Fix: don't throw in checkVisibility for a detached text node by
@​kblok in hardkoded/puppeteer-sharp#3525
* Fix: Roll to Firefox 152.0.5 (#​15219) by @​kblok in
hardkoded/puppeteer-sharp#3527
* Fix: combine duplicate BiDi response headers instead of overwriting
(#​15203) by @​kblok in
hardkoded/puppeteer-sharp#3526
* Bump version to 25.4.0 by @​kblok in
hardkoded/puppeteer-sharp#3528


**Full Changelog**:
hardkoded/puppeteer-sharp@v25.3.4...v25.4.0

Commits viewable in [compare
view](hardkoded/puppeteer-sharp@v25.3.4...v25.4.0).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=PuppeteerSharp&package-manager=nuget&previous-version=25.3.4&new-version=25.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant