@hyperbrowser/agent
Version:
Hyperbrowsers Web Agent
66 lines (65 loc) • 2.93 kB
JavaScript
;
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;