blob: 8bf04dc358726eccd8cf98843731906ed6d2584d [file]
<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test.js"></script>
<script>
description('This tests observing a custom element, which observes "style" content attribute, with a MutationObserver.');
let attributeChanges = [];
class SomeElement extends HTMLElement {
static observedAttributes = ["style"];
constructor() {
super();
}
attributeChangedCallback(name, oldValue, newValue) {
attributeChanges.push({name, oldValue, newValue});
}
};
customElements.define('some-element', SomeElement);
const observer = new MutationObserver((records) => { });
shouldBe('observer.takeRecords().length', '0');
shouldBe('attributeChanges.length', '0');
evalAndLog('element = document.createElement("some-element"); observer.observe(element, {attributes: true});');
evalAndLog('element.style.width = "100px";');
shouldBe('records = observer.takeRecords(); records.length', '1');
shouldBe('records[0].target', 'element');
shouldBeEqualToString('records[0].type', 'attributes');
shouldBe('records[0].oldValue', 'null');
shouldBe('attributeChanges.length', '1');
shouldBeEqualToString('attributeChanges[0].name', 'style');
shouldBe('attributeChanges[0].oldValue', 'null');
shouldBeEqualToString('attributeChanges[0].newValue', 'width: 100px;');
evalAndLog('element.style.color = "red";');
shouldBe('records = observer.takeRecords(); records.length', '1');
shouldBe('records[0].target', 'element');
shouldBeEqualToString('records[0].type', 'attributes');
shouldBe('records[0].oldValue', 'null');
shouldBe('attributeChanges.length', '2');
shouldBeEqualToString('attributeChanges[1].name', 'style');
shouldBeEqualToString('attributeChanges[1].oldValue', 'width: 100px;');
shouldBeEqualToString('attributeChanges[1].newValue', 'width: 100px; color: red;');
</script>
</body>
</html>