From 961381ec73a9fa2661d92504eab1a6bd6eaffc75 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Fri, 23 Jan 2026 11:37:04 +0100 Subject: [PATCH 01/11] chore: mark 1.58.0 (#38921) --- package-lock.json | 62 +++++++++---------- package.json | 2 +- .../playwright-browser-chromium/package.json | 4 +- .../playwright-browser-firefox/package.json | 4 +- .../playwright-browser-webkit/package.json | 4 +- packages/playwright-chromium/package.json | 4 +- packages/playwright-client/package.json | 2 +- packages/playwright-core/package.json | 2 +- packages/playwright-ct-core/package.json | 6 +- packages/playwright-ct-react/package.json | 4 +- packages/playwright-ct-react17/package.json | 4 +- packages/playwright-ct-svelte/package.json | 4 +- packages/playwright-ct-vue/package.json | 4 +- packages/playwright-firefox/package.json | 4 +- packages/playwright-test/package.json | 4 +- packages/playwright-webkit/package.json | 4 +- packages/playwright/package.json | 4 +- 17 files changed, 61 insertions(+), 61 deletions(-) diff --git a/package-lock.json b/package-lock.json index f236396171ce3..64e5bf75cf4c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "playwright-internal", - "version": "1.58.0-next", + "version": "1.58.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "playwright-internal", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "workspaces": [ "packages/*" @@ -8333,10 +8333,10 @@ "version": "0.0.0" }, "packages/playwright": { - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "bin": { "playwright": "cli.js" @@ -8350,11 +8350,11 @@ }, "packages/playwright-browser-chromium": { "name": "@playwright/browser-chromium", - "version": "1.58.0-next", + "version": "1.58.0", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "engines": { "node": ">=18" @@ -8362,11 +8362,11 @@ }, "packages/playwright-browser-firefox": { "name": "@playwright/browser-firefox", - "version": "1.58.0-next", + "version": "1.58.0", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "engines": { "node": ">=18" @@ -8374,22 +8374,22 @@ }, "packages/playwright-browser-webkit": { "name": "@playwright/browser-webkit", - "version": "1.58.0-next", + "version": "1.58.0", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "engines": { "node": ">=18" } }, "packages/playwright-chromium": { - "version": "1.58.0-next", + "version": "1.58.0", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "bin": { "playwright": "cli.js" @@ -8403,14 +8403,14 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "engines": { "node": ">=18" } }, "packages/playwright-core": { - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -8421,11 +8421,11 @@ }, "packages/playwright-ct-core": { "name": "@playwright/experimental-ct-core", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.0-next", - "playwright-core": "1.58.0-next", + "playwright": "1.58.0", + "playwright-core": "1.58.0", "vite": "^6.4.1" }, "engines": { @@ -8434,10 +8434,10 @@ }, "packages/playwright-ct-react": { "name": "@playwright/experimental-ct-react", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -8449,10 +8449,10 @@ }, "packages/playwright-ct-react17": { "name": "@playwright/experimental-ct-react17", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -8464,10 +8464,10 @@ }, "packages/playwright-ct-svelte": { "name": "@playwright/experimental-ct-svelte", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@sveltejs/vite-plugin-svelte": "^5.1.0" }, "bin": { @@ -8482,10 +8482,10 @@ }, "packages/playwright-ct-vue": { "name": "@playwright/experimental-ct-vue", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@vitejs/plugin-vue": "^5.2.0" }, "bin": { @@ -8496,11 +8496,11 @@ } }, "packages/playwright-firefox": { - "version": "1.58.0-next", + "version": "1.58.0", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "bin": { "playwright": "cli.js" @@ -8511,10 +8511,10 @@ }, "packages/playwright-test": { "name": "@playwright/test", - "version": "1.58.0-next", + "version": "1.58.0", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.0-next" + "playwright": "1.58.0" }, "bin": { "playwright": "cli.js" @@ -8524,11 +8524,11 @@ } }, "packages/playwright-webkit": { - "version": "1.58.0-next", + "version": "1.58.0", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "bin": { "playwright": "cli.js" diff --git a/package.json b/package.json index 3771b7e399e27..f710b4e771417 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "playwright-internal", "private": true, - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate web browsers", "repository": { "type": "git", diff --git a/packages/playwright-browser-chromium/package.json b/packages/playwright-browser-chromium/package.json index 841f438a3a274..8ae65f5aca8ad 100644 --- a/packages/playwright-browser-chromium/package.json +++ b/packages/playwright-browser-chromium/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-chromium", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright package that automatically installs Chromium", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright-browser-firefox/package.json b/packages/playwright-browser-firefox/package.json index b3890b2c67d18..9d04ad67ec616 100644 --- a/packages/playwright-browser-firefox/package.json +++ b/packages/playwright-browser-firefox/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-firefox", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright package that automatically installs Firefox", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright-browser-webkit/package.json b/packages/playwright-browser-webkit/package.json index a8e8adbf2269f..a1dddd41f433f 100644 --- a/packages/playwright-browser-webkit/package.json +++ b/packages/playwright-browser-webkit/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-webkit", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright package that automatically installs WebKit", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright-chromium/package.json b/packages/playwright-chromium/package.json index 655fa268221cd..8a68d98e814f1 100644 --- a/packages/playwright-chromium/package.json +++ b/packages/playwright-chromium/package.json @@ -1,6 +1,6 @@ { "name": "playwright-chromium", - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate Chromium", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright-client/package.json b/packages/playwright-client/package.json index 4110d30408b00..5888ba67849ee 100644 --- a/packages/playwright-client/package.json +++ b/packages/playwright-client/package.json @@ -30,6 +30,6 @@ "watch": "npm run esbuild -- --watch" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright-core/package.json b/packages/playwright-core/package.json index 6b5389b18c451..f9b2961eea587 100644 --- a/packages/playwright-core/package.json +++ b/packages/playwright-core/package.json @@ -1,6 +1,6 @@ { "name": "playwright-core", - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate web browsers", "repository": { "type": "git", diff --git a/packages/playwright-ct-core/package.json b/packages/playwright-ct-core/package.json index 51a848ec5c7e1..af9536d7ceb40 100644 --- a/packages/playwright-ct-core/package.json +++ b/packages/playwright-ct-core/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-core", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright Component Testing Helpers", "repository": { "type": "git", @@ -26,8 +26,8 @@ } }, "dependencies": { - "playwright-core": "1.58.0-next", + "playwright-core": "1.58.0", "vite": "^6.4.1", - "playwright": "1.58.0-next" + "playwright": "1.58.0" } } diff --git a/packages/playwright-ct-react/package.json b/packages/playwright-ct-react/package.json index f1980b709f4ea..71f891146d1d2 100644 --- a/packages/playwright-ct-react/package.json +++ b/packages/playwright-ct-react/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-react", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright Component Testing for React", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@vitejs/plugin-react": "^4.2.1" }, "bin": { diff --git a/packages/playwright-ct-react17/package.json b/packages/playwright-ct-react17/package.json index be5be3d4a8c90..c6f3e0fc47b50 100644 --- a/packages/playwright-ct-react17/package.json +++ b/packages/playwright-ct-react17/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-react17", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright Component Testing for React", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@vitejs/plugin-react": "^4.2.1" }, "bin": { diff --git a/packages/playwright-ct-svelte/package.json b/packages/playwright-ct-svelte/package.json index 54000f529c21f..d4de96d9aff88 100644 --- a/packages/playwright-ct-svelte/package.json +++ b/packages/playwright-ct-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-svelte", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright Component Testing for Svelte", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@sveltejs/vite-plugin-svelte": "^5.1.0" }, "devDependencies": { diff --git a/packages/playwright-ct-vue/package.json b/packages/playwright-ct-vue/package.json index c4b3e671d06d5..aedcf180eb705 100644 --- a/packages/playwright-ct-vue/package.json +++ b/packages/playwright-ct-vue/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-vue", - "version": "1.58.0-next", + "version": "1.58.0", "description": "Playwright Component Testing for Vue", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0-next", + "@playwright/experimental-ct-core": "1.58.0", "@vitejs/plugin-vue": "^5.2.0" }, "bin": { diff --git a/packages/playwright-firefox/package.json b/packages/playwright-firefox/package.json index 399196938e1c7..cc1d5036d8cde 100644 --- a/packages/playwright-firefox/package.json +++ b/packages/playwright-firefox/package.json @@ -1,6 +1,6 @@ { "name": "playwright-firefox", - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate Firefox", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright-test/package.json b/packages/playwright-test/package.json index a94786f05adc5..610a10c151028 100644 --- a/packages/playwright-test/package.json +++ b/packages/playwright-test/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/test", - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate web browsers", "repository": { "type": "git", @@ -30,6 +30,6 @@ }, "scripts": {}, "dependencies": { - "playwright": "1.58.0-next" + "playwright": "1.58.0" } } diff --git a/packages/playwright-webkit/package.json b/packages/playwright-webkit/package.json index 7d470253e4763..ba04564b46eef 100644 --- a/packages/playwright-webkit/package.json +++ b/packages/playwright-webkit/package.json @@ -1,6 +1,6 @@ { "name": "playwright-webkit", - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate WebKit", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" } } diff --git a/packages/playwright/package.json b/packages/playwright/package.json index a5fd355aebf2f..7e220ca95403a 100644 --- a/packages/playwright/package.json +++ b/packages/playwright/package.json @@ -1,6 +1,6 @@ { "name": "playwright", - "version": "1.58.0-next", + "version": "1.58.0", "description": "A high-level API to automate web browsers", "repository": { "type": "git", @@ -64,7 +64,7 @@ }, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0-next" + "playwright-core": "1.58.0" }, "optionalDependencies": { "fsevents": "2.3.2" From aa6ffebf0c33607e03aa85d3e9c35602b31b95b4 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 28 Jan 2026 13:05:55 -0800 Subject: [PATCH 02/11] cherry-pick(#39014): docs: add 1.58 release notes for Java, Python, and C# --- docs/src/release-notes-csharp.md | 36 ++++++++++++++++++++++++++++++++ docs/src/release-notes-java.md | 36 ++++++++++++++++++++++++++++++++ docs/src/release-notes-python.md | 36 ++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/docs/src/release-notes-csharp.md b/docs/src/release-notes-csharp.md index d41f932f71bdc..82cb5896f0af0 100644 --- a/docs/src/release-notes-csharp.md +++ b/docs/src/release-notes-csharp.md @@ -4,6 +4,42 @@ title: "Release notes" toc_max_heading_level: 2 --- +## Version 1.58 + +### UI Mode and Trace Viewer Improvements + +- New 'system' theme option follows your OS dark/light mode preference +- Search functionality (Cmd/Ctrl+F) is now available in code editors +- Network details panel has been reorganized for better usability +- JSON responses are now automatically formatted for readability + +Thanks to [@cpAdm](https://github.com/cpAdm) for contributing these improvements! + +### Miscellaneous + +[`method: BrowserType.connectOverCDP`] now accepts an `IsLocal` option. When set to `true`, it tells Playwright that it runs on the same host as the CDP server, enabling file system optimizations. + +### Breaking Changes ⚠️ + +- Removed `_react` and `_vue` selectors. See [locators guide](./locators.md) for alternatives. + +- Removed `:light` selector engine suffix. Use standard CSS selectors instead. + +- Option `Devtools` from [`method: BrowserType.launch`] has been removed. Use `Args = new[] { "--auto-open-devtools-for-tabs" }` instead. + +- Removed macOS 13 support for WebKit. We recommend to upgrade your macOS version, or keep using an older Playwright version. + +### Browser Versions + +- Chromium 145.0.7632.6 +- Mozilla Firefox 146.0.1 +- WebKit 26.0 + +This version was also tested against the following stable channels: + +- Google Chrome 144 +- Microsoft Edge 144 + ## Version 1.57 ### Chrome for Testing diff --git a/docs/src/release-notes-java.md b/docs/src/release-notes-java.md index 5081bef05fa61..04ba163829e25 100644 --- a/docs/src/release-notes-java.md +++ b/docs/src/release-notes-java.md @@ -4,6 +4,42 @@ title: "Release notes" toc_max_heading_level: 2 --- +## Version 1.58 + +### UI Mode and Trace Viewer Improvements + +- New 'system' theme option follows your OS dark/light mode preference +- Search functionality (Cmd/Ctrl+F) is now available in code editors +- Network details panel has been reorganized for better usability +- JSON responses are now automatically formatted for readability + +Thanks to [@cpAdm](https://github.com/cpAdm) for contributing these improvements! + +### Miscellaneous + +[`method: BrowserType.connectOverCDP`] now accepts an `isLocal` option. When set to `true`, it tells Playwright that it runs on the same host as the CDP server, enabling file system optimizations. + +### Breaking Changes ⚠️ + +- Removed `_react` and `_vue` selectors. See [locators guide](./locators.md) for alternatives. + +- Removed `:light` selector engine suffix. Use standard CSS selectors instead. + +- Option `devtools` from [`method: BrowserType.launch`] has been removed. Use `setArgs(Arrays.asList("--auto-open-devtools-for-tabs"))` instead. + +- Removed macOS 13 support for WebKit. We recommend to upgrade your macOS version, or keep using an older Playwright version. + +### Browser Versions + +- Chromium 145.0.7632.6 +- Mozilla Firefox 146.0.1 +- WebKit 26.0 + +This version was also tested against the following stable channels: + +- Google Chrome 144 +- Microsoft Edge 144 + ## Version 1.57 ### Chrome for Testing diff --git a/docs/src/release-notes-python.md b/docs/src/release-notes-python.md index ae51bad27174b..95d8d3eb337fa 100644 --- a/docs/src/release-notes-python.md +++ b/docs/src/release-notes-python.md @@ -4,6 +4,42 @@ title: "Release notes" toc_max_heading_level: 2 --- +## Version 1.58 + +### UI Mode and Trace Viewer Improvements + +- New 'system' theme option follows your OS dark/light mode preference +- Search functionality (Cmd/Ctrl+F) is now available in code editors +- Network details panel has been reorganized for better usability +- JSON responses are now automatically formatted for readability + +Thanks to [@cpAdm](https://github.com/cpAdm) for contributing these improvements! + +### Miscellaneous + +[`method: BrowserType.connectOverCDP`] now accepts an `is_local` option. When set to `True`, it tells Playwright that it runs on the same host as the CDP server, enabling file system optimizations. + +### Breaking Changes ⚠️ + +- Removed `_react` and `_vue` selectors. See [locators guide](./locators.md) for alternatives. + +- Removed `:light` selector engine suffix. Use standard CSS selectors instead. + +- Option `devtools` from [`method: BrowserType.launch`] has been removed. Use `args=['--auto-open-devtools-for-tabs']` instead. + +- Removed macOS 13 support for WebKit. We recommend to upgrade your macOS version, or keep using an older Playwright version. + +### Browser Versions + +- Chromium 145.0.7632.6 +- Mozilla Firefox 146.0.1 +- WebKit 26.0 + +This version was also tested against the following stable channels: + +- Google Chrome 144 +- Microsoft Edge 144 + ## Version 1.57 ### Chrome for Testing From ab8136c375310d2a1e3edb9cbcfadff817b8fca5 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 30 Jan 2026 13:36:11 +0000 Subject: [PATCH 03/11] cherry-pick(#39037): chore: update cft download location (#39052) --- packages/playwright-core/src/server/registry/index.ts | 4 ++-- .../installation/playwright-cli-install-should-work.spec.ts | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/playwright-core/src/server/registry/index.ts b/packages/playwright-core/src/server/registry/index.ts index 0024a9eede2ca..07ef404b32fc4 100644 --- a/packages/playwright-core/src/server/registry/index.ts +++ b/packages/playwright-core/src/server/registry/index.ts @@ -130,9 +130,9 @@ type DownloadPathFunction = (params: BrowsersJSONDescriptor) => { path: string, function cftUrl(suffix: string): DownloadPathFunction { return ({ browserVersion }) => { return { - path: `${browserVersion}/${suffix}`, + path: `builds/cft/${browserVersion}/${suffix}`, mirrors: [ - 'https://cdn.playwright.dev/chrome-for-testing-public', + 'https://cdn.playwright.dev', ], }; }; diff --git a/tests/installation/playwright-cli-install-should-work.spec.ts b/tests/installation/playwright-cli-install-should-work.spec.ts index 973097dd444f0..ea8d9ecea1f0b 100755 --- a/tests/installation/playwright-cli-install-should-work.spec.ts +++ b/tests/installation/playwright-cli-install-should-work.spec.ts @@ -85,11 +85,7 @@ test('install command should work with mirror that uses chunked encoding', async await exec('npm i playwright'); const server = http.createServer(async (req, res) => { try { - const upstream = await fetch( - req.url.startsWith('/builds/') - ? 'https://cdn.playwright.dev/dbazure/download/playwright' + req.url - : 'https://cdn.playwright.dev/chrome-for-testing-public' + req.url - ); + const upstream = await fetch('https://cdn.playwright.dev' + req.url); const headers = new Headers(upstream.headers); headers.delete('content-length'); res.writeHead(upstream.status, Object.fromEntries(headers)); From f07234d2a0a5d88ec987c82ab8749db158154e3d Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 30 Jan 2026 13:36:24 +0000 Subject: [PATCH 04/11] cherry-pick(#39036): fix(msedge): fix local network permissions (#39053) Co-authored-by: Pavel Feldman --- .../src/server/chromium/crBrowser.ts | 26 ++++++++++++++----- tests/library/permissions.spec.ts | 1 - 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/playwright-core/src/server/chromium/crBrowser.ts b/packages/playwright-core/src/server/chromium/crBrowser.ts index fe3f114c61c93..83cb12d2eec47 100644 --- a/packages/playwright-core/src/server/chromium/crBrowser.ts +++ b/packages/playwright-core/src/server/chromium/crBrowser.ts @@ -452,13 +452,25 @@ export class CRBrowserContext extends BrowserContext { ['local-fonts', 'localFonts'], ['local-network-access', ['localNetworkAccess', 'localNetwork', 'loopbackNetwork']], ]); - const filtered = permissions.flatMap(permission => { - const protocolPermission = webPermissionToProtocol.get(permission); - if (!protocolPermission) - throw new Error('Unknown permission: ' + permission); - return typeof protocolPermission === 'string' ? [protocolPermission] : protocolPermission; - }); - await this._browser._session.send('Browser.grantPermissions', { origin: origin === '*' ? undefined : origin, browserContextId: this._browserContextId, permissions: filtered }); + + const grantPermissions = async (mapping: Map) => { + const filtered = permissions.flatMap(permission => { + const protocolPermission = mapping.get(permission); + if (!protocolPermission) + throw new Error('Unknown permission: ' + permission); + return typeof protocolPermission === 'string' ? [protocolPermission] : protocolPermission; + }); + await this._browser._session.send('Browser.grantPermissions', { origin: origin === '*' ? undefined : origin, browserContextId: this._browserContextId, permissions: filtered }); + }; + + try { + await grantPermissions(webPermissionToProtocol); + } catch (e) { + // Old stable browsers dislike the new permission name, so we use the fallback mapping. + const fallbackMapping = new Map(webPermissionToProtocol); + fallbackMapping.set('local-network-access', ['localNetworkAccess']); + await grantPermissions(fallbackMapping); + } } async doClearPermissions() { diff --git a/tests/library/permissions.spec.ts b/tests/library/permissions.spec.ts index 6965554b40dbe..d5d73f3fae7fb 100644 --- a/tests/library/permissions.spec.ts +++ b/tests/library/permissions.spec.ts @@ -258,7 +258,6 @@ it('local network request is allowed from public origin', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/37861' } }, async ({ page, context, server, browserName, channel, browserMajorVersion }) => { it.skip(browserName === 'webkit'); - it.skip(channel?.startsWith('msedge')); it.skip(browserName === 'chromium' && browserMajorVersion < 145, 'local-network-access permission support has changed between versions'); if (browserName === 'chromium') From ad625fe2b6214967369ee06a80ebf580835cf5da Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 30 Jan 2026 14:58:54 +0000 Subject: [PATCH 05/11] chore: mark v1.58.1 (#39055) --- package-lock.json | 62 +++++++++---------- package.json | 2 +- .../playwright-browser-chromium/package.json | 4 +- .../playwright-browser-firefox/package.json | 4 +- .../playwright-browser-webkit/package.json | 4 +- packages/playwright-chromium/package.json | 4 +- packages/playwright-client/package.json | 2 +- packages/playwright-core/package.json | 2 +- packages/playwright-ct-core/package.json | 6 +- packages/playwright-ct-react/package.json | 4 +- packages/playwright-ct-react17/package.json | 4 +- packages/playwright-ct-svelte/package.json | 4 +- packages/playwright-ct-vue/package.json | 4 +- packages/playwright-firefox/package.json | 4 +- packages/playwright-test/package.json | 4 +- packages/playwright-webkit/package.json | 4 +- packages/playwright/package.json | 4 +- 17 files changed, 61 insertions(+), 61 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64e5bf75cf4c8..a25fb09e2f891 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "playwright-internal", - "version": "1.58.0", + "version": "1.58.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "playwright-internal", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "workspaces": [ "packages/*" @@ -8333,10 +8333,10 @@ "version": "0.0.0" }, "packages/playwright": { - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -8350,11 +8350,11 @@ }, "packages/playwright-browser-chromium": { "name": "@playwright/browser-chromium", - "version": "1.58.0", + "version": "1.58.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "engines": { "node": ">=18" @@ -8362,11 +8362,11 @@ }, "packages/playwright-browser-firefox": { "name": "@playwright/browser-firefox", - "version": "1.58.0", + "version": "1.58.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "engines": { "node": ">=18" @@ -8374,22 +8374,22 @@ }, "packages/playwright-browser-webkit": { "name": "@playwright/browser-webkit", - "version": "1.58.0", + "version": "1.58.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "engines": { "node": ">=18" } }, "packages/playwright-chromium": { - "version": "1.58.0", + "version": "1.58.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -8403,14 +8403,14 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "engines": { "node": ">=18" } }, "packages/playwright-core": { - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -8421,11 +8421,11 @@ }, "packages/playwright-ct-core": { "name": "@playwright/experimental-ct-core", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.0", - "playwright-core": "1.58.0", + "playwright": "1.58.1", + "playwright-core": "1.58.1", "vite": "^6.4.1" }, "engines": { @@ -8434,10 +8434,10 @@ }, "packages/playwright-ct-react": { "name": "@playwright/experimental-ct-react", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -8449,10 +8449,10 @@ }, "packages/playwright-ct-react17": { "name": "@playwright/experimental-ct-react17", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -8464,10 +8464,10 @@ }, "packages/playwright-ct-svelte": { "name": "@playwright/experimental-ct-svelte", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@sveltejs/vite-plugin-svelte": "^5.1.0" }, "bin": { @@ -8482,10 +8482,10 @@ }, "packages/playwright-ct-vue": { "name": "@playwright/experimental-ct-vue", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@vitejs/plugin-vue": "^5.2.0" }, "bin": { @@ -8496,11 +8496,11 @@ } }, "packages/playwright-firefox": { - "version": "1.58.0", + "version": "1.58.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -8511,10 +8511,10 @@ }, "packages/playwright-test": { "name": "@playwright/test", - "version": "1.58.0", + "version": "1.58.1", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.0" + "playwright": "1.58.1" }, "bin": { "playwright": "cli.js" @@ -8524,11 +8524,11 @@ } }, "packages/playwright-webkit": { - "version": "1.58.0", + "version": "1.58.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "bin": { "playwright": "cli.js" diff --git a/package.json b/package.json index f710b4e771417..a6f277581d749 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "playwright-internal", "private": true, - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate web browsers", "repository": { "type": "git", diff --git a/packages/playwright-browser-chromium/package.json b/packages/playwright-browser-chromium/package.json index 8ae65f5aca8ad..55e3b9c29a354 100644 --- a/packages/playwright-browser-chromium/package.json +++ b/packages/playwright-browser-chromium/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-chromium", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright package that automatically installs Chromium", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright-browser-firefox/package.json b/packages/playwright-browser-firefox/package.json index 9d04ad67ec616..96c34aede818e 100644 --- a/packages/playwright-browser-firefox/package.json +++ b/packages/playwright-browser-firefox/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-firefox", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright package that automatically installs Firefox", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright-browser-webkit/package.json b/packages/playwright-browser-webkit/package.json index a1dddd41f433f..c0e6a6af62a78 100644 --- a/packages/playwright-browser-webkit/package.json +++ b/packages/playwright-browser-webkit/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-webkit", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright package that automatically installs WebKit", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright-chromium/package.json b/packages/playwright-chromium/package.json index 8a68d98e814f1..c335e76d0dede 100644 --- a/packages/playwright-chromium/package.json +++ b/packages/playwright-chromium/package.json @@ -1,6 +1,6 @@ { "name": "playwright-chromium", - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate Chromium", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright-client/package.json b/packages/playwright-client/package.json index 5888ba67849ee..df4379b12d8f1 100644 --- a/packages/playwright-client/package.json +++ b/packages/playwright-client/package.json @@ -30,6 +30,6 @@ "watch": "npm run esbuild -- --watch" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright-core/package.json b/packages/playwright-core/package.json index f9b2961eea587..cf3b6eb540901 100644 --- a/packages/playwright-core/package.json +++ b/packages/playwright-core/package.json @@ -1,6 +1,6 @@ { "name": "playwright-core", - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate web browsers", "repository": { "type": "git", diff --git a/packages/playwright-ct-core/package.json b/packages/playwright-ct-core/package.json index af9536d7ceb40..47cdc42c2e5a6 100644 --- a/packages/playwright-ct-core/package.json +++ b/packages/playwright-ct-core/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-core", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright Component Testing Helpers", "repository": { "type": "git", @@ -26,8 +26,8 @@ } }, "dependencies": { - "playwright-core": "1.58.0", + "playwright-core": "1.58.1", "vite": "^6.4.1", - "playwright": "1.58.0" + "playwright": "1.58.1" } } diff --git a/packages/playwright-ct-react/package.json b/packages/playwright-ct-react/package.json index 71f891146d1d2..6a35fc416584e 100644 --- a/packages/playwright-ct-react/package.json +++ b/packages/playwright-ct-react/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-react", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright Component Testing for React", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { diff --git a/packages/playwright-ct-react17/package.json b/packages/playwright-ct-react17/package.json index c6f3e0fc47b50..2d1cfdbd0c9d2 100644 --- a/packages/playwright-ct-react17/package.json +++ b/packages/playwright-ct-react17/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-react17", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright Component Testing for React", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { diff --git a/packages/playwright-ct-svelte/package.json b/packages/playwright-ct-svelte/package.json index d4de96d9aff88..0c356468eff94 100644 --- a/packages/playwright-ct-svelte/package.json +++ b/packages/playwright-ct-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-svelte", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright Component Testing for Svelte", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@sveltejs/vite-plugin-svelte": "^5.1.0" }, "devDependencies": { diff --git a/packages/playwright-ct-vue/package.json b/packages/playwright-ct-vue/package.json index aedcf180eb705..e723593909ce7 100644 --- a/packages/playwright-ct-vue/package.json +++ b/packages/playwright-ct-vue/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-vue", - "version": "1.58.0", + "version": "1.58.1", "description": "Playwright Component Testing for Vue", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.0", + "@playwright/experimental-ct-core": "1.58.1", "@vitejs/plugin-vue": "^5.2.0" }, "bin": { diff --git a/packages/playwright-firefox/package.json b/packages/playwright-firefox/package.json index cc1d5036d8cde..e140af738887a 100644 --- a/packages/playwright-firefox/package.json +++ b/packages/playwright-firefox/package.json @@ -1,6 +1,6 @@ { "name": "playwright-firefox", - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate Firefox", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright-test/package.json b/packages/playwright-test/package.json index 610a10c151028..1cc97e107ef58 100644 --- a/packages/playwright-test/package.json +++ b/packages/playwright-test/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/test", - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate web browsers", "repository": { "type": "git", @@ -30,6 +30,6 @@ }, "scripts": {}, "dependencies": { - "playwright": "1.58.0" + "playwright": "1.58.1" } } diff --git a/packages/playwright-webkit/package.json b/packages/playwright-webkit/package.json index ba04564b46eef..963c26cfe1b5a 100644 --- a/packages/playwright-webkit/package.json +++ b/packages/playwright-webkit/package.json @@ -1,6 +1,6 @@ { "name": "playwright-webkit", - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate WebKit", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" } } diff --git a/packages/playwright/package.json b/packages/playwright/package.json index 7e220ca95403a..3c0c4292764e3 100644 --- a/packages/playwright/package.json +++ b/packages/playwright/package.json @@ -1,6 +1,6 @@ { "name": "playwright", - "version": "1.58.0", + "version": "1.58.1", "description": "A high-level API to automate web browsers", "repository": { "type": "git", @@ -64,7 +64,7 @@ }, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.0" + "playwright-core": "1.58.1" }, "optionalDependencies": { "fsevents": "2.3.2" From 97bc385142cfb498a59219442d8032ca2e1d79fe Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 27 Jan 2026 11:25:00 -0800 Subject: [PATCH 06/11] cherry-pick(#38995): chore(webkit): disable frame sessions on fronzen builds --- packages/playwright-core/src/server/webkit/wkPage.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 0bdb92c031185..ec4b71b1e8038 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -34,6 +34,7 @@ import { WKInterceptableRequest, WKRouteImpl } from './wkInterceptableRequest'; import { WKProvisionalPage } from './wkProvisionalPage'; import { WKWorkers } from './wkWorkers'; import { translatePathToWSL } from './webkit'; +import { registry } from '../registry'; import type { Protocol } from './protocol'; import type { WKBrowserContext } from './wkBrowser'; @@ -46,7 +47,7 @@ import type * as types from '../types'; const UTILITY_WORLD_NAME = '__playwright_utility_world__'; -const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS; +const enableFrameSessions = !process.env.WK_DISABLE_FRAME_SESSIONS && parseInt(registry.findExecutable('webkit').revision!, 10) >= 2245; export class WKPage implements PageDelegate { readonly rawMouse: RawMouseImpl; From 8684e0834f368cd1ff4973ab7c36c4775c1038a4 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 5 Feb 2026 16:32:03 +0100 Subject: [PATCH 07/11] cherry-pick(#39121): fix(trace viewer): make paths via stdin work Co-authored-by: li-zhixin --- .../src/server/trace/viewer/traceViewer.ts | 10 +++++----- .../playwright-core/src/server/utils/httpServer.ts | 2 +- tests/library/trace-viewer.spec.ts | 13 +++++++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts index 0e83a15f387f7..39ea55ee0f026 100644 --- a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts +++ b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts @@ -55,7 +55,7 @@ export type TraceViewerAppOptions = { const tracesDirMarker = 'traces.dir'; -function validateTraceUrl(traceFileOrUrl: string | undefined): string | undefined { +function validateTraceUrlOrPath(traceFileOrUrl: string | undefined): string | undefined { if (!traceFileOrUrl) return traceFileOrUrl; @@ -152,7 +152,7 @@ export async function installRootRedirect(server: HttpServer, traceUrl: string | } export async function runTraceViewerApp(traceUrl: string | undefined, browserName: string, options: TraceViewerServerOptions & { headless?: boolean }, exitOnClose?: boolean) { - traceUrl = validateTraceUrl(traceUrl); + traceUrl = validateTraceUrlOrPath(traceUrl); const server = await startTraceViewerServer(options); await installRootRedirect(server, traceUrl, options); const page = await openTraceViewerApp(server.urlPrefix('precise'), browserName, options); @@ -162,7 +162,7 @@ export async function runTraceViewerApp(traceUrl: string | undefined, browserNam } export async function runTraceInBrowser(traceUrl: string | undefined, options: TraceViewerServerOptions) { - traceUrl = validateTraceUrl(traceUrl); + traceUrl = validateTraceUrlOrPath(traceUrl); const server = await startTraceViewerServer(options); await installRootRedirect(server, traceUrl, options); await openTraceInBrowser(server.urlPrefix('human-readable')); @@ -216,8 +216,8 @@ class StdinServer implements Transport { constructor() { process.stdin.on('data', data => { - const url = data.toString().trim(); - if (url === this._traceUrl) + const url = validateTraceUrlOrPath(data.toString().trim()); + if (!url || url === this._traceUrl) return; if (url.endsWith('.json')) this._pollLoadTrace(url); diff --git a/packages/playwright-core/src/server/utils/httpServer.ts b/packages/playwright-core/src/server/utils/httpServer.ts index 92a46aac1762f..cb08f27eb2e36 100644 --- a/packages/playwright-core/src/server/utils/httpServer.ts +++ b/packages/playwright-core/src/server/utils/httpServer.ts @@ -115,7 +115,7 @@ export class HttpServer { this._port = address.port; const resolvedHost = address.family === 'IPv4' ? address.address : `[${address.address}]`; this._urlPrefixPrecise = `http://${resolvedHost}:${address.port}`; - this._urlPrefixHumanReadable = `http://${host}:${address.port}`; + this._urlPrefixHumanReadable = `http://${host ?? 'localhost'}:${address.port}`; } } diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index 0e03f7fb1d094..706197fb0e1d6 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -2248,3 +2248,16 @@ test('should capture iframe with srcdoc', async ({ page, server, runAndTrace }) const frame = await traceViewer.snapshotFrame('Evaluate'); await expect(frame.frameLocator('iframe').getByRole('button')).toHaveText('Hello iframe'); }); + +test('take trace paths via stdin', async ({ childProcess, page }) => { + const cliEntrypoint = path.join(__dirname, '../../packages/playwright-core/cli.js'); + const cp = childProcess({ command: ['node', cliEntrypoint, 'show-trace', '--port', '0', '--stdin'] }); + await cp.waitForOutput('Listening on'); + const url = cp.output.match(/Listening on (http:\/\/[^\s]+)/)![1]; + await page.goto(url); + await expect(page).toHaveTitle('Playwright Trace Viewer'); + cp.write(traceFile); + await expect(page.locator('.action-title')).toContainText([ + /Create page/, + ]); +}); From f3dcf50a2e7ddb225431b9a5e53804bdb8a25311 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 5 Feb 2026 10:09:23 +0000 Subject: [PATCH 08/11] cherry-pick(#39129): fix: do not force swiftshader on chromium mac --- .../src/server/bidi/bidiChromium.ts | 3 ++- .../src/server/chromium/chromium.ts | 8 +++++--- .../src/server/utils/hostPlatform.ts | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/playwright-core/src/server/bidi/bidiChromium.ts b/packages/playwright-core/src/server/bidi/bidiChromium.ts index 7445f08269ba6..b65b769c1a913 100644 --- a/packages/playwright-core/src/server/bidi/bidiChromium.ts +++ b/packages/playwright-core/src/server/bidi/bidiChromium.ts @@ -23,6 +23,7 @@ import { kBrowserCloseMessageId } from './bidiConnection'; import { chromiumSwitches } from '../chromium/chromiumSwitches'; import { RecentLogsCollector } from '../utils/debugLogger'; import { waitForReadyState } from '../chromium/chromium'; +import { hasGpuMac } from '../utils/hostPlatform'; import type { BrowserOptions } from '../browser'; import type { SdkObject } from '../instrumentation'; @@ -114,7 +115,7 @@ export class BidiChromium extends BrowserType { throw new Error('Arguments can not specify page to be opened'); const chromeArguments = [...chromiumSwitches(options.assistantMode)]; - if (os.platform() === 'darwin') { + if (os.platform() !== 'darwin' || !hasGpuMac()) { // See https://issues.chromium.org/issues/40277080 chromeArguments.push('--enable-unsafe-swiftshader'); } diff --git a/packages/playwright-core/src/server/chromium/chromium.ts b/packages/playwright-core/src/server/chromium/chromium.ts index b7d2dd294d5ef..bcc69d40f161b 100644 --- a/packages/playwright-core/src/server/chromium/chromium.ts +++ b/packages/playwright-core/src/server/chromium/chromium.ts @@ -22,7 +22,7 @@ import path from 'path'; import { chromiumSwitches } from './chromiumSwitches'; import { CRBrowser } from './crBrowser'; import { kBrowserCloseMessageId } from './crConnection'; -import { debugMode, headersArrayToObject, headersObjectToArray, } from '../../utils'; +import { debugMode, hasGpuMac, headersArrayToObject, headersObjectToArray } from '../../utils'; import { wrapInASCIIBox } from '../utils/ascii'; import { RecentLogsCollector } from '../utils/debugLogger'; import { ManualPromise } from '../../utils/isomorphic/manualPromise'; @@ -313,8 +313,10 @@ export class Chromium extends BrowserType { throw new Error('Arguments can not specify page to be opened'); const chromeArguments = [...chromiumSwitches(options.assistantMode, options.channel)]; - // See https://issues.chromium.org/issues/40277080 - chromeArguments.push('--enable-unsafe-swiftshader'); + if (os.platform() !== 'darwin' || !hasGpuMac()) { + // See https://issues.chromium.org/issues/40277080 + chromeArguments.push('--enable-unsafe-swiftshader'); + } if (options.headless) { chromeArguments.push('--headless'); diff --git a/packages/playwright-core/src/server/utils/hostPlatform.ts b/packages/playwright-core/src/server/utils/hostPlatform.ts index 635d65d3d98ce..8df9ceb34281a 100644 --- a/packages/playwright-core/src/server/utils/hostPlatform.ts +++ b/packages/playwright-core/src/server/utils/hostPlatform.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { execSync } from 'child_process'; import os from 'os'; import { getLinuxDistributionInfoSync } from './linuxUtils'; @@ -133,3 +134,17 @@ function toShortPlatform(hostPlatform: HostPlatform): ShortPlatform { } export const shortPlatform = toShortPlatform(hostPlatform); + +let hasGpuMacValue: boolean | undefined; + +export function hasGpuMac() { + try { + if (hasGpuMacValue === undefined) { + const output = execSync('system_profiler SPDisplaysDataType').toString(); + hasGpuMacValue = output.includes('Metal: Supported') || output.includes('Metal Support: Metal'); + } + return hasGpuMacValue; + } catch (e) { + return false; + } +} From 50b7296be7208c275b12004f4703b8086ee45dfd Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 5 Feb 2026 19:38:21 +0000 Subject: [PATCH 09/11] cherry-pick(#39152): chore: fix execSync inheriting stdio --- packages/playwright-core/src/server/utils/hostPlatform.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-core/src/server/utils/hostPlatform.ts b/packages/playwright-core/src/server/utils/hostPlatform.ts index 8df9ceb34281a..4e6cba85a5f77 100644 --- a/packages/playwright-core/src/server/utils/hostPlatform.ts +++ b/packages/playwright-core/src/server/utils/hostPlatform.ts @@ -140,7 +140,7 @@ let hasGpuMacValue: boolean | undefined; export function hasGpuMac() { try { if (hasGpuMacValue === undefined) { - const output = execSync('system_profiler SPDisplaysDataType').toString(); + const output = execSync('system_profiler SPDisplaysDataType', { stdio: ['ignore', 'pipe', 'ignore'] }).toString(); hasGpuMacValue = output.includes('Metal: Supported') || output.includes('Metal Support: Metal'); } return hasGpuMacValue; From e40c137ebeb0221a56f968ac41c66287e8e2c810 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 5 Feb 2026 20:16:13 +0000 Subject: [PATCH 10/11] chore: mark v1.58.2 (#39155) --- package-lock.json | 62 +++++++++---------- package.json | 2 +- .../playwright-browser-chromium/package.json | 4 +- .../playwright-browser-firefox/package.json | 4 +- .../playwright-browser-webkit/package.json | 4 +- packages/playwright-chromium/package.json | 4 +- packages/playwright-client/package.json | 2 +- packages/playwright-core/package.json | 2 +- packages/playwright-ct-core/package.json | 6 +- packages/playwright-ct-react/package.json | 4 +- packages/playwright-ct-react17/package.json | 4 +- packages/playwright-ct-svelte/package.json | 4 +- packages/playwright-ct-vue/package.json | 4 +- packages/playwright-firefox/package.json | 4 +- packages/playwright-test/package.json | 4 +- packages/playwright-webkit/package.json | 4 +- packages/playwright/package.json | 4 +- 17 files changed, 61 insertions(+), 61 deletions(-) diff --git a/package-lock.json b/package-lock.json index a25fb09e2f891..39d5444ccec94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "playwright-internal", - "version": "1.58.1", + "version": "1.58.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "playwright-internal", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "workspaces": [ "packages/*" @@ -8333,10 +8333,10 @@ "version": "0.0.0" }, "packages/playwright": { - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -8350,11 +8350,11 @@ }, "packages/playwright-browser-chromium": { "name": "@playwright/browser-chromium", - "version": "1.58.1", + "version": "1.58.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "engines": { "node": ">=18" @@ -8362,11 +8362,11 @@ }, "packages/playwright-browser-firefox": { "name": "@playwright/browser-firefox", - "version": "1.58.1", + "version": "1.58.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "engines": { "node": ">=18" @@ -8374,22 +8374,22 @@ }, "packages/playwright-browser-webkit": { "name": "@playwright/browser-webkit", - "version": "1.58.1", + "version": "1.58.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "engines": { "node": ">=18" } }, "packages/playwright-chromium": { - "version": "1.58.1", + "version": "1.58.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -8403,14 +8403,14 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "engines": { "node": ">=18" } }, "packages/playwright-core": { - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -8421,11 +8421,11 @@ }, "packages/playwright-ct-core": { "name": "@playwright/experimental-ct-core", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.1", - "playwright-core": "1.58.1", + "playwright": "1.58.2", + "playwright-core": "1.58.2", "vite": "^6.4.1" }, "engines": { @@ -8434,10 +8434,10 @@ }, "packages/playwright-ct-react": { "name": "@playwright/experimental-ct-react", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -8449,10 +8449,10 @@ }, "packages/playwright-ct-react17": { "name": "@playwright/experimental-ct-react17", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@vitejs/plugin-react": "^4.2.1" }, "bin": { @@ -8464,10 +8464,10 @@ }, "packages/playwright-ct-svelte": { "name": "@playwright/experimental-ct-svelte", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@sveltejs/vite-plugin-svelte": "^5.1.0" }, "bin": { @@ -8482,10 +8482,10 @@ }, "packages/playwright-ct-vue": { "name": "@playwright/experimental-ct-vue", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@vitejs/plugin-vue": "^5.2.0" }, "bin": { @@ -8496,11 +8496,11 @@ } }, "packages/playwright-firefox": { - "version": "1.58.1", + "version": "1.58.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -8511,10 +8511,10 @@ }, "packages/playwright-test": { "name": "@playwright/test", - "version": "1.58.1", + "version": "1.58.2", "license": "Apache-2.0", "dependencies": { - "playwright": "1.58.1" + "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" @@ -8524,11 +8524,11 @@ } }, "packages/playwright-webkit": { - "version": "1.58.1", + "version": "1.58.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" diff --git a/package.json b/package.json index a6f277581d749..90474ee37699e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "playwright-internal", "private": true, - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate web browsers", "repository": { "type": "git", diff --git a/packages/playwright-browser-chromium/package.json b/packages/playwright-browser-chromium/package.json index 55e3b9c29a354..ed52082ceaef7 100644 --- a/packages/playwright-browser-chromium/package.json +++ b/packages/playwright-browser-chromium/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-chromium", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright package that automatically installs Chromium", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright-browser-firefox/package.json b/packages/playwright-browser-firefox/package.json index 96c34aede818e..4b1ebe642d049 100644 --- a/packages/playwright-browser-firefox/package.json +++ b/packages/playwright-browser-firefox/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-firefox", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright package that automatically installs Firefox", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright-browser-webkit/package.json b/packages/playwright-browser-webkit/package.json index c0e6a6af62a78..6cb381c82c560 100644 --- a/packages/playwright-browser-webkit/package.json +++ b/packages/playwright-browser-webkit/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/browser-webkit", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright package that automatically installs WebKit", "repository": { "type": "git", @@ -27,6 +27,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright-chromium/package.json b/packages/playwright-chromium/package.json index c335e76d0dede..f81233908fe76 100644 --- a/packages/playwright-chromium/package.json +++ b/packages/playwright-chromium/package.json @@ -1,6 +1,6 @@ { "name": "playwright-chromium", - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate Chromium", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright-client/package.json b/packages/playwright-client/package.json index df4379b12d8f1..54886f90dfa10 100644 --- a/packages/playwright-client/package.json +++ b/packages/playwright-client/package.json @@ -30,6 +30,6 @@ "watch": "npm run esbuild -- --watch" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright-core/package.json b/packages/playwright-core/package.json index cf3b6eb540901..1a9356d24c360 100644 --- a/packages/playwright-core/package.json +++ b/packages/playwright-core/package.json @@ -1,6 +1,6 @@ { "name": "playwright-core", - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate web browsers", "repository": { "type": "git", diff --git a/packages/playwright-ct-core/package.json b/packages/playwright-ct-core/package.json index 47cdc42c2e5a6..469bbd5eb23fa 100644 --- a/packages/playwright-ct-core/package.json +++ b/packages/playwright-ct-core/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-core", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright Component Testing Helpers", "repository": { "type": "git", @@ -26,8 +26,8 @@ } }, "dependencies": { - "playwright-core": "1.58.1", + "playwright-core": "1.58.2", "vite": "^6.4.1", - "playwright": "1.58.1" + "playwright": "1.58.2" } } diff --git a/packages/playwright-ct-react/package.json b/packages/playwright-ct-react/package.json index 6a35fc416584e..1033b694de231 100644 --- a/packages/playwright-ct-react/package.json +++ b/packages/playwright-ct-react/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-react", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright Component Testing for React", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@vitejs/plugin-react": "^4.2.1" }, "bin": { diff --git a/packages/playwright-ct-react17/package.json b/packages/playwright-ct-react17/package.json index 2d1cfdbd0c9d2..54e5df32d2d36 100644 --- a/packages/playwright-ct-react17/package.json +++ b/packages/playwright-ct-react17/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-react17", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright Component Testing for React", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@vitejs/plugin-react": "^4.2.1" }, "bin": { diff --git a/packages/playwright-ct-svelte/package.json b/packages/playwright-ct-svelte/package.json index 0c356468eff94..2c2c678a83009 100644 --- a/packages/playwright-ct-svelte/package.json +++ b/packages/playwright-ct-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-svelte", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright Component Testing for Svelte", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@sveltejs/vite-plugin-svelte": "^5.1.0" }, "devDependencies": { diff --git a/packages/playwright-ct-vue/package.json b/packages/playwright-ct-vue/package.json index e723593909ce7..ec219f09733dd 100644 --- a/packages/playwright-ct-vue/package.json +++ b/packages/playwright-ct-vue/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/experimental-ct-vue", - "version": "1.58.1", + "version": "1.58.2", "description": "Playwright Component Testing for Vue", "repository": { "type": "git", @@ -30,7 +30,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@playwright/experimental-ct-core": "1.58.1", + "@playwright/experimental-ct-core": "1.58.2", "@vitejs/plugin-vue": "^5.2.0" }, "bin": { diff --git a/packages/playwright-firefox/package.json b/packages/playwright-firefox/package.json index e140af738887a..4150becc33ecd 100644 --- a/packages/playwright-firefox/package.json +++ b/packages/playwright-firefox/package.json @@ -1,6 +1,6 @@ { "name": "playwright-firefox", - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate Firefox", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright-test/package.json b/packages/playwright-test/package.json index 1cc97e107ef58..56748d924bbe4 100644 --- a/packages/playwright-test/package.json +++ b/packages/playwright-test/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/test", - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate web browsers", "repository": { "type": "git", @@ -30,6 +30,6 @@ }, "scripts": {}, "dependencies": { - "playwright": "1.58.1" + "playwright": "1.58.2" } } diff --git a/packages/playwright-webkit/package.json b/packages/playwright-webkit/package.json index 963c26cfe1b5a..0a6e2718d64da 100644 --- a/packages/playwright-webkit/package.json +++ b/packages/playwright-webkit/package.json @@ -1,6 +1,6 @@ { "name": "playwright-webkit", - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate WebKit", "repository": { "type": "git", @@ -30,6 +30,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" } } diff --git a/packages/playwright/package.json b/packages/playwright/package.json index 3c0c4292764e3..8f807f632325f 100644 --- a/packages/playwright/package.json +++ b/packages/playwright/package.json @@ -1,6 +1,6 @@ { "name": "playwright", - "version": "1.58.1", + "version": "1.58.2", "description": "A high-level API to automate web browsers", "repository": { "type": "git", @@ -64,7 +64,7 @@ }, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.1" + "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" From ce480a952553175eae75342aad2c5e86cdf2cbba Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 6 Feb 2026 13:41:44 +0000 Subject: [PATCH 11/11] cherry-pick(#39171): devops: add ubuntu-22.04-arm bot --- .github/workflows/tests_primary.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/tests_primary.yml b/.github/workflows/tests_primary.yml index ebf04581f1028..6258a602d1ff8 100644 --- a/.github/workflows/tests_primary.yml +++ b/.github/workflows/tests_primary.yml @@ -43,6 +43,9 @@ jobs: - os: ubuntu-22.04 node-version: 24 browser: chromium + - os: ubuntu-22.04-arm + node-version: 20 + browser: chromium runs-on: ${{ matrix.os }} permissions: id-token: write # This is required for OIDC login (azure/login) to succeed