summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts')
-rw-r--r--remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts72
1 files changed, 52 insertions, 20 deletions
diff --git a/remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts b/remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts
index fd886e8c26..4263697671 100644
--- a/remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts
+++ b/remote/test/puppeteer/packages/puppeteer-core/src/bidi/ElementHandle.ts
@@ -6,14 +6,12 @@
import type * as Bidi from 'chromium-bidi/lib/cjs/protocol/protocol.js';
-import {type AutofillData, ElementHandle} from '../api/ElementHandle.js';
-import {UnsupportedOperation} from '../common/Errors.js';
+import {ElementHandle, type AutofillData} from '../api/ElementHandle.js';
import {throwIfDisposed} from '../util/decorators.js';
import type {BidiFrame} from './Frame.js';
import {BidiJSHandle} from './JSHandle.js';
-import type {BidiRealm} from './Realm.js';
-import type {Sandbox} from './Sandbox.js';
+import type {BidiFrameRealm} from './Realm.js';
/**
* @internal
@@ -21,28 +19,28 @@ import type {Sandbox} from './Sandbox.js';
export class BidiElementHandle<
ElementType extends Node = Element,
> extends ElementHandle<ElementType> {
+ static from<ElementType extends Node = Element>(
+ value: Bidi.Script.RemoteValue,
+ realm: BidiFrameRealm
+ ): BidiElementHandle<ElementType> {
+ return new BidiElementHandle(value, realm);
+ }
+
declare handle: BidiJSHandle<ElementType>;
- constructor(sandbox: Sandbox, remoteValue: Bidi.Script.RemoteValue) {
- super(new BidiJSHandle(sandbox, remoteValue));
+ constructor(value: Bidi.Script.RemoteValue, realm: BidiFrameRealm) {
+ super(BidiJSHandle.from(value, realm));
}
- override get realm(): Sandbox {
- return this.handle.realm;
+ override get realm(): BidiFrameRealm {
+ // SAFETY: See the super call in the constructor.
+ return this.handle.realm as BidiFrameRealm;
}
override get frame(): BidiFrame {
return this.realm.environment;
}
- context(): BidiRealm {
- return this.handle.context();
- }
-
- get isPrimitiveValue(): boolean {
- return this.handle.isPrimitiveValue;
- }
-
remoteValue(): Bidi.Script.RemoteValue {
return this.handle.remoteValue();
}
@@ -69,19 +67,53 @@ export class BidiElementHandle<
@ElementHandle.bindIsolatedHandle
override async contentFrame(): Promise<BidiFrame | null> {
using handle = (await this.evaluateHandle(element => {
- if (element instanceof HTMLIFrameElement) {
+ if (
+ element instanceof HTMLIFrameElement ||
+ element instanceof HTMLFrameElement
+ ) {
return element.contentWindow;
}
return;
})) as BidiJSHandle;
const value = handle.remoteValue();
if (value.type === 'window') {
- return this.frame.page().frame(value.value.context);
+ return (
+ this.frame
+ .page()
+ .frames()
+ .find(frame => {
+ return frame._id === value.value.context;
+ }) ?? null
+ );
}
return null;
}
- override uploadFile(this: ElementHandle<HTMLInputElement>): never {
- throw new UnsupportedOperation();
+ override async uploadFile(
+ this: BidiElementHandle<HTMLInputElement>,
+ ...files: string[]
+ ): Promise<void> {
+ // Locate all files and confirm that they exist.
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
+ let path: typeof import('path');
+ try {
+ path = await import('path');
+ } catch (error) {
+ if (error instanceof TypeError) {
+ throw new Error(
+ `JSHandle#uploadFile can only be used in Node-like environments.`
+ );
+ }
+ throw error;
+ }
+
+ files = files.map(file => {
+ if (path.win32.isAbsolute(file) || path.posix.isAbsolute(file)) {
+ return file;
+ } else {
+ return path.resolve(file);
+ }
+ });
+ await this.frame.setFiles(this, files);
}
}