Skip to content

Commit a567123

Browse files
authored
feat: do not wait for first page in non-persistent mode (#939)
1 parent c2ab1e3 commit a567123

File tree

8 files changed

+19
-18
lines changed

8 files changed

+19
-18
lines changed

src/chromium/crBrowser.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ export class CRBrowser extends platform.EventEmitter implements Browser {
4646
const connection = new CRConnection(SlowMoTransport.wrap(transport, slowMo));
4747
const browser = new CRBrowser(connection);
4848
await connection.rootSession.send('Target.setDiscoverTargets', { discover: true });
49-
await browser.waitForTarget(t => t.type() === 'page');
5049
return browser;
5150
}
5251

src/firefox/ffBrowser.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export class FFBrowser extends platform.EventEmitter implements Browser {
3939
const connection = new FFConnection(SlowMoTransport.wrap(transport, slowMo));
4040
const browser = new FFBrowser(connection);
4141
await connection.send('Target.enable');
42-
await browser._waitForTarget(t => t.type() === 'page');
4342
return browser;
4443
}
4544

src/server/chromium.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import * as util from 'util';
2222
import { BrowserFetcher, OnProgressCallback, BrowserFetcherOptions } from '../server/browserFetcher';
2323
import { DeviceDescriptors } from '../deviceDescriptors';
2424
import * as types from '../types';
25-
import { assert } from '../helper';
25+
import { assert, helper } from '../helper';
2626
import { CRBrowser } from '../chromium/crBrowser';
2727
import * as platform from '../platform';
2828
import { TimeoutError } from '../errors';
@@ -65,8 +65,10 @@ export class Chromium implements BrowserType {
6565
}
6666

6767
async launchPersistent(userDataDir: string, options?: LaunchOptions): Promise<BrowserContext> {
68+
const { timeout = 30000 } = options || {};
6869
const { browserServer, transport } = await this._launchServer(options, 'persistent', userDataDir);
6970
const browser = await CRBrowser.connect(transport!);
71+
await helper.waitWithTimeout(browser.waitForTarget(t => t.type() === 'page'), 'first page', timeout);
7072
// Hack: for typical launch scenario, ensure that close waits for actual process termination.
7173
const browserContext = browser._defaultContext;
7274
browserContext.close = () => browserServer.close();

src/server/firefox.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import * as os from 'os';
2727
import * as path from 'path';
2828
import * as util from 'util';
2929
import { TimeoutError } from '../errors';
30-
import { assert } from '../helper';
30+
import { assert, helper } from '../helper';
3131
import { LaunchOptions, BrowserArgOptions, BrowserType } from './browserType';
3232
import { ConnectOptions, LaunchType } from '../browser';
3333
import { BrowserServer } from './browserServer';
@@ -75,8 +75,10 @@ export class Firefox implements BrowserType {
7575
}
7676

7777
async launchPersistent(userDataDir: string, options?: LaunchOptions): Promise<BrowserContext> {
78+
const { timeout = 30000 } = options || {};
7879
const { browserServer, transport } = await this._launchServer(options, 'persistent', userDataDir);
7980
const browser = await FFBrowser.connect(transport!);
81+
await helper.waitWithTimeout(browser._waitForTarget(t => t.type() === 'page'), 'first page', timeout);
8082
// Hack: for typical launch scenario, ensure that close waits for actual process termination.
8183
const browserContext = browser._defaultContext;
8284
browserContext.close = () => browserServer.close();

src/server/webkit.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import * as path from 'path';
2828
import * as platform from '../platform';
2929
import * as util from 'util';
3030
import * as os from 'os';
31-
import { assert } from '../helper';
31+
import { assert, helper } from '../helper';
3232
import { kBrowserCloseMessageId } from '../webkit/wkConnection';
3333
import { LaunchOptions, BrowserArgOptions, BrowserType } from './browserType';
3434
import { ConnectionTransport } from '../transport';
@@ -77,8 +77,10 @@ export class WebKit implements BrowserType {
7777
}
7878

7979
async launchPersistent(userDataDir: string, options?: LaunchOptions): Promise<BrowserContext> {
80+
const { timeout = 30000 } = options || {};
8081
const { browserServer, transport } = await this._launchServer(options, 'persistent', userDataDir);
8182
const browser = await WKBrowser.connect(transport!);
83+
await helper.waitWithTimeout(browser._waitForFirstPageTarget(), 'first page', timeout);
8284
// Hack: for typical launch scenario, ensure that close waits for actual process termination.
8385
const browserContext = browser._defaultContext;
8486
browserContext.close = () => browserServer.close();

src/webkit/wkBrowser.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
4343

4444
static async connect(transport: ConnectionTransport, slowMo: number = 0): Promise<WKBrowser> {
4545
const browser = new WKBrowser(SlowMoTransport.wrap(transport, slowMo));
46-
// TODO: figure out the timeout.
47-
await browser._waitForFirstPageTarget(30000);
4846
return browser;
4947
}
5048

@@ -93,9 +91,9 @@ export class WKBrowser extends platform.EventEmitter implements Browser {
9391
return createPageInNewContext(this, options);
9492
}
9593

96-
async _waitForFirstPageTarget(timeout: number): Promise<void> {
94+
async _waitForFirstPageTarget(): Promise<void> {
9795
assert(!this._pageProxies.size);
98-
await helper.waitWithTimeout(this._firstPageProxyPromise, 'firstPageProxy', timeout);
96+
return this._firstPageProxyPromise;
9997
}
10098

10199
_onPageProxyCreated(event: Protocol.Browser.pageProxyCreatedPayload) {

test/chromium/chromium.spec.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,15 @@ module.exports.describe = function({testRunner, expect, playwright, FFOX, CHROMI
153153
expect(browser.pageTarget(page).opener()).toBe(null);
154154
});
155155
it('should close all belonging targets once closing context', async function({browser, newContext}) {
156-
const targets = async () => (await browser.targets()).filter(t => t.type() === 'page');
157-
// There is one page in a default profile and one page created by test harness.
158-
expect((await targets()).length).toBe(2);
156+
const targets = async (context) => (await browser.targets()).filter(t => t.type() === 'page' && t.context() === context);
159157

160158
const context = await newContext();
161159
await context.newPage();
162-
expect((await targets()).length).toBe(3);
160+
expect((await targets(context)).length).toBe(1);
163161
expect((await context.pages()).length).toBe(1);
164162

165163
await context.close();
166-
expect((await targets()).length).toBe(2);
164+
expect((await targets(context)).length).toBe(0);
167165
});
168166
});
169167

test/chromium/launcher.spec.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,12 @@ module.exports.describe = function({testRunner, expect, defaultBrowserOptions, p
5757
describe('Browser target events', function() {
5858
it('should work', async({server}) => {
5959
const browser = await playwright.launch(defaultBrowserOptions);
60+
const context = await browser.newContext();
6061
const events = [];
61-
browser.on('targetcreated', () => events.push('CREATED'));
62-
browser.on('targetchanged', () => events.push('CHANGED'));
63-
browser.on('targetdestroyed', () => events.push('DESTROYED'));
64-
const page = await browser.newPage();
62+
browser.on('targetcreated', target => target.context() === context && events.push('CREATED'));
63+
browser.on('targetchanged', target => target.context() === context && events.push('CHANGED'));
64+
browser.on('targetdestroyed', target => target.context() === context && events.push('DESTROYED'));
65+
const page = await context.newPage();
6566
await page.goto(server.EMPTY_PAGE);
6667
await page.close();
6768
expect(events).toEqual(['CREATED', 'CHANGED', 'DESTROYED']);

0 commit comments

Comments
 (0)