| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>PointerCapture for Shadow DOM Elements</title> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width"> |
| <link rel="help" href= "https://bugs.chromium.org/p/chromium/issues/detail?id=810882"> |
| <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> |
| </head> |
| <body onload="onLoad()"> |
| <template id="template"> |
| <style> |
| #content{ |
| height:100px; |
| width:100px; |
| background-color: lightgrey; |
| } |
| </style> |
| <div id="content"></div> |
| </template> |
| <h4>PointerCapture by Shadow DOM element</h4> |
| The light gray box below is part of Shadow DOM. |
| <ul> |
| <li> Click left mouse button inside the box and keep mouse button depressed </li> |
| <li> Move the mouse </li> |
| <li> There should be a message stating <em>Pointer was captured by Shadow DOM!</em></li> |
| <li> Release left mouse button |
| <li> There should be a message stating <em>Pointer was released by Shadow DOM!</em></li> |
| </ul> |
| <div id="shadowhost"></div> |
| <div id="log"></div> |
| <script> |
| function onLoad(){ |
| var logDiv = document.getElementById("log"); |
| function logMessage(message){ |
| var log = document.createElement("div"); |
| var messageNode = document.createTextNode(message); |
| log.appendChild(messageNode); |
| logDiv.appendChild(log); |
| } |
| var events = []; |
| |
| var host = document.getElementById("shadowhost"); |
| var shadowRoot = host.attachShadow({mode: "open"}); |
| var template = document.getElementById("template"); |
| var node = template.content.cloneNode(true); |
| shadowRoot.appendChild(node); |
| |
| var content = host.shadowRoot.getElementById("content"); |
| |
| content.addEventListener("pointerdown", function(e){ |
| content.setPointerCapture(e.pointerId); |
| events.push("pointerdown@content"); |
| }); |
| content.addEventListener("gotpointercapture", function(e){ |
| logMessage("Pointer was captured by Shadow DOM!"); |
| events.push("gotpointercapture@content"); |
| }); |
| content.addEventListener("pointerup", function(e){ |
| content.releasePointerCapture(e.pointerId); |
| events.push("pointerup@content"); |
| }); |
| content.addEventListener("lostpointercapture", function(e){ |
| logMessage("Pointer was released by Shadow DOM!"); |
| events.push("lostpointercapture@content"); |
| if(window.promise_test && shadow_dom_test){ |
| shadow_dom_test.step(function(){ |
| assert_array_equals(events, ["pointerdown@content", |
| "gotpointercapture@content", "pointerup@content", |
| "lostpointercapture@content"]); |
| resolve_test(); |
| }); |
| } |
| }); |
| |
| var shadow_dom_test = null; |
| var resolve_test = null; |
| var reject_test = null; |
| |
| function cleanup(){ |
| events = []; |
| shadow_dom_test = null; |
| resolve_test = null; |
| reject_test = null; |
| } |
| |
| if(window.promise_test){ |
| promise_test(async function(t){ |
| var actions_promise; |
| return new Promise(async function(resolve, reject){ |
| shadow_dom_test = t; |
| resolve_test = resolve; |
| reject_test = reject; |
| t.add_cleanup(function(){ |
| cleanup(); |
| }); |
| var contentRect = content.getBoundingClientRect(); |
| var actions = new test_driver.Actions(); |
| actions_promise = actions |
| .pointerMove(Math.ceil(contentRect.x), Math.ceil(contentRect.y)) |
| .pointerDown({button: actions.ButtonType.LEFT}) |
| .pointerUp({button: actions.ButtonType.LEFT}) |
| .send(); |
| }).then(async ()=>{ |
| await actions_promise; |
| t.done(); |
| }); |
| }, "PointerCapture works for Shadow DOM element."); |
| } |
| } |
| </script> |
| </body> |
| </html> |