blob: 9666fae6f9ee6f466c55ff36422464bdb4d53090 [file] [log] [blame]
<!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>