Skip to main content
Glama
interact.js3.73 kB
/** * Webview interaction script - handles click, double-click, long-press, and scroll actions * This script is injected into the webview and executed with parameters. * * @param {Object} params * @param {string} params.action - The action to perform * @param {string|null} params.selector - CSS selector for the element * @param {number|null} params.x - X coordinate * @param {number|null} params.y - Y coordinate * @param {number} params.duration - Duration for long-press * @param {number} params.scrollX - Horizontal scroll amount * @param {number} params.scrollY - Vertical scroll amount */ (function(params) { const { action, selector, x, y, duration, scrollX, scrollY } = params; let element = null; let targetX, targetY; // For scroll action, we don't necessarily need a selector or coordinates if (action === 'scroll') { if (selector) { element = document.querySelector(selector); if (!element) { throw new Error(`Element not found: ${selector}`); } } } else { // For other actions, we need either selector or coordinates if (selector) { element = document.querySelector(selector); if (!element) { throw new Error(`Element not found: ${selector}`); } const rect = element.getBoundingClientRect(); targetX = rect.left + rect.width / 2; targetY = rect.top + rect.height / 2; } else if (x !== null && y !== null) { targetX = x; targetY = y; element = document.elementFromPoint(x, y); } else { throw new Error('Either selector or coordinates (x, y) must be provided'); } } // Perform the interaction const eventOptions = { bubbles: true, cancelable: true, view: window, clientX: targetX, clientY: targetY, }; if (action === 'click') { if (element) { element.dispatchEvent(new MouseEvent('mousedown', eventOptions)); element.dispatchEvent(new MouseEvent('mouseup', eventOptions)); element.dispatchEvent(new MouseEvent('click', eventOptions)); } return `Clicked at (${targetX}, ${targetY})`; } if (action === 'double-click') { if (element) { element.dispatchEvent(new MouseEvent('mousedown', eventOptions)); element.dispatchEvent(new MouseEvent('mouseup', eventOptions)); element.dispatchEvent(new MouseEvent('click', eventOptions)); element.dispatchEvent(new MouseEvent('mousedown', eventOptions)); element.dispatchEvent(new MouseEvent('mouseup', eventOptions)); element.dispatchEvent(new MouseEvent('click', eventOptions)); element.dispatchEvent(new MouseEvent('dblclick', eventOptions)); } return `Double-clicked at (${targetX}, ${targetY})`; } if (action === 'long-press') { if (element) { element.dispatchEvent(new MouseEvent('mousedown', eventOptions)); setTimeout(() => { element.dispatchEvent(new MouseEvent('mouseup', eventOptions)); }, duration); } return `Long-pressed at (${targetX}, ${targetY}) for ${duration}ms`; } if (action === 'scroll') { const scrollTarget = element || window; if (scrollX !== 0 || scrollY !== 0) { if (scrollTarget === window) { window.scrollBy(scrollX, scrollY); } else { scrollTarget.scrollLeft += scrollX; scrollTarget.scrollTop += scrollY; } return `Scrolled by (${scrollX}, ${scrollY}) pixels`; } return 'No scroll performed (scrollX and scrollY are both 0)'; } throw new Error(`Unknown action: ${action}`); })

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hypothesi/mcp-server-tauri'

If you have feedback or need assistance with the MCP directory API, please join our Discord server