// © 2026 TechnoLibre (http://www.technolibre.ca) // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) // Entrées que Chromium traite comme réelles (§ 7.3), et le cadre d'affichage // (§ 19.4). Les événements passent par le protocole de débogage de Chromium, // Input.dispatch… sur la page qui porte le cadre de l'épreuve : ils // traversent le test d'atteinte, la capture du pointeur et la conversion du // toucher en pointeur comme ceux d'un périphérique, et portent isTrusted // vrai. Un événement construit par new PointerEvent ne pose pas de capture. // // Les coordonnées reçues sont celles du cadre de l'épreuve — clientX et // clientY de l'élément visé. CDP les attend dans la fenêtre de la page : // chaque appel relit, d'un cadre à son parent, le rectangle du cadre et // l'échelle qu'une transformation lui donne, et convertit au moment de // l'envoi. Défiler la page de l'épreuve ne change rien : un point du cadre // reste un point de sa fenêtre. import { cdp, page } from 'vitest/browser'; // Boutons de la souris : le masque de buttons et le nom que CDP attend. const BOUTONS = [ [1, 'left'], [2, 'right'], [4, 'middle'], ]; const GENRES = { souris: 'mouse', stylet: 'pen' }; const TYPES_POINTEUR = { presser: 'mousePressed', bouger: 'mouseMoved', relacher: 'mouseReleased' }; const TYPES_TOUCHER = { presser: 'touchStart', bouger: 'touchMove', relacher: 'touchEnd', annuler: 'touchCancel' }; // Touches nommées : key, code et code de touche virtuelle ; text pour celles // qui saisissent un caractère. const TOUCHES = { Escape: { code: 'Escape', touche: 27 }, Enter: { code: 'Enter', touche: 13, texte: '\r' }, Tab: { code: 'Tab', touche: 9 }, ' ': { code: 'Space', touche: 32, texte: ' ' }, Backspace: { code: 'Backspace', touche: 8 }, Delete: { code: 'Delete', touche: 46 }, Home: { code: 'Home', touche: 36 }, End: { code: 'End', touche: 35 }, PageUp: { code: 'PageUp', touche: 33 }, PageDown: { code: 'PageDown', touche: 34 }, ArrowLeft: { code: 'ArrowLeft', touche: 37 }, ArrowUp: { code: 'ArrowUp', touche: 38 }, ArrowRight: { code: 'ArrowRight', touche: 39 }, ArrowDown: { code: 'ArrowDown', touche: 40 }, }; // Boutons tenus enfoncés depuis le dernier presser, rendus par relacher. let boutonsEnfonces = 0; /** Point de la fenêtre de la page qui porte le cadre de l'épreuve, pour le * point (x, y) de la fenêtre de ce cadre. D'un cadre à son parent : la * boîte de l'