move persistent context logic up

This commit is contained in:
Max Schmitt 2024-07-12 10:22:10 +02:00
parent eeef44455f
commit 37ab55c318

View file

@ -40,7 +40,6 @@ import type { CallMetadata } from './instrumentation';
import { SdkObject } from './instrumentation'; import { SdkObject } from './instrumentation';
import { ManualPromise } from '../utils/manualPromise'; import { ManualPromise } from '../utils/manualPromise';
import { type ProtocolError, isProtocolError } from './protocolError'; import { type ProtocolError, isProtocolError } from './protocolError';
import type { ClientCertificatesProxy } from './socksClientCertificatesInterceptor';
export const kNoXServerRunningError = 'Looks like you launched a headed browser without having a XServer running.\n' + export const kNoXServerRunningError = 'Looks like you launched a headed browser without having a XServer running.\n' +
'Set either \'headless: true\' or use \'xvfb-run <your-playwright-app>\' before running Playwright.\n\n<3 Playwright Team'; 'Set either \'headless: true\' or use \'xvfb-run <your-playwright-app>\' before running Playwright.\n\n<3 Playwright Team';
@ -80,9 +79,18 @@ export abstract class BrowserType extends SdkObject {
const controller = new ProgressController(metadata, this); const controller = new ProgressController(metadata, this);
const persistent: channels.BrowserNewContextParams = { ...options }; const persistent: channels.BrowserNewContextParams = { ...options };
controller.setLogName('browser'); controller.setLogName('browser');
// Note: Any initial TLS requests will fail since we rely on the Page/Frames initialize which sets ignoreHTTPSErrors.
const clientCertificatesProxy = await createClientCertificatesProxyIfNeeded(persistent);
if (clientCertificatesProxy)
options.proxy = persistent.proxy;
const browser = await controller.run(progress => { const browser = await controller.run(progress => {
progress.cleanupWhenAborted(() => clientCertificatesProxy?.close());
return this._innerLaunchWithRetries(progress, options, persistent, helper.debugProtocolLogger(), userDataDir).catch(e => { throw this._rewriteStartupLog(e); }); return this._innerLaunchWithRetries(progress, options, persistent, helper.debugProtocolLogger(), userDataDir).catch(e => { throw this._rewriteStartupLog(e); });
}, TimeoutSettings.launchTimeout(options)); }, TimeoutSettings.launchTimeout(options));
browser._defaultContext!._clientCertificatesProxy = clientCertificatesProxy;
return browser._defaultContext!; return browser._defaultContext!;
} }
@ -102,22 +110,8 @@ export abstract class BrowserType extends SdkObject {
async _innerLaunch(progress: Progress, options: types.LaunchOptions, persistent: channels.BrowserNewContextParams | undefined, protocolLogger: types.ProtocolLogger, maybeUserDataDir?: string): Promise<Browser> { async _innerLaunch(progress: Progress, options: types.LaunchOptions, persistent: channels.BrowserNewContextParams | undefined, protocolLogger: types.ProtocolLogger, maybeUserDataDir?: string): Promise<Browser> {
options.proxy = options.proxy ? normalizeProxySettings(options.proxy) : undefined; options.proxy = options.proxy ? normalizeProxySettings(options.proxy) : undefined;
let clientCertificatesProxy: ClientCertificatesProxy | undefined;
if (persistent) {
// Note: Any initial requests done by browser will not be intercepted by the client certificates proxy.
// We rely when the Page/Frames to ignoreHTTPSErrors to bypass the certificate errors.
clientCertificatesProxy = await createClientCertificatesProxyIfNeeded(persistent);
options.proxy = persistent.proxy;
}
const browserLogsCollector = new RecentLogsCollector(); const browserLogsCollector = new RecentLogsCollector();
let launchInfo; const { browserProcess, userDataDir, artifactsDir, transport } = await this._launchProcess(progress, options, !!persistent, browserLogsCollector, maybeUserDataDir);
try {
launchInfo = await this._launchProcess(progress, options, !!persistent, browserLogsCollector, maybeUserDataDir);
} catch (error) {
await clientCertificatesProxy?.close();
throw error;
}
const { browserProcess, userDataDir, artifactsDir, transport } = launchInfo;
if ((options as any).__testHookBeforeCreateBrowser) if ((options as any).__testHookBeforeCreateBrowser)
await (options as any).__testHookBeforeCreateBrowser(); await (options as any).__testHookBeforeCreateBrowser();
const browserOptions: BrowserOptions = { const browserOptions: BrowserOptions = {
@ -141,16 +135,8 @@ export abstract class BrowserType extends SdkObject {
if (persistent) if (persistent)
validateBrowserContextOptions(persistent, browserOptions); validateBrowserContextOptions(persistent, browserOptions);
copyTestHooks(options, browserOptions); copyTestHooks(options, browserOptions);
let browser; const browser = await this._connectToTransport(transport, browserOptions);
try {
browser = await this._connectToTransport(transport, browserOptions);
} catch (error) {
await clientCertificatesProxy?.close();
throw error;
}
(browser as any)._userDataDirForTest = userDataDir; (browser as any)._userDataDirForTest = userDataDir;
if (persistent)
browser._defaultContext!._clientCertificatesProxy = clientCertificatesProxy;
// We assume no control when using custom arguments, and do not prepare the default context in that case. // We assume no control when using custom arguments, and do not prepare the default context in that case.
if (persistent && !options.ignoreAllDefaultArgs) if (persistent && !options.ignoreAllDefaultArgs)
await browser._defaultContext!._loadDefaultContext(progress); await browser._defaultContext!._loadDefaultContext(progress);