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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
import * as types from '../../types';
|
2020-06-26 11:51:47 -07:00
|
|
|
import { BrowserContextBase, BrowserContext } from '../../browserContext';
|
2020-06-25 16:05:36 -07:00
|
|
|
import { Events } from '../../events';
|
2020-06-30 22:21:17 -07:00
|
|
|
import { Dispatcher, DispatcherScope, lookupNullableDispatcher, lookupDispatcher } from './dispatcher';
|
2020-07-08 21:36:03 -07:00
|
|
|
import { PageDispatcher, BindingCallDispatcher, WorkerDispatcher } from './pageDispatcher';
|
|
|
|
import { PageChannel, BrowserContextChannel, BrowserContextInitializer, CDPSessionChannel } from '../channels';
|
2020-06-26 11:51:47 -07:00
|
|
|
import { RouteDispatcher, RequestDispatcher } from './networkDispatchers';
|
|
|
|
import { Page } from '../../page';
|
2020-07-08 21:36:03 -07:00
|
|
|
import { CRBrowserContext } from '../../chromium/crBrowser';
|
|
|
|
import { CDPSessionDispatcher } from './cdpSessionDispatcher';
|
|
|
|
import { Events as ChromiumEvents } from '../../chromium/events';
|
2020-06-25 16:05:36 -07:00
|
|
|
|
2020-06-26 17:24:21 -07:00
|
|
|
export class BrowserContextDispatcher extends Dispatcher<BrowserContext, BrowserContextInitializer> implements BrowserContextChannel {
|
2020-06-25 16:05:36 -07:00
|
|
|
private _context: BrowserContextBase;
|
|
|
|
|
|
|
|
constructor(scope: DispatcherScope, context: BrowserContextBase) {
|
2020-07-08 21:36:03 -07:00
|
|
|
let crBackgroundPages: PageDispatcher[] = [];
|
|
|
|
let crServiceWorkers: WorkerDispatcher[] = [];
|
|
|
|
if (context._browserBase._options.name === 'chromium') {
|
|
|
|
crBackgroundPages = (context as CRBrowserContext).backgroundPages().map(p => new PageDispatcher(scope, p));
|
|
|
|
context.on(ChromiumEvents.CRBrowserContext.BackgroundPage, page => this._dispatchEvent('crBackgroundPage', new PageDispatcher(this._scope, page)));
|
|
|
|
crServiceWorkers = (context as CRBrowserContext).serviceWorkers().map(w => new WorkerDispatcher(scope, w));
|
|
|
|
context.on(ChromiumEvents.CRBrowserContext.ServiceWorker, serviceWorker => this._dispatchEvent('crServiceWorker', new WorkerDispatcher(this._scope, serviceWorker)));
|
|
|
|
}
|
|
|
|
|
2020-06-26 17:24:21 -07:00
|
|
|
super(scope, context, 'context', {
|
2020-07-08 21:36:03 -07:00
|
|
|
pages: context.pages().map(p => new PageDispatcher(scope, p)),
|
|
|
|
crBackgroundPages,
|
|
|
|
crServiceWorkers,
|
2020-07-01 13:55:29 -07:00
|
|
|
}, true);
|
2020-06-25 16:05:36 -07:00
|
|
|
this._context = context;
|
2020-07-01 18:36:09 -07:00
|
|
|
context.on(Events.BrowserContext.Page, page => this._dispatchEvent('page', new PageDispatcher(this._scope, page)));
|
2020-06-25 16:05:36 -07:00
|
|
|
context.on(Events.BrowserContext.Close, () => {
|
|
|
|
this._dispatchEvent('close');
|
2020-07-10 16:24:11 -07:00
|
|
|
this._dispose();
|
2020-06-25 16:05:36 -07:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async setDefaultNavigationTimeoutNoReply(params: { timeout: number }) {
|
|
|
|
this._context.setDefaultNavigationTimeout(params.timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
async setDefaultTimeoutNoReply(params: { timeout: number }) {
|
|
|
|
this._context.setDefaultTimeout(params.timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
async exposeBinding(params: { name: string }): Promise<void> {
|
2020-06-26 22:38:21 -07:00
|
|
|
await this._context.exposeBinding(params.name, (source, ...args) => {
|
2020-06-26 11:51:47 -07:00
|
|
|
const bindingCall = new BindingCallDispatcher(this._scope, params.name, source, args);
|
|
|
|
this._dispatchEvent('bindingCall', bindingCall);
|
|
|
|
return bindingCall.promise();
|
|
|
|
});
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
async newPage(): Promise<PageChannel> {
|
2020-06-30 21:30:39 -07:00
|
|
|
return lookupDispatcher<PageDispatcher>(await this._context.newPage());
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
async cookies(params: { urls: string[] }): Promise<types.NetworkCookie[]> {
|
|
|
|
return await this._context.cookies(params.urls);
|
|
|
|
}
|
|
|
|
|
|
|
|
async addCookies(params: { cookies: types.SetNetworkCookieParam[] }): Promise<void> {
|
|
|
|
await this._context.addCookies(params.cookies);
|
|
|
|
}
|
|
|
|
|
|
|
|
async clearCookies(): Promise<void> {
|
|
|
|
await this._context.clearCookies();
|
|
|
|
}
|
|
|
|
|
|
|
|
async grantPermissions(params: { permissions: string[], options: { origin?: string } }): Promise<void> {
|
|
|
|
await this._context.grantPermissions(params.permissions, params.options);
|
|
|
|
}
|
|
|
|
|
|
|
|
async clearPermissions(): Promise<void> {
|
|
|
|
await this._context.clearPermissions();
|
|
|
|
}
|
|
|
|
|
|
|
|
async setGeolocation(params: { geolocation: types.Geolocation | null }): Promise<void> {
|
|
|
|
await this._context.setGeolocation(params.geolocation);
|
|
|
|
}
|
|
|
|
|
|
|
|
async setExtraHTTPHeaders(params: { headers: types.Headers }): Promise<void> {
|
|
|
|
await this._context.setExtraHTTPHeaders(params.headers);
|
|
|
|
}
|
|
|
|
|
|
|
|
async setOffline(params: { offline: boolean }): Promise<void> {
|
|
|
|
await this._context.setOffline(params.offline);
|
|
|
|
}
|
|
|
|
|
|
|
|
async setHTTPCredentials(params: { httpCredentials: types.Credentials | null }): Promise<void> {
|
|
|
|
await this._context.setHTTPCredentials(params.httpCredentials);
|
|
|
|
}
|
|
|
|
|
|
|
|
async addInitScript(params: { source: string }): Promise<void> {
|
|
|
|
await this._context._doAddInitScript(params.source);
|
|
|
|
}
|
|
|
|
|
|
|
|
async setNetworkInterceptionEnabled(params: { enabled: boolean }): Promise<void> {
|
2020-06-26 11:51:47 -07:00
|
|
|
if (!params.enabled) {
|
|
|
|
await this._context.unroute('**/*');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this._context.route('**/*', (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
|
|
|
}
|
|
|
|
|
|
|
|
async waitForEvent(params: { event: string }): Promise<any> {
|
2020-06-26 11:51:47 -07:00
|
|
|
const result = await this._context.waitForEvent(params.event);
|
|
|
|
if (result instanceof Page)
|
2020-06-30 21:30:39 -07:00
|
|
|
return lookupNullableDispatcher<PageDispatcher>(result);
|
2020-06-26 11:51:47 -07:00
|
|
|
return result;
|
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
|
|
|
|
|
|
|
async crNewCDPSession(params: { page: PageDispatcher }): Promise<CDPSessionChannel> {
|
|
|
|
const crBrowserContext = this._object as CRBrowserContext;
|
|
|
|
return new CDPSessionDispatcher(this._scope, await crBrowserContext.newCDPSession(params.page._object));
|
|
|
|
}
|
2020-06-25 16:05:36 -07:00
|
|
|
}
|