fix(webkit): wait for the pipe ready on windows (#997)
This commit is contained in:
parent
cd4e9da807
commit
4d7e531520
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue