Skip to content

Commit 416c9b3

Browse files
authored
fix: allow relative userDataDir (#34710)
1 parent 72cd6f0 commit 416c9b3

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

packages/playwright-core/src/client/browserType.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17+
import path from 'path';
18+
1719
import { Browser } from './browser';
1820
import { BrowserContext, prepareBrowserContextParams } from './browserContext';
1921
import { ChannelOwner } from './channelOwner';
@@ -98,7 +100,7 @@ export class BrowserType extends ChannelOwner<channels.BrowserTypeChannel> imple
98100
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
99101
env: options.env ? envObjectToArray(options.env) : undefined,
100102
channel: options.channel,
101-
userDataDir,
103+
userDataDir: path.isAbsolute(userDataDir) ? userDataDir : path.resolve(userDataDir),
102104
};
103105
return await this._wrapApiCall(async () => {
104106
const result = await this._channel.launchPersistentContext(persistentParams);

packages/playwright-core/src/server/browserType.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import * as path from 'path';
2020

2121
import { normalizeProxySettings, validateBrowserContextOptions } from './browserContext';
2222
import { DEFAULT_TIMEOUT, TimeoutSettings } from '../common/timeoutSettings';
23-
import { ManualPromise, debugMode } from '../utils';
23+
import { ManualPromise, assert, debugMode } from '../utils';
2424
import { existsAsync } from './fileUtils';
2525
import { helper } from './helper';
2626
import { SdkObject } from './instrumentation';
@@ -188,6 +188,7 @@ export abstract class BrowserType extends SdkObject {
188188
tempDirectories.push(artifactsDir);
189189

190190
if (userDataDir) {
191+
assert(path.isAbsolute(userDataDir), 'userDataDir must be an absolute path');
191192
// Firefox bails if the profile directory does not exist, Chrome creates it. We ensure consistent behavior here.
192193
if (!await existsAsync(userDataDir))
193194
await fs.promises.mkdir(userDataDir, { recursive: true, mode: 0o700 });

tests/library/defaultbrowsercontext-2.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ it('should accept userDataDir', async ({ createUserDataDir, browserType }) => {
101101
expect(fs.readdirSync(userDataDir).length).toBeGreaterThan(0);
102102
});
103103

104+
it('should accept relative userDataDir', async ({ createUserDataDir, browserType }) => {
105+
const userDataDir = await createUserDataDir();
106+
const context = await browserType.launchPersistentContext(path.relative(process.cwd(), path.join(userDataDir, 'foobar')));
107+
expect(fs.readdirSync(path.join(userDataDir, 'foobar')).length).toBeGreaterThan(0);
108+
await context.close();
109+
});
110+
104111
it('should restore state from userDataDir', async ({ browserType, server, createUserDataDir, isMac, browserName }) => {
105112
it.slow();
106113

0 commit comments

Comments
 (0)