UNPKG

puppeteer-core

Version:

A high-level API to control headless Chrome over the DevTools Protocol

106 lines 3.16 kB
"use strict"; /** * @license * Copyright 2019 Google Inc. * SPDX-License-Identifier: Apache-2.0 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.CdpJSHandle = void 0; exports.releaseObject = releaseObject; const JSHandle_js_1 = require("../api/JSHandle.js"); const util_js_1 = require("../common/util.js"); const utils_js_1 = require("./utils.js"); /** * @internal */ class CdpJSHandle extends JSHandle_js_1.JSHandle { #disposed = false; #remoteObject; #world; constructor(world, remoteObject) { super(); this.#world = world; this.#remoteObject = remoteObject; } get disposed() { return this.#disposed; } get realm() { return this.#world; } get client() { return this.realm.environment.client; } async jsonValue() { if (!this.#remoteObject.objectId) { return (0, utils_js_1.valueFromRemoteObject)(this.#remoteObject); } const value = await this.evaluate(object => { return object; }); if (value === undefined) { throw new Error('Could not serialize referenced object'); } return value; } /** * Either `null` or the handle itself if the handle is an * instance of {@link ElementHandle}. */ asElement() { return null; } async dispose() { if (this.#disposed) { return; } this.#disposed = true; await releaseObject(this.client, this.#remoteObject); } toString() { if (!this.#remoteObject.objectId) { return 'JSHandle:' + (0, utils_js_1.valueFromRemoteObject)(this.#remoteObject); } const type = this.#remoteObject.subtype || this.#remoteObject.type; return 'JSHandle@' + type; } get id() { return this.#remoteObject.objectId; } remoteObject() { return this.#remoteObject; } async getProperties() { // We use Runtime.getProperties rather than iterative version for // improved performance as it allows getting everything at once. const response = await this.client.send('Runtime.getProperties', { objectId: this.#remoteObject.objectId, ownProperties: true, }); const result = new Map(); for (const property of response.result) { if (!property.enumerable || !property.value) { continue; } result.set(property.name, this.#world.createCdpHandle(property.value)); } return result; } } exports.CdpJSHandle = CdpJSHandle; /** * @internal */ async function releaseObject(client, remoteObject) { if (!remoteObject.objectId) { return; } await client .send('Runtime.releaseObject', { objectId: remoteObject.objectId }) .catch(error => { // Exceptions might happen in case of a page been navigated or closed. // Swallow these since they are harmless and we don't leak anything in this case. (0, util_js_1.debugError)(error); }); } //# sourceMappingURL=JSHandle.js.map