inert-inlines.html (2804B)
1 <!DOCTYPE html> 2 <link rel=author href="mailto:jarhar@chromium.org"> 3 <link rel=author href="mailto:falken@chromium.org"> 4 <link rel=help href="https://html.spec.whatwg.org/multipage/interactive-elements.html#the-dialog-element"> 5 <link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=241699"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="/resources/testdriver.js"></script> 9 <script src="/resources/testdriver-actions.js"></script> 10 <script src="/resources/testdriver-vendor.js"></script> 11 12 <p> 13 To test manually, click on all the "Click me"s. 14 The test fails if you see red. 15 </p> 16 17 <style> 18 dialog { 19 width: 50px; 20 } 21 </style> 22 23 <a id="a" href="javascript:void(0)">Click me</a> 24 <button id="button">Click me</button> 25 <div id="div" style="background-color: blue; width: 50px; height: 50px">Click meeee</div> 26 <span id="span">Click me</span> 27 <div id="dialog-parent" style="width: 50px; height: 50px"> 28 <span id="dialog-sibling">Click meeee</span> 29 <dialog></dialog> 30 </div> 31 32 <script> 33 promise_test(async () => { 34 async function clickOn(element) { 35 let absoluteTop = 0; 36 let absoluteLeft = 0; 37 for (let parentNode = element; parentNode; parentNode = parentNode.offsetParent) { 38 absoluteLeft += parentNode.offsetLeft; 39 absoluteTop += parentNode.offsetTop; 40 } 41 42 const x = Math.round(absoluteLeft + element.offsetWidth / 2); 43 const y = Math.round(absoluteTop + element.offsetHeight / 2); 44 const actions = new test_driver.Actions() 45 .pointerMove(x, y) 46 .pointerDown() 47 .pointerUp() 48 .pointerMove(0, 0); 49 await actions.send(); 50 } 51 52 function eventFiredOnInertElement(e) { 53 e.target.style.background = 'red'; 54 inertElementFiredOn = true; 55 } 56 57 inertElements = ['a', 'button', 'div', 'span'] 58 inertElements.forEach(function(id) { 59 element = document.getElementById(id); 60 element.addEventListener('click', eventFiredOnInertElement); 61 element.addEventListener('mousemove', eventFiredOnInertElement); 62 }); 63 64 document.addEventListener('click', function(e) { 65 document.firedOn = true; 66 }); 67 68 document.getElementById('dialog-parent').addEventListener('click', function(e) { 69 e.target.firedOn = true; 70 }); 71 72 document.querySelector('dialog').showModal(); 73 for (const id of inertElements) { 74 expectedTarget = document; 75 if (id == 'dialog-sibling') 76 expectedTarget = document.getElementById('dialog-parent') 77 element = document.getElementById(id); 78 inertElementFiredOn = false; 79 expectedTarget.firedOn = false; 80 await clickOn(element); 81 assert_false(inertElementFiredOn, 'clicking on ' + id); 82 assert_true(expectedTarget.firedOn, 'clicking on ' + id); 83 } 84 }, 'Tests that inert inlines do not receive mouse events.'); 85 </script>