<!DOCTYPE html>
<html>
<head>
<meta name='author' title='weizman' href='https://www.weizmangal.com'>
<meta name='assert' content='Shadow DOM should not leak via Selection API'>
<link rel='help' href='https://w3c.github.io/webcomponents/spec/shadow/'>
<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>
<div id='log'></div>
<div id='container'></div>
</body>
<script>
'use strict';
const container = document.getElementById('container');
function reset(text) {
const host = container.appendChild(document.createElement('div'));
const shadow = host.attachShadow({mode: 'closed'});
const child = shadow.appendChild(document.createElement('span'));
child.textContent = text;
return host;
}
async function select(t, target) {
const event_watcher = new EventWatcher(t, target, ["mouseup"]);
const actions_promise = new test_driver.Actions()
.pointerMove(0, 0, {origin: target})
.pointerDown()
.pointerMove(100, 0, {origin: target})
.pointerUp()
.send();
t.add_cleanup(() => actions_promise);
const event = await event_watcher.wait_for(["mouseup"]);
assert_equals(event.type, "mouseup");
assert_equals(event.target, target);
}
promise_test(async (t) => {
const text = 'text_inside_shadow';
const host = reset(text);
await select(t, host);
const node = getSelection().anchorNode;
assert_equals(node, container, 'getSelection().anchorNode should return the host of the shadow');
assert_not_equals(node.textContent, text, 'getSelection().anchorNode textContent should not be the text contents of an element inside the shadow root');
}, 'selection API should not leak nodes in Shadow DOM.');
</script>
</html>