/// /// /// import { sleep } from "../../sleep.ts"; /** the options for `click()` */ export interface ClickOptions { button?: number; X: number; Y: number; shiftKey?: boolean; ctrlKey?: boolean; altKey?: boolean; } /** Emulate click event sequences */ export const click = async ( element: HTMLElement, options: ClickOptions, ): Promise => { const mouseOptions: MouseEventInit = { button: options.button ?? 0, clientX: options.X, clientY: options.Y, bubbles: true, cancelable: true, shiftKey: options.shiftKey, ctrlKey: options.ctrlKey, altKey: options.altKey, view: window, }; element.dispatchEvent(new MouseEvent("mousedown", mouseOptions)); element.dispatchEvent(new MouseEvent("mouseup", mouseOptions)); element.dispatchEvent(new MouseEvent("click", mouseOptions)); // ScrapboxのReactの処理が終わるまで少し待つ // 待ち時間は感覚で決めた await sleep(10); }; export interface HoldDownOptions extends ClickOptions { holding?: number; } /** Emulate long tap event sequence */ export const holdDown = async ( element: HTMLElement, options: HoldDownOptions, ): Promise => { const touch = new Touch({ identifier: 0, target: element, clientX: options.X, clientY: options.Y, pageX: options.X + window.scrollX, pageY: options.Y + window.scrollY, }); const mouseOptions = { button: options.button ?? 0, clientX: options.X, clientY: options.Y, changedTouches: [touch], touches: [touch], bubbles: true, cancelable: true, shiftKey: options.shiftKey, ctrlKey: options.ctrlKey, altKey: options.altKey, view: window, }; element.dispatchEvent(new TouchEvent("touchstart", mouseOptions)); element.dispatchEvent(new MouseEvent("mousedown", mouseOptions)); await sleep(options.holding ?? 1000); element.dispatchEvent(new MouseEvent("mouseup", mouseOptions)); element.dispatchEvent(new TouchEvent("touchend", mouseOptions)); element.dispatchEvent(new MouseEvent("click", mouseOptions)); // ScrapboxのReactの処理が終わるまで少し待つ // 待ち時間は感覚で決めた await sleep(10); };