chore(webkit): remove unused fields from Target (#183)

This commit is contained in:
Yury Semikhatsky 2019-12-09 13:13:19 -07:00 committed by Dmitry Gozman
parent 88aea0a886
commit f9d5a18d05
3 changed files with 31 additions and 49 deletions

View file

@ -26,11 +26,11 @@ import { Protocol } from './protocol';
import * as types from '../types'; import * as types from '../types';
export class Browser extends EventEmitter { export class Browser extends EventEmitter {
_defaultViewport: types.Viewport; readonly _defaultViewport: types.Viewport;
private _process: childProcess.ChildProcess; private readonly _process: childProcess.ChildProcess;
_connection: Connection; readonly _connection: Connection;
private _closeCallback: () => Promise<void>; private _closeCallback: () => Promise<void>;
private _defaultContext: BrowserContext; private readonly _defaultContext: BrowserContext;
private _contexts = new Map<string, BrowserContext>(); private _contexts = new Map<string, BrowserContext>();
_targets = new Map<string, Target>(); _targets = new Map<string, Target>();
private _eventListeners: RegisteredListener[]; private _eventListeners: RegisteredListener[];
@ -173,7 +173,7 @@ export class Browser extends EventEmitter {
} }
async _pages(context: BrowserContext): Promise<Page[]> { async _pages(context: BrowserContext): Promise<Page[]> {
const targets = this.targets().filter(target => target.browserContext() === context && target.type() === 'page'); const targets = this.targets().filter(target => target._browserContext === context && target._type === 'page');
const pages = await Promise.all(targets.map(target => target.page())); const pages = await Promise.all(targets.map(target => target.page()));
return pages.filter(page => !!page); return pages.filter(page => !!page);
} }
@ -185,7 +185,7 @@ export class Browser extends EventEmitter {
async _onProvisionalTargetCommitted({oldTargetId, newTargetId}) { async _onProvisionalTargetCommitted({oldTargetId, newTargetId}) {
const oldTarget = this._targets.get(oldTargetId); const oldTarget = this._targets.get(oldTargetId);
const newTarget = this._targets.get(newTargetId); const newTarget = this._targets.get(newTargetId);
newTarget._swappedIn(oldTarget, this._connection.session(newTargetId)); newTarget._swappedIn(oldTarget);
} }
disconnect() { disconnect() {

View file

@ -131,7 +131,7 @@ export class Launcher {
const transport = new PipeTransport(webkitProcess.stdio[3] as NodeJS.WritableStream, webkitProcess.stdio[4] as NodeJS.ReadableStream); const transport = new PipeTransport(webkitProcess.stdio[3] as NodeJS.WritableStream, webkitProcess.stdio[4] as NodeJS.ReadableStream);
connection = new Connection('', transport, slowMo); connection = new Connection('', transport, slowMo);
const browser = new Browser(connection, defaultViewport, webkitProcess, gracefullyCloseWebkit); const browser = new Browser(connection, defaultViewport, webkitProcess, gracefullyCloseWebkit);
await browser._waitForTarget(t => t.type() === 'page'); await browser._waitForTarget(t => t._type === 'page');
return browser; return browser;
} catch (e) { } catch (e) {
killWebKit(); killWebKit();

View file

@ -15,8 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { RegisteredListener } from '../helper'; import { BrowserContext } from './Browser';
import { Browser, BrowserContext } from './Browser';
import { Page } from './Page'; import { Page } from './Page';
import { Protocol } from './protocol'; import { Protocol } from './protocol';
import { isSwappedOutError, TargetSession, TargetSessionEvents } from './Connection'; import { isSwappedOutError, TargetSession, TargetSessionEvents } from './Connection';
@ -24,29 +23,23 @@ import { isSwappedOutError, TargetSession, TargetSessionEvents } from './Connect
const targetSymbol = Symbol('target'); const targetSymbol = Symbol('target');
export class Target { export class Target {
private _browserContext: BrowserContext; readonly _browserContext: BrowserContext;
_targetId: string; readonly _targetId: string;
private _type: 'page' | 'service-worker' | 'worker'; readonly _type: 'page' | 'service-worker' | 'worker';
private _pagePromise: Promise<Page> | null = null; private _pagePromise: Promise<Page> | null = null;
private _page: Page | null = null; private _page: Page | null = null;
private _url: string;
_initializedPromise: Promise<boolean>;
_initializedCallback: (value?: unknown) => void;
_isInitialized: boolean;
_eventListeners: RegisteredListener[];
static fromPage(page: Page): Target { static fromPage(page: Page): Target {
return (page as any)[targetSymbol]; return (page as any)[targetSymbol];
} }
constructor(targetInfo: Protocol.Target.TargetInfo, browserContext: BrowserContext) { constructor(targetInfo: Protocol.Target.TargetInfo, browserContext: BrowserContext) {
const {targetId, url, type} = targetInfo; const {targetId, type} = targetInfo;
this._browserContext = browserContext; this._browserContext = browserContext;
this._targetId = targetId; this._targetId = targetId;
this._type = type; this._type = type;
/** @type {?Promise<!Page>} */ /** @type {?Promise<!Page>} */
this._pagePromise = null; this._pagePromise = null;
this._url = url;
} }
_didClose() { _didClose() {
@ -54,26 +47,28 @@ export class Target {
this._page._didClose(); this._page._didClose();
} }
async _swappedIn(oldTarget: Target, session: TargetSession) { async _swappedIn(oldTarget: Target) {
if (!oldTarget._pagePromise)
return;
this._pagePromise = oldTarget._pagePromise; this._pagePromise = oldTarget._pagePromise;
this._page = oldTarget._page; this._page = oldTarget._page;
// Swapped out target should not be accessed by anyone. Reset page promise so that // Swapped out target should not be accessed by anyone. Reset page promise so that
// old target does not close the page on connection reset. // old target does not close the page on connection reset.
oldTarget._pagePromise = null; oldTarget._pagePromise = null;
oldTarget._page = null; oldTarget._page = null;
if (this._pagePromise) await this._adoptPage();
this._adoptPage(this._page || await this._pagePromise, session);
} }
private async _adoptPage(page: Page, session: TargetSession) { private async _adoptPage() {
this._page = page; (this._page as any)[targetSymbol] = this;
(page as any)[targetSymbol] = this; const browser = this._browserContext.browser();
const session = browser._connection.session(this._targetId);
session.once(TargetSessionEvents.Disconnected, () => { session.once(TargetSessionEvents.Disconnected, () => {
// Once swapped out, we reset _page and won't call _didDisconnect for old session. // Once swapped out, we reset _page and won't call _didDisconnect for old session.
if (this._page === page) if (this._page)
page._didDisconnect(); this._page._didDisconnect();
}); });
await page._initialize(session).catch(e => { await this._page._initialize(session).catch(e => {
// Swallow initialization errors due to newer target swap in, // Swallow initialization errors due to newer target swap in,
// since we will reinitialize again. // since we will reinitialize again.
if (!isSwappedOutError(e)) if (!isSwappedOutError(e))
@ -83,31 +78,18 @@ export class Target {
async page(): Promise<Page> { async page(): Promise<Page> {
if (this._type === 'page' && !this._pagePromise) { if (this._type === 'page' && !this._pagePromise) {
const session = this.browser()._connection.session(this._targetId); const browser = this._browserContext.browser();
// Reference local page variable as _page may be
// cleared on swap.
const page = new Page(this._browserContext);
this._page = page;
this._pagePromise = new Promise(async f => { this._pagePromise = new Promise(async f => {
const page = new Page(this._browserContext); await this._adoptPage();
await this._adoptPage(page, session); if (browser._defaultViewport)
if (this.browser()._defaultViewport) await page.setViewport(browser._defaultViewport);
await page.setViewport(this.browser()._defaultViewport);
f(page); f(page);
}); });
} }
return this._pagePromise; return this._pagePromise;
} }
url(): string {
return this._url;
}
type(): 'page' | 'service-worker' | 'worker' {
return this._type;
}
browser(): Browser {
return this._browserContext.browser();
}
browserContext(): BrowserContext {
return this._browserContext;
}
} }