/** * Copyright 2023 Google Inc. All rights reserved. * * 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 type {TimeoutSettings} from '../common/TimeoutSettings.js'; import type { EvaluateFunc, HandleFor, InnerLazyParams, } from '../common/types.js'; import {TaskManager, WaitTask} from '../common/WaitTask.js'; import {disposeSymbol} from '../util/disposable.js'; import type {ElementHandle} from './ElementHandle.js'; import type {Environment} from './Environment.js'; import type {JSHandle} from './JSHandle.js'; /** * @internal */ export abstract class Realm implements Disposable { protected readonly timeoutSettings: TimeoutSettings; readonly taskManager = new TaskManager(); constructor(timeoutSettings: TimeoutSettings) { this.timeoutSettings = timeoutSettings; } abstract get environment(): Environment; abstract adoptHandle>(handle: T): Promise; abstract transferHandle>(handle: T): Promise; abstract evaluateHandle< Params extends unknown[], Func extends EvaluateFunc = EvaluateFunc, >( pageFunction: Func | string, ...args: Params ): Promise>>>; abstract evaluate< Params extends unknown[], Func extends EvaluateFunc = EvaluateFunc, >( pageFunction: Func | string, ...args: Params ): Promise>>; async waitForFunction< Params extends unknown[], Func extends EvaluateFunc> = EvaluateFunc< InnerLazyParams >, >( pageFunction: Func | string, options: { polling?: 'raf' | 'mutation' | number; timeout?: number; root?: ElementHandle; signal?: AbortSignal; } = {}, ...args: Params ): Promise>>> { const { polling = 'raf', timeout = this.timeoutSettings.timeout(), root, signal, } = options; if (typeof polling === 'number' && polling < 0) { throw new Error('Cannot poll with non-positive interval'); } const waitTask = new WaitTask( this, { polling, root, timeout, signal, }, pageFunction as unknown as | ((...args: unknown[]) => Promise>>) | string, ...args ); return await waitTask.result; } abstract adoptBackendNode(backendNodeId?: number): Promise>; get disposed(): boolean { return this.#disposed; } #disposed = false; /** @internal */ [disposeSymbol](): void { this.#disposed = true; this.taskManager.terminateAll( new Error('waitForFunction failed: frame got detached.') ); } }