UNPKG

@hyperbrowser/agent

Version:

Hyperbrowsers Web Agent

66 lines (65 loc) 2.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isIgnoredElem = exports.isInteractiveElem = void 0; const const_1 = require("./const"); const isInteractiveElem = (element) => { const tagName = element.tagName.toLowerCase(); const role = element.getAttribute("role"); const ariaRole = element.getAttribute("aria-role"); const hasInteractiveRole = const_1.INTERACTIVE_ELEMENTS.has(tagName) || const_1.INTERACTIVE_ROLES.has(role || "") || const_1.INTERACTIVE_ROLES.has(ariaRole || ""); if (hasInteractiveRole) { let reason = ""; if (const_1.INTERACTIVE_ELEMENTS.has(tagName)) { reason = `Interactive HTML element: <${tagName}>`; } else if (const_1.INTERACTIVE_ROLES.has(role || "")) { reason = `Interactive role: ${role}`; } else if (const_1.INTERACTIVE_ROLES.has(ariaRole || "")) { reason = `Interactive aria-role: ${ariaRole}`; } return { isInteractive: true, reason }; } const hasClickHandler = element.onclick !== null || element.getAttribute("onclick") !== null || const_1.CLICK_ATTRIBUTES.some((attr) => element.hasAttribute(attr)); if (hasClickHandler) { return { isInteractive: true, reason: "Has click handler" }; } // Check for the marker attribute set by the injected script const hasInjectedListener = element.hasAttribute("data-has-interactive-listener"); if (hasInjectedListener) { return { isInteractive: true, reason: "Has interactive event listener (tracked)" }; } const hasAriaProps = const_1.INTERACTIVE_ARIA_PROPS.some((prop) => element.hasAttribute(prop)); if (hasAriaProps) { const props = const_1.INTERACTIVE_ARIA_PROPS.filter((prop) => element.hasAttribute(prop)); return { isInteractive: true, reason: `Has interactive ARIA properties: ${props.join(", ")}`, }; } const isContentEditable = element.getAttribute("contenteditable") === "true" || element.isContentEditable; if (isContentEditable) { return { isInteractive: true, reason: "Is content editable" }; } const isDraggable = element.draggable || element.getAttribute("draggable") === "true"; if (isDraggable) { return { isInteractive: true, reason: "Is draggable" }; } return { isInteractive: false, reason: "Not interactive" }; }; exports.isInteractiveElem = isInteractiveElem; const isIgnoredElem = (element) => { const rect = element.getBoundingClientRect(); const isNotVisible = rect.width === 0 || rect.height === 0; return (element.tagName.toLowerCase() === "html" || element.tagName.toLowerCase() === "body" || isNotVisible || element.hasAttribute("disabled") || element.getAttribute("aria-disabled") === "true"); }; exports.isIgnoredElem = isIgnoredElem;