browse
Version:
Unified Browserbase CLI for browser automation and cloud APIs.
87 lines (86 loc) • 3.07 kB
JavaScript
import { z } from "zod";
import { updateCursorOverlayPosition } from "../cursor-overlay.js";
const ButtonSchema = z.enum(["left", "right", "middle"]).optional();
export const mouseHandlers = {
async "mouse.click"(manager, params) {
const { button, clickCount, x, y } = z
.object({
button: ButtonSchema,
clickCount: z.number().int().positive().optional(),
x: z.number(),
y: z.number(),
})
.strict()
.parse(params);
const page = await manager.activePage();
await positionCursorOverlay(manager, page, x, y);
await page.click(x, y, {
...(button === undefined ? {} : { button }),
...(clickCount === undefined ? {} : { clickCount }),
});
return { clicked: true };
},
async "mouse.hover"(manager, params) {
const { x, y } = z
.object({
x: z.number(),
y: z.number(),
})
.strict()
.parse(params);
const page = await manager.activePage();
await positionCursorOverlay(manager, page, x, y);
await page.hover(x, y);
return { hovered: true };
},
async "mouse.scroll"(manager, params) {
const { deltaX, deltaY, x, y } = z
.object({
deltaX: z.number(),
deltaY: z.number(),
x: z.number(),
y: z.number(),
})
.strict()
.parse(params);
const page = await manager.activePage();
await positionCursorOverlay(manager, page, x, y);
await page.scroll(x, y, deltaX, deltaY);
return { scrolled: true };
},
async "mouse.drag"(manager, params) {
const { button, delay, fromX, fromY, steps, toX, toY } = z
.object({
button: ButtonSchema,
delay: z.number().int().nonnegative().optional(),
fromX: z.number(),
fromY: z.number(),
steps: z.number().int().positive().optional(),
toX: z.number(),
toY: z.number(),
})
.strict()
.parse(params);
const page = await manager.activePage();
await positionCursorOverlay(manager, page, fromX, fromY);
await page.dragAndDrop(fromX, fromY, toX, toY, {
...(button === undefined ? {} : { button }),
...(delay === undefined ? {} : { delay }),
...(steps === undefined ? {} : { steps }),
});
await positionCursorOverlay(manager, page, toX, toY);
return { dragged: true };
},
};
async function positionCursorOverlay(manager, page, x, y) {
if (!manager.isCursorOverlayEnabled(page))
return;
// The overlay is visual-only. A navigation can destroy its execution
// context, but that must not prevent or invalidate the real mouse action.
try {
await page.evaluate(updateCursorOverlayPosition, { x, y });
}
catch {
// Best-effort parity with V3's cursor updates.
}
}