summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/cssom/css-style-attr-decl-block.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/css/cssom/css-style-attr-decl-block.html')
-rw-r--r--testing/web-platform/tests/css/cssom/css-style-attr-decl-block.html148
1 files changed, 148 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/cssom/css-style-attr-decl-block.html b/testing/web-platform/tests/css/cssom/css-style-attr-decl-block.html
new file mode 100644
index 0000000000..744b3a744c
--- /dev/null
+++ b/testing/web-platform/tests/css/cssom/css-style-attr-decl-block.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<link rel="author" title="Xidorn Quan" href="mailto:me@upsuper.org">
+<link rel="help" href="https://drafts.csswg.org/cssom-1/#css-declaration-blocks">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+function createTestElement(style) {
+ let wrapper = document.createElement("div");
+ wrapper.innerHTML = `<div id="test" style="${style}"></div>`;
+ return wrapper.querySelector("#test");
+}
+
+test(function() {
+ let elem = createTestElement("z-index: 10;");
+ assert_equals(elem.style.cssText, "z-index: 10;");
+}, "Style attribute should create CSS declaration block based on its content");
+
+test(function() {
+ let elem = createTestElement("z-index: 20;");
+ let style = elem.style;
+ assert_equals(style.cssText, "z-index: 20;");
+ function assert_css_text(value, action) {
+ assert_equals(style.cssText, value, "CSS declaration block after " + action);
+ }
+ elem.setAttribute("style", "z-index: 21;");
+ assert_css_text("z-index: 21;", "changing the style attribute");
+ elem.removeAttribute("style");
+ assert_css_text("", "removing the style attribute");
+ elem.setAttribute("style", "position: absolute;");
+ assert_css_text("position: absolute;", "adding style attribute again");
+}, "Changes to style attribute should reflect on CSS declaration block");
+
+test(function() {
+ let elem = createTestElement("z-index: 30;");
+ let style = elem.style;
+ assert_equals(style.cssText, "z-index: 30;");
+ function assert_attr(value, action) {
+ assert_equals(elem.getAttribute("style"), value, "style attribute after " + action);
+ }
+ style.setProperty("z-index", "31");
+ assert_attr("z-index: 31;", "changing property in CSS declaration block");
+ style.removeProperty("z-index");
+ assert_attr("", "removing property from CSS declaration block");
+ style.setProperty("position", "absolute");
+ assert_attr("position: absolute;", "adding property to CSS declaration block");
+ style.cssText = "z-index: 32;";
+ assert_attr("z-index: 32;", "changing cssText");
+ style.cssText = "z-index: 33; invalid";
+ assert_attr("z-index: 33;", "changing cssText to a partial invalid value");
+}, "Changes to CSS declaration block should reflect on style attribute");
+
+test(function() {
+ let elem = createTestElement("z-index: 40;");
+ let style = elem.style;
+ assert_equals(style.cssText, "z-index: 40;");
+ // Create an observer for the element.
+ let observer = new MutationObserver(function() {});
+ observer.observe(elem, {attributes: true, attributeOldValue: true});
+ function assert_record_with_old_value(oldValue, action) {
+ let records = observer.takeRecords();
+ assert_equals(records.length, 1, "number of mutation records after " + action);
+ let record = records[0];
+ assert_equals(record.type, "attributes", "mutation type after " + action);
+ assert_equals(record.attributeName, "style", "mutated attribute after " + action);
+ assert_equals(record.oldValue, oldValue, "old value after " + action);
+ }
+ style.setProperty("z-index", "41");
+ assert_record_with_old_value("z-index: 40;", "changing property in CSS declaration block");
+ style.cssText = "z-index: 42;";
+ assert_record_with_old_value("z-index: 41;", "changing cssText");
+ style.cssText = "z-index: 42;";
+ assert_record_with_old_value("z-index: 42;", "changing cssText with the same content");
+ style.removeProperty("z-index");
+ assert_record_with_old_value("z-index: 42;", "removing property from CSS declaration block");
+ // Mutation to shorthand properties should also trigger only one mutation record.
+ style.setProperty("margin", "1px");
+ assert_record_with_old_value("", "adding shorthand property to CSS declaration block");
+ style.removeProperty("margin");
+ assert_record_with_old_value("margin: 1px;", "removing shorthand property from CSS declaration block");
+ // Final sanity check.
+ assert_equals(elem.getAttribute("style"), "");
+}, "Changes to CSS declaration block should queue mutation record for style attribute");
+
+test(function() {
+ let elem = createTestElement("z-index: 50; invalid");
+ let style = elem.style;
+ assert_equals(style.cssText, "z-index: 50;");
+ // Create an observer for the element.
+ let observer = new MutationObserver(function() {});
+ observer.observe(elem, {attributes: true});
+ function assert_no_record(action) {
+ let records = observer.takeRecords();
+ assert_equals(records.length, 0, "expect no record after " + action);
+ }
+ style.setProperty("z-index", "invalid");
+ assert_no_record("setting invalid value to property");
+ // Longhand property.
+ style.removeProperty("position");
+ assert_no_record("removing non-existing longhand property");
+ style.setProperty("position", "");
+ assert_no_record("setting empty string to non-existing longhand property");
+ // Shorthand property.
+ style.removeProperty("margin");
+ assert_no_record("removing non-existing shorthand property");
+ style.setProperty("margin", "");
+ assert_no_record("setting empty string to non-existing shorthand property");
+ // Check that the value really isn't changed.
+ assert_equals(elem.getAttribute("style"), "z-index: 50; invalid",
+ "style attribute after removing non-existing properties");
+}, "Removing non-existing property or setting invalid value on CSS declaration block shouldn't queue mutation record");
+
+test(function() {
+ let elem = createTestElement("background-image: url(./);");
+ let style = elem.style;
+ let base = document.createElement("base");
+ base.href = "/";
+ document.body.appendChild(elem);
+ let originalComputedValue = getComputedStyle(elem).backgroundImage;
+ document.head.appendChild(base);
+ this.add_cleanup(() => {
+ document.head.removeChild(base);
+ document.body.removeChild(elem);
+ });
+ style.setProperty("background-color", "green");
+ assert_equals(getComputedStyle(elem).backgroundImage, originalComputedValue,
+ "getComputedStyle(elem).backgroundImage after setting background-color");
+ style.setProperty("background-image", "url(./)");
+ assert_not_equals(getComputedStyle(elem).backgroundImage, originalComputedValue,
+ "getComputedStyle(elem).backgroundImage after setting background-image");
+}, "Changes to CSS declaration block after a base URL change");
+
+test(function() {
+ let e1 = document.createElement('div');
+ let e2 = document.createElement('div');
+ document.body.append(e1, e2);
+ this.add_cleanup(() => {
+ e1.remove();
+ e2.remove();
+ });
+ e1.style.cssText = "all:revert;border-bottom-left-radius:1px;";
+ e2.style.cssText = "all:unset;border-bottom-left-radius:1px;";
+ let processed = e1.style.cssText.split(';')
+ .map(x => x.replace(/revert$/, 'unset')).join(';');
+ assert_equals(processed, e2.style.cssText);
+}, "Expansion of all:unset and all:revert treated identically");
+</script>