Resumen
Esta implementación introduce una lógica no interactiva para evaluar si un elemento de la UI está funcionalmente deshabilitado. El objetivo es evitar interacciones directas (p.ej., clics que podrían disparar navegación o efectos secundarios) y, en su lugar, ejecutar una batería de chequeos pasivos que alimentan un sistema de puntuación (score). Cuando la puntuación acumulada alcanza el umbral definido, el elemento se clasifica como deshabilitado funcionalmente.
Alcance
- Objetivo: Determinar el estado “deshabilitado funcional” de elementos HTML sin generar efectos colaterales.
- Elementos objetivo:
BUTTON,A,INPUT, y elementos interactivos equivalentes/role-based. - No hace: Clicks reales, envío de formularios, navegación o mutaciones permanentes del DOM.
Motivación
- Evitar falsos positivos originados por estilos/UX que simulan deshabilitación sin atributo
disabled. - Proveer señales cuantificables para decisiones automáticas y reporting de accesibilidad.
- Cumplir la directriz interna del ticket #430 respecto a pruebas no intrusivas.
Flujo de Proceso
- Localización precisa del elemento por ID único (re-resolución para evitar referencias stale).
- Inicialización del score en 0 y de un arreglo
checks[]para logging. - Ejecución de chequeos atómicos (sin interacción activadora) y acumulación de puntos.
- Decisión final por umbral: si
score ≥ 4→ Deshabilitado funcional.
Sistema de Puntuación
- Chequeo 1 (3 pts):
pointer-events: none→ bloquea interacción con ratón. Razonamiento: Interacciones de mouse quedan anuladas. - Chequeo 2 (2 pts): Focusabilidad: se intenta
blur()y luegofocus()y se validadocument.activeElement === el. Si el elemento no puede obtener foco → +2 pts. Razonamiento: Elementos deshabilitados típicamente no son focusable. - Chequeo 3 (1 pt): CSS
cursor: not-allowed→ +1 pt. Adicional: si el elemento esBUTTONoAycursor: default→ +1 pt (heurística de deshabilitación visual/UX). - Chequeo 4 (1 pt): Ausencia de
onclickdirecto o atributoonclickenBUTTON/A/INPUT→ +1 pt. Nota: Heurística débil; eventos pueden estar delegados. - Chequeo 5 (1 pt): CSS
opacityen(0, 0.5)(exclusivo) → +1 pt (indicio de deshabilitación visual/UX).
Umbral de decisión: score ≥ 4 ⇒ Deshabilitado funcional.
