fix(webkit): introduce user-data-dir and use it on win (#505)

This commit is contained in:
Pavel Feldman 2020-01-16 22:11:14 -08:00 committed by GitHub
parent dae6e7cabc
commit 2a619db582
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,25 +24,34 @@ import { WKConnectOptions } from '../webkit/wkBrowser';
import { execSync, ChildProcess } from 'child_process';
import { PipeTransport } from './pipeTransport';
import { launchProcess } from './processLauncher';
import * as fs from 'fs';
import * as path from 'path';
import * as platform from '../platform';
import * as util from 'util';
import * as os from 'os';
import { assert } from '../helper';
import { kBrowserCloseMessageId } from '../webkit/wkConnection';
import { Playwright } from './playwright';
export type LaunchOptions = {
ignoreDefaultArgs?: boolean | string[],
export type SlowMoOptions = {
slowMo?: number,
};
export type WebKitArgOptions = {
headless?: boolean,
args?: string[],
userDataDir?: string,
};
export type LaunchOptions = WebKitArgOptions & SlowMoOptions & {
executablePath?: string,
ignoreDefaultArgs?: boolean | string[],
handleSIGINT?: boolean,
handleSIGTERM?: boolean,
handleSIGHUP?: boolean,
headless?: boolean,
timeout?: number,
dumpio?: boolean,
env?: {[key: string]: string} | undefined,
slowMo?: number,
};
export class WKBrowserServer {
@ -111,6 +120,17 @@ export class WKPlaywright implements Playwright {
else
webkitArguments.push(...args);
let userDataDir: string;
let temporaryUserDataDir: string | null = null;
const userDataDirArg = webkitArguments.find(arg => arg.startsWith('--user-data-dir'));
if (userDataDirArg) {
userDataDir = userDataDirArg.substr('--user-data-dir'.length).trim();
} else {
userDataDir = await mkdtempAsync(WEBKIT_PROFILE_PATH);
temporaryUserDataDir = userDataDir;
webkitArguments.push(`--user-data-dir=${temporaryUserDataDir}`);
}
let webkitExecutable = executablePath;
if (!executablePath) {
const {missingText, executablePath} = this._resolveExecutablePath();
@ -127,12 +147,13 @@ export class WKPlaywright implements Playwright {
const { launchedProcess, gracefullyClose } = await launchProcess({
executablePath: webkitExecutable!,
args: webkitArguments,
env,
env: { ...env, CURL_COOKIE_JAR_PATH: path.join(userDataDir, 'cookiejar.db') },
handleSIGINT,
handleSIGTERM,
handleSIGHUP,
dumpio,
pipe: true,
tempDir: temporaryUserDataDir || undefined,
attemptToGracefullyClose: async () => {
if (!connectOptions)
return Promise.reject();
@ -160,11 +181,14 @@ export class WKPlaywright implements Playwright {
return { TimeoutError };
}
defaultArgs(options: { args?: string[] } = {}): string[] {
defaultArgs(options: WebKitArgOptions = {}): string[] {
const {
args = [],
userDataDir = null
} = options;
const webkitArguments = [...DEFAULT_ARGS];
if (userDataDir)
webkitArguments.push(`--user-data-dir=${userDataDir}`);
webkitArguments.push(...args);
return webkitArguments;
}
@ -214,6 +238,9 @@ export class WKPlaywright implements Playwright {
}
}
const mkdtempAsync = platform.promisify(fs.mkdtemp);
const WEBKIT_PROFILE_PATH = path.join(os.tmpdir(), 'playwright_dev_profile-');
const DEFAULT_ARGS: string[] = [];
let cachedMacVersion: string | undefined = undefined;