| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>CSS Pseudo-Elements Test: Hit testing ::marker</title> |
| <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo"> |
| <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com"> |
| <meta name="assert" content="This test checks that hit-testing a ::marker, the APIs provide the nearest element ancestor." /> |
| <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> |
| <style> |
| ol { |
| display: inline-block; |
| padding-left: 100px; |
| } |
| li { |
| font: 50px/100px Ahem; |
| width: 50px; |
| } |
| .inside { |
| list-style-position: inside; |
| } |
| .image { |
| list-style-image: url("/images/green-100x50.png"); |
| } |
| .string { |
| list-style-type: "X"; |
| } |
| .marker::marker { |
| content: "X"; |
| } |
| .nested { |
| display: block; |
| } |
| .nested::before { |
| content: ''; |
| display: list-item; |
| } |
| </style> |
| <!-- The <li> are 50px wide, and the ::marker are at least 50px wide. |
| Since they are outside, try to locate them at -40px to the left of |
| the <li>, i.e. -65px from the center of the <li> --> |
| <ol class="outside" data-x="-65"> |
| <li class="image"></li> |
| <li class="string"></li> |
| <li class="marker"></li> |
| <li class="nested image"></li> |
| <li class="nested string"></li> |
| </ol> |
| <!-- The <li> are 50px wide, and the inside ::marker are at least 50px, |
| so locate them at the horizontal center of the <li> --> |
| <ol class="inside" data-x="0"> |
| <li class="image"></li> |
| <li class="string"></li> |
| <li class="marker"></li> |
| <li class="nested image"></li> |
| <li class="nested string"></li> |
| </ol> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-actions.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <script> |
| function check(event, li) { |
| assert_equals(event.target, li, "event.target"); |
| if (event.path) { |
| assert_equals(event.path[0], li, "event.path"); |
| } |
| const el = document.elementFromPoint(event.clientX, event.clientY); |
| assert_equals(el, li, "elementFromPoint"); |
| } |
| (async function() { |
| setup({ explicit_done: true }); |
| for (let list of document.querySelectorAll("ol")) { |
| for (let li of list.querySelectorAll("li")) { |
| const listener = e => check(e, li); |
| async_test(function(t) { |
| document.addEventListener("mousedown", t.step_func_done(listener)); |
| }, list.className + " " + li.className + " ::marker's content"); |
| async_test(function(t) { |
| document.addEventListener("mouseup", t.step_func_done(listener)); |
| }, list.className + " " + li.className + " ::marker"); |
| await new test_driver.Actions() |
| // Send an event at the vertical middle of the <li>, this should |
| // hit the contents of the ::marker |
| .pointerMove(+list.dataset.x, 0, {origin: li}) |
| .pointerDown() |
| // The ::marker is 100px tall but its contents only 50px tall. |
| // Send an event inside the ::marker but above its contents. |
| .pointerMove(+list.dataset.x, -40, {origin: li}) |
| .pointerUp() |
| .send(); |
| } |
| } |
| done(); |
| })(); |
| </script> |
| |