fix(webkit): wait for the pipe ready on windows (#997)

This commit is contained in:
Pavel Feldman 2020-02-13 17:46:40 -08:00 committed by GitHub
parent cd4e9da807
commit 4d7e531520
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 8 deletions

View file

@ -31,7 +31,7 @@ import * as os from 'os';
import { assert, helper } from '../helper';
import { kBrowserCloseMessageId } from '../webkit/wkConnection';
import { LaunchOptions, BrowserArgOptions, BrowserType } from './browserType';
import { ConnectionTransport } from '../transport';
import { ConnectionTransport, DeferWriteTransport } from '../transport';
import * as ws from 'ws';
import * as uuidv4 from 'uuid/v4';
import { ConnectOptions, LaunchType } from '../browser';
@ -122,7 +122,7 @@ export class WebKit implements BrowserType {
webkitExecutable = executablePath;
}
let transport: PipeTransport | undefined = undefined;
let transport: ConnectionTransport | undefined = undefined;
let browserServer: BrowserServer | undefined = undefined;
const { launchedProcess, gracefullyClose } = await launchProcess({
executablePath: webkitExecutable!,
@ -151,7 +151,7 @@ export class WebKit implements BrowserType {
const timeoutError = new TimeoutError(`Timed out after ${timeout} ms while trying to connect to WebKit! The only WebKit revision guaranteed to work is r${this._revision}`);
await waitForLine(launchedProcess, launchedProcess.stdout, /^Web Inspector is reading from pipe #3$/, timeout, timeoutError);
transport = new PipeTransport(launchedProcess.stdio[3] as NodeJS.WritableStream, launchedProcess.stdio[4] as NodeJS.ReadableStream);
transport = new DeferWriteTransport(new PipeTransport(launchedProcess.stdio[3] as NodeJS.WritableStream, launchedProcess.stdio[4] as NodeJS.ReadableStream));
browserServer = new BrowserServer(launchedProcess, gracefullyClose, launchType === 'server' ? await wrapTransportWithWebSocket(transport, port || 0) : null);
return { browserServer, transport };
}
@ -278,11 +278,8 @@ async function wrapTransportWithWebSocket(transport: ConnectionTransport, port:
const browserContextIds = new Map<string, ws>();
const pageProxyIds = new Map<string, ws>();
const sockets = new Set<ws>();
let transportReadyCallback: () => void;
const transportReady = new Promise(f => transportReadyCallback = f);
transport.onmessage = message => {
transportReadyCallback();
const parsedMessage = JSON.parse(message);
if ('id' in parsedMessage) {
if (parsedMessage.id === -9999)
@ -418,6 +415,5 @@ async function wrapTransportWithWebSocket(transport: ConnectionTransport, port:
const address = server.address();
if (typeof address === 'string')
return address + '/' + guid;
await transportReady;
return 'ws://127.0.0.1:' + address.port + '/' + guid;
}

View file

@ -83,3 +83,35 @@ export class SlowMoTransport {
this._delegate.close();
}
}
export class DeferWriteTransport implements ConnectionTransport {
private _delegate: ConnectionTransport;
private _readPromise: Promise<void>;
onmessage?: (message: string) => void;
onclose?: () => void;
constructor(transport: ConnectionTransport) {
this._delegate = transport;
let callback: () => void;
this._readPromise = new Promise(f => callback = f);
this._delegate.onmessage = s => {
callback();
if (this.onmessage)
this.onmessage(s);
};
this._delegate.onclose = () => {
if (this.onclose)
this.onclose();
};
}
async send(s: string) {
await this._readPromise;
this._delegate.send(s);
}
close() {
this._delegate.close();
}
}

View file

@ -127,7 +127,6 @@ module.exports.describe = ({testRunner, product, playwrightPath}) => {
state.tearDown = async () => {
await Promise.all(contexts.map(c => c.close()));
expect((await state.browser.contexts()).length).toBe(0, `"${test.fullName}" leaked a context`);
if (rl) {
rl.removeListener('line', onLine);
rl.close();