Skip to content

Commit af20d27

Browse files
authored
fix: auto-add --no-sandbox when running Chromium under root (#3064)
References #2745
1 parent 2120a23 commit af20d27

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

src/server/browserType.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ export abstract class BrowserTypeBase implements BrowserType {
200200
let browserServer: BrowserServer | undefined = undefined;
201201
const { launchedProcess, gracefullyClose, kill } = await launchProcess({
202202
executablePath: executable,
203-
args: browserArguments,
203+
args: this._amendArguments(browserArguments),
204204
env: this._amendEnvironment(env, userDataDir, executable, browserArguments),
205205
handleSIGINT,
206206
handleSIGTERM,
@@ -239,6 +239,7 @@ export abstract class BrowserTypeBase implements BrowserType {
239239
abstract _connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise<BrowserBase>;
240240
abstract _startWebSocketServer(transport: ConnectionTransport, logger: Logger, port: number): WebSocketServer;
241241
abstract _amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env;
242+
abstract _amendArguments(browserArguments: string[]): string[];
242243
abstract _attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void;
243244
}
244245

src/server/chromium.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
*/
1717

1818
import * as path from 'path';
19-
import { assert, getFromENV, logPolitely, helper } from '../helper';
19+
import * as os from 'os';
20+
import { getFromENV, logPolitely, helper } from '../helper';
2021
import { CRBrowser } from '../chromium/crBrowser';
2122
import * as ws from 'ws';
2223
import { Env } from './processLauncher';
@@ -63,11 +64,24 @@ export class Chromium extends BrowserTypeBase {
6364
}
6465

6566
_amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env {
66-
const runningAsRoot = process.geteuid && process.geteuid() === 0;
67-
assert(!runningAsRoot || browserArguments.includes('--no-sandbox'), 'Cannot launch Chromium as root without --no-sandbox. See https://crbug.com/638180.');
6867
return env;
6968
}
7069

70+
_amendArguments(browserArguments: string[]): string[] {
71+
// We currently only support Linux.
72+
if (os.platform() !== 'linux')
73+
return browserArguments;
74+
// If there's already --no-sandbox passed in, do nothing.
75+
if (browserArguments.indexOf('--no-sandbox') !== -1)
76+
return browserArguments;
77+
const runningAsRoot = process.geteuid && process.geteuid() === 0;
78+
if (runningAsRoot) {
79+
console.warn('WARNING: Playwright is being run under "root" user - disabling Chromium sandbox! Run under regular user to get rid of this warning.');
80+
return ['--no-sandbox', ...browserArguments];
81+
}
82+
return browserArguments;
83+
}
84+
7185
_attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void {
7286
const message: ProtocolRequest = { method: 'Browser.close', id: kBrowserCloseMessageId, params: {} };
7387
transport.send(message);

src/server/firefox.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ export class Firefox extends BrowserTypeBase {
4747
} : env;
4848
}
4949

50+
_amendArguments(browserArguments: string[]): string[] {
51+
return browserArguments;
52+
}
53+
5054
_attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void {
5155
const message = { method: 'Browser.close', params: {}, id: kBrowserCloseMessageId };
5256
transport.send(message);

src/server/webkit.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ export class WebKit extends BrowserTypeBase {
4242
return { ...env, CURL_COOKIE_JAR_PATH: path.join(userDataDir, 'cookiejar.db') };
4343
}
4444

45+
_amendArguments(browserArguments: string[]): string[] {
46+
return browserArguments;
47+
}
48+
4549
_attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void {
4650
transport.send({method: 'Playwright.close', params: {}, id: kBrowserCloseMessageId});
4751
}

0 commit comments

Comments
 (0)