| /** |
| * @license |
| * Copyright 2023 Google Inc. |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| 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<T extends JSHandle<Node>>(handle: T): Promise<T>; |
| abstract transferHandle<T extends JSHandle<Node>>(handle: T): Promise<T>; |
| abstract evaluateHandle< |
| Params extends unknown[], |
| Func extends EvaluateFunc<Params> = EvaluateFunc<Params>, |
| >( |
| pageFunction: Func | string, |
| ...args: Params |
| ): Promise<HandleFor<Awaited<ReturnType<Func>>>>; |
| abstract evaluate< |
| Params extends unknown[], |
| Func extends EvaluateFunc<Params> = EvaluateFunc<Params>, |
| >( |
| pageFunction: Func | string, |
| ...args: Params |
| ): Promise<Awaited<ReturnType<Func>>>; |
| |
| async waitForFunction< |
| Params extends unknown[], |
| Func extends EvaluateFunc<InnerLazyParams<Params>> = EvaluateFunc< |
| InnerLazyParams<Params> |
| >, |
| >( |
| pageFunction: Func | string, |
| options: { |
| polling?: 'raf' | 'mutation' | number; |
| timeout?: number; |
| root?: ElementHandle<Node>; |
| signal?: AbortSignal; |
| } = {}, |
| ...args: Params |
| ): Promise<HandleFor<Awaited<ReturnType<Func>>>> { |
| 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<Awaited<ReturnType<Func>>>) |
| | string, |
| ...args, |
| ); |
| return await waitTask.result; |
| } |
| |
| abstract adoptBackendNode(backendNodeId?: number): Promise<JSHandle<Node>>; |
| |
| get disposed(): boolean { |
| return this.#disposed; |
| } |
| |
| #disposed = false; |
| /** @internal */ |
| dispose(): void { |
| this.#disposed = true; |
| this.taskManager.terminateAll( |
| new Error('waitForFunction failed: frame got detached.'), |
| ); |
| } |
| /** @internal */ |
| [disposeSymbol](): void { |
| this.dispose(); |
| } |
| } |