45 lines
1.8 KiB
HTML
45 lines
1.8 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<body>
|
|
<script src="../../resources/js-test.js"></script>
|
|
<script>
|
|
|
|
description('This tests mutating shadow tree inside execCommand. WebKit should not dispach DOM mutation events.');
|
|
|
|
function mutationEventsWith(testFunction)
|
|
{
|
|
const host = document.createElement('div');
|
|
document.body.appendChild(host);
|
|
const shadowRoot = host.attachShadow({mode: 'closed'});
|
|
shadowRoot.innerHTML = '<div id="editor" contenteditable>hello <span></span>world</div>';
|
|
const editor = shadowRoot.getElementById('editor');
|
|
const iframe = shadowRoot.querySelector('span').appendChild(document.createElement('iframe'));
|
|
|
|
editor.focus();
|
|
document.execCommand('selectAll');
|
|
|
|
const events = [];
|
|
const eventTypes = ['DOMSubtreeModified', 'DOMNodeInserted', 'DOMNodeInsertedIntoDocument', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMCharacterDataModified'];
|
|
iframe.contentWindow.onunload = () => {
|
|
const div = document.createElement('div');
|
|
for (const type of eventTypes)
|
|
div.addEventListener(type, (event) => { events.push(event.type); }, {once: true});
|
|
testFunction(div);
|
|
shadowRoot.appendChild(div);
|
|
};
|
|
|
|
document.execCommand('delete', false, null);
|
|
host.remove();
|
|
|
|
return JSON.stringify(events);
|
|
}
|
|
|
|
shouldBeEqualToString(`mutationEventsWith((element) => element.setAttribute('class', 'foo'))`, `[]`);
|
|
shouldBeEqualToString(`mutationEventsWith((element) => element.appendChild(document.createElement('span')))`, `[]`);
|
|
shouldBeEqualToString(`mutationEventsWith((element) => { element.textContent = 'hello'; element.firstChild.appendData(' world') })`, `[]`);
|
|
shouldBeEqualToString(`mutationEventsWith((element) => element.appendChild(element.appendChild(document.createElement('span'))))`, `[]`);
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|