|
5 | 5 | <script src="/resources/testharness.js"></script>
|
6 | 6 | <script src="/resources/testharnessreport.js"></script>
|
7 | 7 | <style>
|
| 8 | +ul { |
| 9 | + font-size: 10px; |
| 10 | +} |
8 | 11 | ul.inside {
|
9 | 12 | list-style-position: inside;
|
10 | 13 | }
|
| 14 | +.image { |
| 15 | + list-style-image: url(../../images/green-16x16.png); |
| 16 | +} |
| 17 | +.debug-marker { |
| 18 | + position: absolute; |
| 19 | + width: 0; |
| 20 | + height: 0; |
| 21 | + outline: 2px solid red; |
| 22 | +} |
11 | 23 | </style>
|
12 | 24 | <body>
|
13 | 25 | <ul>
|
14 | 26 | <li>Outside 1</li>
|
15 | 27 | <li>Outside 2</li>
|
16 | 28 | <li>Outside 3</li>
|
| 29 | + <li class="image">Image Outside 1</li> |
| 30 | + <li class="image">Image Outside 2</li> |
17 | 31 | </ul>
|
18 | 32 | <ul class="inside">
|
19 | 33 | <li>Inside 1</li>
|
20 | 34 | <li>Inside 2</li>
|
21 | 35 | <li>Inside 3</li>
|
| 36 | + <li class="image">Image Inside 1</li> |
| 37 | + <li class="image">Image Inside 2</li> |
22 | 38 | </ul>
|
23 | 39 | <script>
|
24 |
| -for (let li of document.getElementsByTagName('li')) { |
25 |
| - test(() => { |
26 |
| - let bounds = li.getBoundingClientRect(); |
27 |
| - let target = document.elementFromPoint(bounds.x + 1, bounds.y + 1); |
28 |
| - assert_equals(target, li); |
29 |
| - }, `<li>${li.textContent}</li>`); |
| 40 | +setup({explicit_done:true}); |
| 41 | +window.onload = function() { |
| 42 | + for (let li of document.getElementsByTagName('li')) { |
| 43 | + test(() => { |
| 44 | + let bounds = li.getBoundingClientRect(); |
| 45 | + let style = window.getComputedStyle(li); |
| 46 | + let y = (bounds.top + bounds.bottom) / 2; |
| 47 | + if (style.listStylePosition === 'inside') { |
| 48 | + // Inside markers are normal inline boxes. |
| 49 | + // It is safe to assume "left + 1" is in the box. |
| 50 | + let x = bounds.left + 1; |
| 51 | + addDebugMarker(x, y); |
| 52 | + let result = document.elementFromPoint(x, y); |
| 53 | + assert_equals(result, li); |
| 54 | + } else { |
| 55 | + // The spec does not define outside marker position. |
| 56 | + // This code assumes that the marker is within "left - 40" to "left - 1". |
| 57 | + // This is heuristic, but all browsers seem to pass with this method. |
| 58 | + let result = null; |
| 59 | + for (let x = bounds.left - 40; x < bounds.left; x++) { |
| 60 | + result = document.elementFromPoint(x, y); |
| 61 | + if (result === li) { |
| 62 | + addDebugMarker(x, y); |
| 63 | + break; |
| 64 | + } |
| 65 | + } |
| 66 | + assert_equals(result, li); |
| 67 | + } |
| 68 | + }, `<li>${li.textContent}</li>`); |
| 69 | + } |
| 70 | + done(); |
| 71 | +}; |
| 72 | + |
| 73 | +// Show a marker for the debugging purposes, in case the heuristic doesn't apply. |
| 74 | +function addDebugMarker(x, y) { |
| 75 | + let div = document.createElement('div'); |
| 76 | + div.className = 'debug-marker'; |
| 77 | + let style = div.style; |
| 78 | + style.left = x + 'px'; |
| 79 | + style.top = y + 'px'; |
| 80 | + document.body.appendChild(div); |
30 | 81 | }
|
31 | 82 | </script>
|
32 | 83 | </body>
|
0 commit comments