From f944809c4aa81d951e32e62b1583c245411a2859 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Tue, 11 Feb 2025 12:52:43 +0100 Subject: [PATCH 1/3] fix: allow relative userDataDir --- packages/playwright-core/src/server/browserType.ts | 2 ++ tests/library/defaultbrowsercontext-2.spec.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/packages/playwright-core/src/server/browserType.ts b/packages/playwright-core/src/server/browserType.ts index 62ec63011e961..a1121693b5002 100644 --- a/packages/playwright-core/src/server/browserType.ts +++ b/packages/playwright-core/src/server/browserType.ts @@ -188,6 +188,8 @@ export abstract class BrowserType extends SdkObject { tempDirectories.push(artifactsDir); if (userDataDir) { + if (!path.isAbsolute(userDataDir)) + userDataDir = path.resolve(userDataDir); // Firefox bails if the profile directory does not exist, Chrome creates it. We ensure consistent behavior here. if (!await existsAsync(userDataDir)) await fs.promises.mkdir(userDataDir, { recursive: true, mode: 0o700 }); diff --git a/tests/library/defaultbrowsercontext-2.spec.ts b/tests/library/defaultbrowsercontext-2.spec.ts index e16dc6b0bad44..abf616161e114 100644 --- a/tests/library/defaultbrowsercontext-2.spec.ts +++ b/tests/library/defaultbrowsercontext-2.spec.ts @@ -101,6 +101,20 @@ it('should accept userDataDir', async ({ createUserDataDir, browserType }) => { expect(fs.readdirSync(userDataDir).length).toBeGreaterThan(0); }); +it('should accept relative userDataDir', async ({ createUserDataDir, browserType }) => { + const userDataDir = await createUserDataDir(); + const cwd = process.cwd(); + try { + console.log(userDataDir); + process.chdir(userDataDir); + const context = await browserType.launchPersistentContext('foobar'); + expect(fs.readdirSync(path.join(userDataDir, 'foobar')).length).toBeGreaterThan(0); + await context.close(); + } finally { + process.chdir(cwd); + } +}); + it('should restore state from userDataDir', async ({ browserType, server, createUserDataDir, isMac, browserName }) => { it.slow(); From 5764a761929f2158820aaffcb04a43724f1a3560 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Tue, 11 Feb 2025 14:24:55 +0100 Subject: [PATCH 2/3] review feedback --- packages/playwright-core/src/client/browserType.ts | 4 +++- packages/playwright-core/src/server/browserType.ts | 2 +- tests/library/defaultbrowsercontext-2.spec.ts | 13 +++---------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/playwright-core/src/client/browserType.ts b/packages/playwright-core/src/client/browserType.ts index 36b9fe4d7ee12..bc1f4536e0451 100644 --- a/packages/playwright-core/src/client/browserType.ts +++ b/packages/playwright-core/src/client/browserType.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import path from 'path'; + import { Browser } from './browser'; import { BrowserContext, prepareBrowserContextParams } from './browserContext'; import { ChannelOwner } from './channelOwner'; @@ -97,7 +99,7 @@ export class BrowserType extends ChannelOwner imple ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs), env: options.env ? envObjectToArray(options.env) : undefined, channel: options.channel, - userDataDir, + userDataDir: path.isAbsolute(userDataDir) ? userDataDir : path.resolve(userDataDir), }; return await this._wrapApiCall(async () => { const result = await this._channel.launchPersistentContext(persistentParams); diff --git a/packages/playwright-core/src/server/browserType.ts b/packages/playwright-core/src/server/browserType.ts index a1121693b5002..47586a42fd134 100644 --- a/packages/playwright-core/src/server/browserType.ts +++ b/packages/playwright-core/src/server/browserType.ts @@ -189,7 +189,7 @@ export abstract class BrowserType extends SdkObject { if (userDataDir) { if (!path.isAbsolute(userDataDir)) - userDataDir = path.resolve(userDataDir); + throw new Error('userDataDir must be an absolute path'); // Firefox bails if the profile directory does not exist, Chrome creates it. We ensure consistent behavior here. if (!await existsAsync(userDataDir)) await fs.promises.mkdir(userDataDir, { recursive: true, mode: 0o700 }); diff --git a/tests/library/defaultbrowsercontext-2.spec.ts b/tests/library/defaultbrowsercontext-2.spec.ts index abf616161e114..f3f273724a4dc 100644 --- a/tests/library/defaultbrowsercontext-2.spec.ts +++ b/tests/library/defaultbrowsercontext-2.spec.ts @@ -103,16 +103,9 @@ it('should accept userDataDir', async ({ createUserDataDir, browserType }) => { it('should accept relative userDataDir', async ({ createUserDataDir, browserType }) => { const userDataDir = await createUserDataDir(); - const cwd = process.cwd(); - try { - console.log(userDataDir); - process.chdir(userDataDir); - const context = await browserType.launchPersistentContext('foobar'); - expect(fs.readdirSync(path.join(userDataDir, 'foobar')).length).toBeGreaterThan(0); - await context.close(); - } finally { - process.chdir(cwd); - } + const context = await browserType.launchPersistentContext(path.relative(process.cwd(), path.join(userDataDir, 'foobar'))); + expect(fs.readdirSync(path.join(userDataDir, 'foobar')).length).toBeGreaterThan(0); + await context.close(); }); it('should restore state from userDataDir', async ({ browserType, server, createUserDataDir, isMac, browserName }) => { From 5fba87f84e693740648888cf3484a53168dd38b4 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Tue, 11 Feb 2025 15:40:47 +0100 Subject: [PATCH 3/3] assert --- packages/playwright-core/src/server/browserType.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/playwright-core/src/server/browserType.ts b/packages/playwright-core/src/server/browserType.ts index 47586a42fd134..49238d5391265 100644 --- a/packages/playwright-core/src/server/browserType.ts +++ b/packages/playwright-core/src/server/browserType.ts @@ -20,7 +20,7 @@ import * as path from 'path'; import { normalizeProxySettings, validateBrowserContextOptions } from './browserContext'; import { DEFAULT_TIMEOUT, TimeoutSettings } from '../common/timeoutSettings'; -import { ManualPromise, debugMode } from '../utils'; +import { ManualPromise, assert, debugMode } from '../utils'; import { helper } from './helper'; import { SdkObject } from './instrumentation'; import { PipeTransport } from './pipeTransport'; @@ -188,8 +188,7 @@ export abstract class BrowserType extends SdkObject { tempDirectories.push(artifactsDir); if (userDataDir) { - if (!path.isAbsolute(userDataDir)) - throw new Error('userDataDir must be an absolute path'); + assert(path.isAbsolute(userDataDir), 'userDataDir must be an absolute path'); // Firefox bails if the profile directory does not exist, Chrome creates it. We ensure consistent behavior here. if (!await existsAsync(userDataDir)) await fs.promises.mkdir(userDataDir, { recursive: true, mode: 0o700 });