Skip to content

Commit 0bf6c3d

Browse files
authored
chore: validate launchOptions options (#36276)
1 parent 15d033f commit 0bf6c3d

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

packages/playwright-core/src/DEPS.list

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ server/
44
server/utils
55
utils/isomorphic/
66
utilsBundle.ts
7+
protocol/validator.ts
8+
protocol/validatorPrimitives.ts
79

810
[androidServerImpl.ts]
911
remote/

packages/playwright-core/src/browserServerImpl.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ import { helper } from './server/helper';
2020
import { serverSideCallMetadata } from './server/instrumentation';
2121
import { createPlaywright } from './server/playwright';
2222
import { createGuid } from './server/utils/crypto';
23+
import { isUnderTest } from './server/utils/debug';
2324
import { rewriteErrorMessage } from './utils/isomorphic/stackTrace';
2425
import { DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT } from './utils/isomorphic/time';
2526
import { ws } from './utilsBundle';
27+
import * as validatorPrimitives from './protocol/validatorPrimitives';
2628

2729
import type { BrowserServer, BrowserServerLauncher } from './client/browserType';
2830
import type { LaunchServerOptions, Logger, Env } from './client/types';
@@ -45,19 +47,31 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
4547

4648
// 1. Pre-launch the browser
4749
const metadata = serverSideCallMetadata();
48-
const launchOptions = {
50+
const validatorContext = {
51+
tChannelImpl: (names: '*' | string[], arg: any, path: string) => {
52+
throw new validatorPrimitives.ValidationError(`${path}: channels are not expected in launchServer`);
53+
},
54+
binary: 'buffer',
55+
isUnderTest,
56+
} satisfies validatorPrimitives.ValidatorContext;
57+
let launchOptions = {
4958
...options,
5059
ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined,
5160
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
5261
env: options.env ? envObjectToArray(options.env) : undefined,
5362
timeout: options.timeout ?? DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT,
5463
};
64+
5565
let browser: Browser;
5666
try {
5767
if (options._userDataDir !== undefined) {
68+
const validator = validatorPrimitives.scheme['BrowserTypeLaunchPersistentContextParams'];
69+
launchOptions = validator({ ...launchOptions, userDataDir: options._userDataDir }, '', validatorContext);
5870
const context = await playwright[this._browserName].launchPersistentContext(metadata, options._userDataDir, launchOptions);
5971
browser = context._browser;
6072
} else {
73+
const validator = validatorPrimitives.scheme['BrowserTypeLaunchParams'];
74+
launchOptions = validator(launchOptions, '', validatorContext);
6175
browser = await playwright[this._browserName].launch(metadata, launchOptions, toProtocolLogger(options.logger));
6276
}
6377
} catch (e) {

tests/library/browsertype-launch-server.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ it.describe('launch server', () => {
2626
await browserServer.close();
2727
});
2828

29+
it('should validate options', async ({ browserType }) => {
30+
await expect(browserType.launchServer({ channel: null })).rejects.toThrow(/channel: expected string, got object/);
31+
});
32+
2933
it('should work with host', async ({ browserType }) => {
3034
const host = '0.0.0.0';
3135
const browserServer = await browserType.launchServer({ host });

0 commit comments

Comments
 (0)