| <!DOCTYPE html> | |
| <html> | |
| <meta charset=utf-8 /> | |
| <script src=/resources/testharness.js></script> | |
| <script src=/resources/testharnessreport.js></script> | |
| <script src=/resources/testdriver.js></script> | |
| <script src=/resources/testdriver-vendor.js></script> | |
| <script src=/resources/testdriver-actions.js></script> | |
| <script src=resources/event-timing-test-utils.js></script> | |
| <body> | |
| <div id='host'> | |
| </div> | |
| <script> | |
| promise_test(async t => { | |
| assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.'); | |
| const host = document.getElementById('host'); | |
| const shadowRoot = host.attachShadow({mode: "closed"}); | |
| const durationThreshold = 16; | |
| const innerSpan1 = document.createElement("span"); | |
| innerSpan1.textContent = "Span1"; | |
| const innerSpan2 = document.createElement("span"); | |
| innerSpan2.textContent = "Span2"; | |
| shadowRoot.append(innerSpan1); | |
| shadowRoot.append(innerSpan2); | |
| innerSpan2.addEventListener("mouseover", function(e) { | |
| // To make this is a slow event | |
| mainThreadBusy(durationThreshold + 4); | |
| }); | |
| const span1Rect = innerSpan1.getBoundingClientRect(); | |
| const span2Rect = innerSpan2.getBoundingClientRect(); | |
| const actions = new test_driver.Actions(); | |
| // Move the pointer to innerSpan1 | |
| await actions.pointerMove( | |
| Math.ceil(span1Rect.x + span1Rect.width / 2), | |
| Math.ceil(span1Rect.y + span1Rect.height / 2) | |
| ).send(); | |
| await waitForTick(); | |
| const observerPromise = new Promise(resolve => { | |
| new PerformanceObserver(t.step_func(entryList => { | |
| let mouseOverEntries = entryList.getEntriesByName("mouseover"); | |
| assert_equals(mouseOverEntries.length, 1); | |
| assert_equals(mouseOverEntries[0].target, null); | |
| resolve(); | |
| })).observe({type: 'event', durationThreshold: durationThreshold}); | |
| }); | |
| // Move the pointer to innerSpan2 | |
| // Here we move the pointer within the shadow DOM | |
| await actions.pointerMove( | |
| Math.ceil(span2Rect.x + span2Rect.width / 2), | |
| Math.ceil(span2Rect.y + span2Rect.height / 2) | |
| ).send(); | |
| await waitForTick(); | |
| await observerPromise; | |
| }, "Event Timing: Move pointer within shadow DOM should create event-timing entry with null target."); | |
| </script> | |
| </body> | |
| </html> |