chore(webkit): remove unused fields from Target (#183)
This commit is contained in:
parent
88aea0a886
commit
f9d5a18d05
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue