'use strict'; function test_shorthand_value(property, value, longhands) { const stringifiedValue = JSON.stringify(value); for (let longhand of Object.keys(longhands).sort()) { test(function(){ var div = document.getElementById('target') || document.createElement('div'); div.style[property] = ""; try { div.style[property] = value; const readValue = div.style[longhand]; assert_equals(readValue, longhands[longhand], longhand + " should be canonical"); div.style[longhand] = ""; div.style[longhand] = readValue; assert_equals(div.style[longhand], readValue, "serialization should round-trip"); } finally { div.style[property] = ""; } }, "e.style['" + property + "'] = " + stringifiedValue + " should set " + longhand); } test(function(){ var div = document.getElementById('target') || document.createElement('div'); div.style[property] = ""; try { const expectedLength = div.style.length; div.style[property] = value; assert_true(CSS.supports(property, value)); for (let longhand of Object.keys(longhands).sort()) { div.style[longhand] = ""; } assert_equals(div.style.length, expectedLength); } finally { div.style[property] = ""; } }, "e.style['" + property + "'] = " + stringifiedValue + " should not set unrelated longhands"); } /** * Helper to be called from inside test(). */ function is_property_in_longhands(t, property_name) { let e = document.createElement("div"); document.body.append(e); t.add_cleanup(() => e.remove()); let cs = getComputedStyle(e); return Array.from(cs).includes(property_name); } /** * This function is designed mainly to test the distinction between * legacy name aliases and legacy shorthands. */ function test_is_legacy_name_alias(old_name, new_name) { test(t => { let e = document.createElement("div"); e.style.setProperty(old_name, "inherit"); assert_equals(e.style.getPropertyValue(old_name), "inherit", `${old_name} is supported`); assert_equals(e.style.getPropertyValue(new_name), "inherit", `${old_name} is an alias for ${new_name}`); assert_equals(e.style.cssText, `${new_name}: inherit;`, `declarations serialize using new name ${new_name}`); e = document.createElement("div"); e.style.setProperty(old_name, "var(--v)"); assert_equals(e.style.getPropertyValue(new_name), "var(--v)", `${old_name} is a legacy name alias rather than a shorthand`) e = document.createElement("div"); e.style.setProperty(new_name, "var(--w)"); assert_equals(e.style.getPropertyValue(old_name), "var(--w)", `${old_name} is a legacy name alias rather than a shorthand`) assert_false(is_property_in_longhands(t, old_name), `${old_name} is not in getComputedStyle() list of longhands`); }, `${old_name} is a legacy name alias for ${new_name}`); } /** * This function is designed mainly to test the distinction between * legacy name aliases and legacy shorthands. */ function test_is_legacy_shorthand(old_name, new_name) { test(t => { let e = document.createElement("div"); e.style.setProperty(old_name, "inherit"); assert_equals(e.style.getPropertyValue(old_name), "inherit", `${old_name} is supported`); assert_equals(e.style.getPropertyValue(new_name), "inherit", `${old_name} is an alias for ${new_name}`); assert_equals(e.style.cssText, `${new_name}: inherit;`, `declarations serialize using new name ${new_name}`); e = document.createElement("div"); e.style.setProperty(old_name, "var(--v)"); assert_equals(e.style.getPropertyValue(new_name), "", `${old_name} is a shorthand rather than a legacy name alias`) assert_false(is_property_in_longhands(t, old_name), `${old_name} is not in getComputedStyle() list of longhands`); }, `${old_name} is a legacy name alias for ${new_name}`); }