blob: 3a9786c510dedc80cf7a5af143960fbeb7a09371 [file] [log] [blame]
<!doctype html>
<meta charset="utf-8">
<title>CSS.supports v. CSSStyleDeclaration</title>
<link rel="help" href="https://drafts.csswg.org/css-conditional/#dom-css-supports">
<link rel="help" href="https://drafts.csswg.org/cssom/#the-cssstyledeclaration-interface">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="testElement"></div>
<script>
// This gigantic list of properties is derived from the union of pretty much everything ever
// exposed via CSSStyleDeclaration since 2010 in a major browser; this deliberately includes all
// the vendor-prefixed properties _because_ they're often where bugs lie
const properties = [
"-apple-color-filter",
"-apple-pay-button-style",
"-apple-pay-button-type",
"-apple-trailing-word",
"-epub-caption-side",
"-epub-text-combine",
"-epub-text-emphasis",
"-epub-text-emphasis-color",
"-epub-text-emphasis-style",
"-epub-text-orientation",
"-epub-text-transform",
"-epub-word-break",
"-epub-writing-mode",
"-moz-animation",
"-moz-animation-delay",
"-moz-animation-direction",
"-moz-animation-duration",
"-moz-animation-fill-mode",
"-moz-animation-iteration-count",
"-moz-animation-name",
"-moz-animation-play-state",
"-moz-animation-timing-function",
"-moz-appearance",
"-moz-backface-visibility",
"-moz-binding",
"-moz-border-bottom-colors",
"-moz-border-end",
"-moz-border-end-color",
"-moz-border-end-style",
"-moz-border-end-width",
"-moz-border-image",
"-moz-border-left-colors",
"-moz-border-right-colors",
"-moz-border-start",
"-moz-border-start-color",
"-moz-border-start-style",
"-moz-border-start-width",
"-moz-border-top-colors",
"-moz-box-align",
"-moz-box-direction",
"-moz-box-flex",
"-moz-box-ordinal-group",
"-moz-box-orient",
"-moz-box-pack",
"-moz-box-sizing",
"-moz-column-count",
"-moz-column-fill",
"-moz-column-gap",
"-moz-column-rule",
"-moz-column-rule-color",
"-moz-column-rule-style",
"-moz-column-rule-width",
"-moz-column-span",
"-moz-column-width",
"-moz-columns",
"-moz-float-edge",
"-moz-font-feature-settings",
"-moz-font-language-override",
"-moz-force-broken-image-icon",
"-moz-hyphens",
"-moz-image-region",
"-moz-margin-end",
"-moz-margin-start",
"-moz-orient",
"-moz-osx-font-smoothing",
"-moz-outline-radius",
"-moz-outline-radius-bottomleft",
"-moz-outline-radius-bottomright",
"-moz-outline-radius-topleft",
"-moz-outline-radius-topright",
"-moz-padding-end",
"-moz-padding-start",
"-moz-perspective",
"-moz-perspective-origin",
"-moz-stack-sizing",
"-moz-tab-size",
"-moz-text-align-last",
"-moz-text-size-adjust",
"-moz-transform",
"-moz-transform-origin",
"-moz-transform-style",
"-moz-transition",
"-moz-transition-delay",
"-moz-transition-duration",
"-moz-transition-property",
"-moz-transition-timing-function",
"-moz-user-focus",
"-moz-user-input",
"-moz-user-modify",
"-moz-user-select",
"-moz-window-dragging",
"-ms-content-zoom-chaining",
"-ms-content-zoom-limit",
"-ms-content-zoom-limit-max",
"-ms-content-zoom-limit-min",
"-ms-content-zoom-snap",
"-ms-content-zoom-snap-points",
"-ms-content-zoom-snap-type",
"-ms-content-zooming",
"-ms-flow-from",
"-ms-flow-into",
"-ms-font-feature-settings",
"-ms-grid-column",
"-ms-grid-column-align",
"-ms-grid-column-span",
"-ms-grid-columns",
"-ms-grid-row",
"-ms-grid-row-align",
"-ms-grid-row-span",
"-ms-grid-rows",
"-ms-high-contrast-adjust",
"-ms-hyphenate-limit-chars",
"-ms-hyphenate-limit-lines",
"-ms-hyphenate-limit-zone",
"-ms-hyphens",
"-ms-ime-align",
"-ms-overflow-style",
"-ms-scroll-chaining",
"-ms-scroll-limit",
"-ms-scroll-limit-x-max",
"-ms-scroll-limit-x-min",
"-ms-scroll-limit-y-max",
"-ms-scroll-limit-y-min",
"-ms-scroll-rails",
"-ms-scroll-snap-points-x",
"-ms-scroll-snap-points-y",
"-ms-scroll-snap-type",
"-ms-scroll-snap-x",
"-ms-scroll-snap-y",
"-ms-scroll-translation",
"-ms-text-combine-horizontal",
"-ms-text-size-adjust",
"-ms-touch-select",
"-ms-user-select",
"-ms-wrap-flow",
"-ms-wrap-margin",
"-ms-wrap-through",
"-webkit-align-content",
"-webkit-align-items",
"-webkit-align-self",
"-webkit-animation",
"-webkit-animation-delay",
"-webkit-animation-direction",
"-webkit-animation-duration",
"-webkit-animation-fill-mode",
"-webkit-animation-iteration-count",
"-webkit-animation-name",
"-webkit-animation-play-state",
"-webkit-animation-timing-function",
"-webkit-appearance",
"-webkit-backface-visibility",
"-webkit-background-clip",
"-webkit-background-origin",
"-webkit-background-size",
"-webkit-border-bottom-left-radius",
"-webkit-border-bottom-right-radius",
"-webkit-border-image",
"-webkit-border-radius",
"-webkit-border-top-left-radius",
"-webkit-border-top-right-radius",
"-webkit-box-align",
"-webkit-box-direction",
"-webkit-box-flex",
"-webkit-box-ordinal-group",
"-webkit-box-orient",
"-webkit-box-pack",
"-webkit-box-shadow",
"-webkit-box-sizing",
"-webkit-filter",
"-webkit-flex",
"-webkit-flex-basis",
"-webkit-flex-direction",
"-webkit-flex-flow",
"-webkit-flex-grow",
"-webkit-flex-shrink",
"-webkit-flex-wrap",
"-webkit-justify-content",
"-webkit-line-clamp",
"-webkit-mask",
"-webkit-mask-clip",
"-webkit-mask-composite",
"-webkit-mask-image",
"-webkit-mask-origin",
"-webkit-mask-position",
"-webkit-mask-position-x",
"-webkit-mask-position-y",
"-webkit-mask-repeat",
"-webkit-mask-size",
"-webkit-order",
"-webkit-perspective",
"-webkit-perspective-origin",
"-webkit-text-fill-color",
"-webkit-text-size-adjust",
"-webkit-text-stroke",
"-webkit-text-stroke-color",
"-webkit-text-stroke-width",
"-webkit-transform",
"-webkit-transform-origin",
"-webkit-transform-style",
"-webkit-transition",
"-webkit-transition-delay",
"-webkit-transition-duration",
"-webkit-transition-property",
"-webkit-transition-timing-function",
"-webkit-user-select",
"align-content",
"align-items",
"align-self",
"alignment-baseline",
"all",
"alt",
"animation",
"animation-delay",
"animation-direction",
"animation-duration",
"animation-fill-mode",
"animation-iteration-count",
"animation-name",
"animation-play-state",
"animation-timing-function",
"appearance",
"backdrop-filter",
"backface-visibility",
"background",
"background-attachment",
"background-blend-mode",
"background-clip",
"background-color",
"background-image",
"background-origin",
"background-position",
"background-position-x",
"background-position-y",
"background-repeat",
"background-repeat-x",
"background-repeat-y",
"background-size",
"baseline-shift",
"block-size",
"border",
"border-block",
"border-block-color",
"border-block-end",
"border-block-end-color",
"border-block-end-style",
"border-block-end-width",
"border-block-start",
"border-block-start-color",
"border-block-start-style",
"border-block-start-width",
"border-block-style",
"border-block-width",
"border-bottom",
"border-bottom-color",
"border-bottom-left-radius",
"border-bottom-right-radius",
"border-bottom-style",
"border-bottom-width",
"border-collapse",
"border-color",
"border-end-end-radius",
"border-end-start-radius",
"border-image",
"border-image-outset",
"border-image-repeat",
"border-image-slice",
"border-image-source",
"border-image-width",
"border-inline",
"border-inline-color",
"border-inline-end",
"border-inline-end-color",
"border-inline-end-style",
"border-inline-end-width",
"border-inline-start",
"border-inline-start-color",
"border-inline-start-style",
"border-inline-start-width",
"border-inline-style",
"border-inline-width",
"border-left",
"border-left-color",
"border-left-style",
"border-left-width",
"border-radius",
"border-right",
"border-right-color",
"border-right-style",
"border-right-width",
"border-spacing",
"border-start-end-radius",
"border-start-start-radius",
"border-style",
"border-top",
"border-top-color",
"border-top-left-radius",
"border-top-right-radius",
"border-top-style",
"border-top-width",
"border-width",
"bottom",
"box-decoration-break",
"box-shadow",
"box-sizing",
"break-after",
"break-before",
"break-inside",
"buffered-rendering",
"caption-side",
"caret-color",
"clear",
"clip",
"clip-path",
"clip-rule",
"color",
"color-adjust",
"color-interpolation",
"color-interpolation-filters",
"color-profile",
"color-rendering",
"color-scheme",
"column-count",
"column-fill",
"column-gap",
"column-progression",
"column-rule",
"column-rule-color",
"column-rule-style",
"column-rule-width",
"column-span",
"column-width",
"columns",
"contain",
"contain-intrinsic-size",
"content",
"content-visibility",
"counter-increment",
"counter-reset",
"counter-set",
"cursor",
"cx",
"cy",
"d",
"direction",
"display",
"dominant-baseline",
"empty-cells",
"enable-background",
"fill",
"fill-opacity",
"fill-rule",
"filter",
"flex",
"flex-basis",
"flex-direction",
"flex-flow",
"flex-grow",
"flex-shrink",
"flex-wrap",
"float",
"flood-color",
"flood-opacity",
"font",
"font-display",
"font-family",
"font-feature-settings",
"font-kerning",
"font-language-override",
"font-optical-sizing",
"font-size",
"font-size-adjust",
"font-stretch",
"font-style",
"font-synthesis",
"font-variant",
"font-variant-alternates",
"font-variant-caps",
"font-variant-east-asian",
"font-variant-ligatures",
"font-variant-numeric",
"font-variant-position",
"font-variation-settings",
"font-weight",
"gap",
"glyph-orientation-horizontal",
"glyph-orientation-vertical",
"grid",
"grid-area",
"grid-auto-columns",
"grid-auto-flow",
"grid-auto-rows",
"grid-column",
"grid-column-end",
"grid-column-gap",
"grid-column-start",
"grid-gap",
"grid-row",
"grid-row-end",
"grid-row-gap",
"grid-row-start",
"grid-template",
"grid-template-areas",
"grid-template-columns",
"grid-template-rows",
"hanging-punctuation",
"height",
"hyphens",
"image-orientation",
"image-rendering",
"ime-mode",
"inherits",
"initial-value",
"inline-size",
"inset",
"inset-block",
"inset-block-end",
"inset-block-start",
"inset-inline",
"inset-inline-end",
"inset-inline-start",
"internal-text-autosizing-status",
"isolation",
"justify-content",
"justify-items",
"justify-self",
"kerning",
"layout-grid",
"layout-grid-char",
"layout-grid-line",
"layout-grid-mode",
"layout-grid-type",
"left",
"letter-spacing",
"lighting-color",
"line-break",
"line-height",
"list-style",
"list-style-image",
"list-style-position",
"list-style-type",
"margin",
"margin-block",
"margin-block-end",
"margin-block-start",
"margin-bottom",
"margin-inline",
"margin-inline-end",
"margin-inline-start",
"margin-left",
"margin-right",
"margin-top",
"marker",
"marker-end",
"marker-mid",
"marker-offset",
"marker-start",
"mask",
"mask-clip",
"mask-composite",
"mask-image",
"mask-mode",
"mask-origin",
"mask-position",
"mask-position-x",
"mask-position-y",
"mask-repeat",
"mask-size",
"mask-type",
"max-block-size",
"max-height",
"max-inline-size",
"max-width",
"max-zoom",
"min-block-size",
"min-height",
"min-inline-size",
"min-width",
"min-zoom",
"mix-blend-mode",
"motion",
"motion-offset",
"motion-path",
"motion-rotation",
"object-fit",
"object-position",
"offset",
"offset-anchor",
"offset-block-end",
"offset-block-start",
"offset-distance",
"offset-inline-end",
"offset-inline-start",
"offset-path",
"offset-rotate",
"offset-rotation",
"opacity",
"order",
"orientation",
"orphans",
"outline",
"outline-color",
"outline-offset",
"outline-style",
"outline-width",
"overflow",
"overflow-anchor",
"overflow-block",
"overflow-inline",
"overflow-wrap",
"overflow-x",
"overflow-y",
"overscroll-behavior",
"overscroll-behavior-block",
"overscroll-behavior-inline",
"overscroll-behavior-x",
"overscroll-behavior-y",
"padding",
"padding-block",
"padding-block-end",
"padding-block-start",
"padding-bottom",
"padding-inline",
"padding-inline-end",
"padding-inline-start",
"padding-left",
"padding-right",
"padding-top",
"page",
"page-break-after",
"page-break-before",
"page-break-inside",
"page-orientation",
"paint-order",
"pen-action",
"perspective",
"perspective-origin",
"perspective-origin-x",
"perspective-origin-y",
"place-content",
"place-items",
"place-self",
"pointer-events",
"position",
"quotes",
"r",
"resize",
"right",
"rotate",
"row-gap",
"ruby-align",
"ruby-overhang",
"ruby-position",
"rx",
"ry",
"scale",
"scroll-behavior",
"scroll-margin",
"scroll-margin-block",
"scroll-margin-block-end",
"scroll-margin-block-start",
"scroll-margin-bottom",
"scroll-margin-inline",
"scroll-margin-inline-end",
"scroll-margin-inline-start",
"scroll-margin-left",
"scroll-margin-right",
"scroll-margin-top",
"scroll-padding",
"scroll-padding-block",
"scroll-padding-block-end",
"scroll-padding-block-start",
"scroll-padding-bottom",
"scroll-padding-inline",
"scroll-padding-inline-end",
"scroll-padding-inline-start",
"scroll-padding-left",
"scroll-padding-right",
"scroll-padding-top",
"scroll-snap-align",
"scroll-snap-coordinate",
"scroll-snap-destination",
"scroll-snap-margin",
"scroll-snap-margin-bottom",
"scroll-snap-margin-left",
"scroll-snap-margin-right",
"scroll-snap-margin-top",
"scroll-snap-points-x",
"scroll-snap-points-y",
"scroll-snap-stop",
"scroll-snap-type",
"scroll-snap-type-x",
"scroll-snap-type-y",
"scrollbar-color",
"scrollbar-width",
"shape-image-threshold",
"shape-margin",
"shape-outside",
"shape-rendering",
"size",
"speak",
"speak-as",
"src",
"stop-color",
"stop-opacity",
"stroke",
"stroke-color",
"stroke-dasharray",
"stroke-dashoffset",
"stroke-linecap",
"stroke-linejoin",
"stroke-miterlimit",
"stroke-opacity",
"stroke-width",
"supported-color-schemes",
"syntax",
"tab-size",
"table-layout",
"text-align",
"text-align-last",
"text-anchor",
"text-combine-upright",
"text-decoration",
"text-decoration-color",
"text-decoration-line",
"text-decoration-skip",
"text-decoration-skip-ink",
"text-decoration-style",
"text-decoration-thickness",
"text-emphasis",
"text-emphasis-color",
"text-emphasis-position",
"text-emphasis-style",
"text-indent",
"text-justify",
"text-kashida",
"text-kashida-space",
"text-line-through",
"text-line-through-color",
"text-line-through-mode",
"text-line-through-style",
"text-line-through-width",
"text-orientation",
"text-overflow",
"text-overline",
"text-overline-color",
"text-overline-mode",
"text-overline-style",
"text-overline-width",
"text-rendering",
"text-shadow",
"text-size-adjust",
"text-transform",
"text-underline",
"text-underline-color",
"text-underline-mode",
"text-underline-offset",
"text-underline-position",
"text-underline-style",
"text-underline-width",
"top",
"touch-action",
"transform",
"transform-box",
"transform-origin",
"transform-origin-x",
"transform-origin-y",
"transform-origin-z",
"transform-style",
"transition",
"transition-delay",
"transition-duration",
"transition-property",
"transition-timing-function",
"translate",
"unicode-bidi",
"unicode-range",
"user-select",
"user-zoom",
"vector-effect",
"vertical-align",
"viewport-fit",
"visibility",
"white-space",
"widows",
"width",
"will-change",
"word-break",
"word-spacing",
"word-wrap",
"writing-mode",
"x",
"y",
"z-index",
"zoom"
];
function CSSPropertyToIDLAttribute(property, lowercaseFirstFlag=false) {
let output = "";
let uppercaseNext = false;
if (lowercaseFirstFlag) {
property = property.substring(1);
}
for (let c of property) {
if (c === "-") {
uppercaseNext = true;
} else if (uppercaseNext) {
uppercaseNext = false;
if (c >= "a" && c <= "z") {
output += c.toUpperCase();
} else {
output += c;
}
} else {
output += c;
}
}
return output;
}
const styledecl = document.getElementById("testElement").style;
for (let prop of properties) {
test(() => {
const camelCase = CSSPropertyToIDLAttribute(prop);
const supports = CSS.supports(prop, "inherit"); // inherit is always a valid value
assert_equals(supports, camelCase in styledecl);
}, `${prop}: _camel_cased_attribute v. CSS.supports`);
if (prop[0] == "-") {
if (prop.startsWith("-webkit-")) {
test(() => {
const webkitCased = CSSPropertyToIDLAttribute(prop, true);
const supports = CSS.supports(prop, "inherit"); // inherit is always a valid value
assert_equals(supports, webkitCased in styledecl);
}, `${prop}: _webkit_cased_attribute v. CSS.supports`);
} else {
test(() => {
const webkitCased = CSSPropertyToIDLAttribute(prop, true);
assert_false(webkitCased in styledecl);
}, `${prop}: _webkit_cased_attribute must only exist for -webkit-`);
}
}
if (prop.indexOf("-") >= 0) {
test(() => {
const supports = CSS.supports(prop, "inherit"); // inherit is always a valid value
assert_equals(supports, prop in styledecl);
}, `${prop}: _dashed_attribute v. CSS.supports`);
}
}
</script>