playwright-core
Advanced tools
Comparing version 0.11.1-next.1583541572382 to 0.11.1-next.1583543158962
@@ -33,3 +33,3 @@ /** | ||
private _eventListeners; | ||
static connect(transport: ConnectionTransport, slowMo?: number): Promise<FFBrowser>; | ||
static connect(transport: ConnectionTransport, attachToDefaultContext: boolean, slowMo?: number): Promise<FFBrowser>; | ||
constructor(connection: FFConnection); | ||
@@ -44,6 +44,4 @@ isConnected(): boolean; | ||
_allTargets(): Target[]; | ||
_onTargetCreated(payload: Protocol.Target.targetCreatedPayload): Promise<void>; | ||
_onTargetDestroyed(payload: Protocol.Target.targetDestroyedPayload): void; | ||
_onTargetInfoChanged(payload: Protocol.Target.targetInfoChangedPayload): void; | ||
_onAttachedToTarget(payload: Protocol.Target.attachedToTargetPayload): Promise<void>; | ||
_onDetachedFromTarget(payload: Protocol.Browser.detachedFromTargetPayload): void; | ||
_onAttachedToTarget(payload: Protocol.Browser.attachedToTargetPayload): Promise<void>; | ||
close(): Promise<void>; | ||
@@ -57,8 +55,7 @@ _setDebugFunction(debugFunction: (message: string) => void): void; | ||
private readonly _context; | ||
private readonly _connection; | ||
private readonly _targetId; | ||
private readonly _type; | ||
_url: string; | ||
private readonly _openerId; | ||
constructor(connection: any, browser: FFBrowser, context: FFBrowserContext, targetId: string, type: 'page' | 'browser', url: string, openerId: string | undefined); | ||
private _session?; | ||
constructor(browser: FFBrowser, context: FFBrowserContext, type: 'page' | 'browser', url: string, openerId: string | undefined); | ||
_didClose(): void; | ||
@@ -65,0 +62,0 @@ opener(): Target | null; |
@@ -30,2 +30,3 @@ "use strict"; | ||
const ffPage_1 = require("./ffPage"); | ||
const kAttachedToTarget = Symbol('kAttachedToTarget'); | ||
class FFBrowser extends platform.EventEmitter { | ||
@@ -44,12 +45,10 @@ constructor(connection) { | ||
this._eventListeners = [ | ||
helper_1.helper.addEventListener(this._connection, 'Target.targetCreated', this._onTargetCreated.bind(this)), | ||
helper_1.helper.addEventListener(this._connection, 'Target.targetDestroyed', this._onTargetDestroyed.bind(this)), | ||
helper_1.helper.addEventListener(this._connection, 'Target.targetInfoChanged', this._onTargetInfoChanged.bind(this)), | ||
helper_1.helper.addEventListener(this._connection, 'Target.attachedToTarget', this._onAttachedToTarget.bind(this)), | ||
helper_1.helper.addEventListener(this._connection, 'Browser.attachedToTarget', this._onAttachedToTarget.bind(this)), | ||
helper_1.helper.addEventListener(this._connection, 'Browser.detachedFromTarget', this._onDetachedFromTarget.bind(this)), | ||
]; | ||
} | ||
static async connect(transport, slowMo) { | ||
static async connect(transport, attachToDefaultContext, slowMo) { | ||
const connection = new ffConnection_1.FFConnection(transport_1.SlowMoTransport.wrap(transport, slowMo)); | ||
const browser = new FFBrowser(connection); | ||
await connection.send('Target.enable'); | ||
await connection.send('Browser.enable', { attachToDefaultContext }); | ||
return browser; | ||
@@ -82,3 +81,3 @@ } | ||
} | ||
const { browserContextId } = await this._connection.send('Target.createBrowserContext', { | ||
const { browserContextId } = await this._connection.send('Browser.createBrowserContext', { | ||
userAgent: options.userAgent, | ||
@@ -111,3 +110,3 @@ bypassCSP: options.bypassCSP, | ||
const targetPromise = new Promise(x => resolve = x); | ||
this.on('targetchanged', check); | ||
this.on(kAttachedToTarget, check); | ||
try { | ||
@@ -119,3 +118,3 @@ if (!timeout) | ||
finally { | ||
this.removeListener('targetchanged', check); | ||
this.removeListener(kAttachedToTarget, check); | ||
} | ||
@@ -130,9 +129,3 @@ function check(target) { | ||
} | ||
async _onTargetCreated(payload) { | ||
const { targetId, url, browserContextId, openerId, type } = payload; | ||
const context = browserContextId ? this._contexts.get(browserContextId) : this._defaultContext; | ||
const target = new Target(this._connection, this, context, targetId, type, url, openerId); | ||
this._targets.set(targetId, target); | ||
} | ||
_onTargetDestroyed(payload) { | ||
_onDetachedFromTarget(payload) { | ||
const { targetId } = payload; | ||
@@ -143,13 +136,11 @@ const target = this._targets.get(targetId); | ||
} | ||
_onTargetInfoChanged(payload) { | ||
const { targetId, url } = payload; | ||
const target = this._targets.get(targetId); | ||
target._url = url; | ||
} | ||
async _onAttachedToTarget(payload) { | ||
const { targetId } = payload.targetInfo; | ||
const target = this._targets.get(targetId); | ||
target._initPagePromise(this._connection.getSession(payload.sessionId)); | ||
const { targetId, browserContextId, openerId, type } = payload.targetInfo; | ||
const context = browserContextId ? this._contexts.get(browserContextId) : this._defaultContext; | ||
const target = new Target(this, context, type, '', openerId); | ||
this._targets.set(targetId, target); | ||
target._initPagePromise(this._connection.createSession(payload.sessionId, type)); | ||
const pageEvent = new page_1.PageEvent(target.pageOrError()); | ||
target.context().emit(events_1.Events.BrowserContext.Page, pageEvent); | ||
this.emit(kAttachedToTarget, target); | ||
const opener = target.opener(); | ||
@@ -175,8 +166,6 @@ if (!opener) | ||
class Target { | ||
constructor(connection, browser, context, targetId, type, url, openerId) { | ||
constructor(browser, context, type, url, openerId) { | ||
this._ffPage = null; | ||
this._browser = browser; | ||
this._context = context; | ||
this._connection = connection; | ||
this._targetId = targetId; | ||
this._type = type; | ||
@@ -187,2 +176,4 @@ this._url = url; | ||
_didClose() { | ||
if (this._session) | ||
this._session.dispose(); | ||
if (this._ffPage) | ||
@@ -206,7 +197,6 @@ this._ffPage.didClose(); | ||
throw new Error(`Cannot create page for "${this._type}" target`); | ||
if (!this._pagePromise) | ||
await this._connection.send('Target.attachToTarget', { targetId: this._targetId }); | ||
return this._pagePromise; | ||
} | ||
_initPagePromise(session) { | ||
this._session = session; | ||
this._pagePromise = new Promise(async (f) => { | ||
@@ -279,3 +269,3 @@ this._ffPage = new ffPage_1.FFPage(session, this._context, async () => { | ||
browserContext_1.assertBrowserContextIsNotOwned(this); | ||
const { targetId } = await this._browser._connection.send('Target.newPage', { | ||
const { targetId } = await this._browser._connection.send('Browser.newPage', { | ||
browserContextId: this._browserContextId || undefined | ||
@@ -360,3 +350,3 @@ }); | ||
helper_1.assert(this._browserContextId, 'Non-incognito profiles cannot be closed!'); | ||
await this._browser._connection.send('Target.removeBrowserContext', { browserContextId: this._browserContextId }); | ||
await this._browser._connection.send('Browser.removeBrowserContext', { browserContextId: this._browserContextId }); | ||
this._browser._contexts.delete(this._browserContextId); | ||
@@ -363,0 +353,0 @@ this._didCloseInternal(); |
@@ -28,3 +28,3 @@ /** | ||
private _transport; | ||
private _sessions; | ||
readonly _sessions: Map<string, FFSession>; | ||
_debugProtocol: (message: string) => void; | ||
@@ -38,4 +38,2 @@ _closed: boolean; | ||
constructor(transport: ConnectionTransport); | ||
static fromSession(session: FFSession): FFConnection; | ||
session(sessionId: string): FFSession | null; | ||
send<T extends keyof Protocol.CommandParameters>(method: T, params?: Protocol.CommandParameters[T]): Promise<Protocol.CommandReturnValues[T]>; | ||
@@ -47,3 +45,3 @@ nextMessageId(): number; | ||
close(): void; | ||
getSession(sessionId: string): FFSession | null; | ||
createSession(sessionId: string, type: string): FFSession; | ||
} | ||
@@ -77,3 +75,3 @@ export declare const FFSessionEvents: { | ||
}): void; | ||
_onClosed(): void; | ||
dispose(): void; | ||
} |
@@ -44,8 +44,2 @@ "use strict"; | ||
} | ||
static fromSession(session) { | ||
return session._connection; | ||
} | ||
session(sessionId) { | ||
return this._sessions.get(sessionId) || null; | ||
} | ||
async send(method, params) { | ||
@@ -71,14 +65,2 @@ const id = this.nextMessageId(); | ||
return; | ||
if (object.method === 'Target.attachedToTarget') { | ||
const sessionId = object.params.sessionId; | ||
const session = new FFSession(this, object.params.targetInfo.type, sessionId, message => this._rawSend({ ...message, sessionId })); | ||
this._sessions.set(sessionId, session); | ||
} | ||
else if (object.method === 'Target.detachedFromTarget') { | ||
const session = this._sessions.get(object.params.sessionId); | ||
if (session) { | ||
session._onClosed(); | ||
this._sessions.delete(object.params.sessionId); | ||
} | ||
} | ||
if (object.sessionId) { | ||
@@ -112,3 +94,3 @@ const session = this._sessions.get(object.sessionId); | ||
for (const session of this._sessions.values()) | ||
session._onClosed(); | ||
session.dispose(); | ||
this._sessions.clear(); | ||
@@ -121,4 +103,6 @@ Promise.resolve().then(() => this.emit(exports.ConnectionEvents.Disconnected)); | ||
} | ||
getSession(sessionId) { | ||
return this._sessions.get(sessionId) || null; | ||
createSession(sessionId, type) { | ||
const session = new FFSession(this, type, sessionId, message => this._rawSend({ ...message, sessionId })); | ||
this._sessions.set(sessionId, session); | ||
return session; | ||
} | ||
@@ -168,3 +152,3 @@ } | ||
} | ||
_onClosed() { | ||
dispose() { | ||
for (const callback of this._callbacks.values()) | ||
@@ -174,2 +158,3 @@ callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`)); | ||
this._disposed = true; | ||
this._connection._sessions.delete(this._sessionId); | ||
Promise.resolve().then(() => this.emit(exports.FFSessionEvents.Disconnected)); | ||
@@ -176,0 +161,0 @@ } |
@@ -192,3 +192,3 @@ "use strict"; | ||
return; | ||
worker.session._onClosed(); | ||
worker.session.dispose(); | ||
this._workers.delete(workerId); | ||
@@ -195,0 +195,0 @@ this._page._removeWorker(workerId); |
export declare module Protocol { | ||
module Browser { | ||
type TargetInfo = { | ||
type: ("page"); | ||
targetId: string; | ||
browserContextId?: string; | ||
openerId?: string; | ||
}; | ||
type CookieOptions = { | ||
@@ -26,2 +32,47 @@ name: string; | ||
}; | ||
type attachedToTargetPayload = { | ||
sessionId: string; | ||
targetInfo: { | ||
type: ("page"); | ||
targetId: string; | ||
browserContextId?: string; | ||
openerId?: string; | ||
}; | ||
}; | ||
type detachedFromTargetPayload = { | ||
sessionId: string; | ||
targetId: string; | ||
}; | ||
type enableParameters = { | ||
attachToDefaultContext: boolean; | ||
}; | ||
type enableReturnValue = void; | ||
type createBrowserContextParameters = { | ||
removeOnDetach?: boolean; | ||
userAgent?: string; | ||
bypassCSP?: boolean; | ||
javaScriptDisabled?: boolean; | ||
viewport?: { | ||
viewportSize: { | ||
width: number; | ||
height: number; | ||
}; | ||
deviceScaleFactor: number; | ||
isMobile: boolean; | ||
hasTouch: boolean; | ||
}; | ||
}; | ||
type createBrowserContextReturnValue = { | ||
browserContextId: string; | ||
}; | ||
type removeBrowserContextParameters = { | ||
browserContextId: string; | ||
}; | ||
type removeBrowserContextReturnValue = void; | ||
type newPageParameters = { | ||
browserContextId?: string; | ||
}; | ||
type newPageReturnValue = { | ||
targetId: string; | ||
}; | ||
type closeParameters = void; | ||
@@ -106,85 +157,2 @@ type closeReturnValue = void; | ||
} | ||
module Target { | ||
type TargetInfo = { | ||
type: ("page" | "browser"); | ||
targetId: string; | ||
browserContextId?: string; | ||
url: string; | ||
openerId?: string; | ||
}; | ||
type attachedToTargetPayload = { | ||
sessionId: string; | ||
targetInfo: { | ||
type: ("page" | "browser"); | ||
targetId: string; | ||
browserContextId?: string; | ||
url: string; | ||
openerId?: string; | ||
}; | ||
}; | ||
type detachedFromTargetPayload = { | ||
sessionId: string; | ||
}; | ||
type targetCreatedPayload = { | ||
type: ("page" | "browser"); | ||
targetId: string; | ||
browserContextId?: string; | ||
url: string; | ||
openerId?: string; | ||
}; | ||
type targetDestroyedPayload = { | ||
type: ("page" | "browser"); | ||
targetId: string; | ||
browserContextId?: string; | ||
url: string; | ||
openerId?: string; | ||
}; | ||
type targetInfoChangedPayload = { | ||
type: ("page" | "browser"); | ||
targetId: string; | ||
browserContextId?: string; | ||
url: string; | ||
openerId?: string; | ||
}; | ||
type enableParameters = void; | ||
type enableReturnValue = void; | ||
type attachToTargetParameters = { | ||
targetId: string; | ||
}; | ||
type attachToTargetReturnValue = { | ||
sessionId: string; | ||
}; | ||
type newPageParameters = { | ||
browserContextId?: string; | ||
}; | ||
type newPageReturnValue = { | ||
targetId: string; | ||
}; | ||
type createBrowserContextParameters = { | ||
removeOnDetach?: boolean; | ||
userAgent?: string; | ||
bypassCSP?: boolean; | ||
javaScriptDisabled?: boolean; | ||
viewport?: { | ||
viewportSize: { | ||
width: number; | ||
height: number; | ||
}; | ||
deviceScaleFactor: number; | ||
isMobile: boolean; | ||
hasTouch: boolean; | ||
}; | ||
}; | ||
type createBrowserContextReturnValue = { | ||
browserContextId: string; | ||
}; | ||
type removeBrowserContextParameters = { | ||
browserContextId: string; | ||
}; | ||
type removeBrowserContextReturnValue = void; | ||
type getBrowserContextsParameters = void; | ||
type getBrowserContextsReturnValue = { | ||
browserContextIds: string[]; | ||
}; | ||
} | ||
module Page { | ||
@@ -827,7 +795,4 @@ type DOMPoint = { | ||
interface Events { | ||
"Target.attachedToTarget": Target.attachedToTargetPayload; | ||
"Target.detachedFromTarget": Target.detachedFromTargetPayload; | ||
"Target.targetCreated": Target.targetCreatedPayload; | ||
"Target.targetDestroyed": Target.targetDestroyedPayload; | ||
"Target.targetInfoChanged": Target.targetInfoChangedPayload; | ||
"Browser.attachedToTarget": Browser.attachedToTargetPayload; | ||
"Browser.detachedFromTarget": Browser.detachedFromTargetPayload; | ||
"Page.ready": Page.readyPayload; | ||
@@ -860,2 +825,6 @@ "Page.crashed": Page.crashedPayload; | ||
interface CommandParameters { | ||
"Browser.enable": Browser.enableParameters; | ||
"Browser.createBrowserContext": Browser.createBrowserContextParameters; | ||
"Browser.removeBrowserContext": Browser.removeBrowserContextParameters; | ||
"Browser.newPage": Browser.newPageParameters; | ||
"Browser.close": Browser.closeParameters; | ||
@@ -872,8 +841,2 @@ "Browser.getInfo": Browser.getInfoParameters; | ||
"Browser.getCookies": Browser.getCookiesParameters; | ||
"Target.enable": Target.enableParameters; | ||
"Target.attachToTarget": Target.attachToTargetParameters; | ||
"Target.newPage": Target.newPageParameters; | ||
"Target.createBrowserContext": Target.createBrowserContextParameters; | ||
"Target.removeBrowserContext": Target.removeBrowserContextParameters; | ||
"Target.getBrowserContexts": Target.getBrowserContextsParameters; | ||
"Page.close": Page.closeParameters; | ||
@@ -918,2 +881,6 @@ "Page.setFileInputFiles": Page.setFileInputFilesParameters; | ||
interface CommandReturnValues { | ||
"Browser.enable": Browser.enableReturnValue; | ||
"Browser.createBrowserContext": Browser.createBrowserContextReturnValue; | ||
"Browser.removeBrowserContext": Browser.removeBrowserContextReturnValue; | ||
"Browser.newPage": Browser.newPageReturnValue; | ||
"Browser.close": Browser.closeReturnValue; | ||
@@ -930,8 +897,2 @@ "Browser.getInfo": Browser.getInfoReturnValue; | ||
"Browser.getCookies": Browser.getCookiesReturnValue; | ||
"Target.enable": Target.enableReturnValue; | ||
"Target.attachToTarget": Target.attachToTargetReturnValue; | ||
"Target.newPage": Target.newPageReturnValue; | ||
"Target.createBrowserContext": Target.createBrowserContextReturnValue; | ||
"Target.removeBrowserContext": Target.removeBrowserContextReturnValue; | ||
"Target.getBrowserContexts": Target.getBrowserContextsReturnValue; | ||
"Page.close": Page.closeReturnValue; | ||
@@ -938,0 +899,0 @@ "Page.setFileInputFiles": Page.setFileInputFilesReturnValue; |
@@ -56,3 +56,3 @@ "use strict"; | ||
const browser = await platform.connectToWebsocket(browserServer.wsEndpoint(), transport => { | ||
return ffBrowser_1.FFBrowser.connect(transport, options && options.slowMo); | ||
return ffBrowser_1.FFBrowser.connect(transport, false, options && options.slowMo); | ||
}); | ||
@@ -71,3 +71,3 @@ // Hack: for typical launch scenario, ensure that close waits for actual process termination. | ||
const browser = await platform.connectToWebsocket(browserServer.wsEndpoint(), transport => { | ||
return ffBrowser_1.FFBrowser.connect(transport); | ||
return ffBrowser_1.FFBrowser.connect(transport, true); | ||
}); | ||
@@ -139,3 +139,3 @@ await helper_1.helper.waitWithTimeout(browser._waitForTarget(t => t.type() === 'page'), 'first page', timeout); | ||
return await platform.connectToWebsocket(options.wsEndpoint, transport => { | ||
return ffBrowser_1.FFBrowser.connect(transport, options.slowMo); | ||
return ffBrowser_1.FFBrowser.connect(transport, false, options.slowMo); | ||
}); | ||
@@ -142,0 +142,0 @@ } |
@@ -39,3 +39,3 @@ "use strict"; | ||
return await platform.connectToWebsocket(url, transport => { | ||
return ffBrowser_1.FFBrowser.connect(transport); | ||
return ffBrowser_1.FFBrowser.connect(transport, false); | ||
}); | ||
@@ -42,0 +42,0 @@ } |
@@ -47,3 +47,2 @@ /** | ||
private _initialized; | ||
private readonly _sessions; | ||
constructor(browserContext: WKBrowserContext, pageProxySession: WKSession, opener: WKPage | null); | ||
@@ -50,0 +49,0 @@ _initializedPage(): Page | undefined; |
@@ -35,3 +35,2 @@ "use strict"; | ||
const BINDING_CALL_MESSAGE = '__playwright_binding_call__'; | ||
const isPovisionalSymbol = Symbol('isPovisional'); | ||
class WKPage { | ||
@@ -45,4 +44,2 @@ constructor(browserContext, pageProxySession, opener) { | ||
this._initialized = false; | ||
// TODO: we should be able to just use |this._session| and |this._provisionalPage|. | ||
this._sessions = new Map(); | ||
this._pageProxySession = pageProxySession; | ||
@@ -141,10 +138,7 @@ this._opener = opener; | ||
const { oldTargetId, newTargetId } = event; | ||
const newSession = this._sessions.get(newTargetId); | ||
helper_1.assert(newSession, 'Unknown new target: ' + newTargetId); | ||
const oldSession = this._sessions.get(oldTargetId); | ||
helper_1.assert(oldSession, 'Unknown old target: ' + oldTargetId); | ||
oldSession.errorText = 'Target was swapped out.'; | ||
newSession[isPovisionalSymbol] = undefined; | ||
helper_1.assert(this._provisionalPage); | ||
helper_1.assert(this._provisionalPage._session === newSession); | ||
helper_1.assert(this._provisionalPage._session.sessionId === newTargetId, 'Unknown new target: ' + newTargetId); | ||
helper_1.assert(this._session.sessionId === oldTargetId, 'Unknown old target: ' + oldTargetId); | ||
this._session.errorText = 'Target was swapped out.'; | ||
const newSession = this._provisionalPage._session; | ||
this._provisionalPage.commit(); | ||
@@ -157,13 +151,12 @@ this._provisionalPage.dispose(); | ||
const { targetId, crashed } = event; | ||
const session = this._sessions.get(targetId); | ||
helper_1.assert(session, 'Unknown target destroyed: ' + targetId); | ||
session.dispose(); | ||
this._sessions.delete(targetId); | ||
if (this._provisionalPage && this._provisionalPage._session === session) { | ||
if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) { | ||
this._provisionalPage._session.dispose(); | ||
this._provisionalPage.dispose(); | ||
this._provisionalPage = null; | ||
return; | ||
} | ||
if (this._session === session && crashed) | ||
this.didClose(crashed); | ||
else if (this._session.sessionId === targetId) { | ||
this._session.dispose(); | ||
if (crashed) | ||
this.didClose(crashed); | ||
} | ||
} | ||
@@ -180,6 +173,6 @@ didClose(crashed) { | ||
helper_1.helper.removeEventListeners(this._eventListeners); | ||
for (const session of this._sessions.values()) | ||
session.dispose(); | ||
this._sessions.clear(); | ||
if (this._session) | ||
this._session.dispose(); | ||
if (this._provisionalPage) { | ||
this._provisionalPage._session.dispose(); | ||
this._provisionalPage.dispose(); | ||
@@ -214,3 +207,2 @@ this._provisionalPage = null; | ||
helper_1.assert(targetInfo.type === 'page', 'Only page targets are expected in WebKit, received: ' + targetInfo.type); | ||
this._sessions.set(targetInfo.targetId, session); | ||
if (!this._initialized) { | ||
@@ -237,3 +229,2 @@ helper_1.assert(!targetInfo.isProvisional); | ||
helper_1.assert(targetInfo.isProvisional); | ||
session[isPovisionalSymbol] = true; | ||
helper_1.assert(!this._provisionalPage); | ||
@@ -250,5 +241,8 @@ this._provisionalPage = new wkProvisionalPage_1.WKProvisionalPage(session, this); | ||
const { targetId, message } = event; | ||
const session = this._sessions.get(targetId); | ||
helper_1.assert(session, 'Unknown target: ' + targetId); | ||
session.dispatchMessage(JSON.parse(message)); | ||
if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) | ||
this._provisionalPage._session.dispatchMessage(JSON.parse(message)); | ||
else if (this._session.sessionId === targetId) | ||
this._session.dispatchMessage(JSON.parse(message)); | ||
else | ||
throw new Error('Unknown target: ' + targetId); | ||
} | ||
@@ -255,0 +249,0 @@ _addSessionListeners() { |
{ | ||
"name": "playwright-core", | ||
"version": "0.11.1-next.1583541572382", | ||
"version": "0.11.1-next.1583543158962", | ||
"description": "A high-level API to automate web browsers", | ||
@@ -12,3 +12,3 @@ "repository": "github:Microsoft/playwright", | ||
"chromium_revision": "747023", | ||
"firefox_revision": "1039", | ||
"firefox_revision": "1040", | ||
"webkit_revision": "1168" | ||
@@ -15,0 +15,0 @@ }, |
Sorry, the diff of this file is too big to display
2441189
57272