From 9fbc0a60e049f36eaf2d847b2d9b46cdfb267352 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 3 Jun 2026 10:59:33 -0700 Subject: [PATCH 1/4] fix(trace): capture attribute mutations after a popup document swap (#41086) --- .../trace/recorder/snapshotterInjected.ts | 21 ++++++++++++--- tests/library/trace-viewer.spec.ts | 26 +++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts b/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts index 13bfcf09d741a..dc4927cc56267 100644 --- a/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts +++ b/packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts @@ -73,6 +73,8 @@ export function frameSnapshotStreamer(snapshotStreamer: string, removeNoScript: return obj[kCachedData]; } + const kObserverConfig: MutationObserverInit = { attributes: true, subtree: true }; + function removeHash(url: string) { try { const u = new URL(url); @@ -90,6 +92,7 @@ export function frameSnapshotStreamer(snapshotStreamer: string, removeNoScript: private _readingStyleSheet = false; // To avoid invalidating due to our own reads. private _fakeBase: HTMLBaseElement; private _observer: MutationObserver; + private _observedDocument: Document | undefined; private _targetGeneration = 0; constructor() { @@ -116,9 +119,7 @@ export function frameSnapshotStreamer(snapshotStreamer: string, removeNoScript: this._fakeBase = document.createElement('base'); this._observer = new MutationObserver(list => this._handleMutations(list)); - const observerConfig = { attributes: true, subtree: true }; - this._observer.observe(document, observerConfig); - this._refreshListenersWhenNeeded(); + this._ensureObservingCurrentDocument(); } private _refreshListenersWhenNeeded() { @@ -210,6 +211,19 @@ export function frameSnapshotStreamer(snapshotStreamer: string, removeNoScript: ensureCachedData(mutation.target).attributesCached = undefined; } + private _ensureObservingCurrentDocument() { + // A window can swap its document without re-running the init script (e.g. + // a popup reusing its initial about:blank document), leaving our observers + // and listeners bound to the stale one. Re-attach on swap. + // https://github.com/microsoft/playwright/issues/40895 + if (this._observedDocument === document) + return; + this._observedDocument = document; + this._observer.disconnect(); + this._observer.observe(document, kObserverConfig); + this._refreshListenersWhenNeeded(); + } + private _invalidateStyleSheet(sheet: CSSStyleSheet) { if (this._readingStyleSheet) return; @@ -347,6 +361,7 @@ export function frameSnapshotStreamer(snapshotStreamer: string, removeNoScript: let shadowDomNesting = 0; let headNesting = 0; + this._ensureObservingCurrentDocument(); // Ensure we are up to date. this._handleMutations(this._observer.takeRecords()); diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index eb2008452f5b0..b5a2b3903b876 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -681,6 +681,32 @@ test('should popup snapshot', async ({ page, runAndTrace, server }) => { await expect(popup.frameLocator('iframe').getByText('hello äöü 🙂')).toBeVisible(); }); +test('should capture attribute mutations inside a popup window', { + annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/40895' } +}, async ({ page, server, runAndTrace }) => { + server.setRoute('/popup.html', (req, res) => { + res.end(` + + +
overlay
+ + `); + }); + + const traceViewer = await runAndTrace(async () => { + await page.goto(server.EMPTY_PAGE); + const [popup] = await Promise.all([ + page.waitForEvent('popup'), + page.evaluate(url => window.open(url, 'popup', 'popup'), server.PREFIX + '/popup.html'), + ]); + await popup.getByRole('button', { name: 'Hide' }).click(); + await expect(popup.locator('#overlay')).toBeHidden(); + }); + + const frame = await traceViewer.snapshotFrame('Click'); + await expect(frame.locator('#overlay')).toHaveClass('no-display'); +}); + test('should capture iframe with sandbox attribute', async ({ page, server, runAndTrace }) => { await page.route('**/empty.html', route => { void route.fulfill({ From f5f0bef392c9b245140f48285ae9723541016551 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 3 Jun 2026 11:37:31 -0700 Subject: [PATCH 2/4] chore(mcp): remove dead saveTrace config references (#41119) --- .../playwright-core/src/tools/backend/context.ts | 14 -------------- .../playwright-core/src/tools/mcp/configIni.ts | 1 - tests/mcp/config.ini.spec.ts | 4 ++-- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/playwright-core/src/tools/backend/context.ts b/packages/playwright-core/src/tools/backend/context.ts index 9a24a2ad0f927..d95462452d37f 100644 --- a/packages/playwright-core/src/tools/backend/context.ts +++ b/packages/playwright-core/src/tools/backend/context.ts @@ -48,7 +48,6 @@ export type ContextConfig = { outputMaxSize?: number; outputMode?: 'file' | 'stdout'; saveSession?: boolean; - saveTrace?: boolean; secrets?: Record; snapshot?: { mode?: 'full' | 'none'; @@ -327,19 +326,6 @@ export class Context { const browserContext = this._rawBrowserContext; await this._setupRequestInterception(browserContext); - if (this.config.saveTrace) { - await browserContext.tracing.start({ - name: 'trace-' + Date.now(), - screenshots: true, - snapshots: true, - live: true, - }); - this._disposables.push({ - dispose: async () => { - await browserContext.tracing.stop(); - }, - }); - } for (const initScript of this.config.browser?.initScript || []) this._disposables.push(await browserContext.addInitScript({ path: path.resolve(this.options.cwd, initScript) })); diff --git a/packages/playwright-core/src/tools/mcp/configIni.ts b/packages/playwright-core/src/tools/mcp/configIni.ts index 6198dcba6c7e3..5b66a113b075d 100644 --- a/packages/playwright-core/src/tools/mcp/configIni.ts +++ b/packages/playwright-core/src/tools/mcp/configIni.ts @@ -157,7 +157,6 @@ const longhandTypes: Record = { 'extension': 'boolean', 'capabilities': 'string[]', 'saveSession': 'boolean', - 'saveTrace': 'boolean', 'saveVideo': 'size', 'sharedBrowserContext': 'boolean', 'outputDir': 'string', diff --git a/tests/mcp/config.ini.spec.ts b/tests/mcp/config.ini.spec.ts index 9746d09adad8c..809fc192c773e 100644 --- a/tests/mcp/config.ini.spec.ts +++ b/tests/mcp/config.ini.spec.ts @@ -105,7 +105,7 @@ test('ini config boolean values', async ({ startClient }) => { const { client } = await startClient({ config: ` capabilities = config - saveTrace = true + saveSession = true browser.contextOptions.bypassCSP = true browser.contextOptions.javaScriptEnabled = false `, @@ -113,7 +113,7 @@ test('ini config boolean values', async ({ startClient }) => { const result = await client.callTool({ name: 'browser_get_config' }); const config = JSON.parse(parseResponse(result).result); - expect(config.saveTrace).toBe(true); + expect(config.saveSession).toBe(true); expect(config.browser.contextOptions.bypassCSP).toBe(true); expect(config.browser.contextOptions.javaScriptEnabled).toBe(false); }); From f1c29818474bb109493660edbe171b94de7ac71c Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 3 Jun 2026 11:48:22 -0700 Subject: [PATCH 3/4] docs: remove stray HTML comment from webview2 guide (#41122) --- docs/src/webview2.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/src/webview2.md b/docs/src/webview2.md index 7aef7216ca57b..6e8fc62b2fddc 100644 --- a/docs/src/webview2.md +++ b/docs/src/webview2.md @@ -68,8 +68,6 @@ By default, the WebView2 control will use the same user data directory for all i Using the following, Playwright will run your WebView2 application as a sub-process, assign a unique user data directory to it and provide the [Page] instance to your test: - - ```js title="webView2Test.ts" import { test as base } from '@playwright/test'; import fs from 'fs'; From 16601141918a7163b87a7ec84060451f6c1bbbfd Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 3 Jun 2026 13:48:15 -0700 Subject: [PATCH 4/4] chore(trace): remove retain-all-failures trace and video mode (#41123) --- docs/src/test-api/class-testoptions.md | 10 ++--- docs/src/test-cli-js.md | 2 +- packages/playwright/src/index.ts | 2 - packages/playwright/src/program.ts | 2 +- packages/playwright/src/worker/testTracing.ts | 5 --- packages/playwright/types/test.d.ts | 8 +--- tests/playwright-test/playwright.spec.ts | 28 ------------ .../playwright-test/playwright.trace.spec.ts | 44 +------------------ utils/generate_types/overrides-test.d.ts | 4 +- 9 files changed, 11 insertions(+), 94 deletions(-) diff --git a/docs/src/test-api/class-testoptions.md b/docs/src/test-api/class-testoptions.md index fdf956d6a6645..475d51821d7c4 100644 --- a/docs/src/test-api/class-testoptions.md +++ b/docs/src/test-api/class-testoptions.md @@ -584,8 +584,8 @@ export default defineConfig({ ## property: TestOptions.trace * since: v1.10 -- type: <[Object]|[TraceMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"retain-on-first-failure"|"retain-on-failure-and-retries"|"retain-all-failures">> - - `mode` <[TraceMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"on-all-retries"|"retain-on-first-failure"|"retain-on-failure-and-retries"|"retain-all-failures">> Trace recording mode. +- type: <[Object]|[TraceMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"retain-on-first-failure"|"retain-on-failure-and-retries">> + - `mode` <[TraceMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"on-all-retries"|"retain-on-first-failure"|"retain-on-failure-and-retries">> Trace recording mode. - `attachments` ?<[boolean]> Whether to include test attachments. Defaults to true. Optional. - `screenshots` ?<[boolean]> Whether to capture screenshots during tracing. Screenshots are used to build a timeline preview. Defaults to true. Optional. - `snapshots` ?<[boolean]> Whether to capture DOM snapshot on every action. Defaults to true. Optional. @@ -599,7 +599,6 @@ Whether to record trace for each test. Defaults to `'off'`. * `'retain-on-failure'`: Record trace for each test. When test run passes, remove the recorded trace. * `'retain-on-first-failure'`: Record trace for the first run of each test, but not for retries. When test run passes, remove the recorded trace. * `'retain-on-failure-and-retries'`: Record trace for each test run. Retains all traces when an attempt fails. -* `'retain-all-failures'`: Record trace for each test run. Retains the trace only for attempts that failed, regardless of the final test outcome. For more control, pass an object that specifies `mode` and trace features to enable. @@ -634,8 +633,8 @@ export default defineConfig({ ## property: TestOptions.video * since: v1.10 -- type: <[Object]|[VideoMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"on-all-retries"|"retain-on-first-failure"|"retain-on-failure-and-retries"|"retain-all-failures">> - - `mode` <[VideoMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"on-all-retries"|"retain-on-first-failure"|"retain-on-failure-and-retries"|"retain-all-failures">> Video recording mode. +- type: <[Object]|[VideoMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"on-all-retries"|"retain-on-first-failure"|"retain-on-failure-and-retries">> + - `mode` <[VideoMode]<"off"|"on"|"retain-on-failure"|"on-first-retry"|"on-all-retries"|"retain-on-first-failure"|"retain-on-failure-and-retries">> Video recording mode. - `size` ?<[Object]> Size of the recorded video. Optional. - `width` <[int]> - `height` <[int]> @@ -657,7 +656,6 @@ Whether to record video for each test. Defaults to `'off'`. * `'retain-on-failure'`: Record video for each test. When test run passes, remove the recorded video. * `'retain-on-first-failure'`: Record video for the first run of each test, but not for retries. When test run passes, remove the recorded video. * `'retain-on-failure-and-retries'`: Record video for each test run. Retains all videos when an attempt fails. -* `'retain-all-failures'`: Record video for each test run. Retains the video only for attempts that failed, regardless of the final test outcome. To control video size, pass an object with `mode` and `size` properties. If video size is not specified, it will be equal to [`property: TestOptions.viewport`] scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. diff --git a/docs/src/test-cli-js.md b/docs/src/test-cli-js.md index d5803a9b1aad8..85171da62fe4c 100644 --- a/docs/src/test-cli-js.md +++ b/docs/src/test-cli-js.md @@ -107,7 +107,7 @@ npx playwright test --ui | `--test-list ` | Path to a file containing a list of tests to run. See [test list](#test-list) for details. | | `--test-list-invert ` | Path to a file containing a list of tests to skip. See [test list](#test-list) for details. | | `--timeout ` | Specify test timeout threshold in milliseconds, zero for unlimited (default: 30 seconds). | -| `--trace ` | Force tracing mode, can be `on`, `off`, `on-first-retry`, `on-all-retries`, `retain-on-failure`, `retain-on-first-failure`, `retain-on-failure-and-retries`, `retain-all-failures`. | +| `--trace ` | Force tracing mode, can be `on`, `off`, `on-first-retry`, `on-all-retries`, `retain-on-failure`, `retain-on-first-failure`, `retain-on-failure-and-retries`. | | `--tsconfig ` | Path to a single tsconfig applicable to all imported files (default: look up tsconfig for each imported file separately). | | `--ui` | Run tests in interactive UI mode. | | `--ui-host ` | Host to serve UI on; specifying this option opens UI in a browser tab. | diff --git a/packages/playwright/src/index.ts b/packages/playwright/src/index.ts index 0c393abf8e770..e27f1b91c226f 100644 --- a/packages/playwright/src/index.ts +++ b/packages/playwright/src/index.ts @@ -523,7 +523,6 @@ function shouldCaptureVideo(videoMode: VideoMode, testInfo: TestInfo) { return videoMode === 'on' || videoMode === 'retain-on-failure' || videoMode === 'retain-on-failure-and-retries' - || videoMode === 'retain-all-failures' || (videoMode === 'on-first-retry' && testInfo.retry === 1) || (videoMode === 'on-all-retries' && testInfo.retry > 0) || (videoMode === 'retain-on-first-failure' && testInfo.retry === 0); @@ -538,7 +537,6 @@ function shouldPreserveVideo(videoMode: VideoMode, testInfo: TestInfo) { return true; case 'retain-on-failure': case 'retain-on-first-failure': - case 'retain-all-failures': return testFailed; case 'retain-on-failure-and-retries': return testFailed || testInfo.retry > 0; diff --git a/packages/playwright/src/program.ts b/packages/playwright/src/program.ts index c03283cf8e64a..242f7eee8b7e5 100644 --- a/packages/playwright/src/program.ts +++ b/packages/playwright/src/program.ts @@ -183,7 +183,7 @@ function addInitAgentsCommand(program: Command) { }); } -const kTraceModes: TraceMode[] = ['on', 'off', 'on-first-retry', 'on-all-retries', 'retain-on-failure', 'retain-on-first-failure', 'retain-on-failure-and-retries', 'retain-all-failures']; +const kTraceModes: TraceMode[] = ['on', 'off', 'on-first-retry', 'on-all-retries', 'retain-on-failure', 'retain-on-first-failure', 'retain-on-failure-and-retries']; // Note: update docs/src/test-cli-js.md when you update this, program is the source of truth. diff --git a/packages/playwright/src/worker/testTracing.ts b/packages/playwright/src/worker/testTracing.ts index 8a0d275dfe2a3..27132bc7fda4d 100644 --- a/packages/playwright/src/worker/testTracing.ts +++ b/packages/playwright/src/worker/testTracing.ts @@ -90,9 +90,6 @@ export class TestTracing { if (this._options?.mode === 'retain-on-failure-and-retries') return true; - if (this._options?.mode === 'retain-all-failures') - return true; - return false; } @@ -171,8 +168,6 @@ export class TestTracing { const testFailed = this._testInfo.status !== this._testInfo.expectedStatus; if (this._options.mode === 'retain-on-failure-and-retries') return !testFailed && this._testInfo.retry === 0; - if (this._options.mode === 'retain-all-failures') - return !testFailed; return !testFailed && (this._options.mode === 'retain-on-failure' || this._options.mode === 'retain-on-first-failure'); } diff --git a/packages/playwright/types/test.d.ts b/packages/playwright/types/test.d.ts index b42fc1477adc8..2ec8436b50cb1 100644 --- a/packages/playwright/types/test.d.ts +++ b/packages/playwright/types/test.d.ts @@ -6999,8 +6999,6 @@ export interface PlaywrightWorkerOptions { * - `'retain-on-first-failure'`: Record trace for the first run of each test, but not for retries. When test run * passes, remove the recorded trace. * - `'retain-on-failure-and-retries'`: Record trace for each test run. Retains all traces when an attempt fails. - * - `'retain-all-failures'`: Record trace for each test run. Retains the trace only for attempts that failed, - * regardless of the final test outcome. * * For more control, pass an object that specifies `mode` and trace features to enable. * @@ -7030,8 +7028,6 @@ export interface PlaywrightWorkerOptions { * - `'retain-on-first-failure'`: Record video for the first run of each test, but not for retries. When test run * passes, remove the recorded video. * - `'retain-on-failure-and-retries'`: Record video for each test run. Retains all videos when an attempt fails. - * - `'retain-all-failures'`: Record video for each test run. Retains the video only for attempts that failed, - * regardless of the final test outcome. * * To control video size, pass an object with `mode` and `size` properties. If video size is not specified, it will be * equal to [testOptions.viewport](https://playwright.dev/docs/api/class-testoptions#test-options-viewport) scaled @@ -7061,8 +7057,8 @@ export interface PlaywrightWorkerOptions { } export type ScreenshotMode = 'off' | 'on' | 'only-on-failure' | 'on-first-failure'; -export type TraceMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries' | 'retain-all-failures'; -export type VideoMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries' | 'retain-all-failures'; +export type TraceMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries'; +export type VideoMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries'; /** * Playwright Test provides many options to configure test environment, * [Browser](https://playwright.dev/docs/api/class-browser), diff --git a/tests/playwright-test/playwright.spec.ts b/tests/playwright-test/playwright.spec.ts index fa3b4e37e5ec6..d3214690c221e 100644 --- a/tests/playwright-test/playwright.spec.ts +++ b/tests/playwright-test/playwright.spec.ts @@ -617,34 +617,6 @@ test('should work with video: retain-on-failure-and-retries', async ({ runInline expect(fs.readdirSync(dirRetry).find(file => file.endsWith('webm'))).toBeTruthy(); }); -test('should work with video: retain-all-failures', async ({ runInlineTest }) => { - const result = await runInlineTest({ - 'playwright.config.ts': ` - module.exports = { use: { video: 'retain-all-failures' }, retries: 1, name: 'chromium' }; - `, - 'a.test.ts': ` - import { test, expect } from '@playwright/test'; - test('flaky', async ({ page }) => { - await page.setContent('
FLAKY
'); - await page.waitForTimeout(1000); - test.expect(test.info().retry).toBe(1); - }); - `, - }, { workers: 1 }); - - expect(result.exitCode).toBe(0); - expect(result.flaky).toBe(1); - - // First attempt failed, video retained. - const dirFail = test.info().outputPath('test-results', 'a-flaky-chromium'); - expect(fs.readdirSync(dirFail).find(file => file.endsWith('webm'))).toBeTruthy(); - - // Retry passed, so its video is removed. - const dirRetry = test.info().outputPath('test-results', 'a-flaky-chromium-retry1'); - const videoRetry = fs.existsSync(dirRetry) ? fs.readdirSync(dirRetry).find(file => file.endsWith('webm')) : undefined; - expect(videoRetry).toBeFalsy(); -}); - test('should work with video size', async ({ runInlineTest }) => { const result = await runInlineTest({ 'playwright.config.js': ` diff --git a/tests/playwright-test/playwright.trace.spec.ts b/tests/playwright-test/playwright.trace.spec.ts index c85fe3bd9d083..78ebd785be167 100644 --- a/tests/playwright-test/playwright.trace.spec.ts +++ b/tests/playwright-test/playwright.trace.spec.ts @@ -386,7 +386,7 @@ test('should respect --trace', async ({ runInlineTest }, testInfo) => { expect(fs.existsSync(testInfo.outputPath('test-results', 'a-test-1', 'trace.zip'))).toBeTruthy(); }); -for (const mode of ['off', 'retain-on-failure', 'on-first-retry', 'on-all-retries', 'retain-on-first-failure', 'retain-on-failure-and-retries', 'retain-all-failures']) { +for (const mode of ['off', 'retain-on-failure', 'on-first-retry', 'on-all-retries', 'retain-on-first-failure', 'retain-on-failure-and-retries']) { test(`trace:${mode} should not create trace zip artifact if page test passed`, async ({ runInlineTest }) => { const result = await runInlineTest({ 'a.spec.ts': ` @@ -1196,48 +1196,6 @@ test('trace:retain-on-failure-and-retries should keep all traces when test fails expect(fs.existsSync(retryTracePath)).toBeTruthy(); }); -test('trace:retain-all-failures should keep traces only for failed attempts when test is flaky', async ({ runInlineTest }, testInfo) => { - const result = await runInlineTest({ - 'a.spec.ts': ` - import { test, expect } from '@playwright/test'; - test('flaky', async ({ page }) => { - await page.goto('about:blank'); - expect(test.info().retry).toBe(2); - }); - `, - }, { trace: 'retain-all-failures', retries: 2 }); - - expect(result.exitCode).toBe(0); - expect(result.flaky).toBe(1); - - const firstRunTracePath = testInfo.outputPath('test-results', 'a-flaky', 'trace.zip'); - expect(fs.existsSync(firstRunTracePath)).toBeTruthy(); - const retry1TracePath = testInfo.outputPath('test-results', 'a-flaky-retry1', 'trace.zip'); - expect(fs.existsSync(retry1TracePath)).toBeTruthy(); - const retry2TracePath = testInfo.outputPath('test-results', 'a-flaky-retry2', 'trace.zip'); - expect(fs.existsSync(retry2TracePath)).toBeFalsy(); -}); - -test('trace:retain-all-failures should keep all traces when test fails on every attempt', async ({ runInlineTest }, testInfo) => { - const result = await runInlineTest({ - 'a.spec.ts': ` - import { test, expect } from '@playwright/test'; - test('fail', async ({ page }) => { - await page.goto('about:blank'); - expect(true).toBe(false); - }); - `, - }, { trace: 'retain-all-failures', retries: 1 }); - - expect(result.exitCode).toBe(1); - expect(result.failed).toBe(1); - - const firstRunTracePath = testInfo.outputPath('test-results', 'a-fail', 'trace.zip'); - expect(fs.existsSync(firstRunTracePath)).toBeTruthy(); - const retryTracePath = testInfo.outputPath('test-results', 'a-fail-retry1', 'trace.zip'); - expect(fs.existsSync(retryTracePath)).toBeTruthy(); -}); - test('should not corrupt actions when no library trace is present', async ({ runInlineTest }) => { const result = await runInlineTest({ 'a.spec.ts': ` diff --git a/utils/generate_types/overrides-test.d.ts b/utils/generate_types/overrides-test.d.ts index 0a6c79c18776a..5710bd4b2e091 100644 --- a/utils/generate_types/overrides-test.d.ts +++ b/utils/generate_types/overrides-test.d.ts @@ -267,8 +267,8 @@ export interface PlaywrightWorkerOptions { } export type ScreenshotMode = 'off' | 'on' | 'only-on-failure' | 'on-first-failure'; -export type TraceMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries' | 'retain-all-failures'; -export type VideoMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries' | 'retain-all-failures'; +export type TraceMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries'; +export type VideoMode = 'off' | 'on' | 'retain-on-failure' | 'on-first-retry' | 'on-all-retries' | 'retain-on-first-failure' | 'retain-on-failure-and-retries'; export interface PlaywrightTestOptions { acceptDownloads: boolean; bypassCSP: boolean;