2020-06-25 16:05:36 -07:00
|
|
|
/**
|
|
|
|
* Copyright (c) Microsoft Corporation.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the 'License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2020-08-24 14:48:03 -07:00
|
|
|
import { BrowserContext } from '../server/browserContext';
|
2020-07-13 16:03:24 -07:00
|
|
|
import { Dispatcher, DispatcherScope, lookupDispatcher } from './dispatcher';
|
2020-07-08 21:36:03 -07:00
|
|
|
import { PageDispatcher, BindingCallDispatcher, WorkerDispatcher } from './pageDispatcher';
|
2020-08-24 14:48:03 -07:00
|
|
|
import * as channels from '../protocol/channels';
|
2020-06-26 11:51:47 -07:00
|
|
|
import { RouteDispatcher, RequestDispatcher } from './networkDispatchers';
|
2020-08-24 14:48:03 -07:00
|
|
|
import { CRBrowserContext } from '../server/chromium/crBrowser';
|
2020-07-08 21:36:03 -07:00
|
|
|
import { CDPSessionDispatcher } from './cdpSessionDispatcher';
|
2021-01-24 19:21:19 -08:00
|
|
|
import { RecorderSupplement } from '../server/supplements/recorderSupplement';
|
|
|
|
import { ConsoleApiSupplement } from '../server/supplements/consoleApiSupplement';
|
2020-06-25 16:05:36 -07:00
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
export class BrowserContextDispatcher extends Dispatcher<BrowserContext, channels.BrowserContextInitializer> implements channels.BrowserContextChannel {
|
2020-08-19 10:31:59 -07:00
|
|
|
private _context: BrowserContext;
|
2020-06-25 16:05:36 -07:00
|
|
|
|
2020-08-19 10:31:59 -07:00
|
|
|
constructor(scope: DispatcherScope, context: BrowserContext) {
|
2021-01-13 12:08:14 -08:00
|
|
|
super(scope, context, 'BrowserContext', { isChromium: context._browser._options.isChromium }, true);
|
2020-06-25 16:05:36 -07:00
|
|
|
this._context = context;
|
2020-07-13 15:26:09 -07:00
|
|
|
|
|
|
|
for (const page of context.pages())
|
2020-07-14 18:26:50 -07:00
|
|
|
this._dispatchEvent('page', { page: new PageDispatcher(this._scope, page) });
|
2020-08-21 16:26:33 -07:00
|
|
|
context.on(BrowserContext.Events.Page, page => this._dispatchEvent('page', { page: new PageDispatcher(this._scope, page) }));
|
|
|
|
context.on(BrowserContext.Events.Close, () => {
|
2020-06-25 16:05:36 -07:00
|
|
|
this._dispatchEvent('close');
|
2020-07-10 16:24:11 -07:00
|
|
|
this._dispose();
|
2020-06-25 16:05:36 -07:00
|
|
|
});
|
2020-07-13 15:26:09 -07:00
|
|
|
|
2020-08-19 10:31:59 -07:00
|
|
|
if (context._browser._options.name === 'chromium') {
|
2020-07-13 15:26:09 -07:00
|
|
|
for (const page of (context as CRBrowserContext).backgroundPages())
|
2020-07-14 18:26:50 -07:00
|
|
|
this._dispatchEvent('crBackgroundPage', { page: new PageDispatcher(this._scope, page) });
|
2020-08-21 16:26:33 -07:00
|
|
|
context.on(CRBrowserContext.CREvents.BackgroundPage, page => this._dispatchEvent('crBackgroundPage', { page: new PageDispatcher(this._scope, page) }));
|
2020-07-13 15:26:09 -07:00
|
|
|
for (const serviceWorker of (context as CRBrowserContext).serviceWorkers())
|
|
|
|
this._dispatchEvent('crServiceWorker', new WorkerDispatcher(this._scope, serviceWorker));
|
2020-08-21 16:26:33 -07:00
|
|
|
context.on(CRBrowserContext.CREvents.ServiceWorker, serviceWorker => this._dispatchEvent('crServiceWorker', { worker: new WorkerDispatcher(this._scope, serviceWorker) }));
|
2020-07-13 15:26:09 -07:00
|
|
|
}
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setDefaultNavigationTimeoutNoReply(params: channels.BrowserContextSetDefaultNavigationTimeoutNoReplyParams) {
|
2020-06-25 16:05:36 -07:00
|
|
|
this._context.setDefaultNavigationTimeout(params.timeout);
|
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setDefaultTimeoutNoReply(params: channels.BrowserContextSetDefaultTimeoutNoReplyParams) {
|
2020-06-25 16:05:36 -07:00
|
|
|
this._context.setDefaultTimeout(params.timeout);
|
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async exposeBinding(params: channels.BrowserContextExposeBindingParams): Promise<void> {
|
2020-10-01 22:47:31 -07:00
|
|
|
await this._context.exposeBinding(params.name, !!params.needsHandle, (source, ...args) => {
|
|
|
|
const binding = new BindingCallDispatcher(this._scope, params.name, !!params.needsHandle, source, args);
|
2020-07-14 18:26:50 -07:00
|
|
|
this._dispatchEvent('bindingCall', { binding });
|
|
|
|
return binding.promise();
|
2020-06-26 11:51:47 -07:00
|
|
|
});
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async newPage(): Promise<channels.BrowserContextNewPageResult> {
|
2020-07-14 18:26:50 -07:00
|
|
|
return { page: lookupDispatcher<PageDispatcher>(await this._context.newPage()) };
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async cookies(params: channels.BrowserContextCookiesParams): Promise<channels.BrowserContextCookiesResult> {
|
2020-07-14 18:26:50 -07:00
|
|
|
return { cookies: await this._context.cookies(params.urls) };
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async addCookies(params: channels.BrowserContextAddCookiesParams): Promise<void> {
|
2020-06-25 16:05:36 -07:00
|
|
|
await this._context.addCookies(params.cookies);
|
|
|
|
}
|
|
|
|
|
|
|
|
async clearCookies(): Promise<void> {
|
|
|
|
await this._context.clearCookies();
|
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async grantPermissions(params: channels.BrowserContextGrantPermissionsParams): Promise<void> {
|
|
|
|
await this._context.grantPermissions(params.permissions, params.origin);
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
async clearPermissions(): Promise<void> {
|
|
|
|
await this._context.clearPermissions();
|
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setGeolocation(params: channels.BrowserContextSetGeolocationParams): Promise<void> {
|
2020-08-17 16:19:21 -07:00
|
|
|
await this._context.setGeolocation(params.geolocation);
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setExtraHTTPHeaders(params: channels.BrowserContextSetExtraHTTPHeadersParams): Promise<void> {
|
2020-08-18 15:38:29 -07:00
|
|
|
await this._context.setExtraHTTPHeaders(params.headers);
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setOffline(params: channels.BrowserContextSetOfflineParams): Promise<void> {
|
2020-06-25 16:05:36 -07:00
|
|
|
await this._context.setOffline(params.offline);
|
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setHTTPCredentials(params: channels.BrowserContextSetHTTPCredentialsParams): Promise<void> {
|
2020-08-17 16:19:21 -07:00
|
|
|
await this._context.setHTTPCredentials(params.httpCredentials);
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async addInitScript(params: channels.BrowserContextAddInitScriptParams): Promise<void> {
|
2020-06-25 16:05:36 -07:00
|
|
|
await this._context._doAddInitScript(params.source);
|
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async setNetworkInterceptionEnabled(params: channels.BrowserContextSetNetworkInterceptionEnabledParams): Promise<void> {
|
2020-06-26 11:51:47 -07:00
|
|
|
if (!params.enabled) {
|
2020-08-18 17:34:04 -07:00
|
|
|
await this._context._setRequestInterceptor(undefined);
|
2020-06-26 11:51:47 -07:00
|
|
|
return;
|
|
|
|
}
|
2020-08-18 17:34:04 -07:00
|
|
|
this._context._setRequestInterceptor((route, request) => {
|
2020-06-30 21:30:39 -07:00
|
|
|
this._dispatchEvent('route', { route: new RouteDispatcher(this._scope, route), request: RequestDispatcher.from(this._scope, request) });
|
2020-06-26 11:51:47 -07:00
|
|
|
});
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
2020-11-13 14:24:53 -08:00
|
|
|
async storageState(): Promise<channels.BrowserContextStorageStateResult> {
|
|
|
|
return await this._context.storageState();
|
|
|
|
}
|
|
|
|
|
2020-06-25 16:05:36 -07:00
|
|
|
async close(): Promise<void> {
|
2020-06-26 21:22:03 -07:00
|
|
|
await this._context.close();
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
2020-07-08 21:36:03 -07:00
|
|
|
|
2021-01-24 19:21:19 -08:00
|
|
|
async consoleSupplementExpose(): Promise<void> {
|
|
|
|
const consoleApi = new ConsoleApiSupplement(this._context);
|
|
|
|
await consoleApi.install();
|
2021-01-24 08:44:11 -08:00
|
|
|
}
|
|
|
|
|
2021-01-24 19:21:19 -08:00
|
|
|
async recorderSupplementEnable(params: channels.BrowserContextRecorderSupplementEnableParams): Promise<void> {
|
|
|
|
const recorder = new RecorderSupplement(this._context, params, {
|
|
|
|
printLn: text => this._dispatchEvent('recorderSupplementPrintLn', { text }),
|
|
|
|
popLn: text => this._dispatchEvent('recorderSupplementPopLn', { text }),
|
|
|
|
});
|
|
|
|
await recorder.install();
|
2020-12-23 14:15:16 -08:00
|
|
|
}
|
|
|
|
|
2020-08-20 14:19:27 -07:00
|
|
|
async crNewCDPSession(params: channels.BrowserContextCrNewCDPSessionParams): Promise<channels.BrowserContextCrNewCDPSessionResult> {
|
2021-01-13 12:08:14 -08:00
|
|
|
if (!this._object._browser._options.isChromium)
|
2020-08-28 10:23:02 -07:00
|
|
|
throw new Error(`CDP session is only available in Chromium`);
|
2020-07-08 21:36:03 -07:00
|
|
|
const crBrowserContext = this._object as CRBrowserContext;
|
2020-08-20 14:19:27 -07:00
|
|
|
return { session: new CDPSessionDispatcher(this._scope, await crBrowserContext.newCDPSession((params.page as PageDispatcher)._object)) };
|
2020-07-08 21:36:03 -07:00
|
|
|
}
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|