| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta name="viewport" content="width=device-width, minimum-scale=1.0"> | |
| <style> | |
| body,html{ | |
| height: 100%; | |
| } | |
| button { | |
| width: 100px; | |
| } | |
| li { | |
| /* Make the <li> element actionable in APC */ | |
| cursor: pointer; | |
| } | |
| #checkboxPseudo-label::before { | |
| content: ""; | |
| position: absolute; | |
| left: 0; | |
| width: 15px; | |
| height: 15px; | |
| border: 3px solid red; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <button id="clickable" aria-label="clickable">Clickable</button> | |
| <button disabled id="disabled">Disabled</button> | |
| <button style="position: absolute;top:150vh" id="offscreen">Offscreen</button> | |
| <button style="position: fixed;top:200vh" id="offscreenfixed">Offscreen</button> | |
| <div style="position: absolute;top:200vh"> | |
| <a href="#" id="offscreenInline">Offscreen Inline</a> | |
| </div> | |
| <p id="text">Some text</p> | |
| <ul> | |
| <li> | |
| <input id="checkbox" type="checkbox" value="Checkbox"> | |
| <label id="checkbox-label" for="checkbox">Label for the checkbox</label> | |
| </li> | |
| <li> | |
| <div style="position:relative"> | |
| <input id="checkboxPseudo" type="checkbox" value="CheckboxPseudo"> | |
| <label id="checkboxPseudo-label" for="checkboxPseudo">Label for the checkboxPseudo</label> | |
| </div> | |
| </li> | |
| </ul> | |
| </body> | |
| <script> | |
| let button_clicked = false; | |
| let button_click_count = null; | |
| let button_right_clicked = false; | |
| let button_right_click_count = null; | |
| let button_mouse_down = false; | |
| let button_mouse_up = false; | |
| let button_pointer_down = false; | |
| let button_pointer_up = false; | |
| let offscreen_button_clicked = false; | |
| let offscreen_inline_clicked = false; | |
| const button = document.getElementById('clickable'); | |
| button.addEventListener('click', (event) => { | |
| button_clicked = true; | |
| button_click_count = event.detail; | |
| }); | |
| button.addEventListener('mousedown', (event) => { | |
| button_mouse_down = true; | |
| }); | |
| button.addEventListener('mouseup', (event) => { | |
| button_mouse_up = true; | |
| }); | |
| button.addEventListener('pointerdown', (event) => { | |
| button_pointer_down = true; | |
| }); | |
| button.addEventListener('pointerup', (event) => { | |
| button_pointer_up = true; | |
| }); | |
| button.addEventListener("auxclick", (event) => { | |
| button_right_clicked = event.button == 2; | |
| button_right_click_count = event.detail; | |
| }); | |
| const offscreen_button = document.getElementById('offscreen'); | |
| offscreen_button.addEventListener('click', (event) => { | |
| offscreen_button_clicked = true; | |
| }); | |
| const offscreen_inline = document.getElementById('offscreenInline'); | |
| offscreen_inline.addEventListener('click', (event) => { | |
| offscreen_inline_clicked = true; | |
| }); | |
| let mouse_event_log = []; | |
| let mouse_event_timestamps = []; | |
| // Log all mouse events in the format: Event[Element#ID] | |
| const log_handler = e => { | |
| mouse_event_log.push(`${e.type}[${e.target.tagName}#${e.target.id}]`); | |
| mouse_event_timestamps.push(performance.now()); | |
| }; | |
| document.addEventListener('click', log_handler); | |
| document.addEventListener('mousedown', log_handler); | |
| document.addEventListener('mouseup', log_handler); | |
| document.addEventListener('mousemove', log_handler); | |
| // GlicActorControllerUiTest crashes on Mac if we allow it to open the | |
| // context menu. | |
| document.addEventListener('contextmenu', function(event) { | |
| event.preventDefault(); | |
| }); | |
| function expect_single_left_click() { | |
| return button_clicked && | |
| button_click_count == 1 && | |
| button_mouse_down && button_mouse_up && | |
| button_pointer_down && button_pointer_up; | |
| } | |
| function expect_double_left_click() { | |
| return button_clicked && | |
| button_click_count == 2 && | |
| button_mouse_down && button_mouse_up && | |
| button_pointer_down && button_pointer_up; | |
| } | |
| function expect_single_right_click() { | |
| return button_right_clicked && | |
| button_right_click_count == 1 && | |
| button_mouse_down && button_mouse_up && | |
| button_pointer_down && button_pointer_up; | |
| } | |
| function expect_double_right_click() { | |
| return button_right_clicked && | |
| button_right_click_count == 2 && | |
| button_mouse_down && button_mouse_up && | |
| button_pointer_down && button_pointer_up; | |
| } | |
| </script> | |
| </html> |