LibWeb/CSS: Implement CSSTransformValue

This is the final CSSStyleValue class used by the per-property test
harness, so those now actually run instead of throwing an exception on
load. 🎉

+39 WPT subtests. (Plus however many from the per-property tests finally
running.)

The two failing serialization tests are also failed by Safari in exactly
the same way, so that seems more like a spec issue. (The spec is
incomplete in quite a few places.) The failing subtest for toMatrix() is
also a spec issue: is2D is handled oddly by CSSMatrixComponent and this
subtest fails because of the `matrix` getter, which is unspecified. See
https://github.com/w3c/css-houdini-drafts/issues/1155 for details.
This commit is contained in:
Sam Atkins 2025-09-16 16:11:39 +01:00
parent 3269937e6d
commit d5977b9f74
18 changed files with 721 additions and 39 deletions

View File

@ -150,6 +150,7 @@ set(SOURCES
CSS/CSSStyleValue.cpp
CSS/CSSSupportsRule.cpp
CSS/CSSTransformComponent.cpp
CSS/CSSTransformValue.cpp
CSS/CSSTransition.cpp
CSS/CSSTranslate.cpp
CSS/CSSUnitValue.cpp

View File

@ -0,0 +1,158 @@
/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "CSSTransformValue.h"
#include <LibWeb/Bindings/CSSTransformValuePrototype.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/CSS/CSSTransformComponent.h>
#include <LibWeb/Geometry/DOMMatrix.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
namespace Web::CSS {
GC_DEFINE_ALLOCATOR(CSSTransformValue);
GC::Ref<CSSTransformValue> CSSTransformValue::create(JS::Realm& realm, Vector<GC::Ref<CSSTransformComponent>> transforms)
{
return realm.create<CSSTransformValue>(realm, move(transforms));
}
// https://drafts.css-houdini.org/css-typed-om-1/#dom-csstransformvalue-csstransformvalue
WebIDL::ExceptionOr<GC::Ref<CSSTransformValue>> CSSTransformValue::construct_impl(JS::Realm& realm, GC::RootVector<GC::Root<CSSTransformComponent>> transforms)
{
// The CSSTransformValue(transforms) constructor must, when called, perform the following steps:
// 1. If transforms is empty, throw a TypeError.
if (transforms.is_empty())
return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "CSSTransformValue's transforms list cannot be empty."sv };
// 2. Return a new CSSTransformValue whose values to iterate over is transforms.
Vector<GC::Ref<CSSTransformComponent>> converted_transforms;
converted_transforms.ensure_capacity(transforms.size());
for (auto const& transform : transforms)
converted_transforms.append(*transform);
return CSSTransformValue::create(realm, move(converted_transforms));
}
CSSTransformValue::CSSTransformValue(JS::Realm& realm, Vector<GC::Ref<CSSTransformComponent>> transforms)
: CSSStyleValue(realm)
, m_transforms(move(transforms))
{
m_legacy_platform_object_flags = LegacyPlatformObjectFlags {
.supports_indexed_properties = true,
.has_indexed_property_setter = true,
};
}
CSSTransformValue::~CSSTransformValue() = default;
void CSSTransformValue::initialize(JS::Realm& realm)
{
WEB_SET_PROTOTYPE_FOR_INTERFACE(CSSTransformValue);
Base::initialize(realm);
}
void CSSTransformValue::visit_edges(Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_transforms);
}
// https://drafts.css-houdini.org/css-typed-om-1/#dom-csstransformvalue-length
WebIDL::UnsignedLong CSSTransformValue::length() const
{
// The length attribute indicates how many transform components are contained within the CSSTransformValue.
return m_transforms.size();
}
// https://drafts.css-houdini.org/css-typed-om-1/#ref-for-dfn-determine-the-value-of-an-indexed-property%E2%91%A0
Optional<JS::Value> CSSTransformValue::item_value(size_t index) const
{
// To determine the value of an indexed property of a CSSTransformValue this and an index n, let values be thiss
// [[values]] internal slot, and return values[n].
if (index >= m_transforms.size())
return {};
return m_transforms[index];
}
static WebIDL::ExceptionOr<GC::Ref<CSSTransformComponent>> transform_component_from_js_value(JS::Value& value)
{
if (value.is_object()) {
if (auto* transform_component = as_if<CSSTransformComponent>(value.as_object()))
return GC::Ref { *transform_component };
}
return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "Value must be a CSSTransformComponent"sv };
}
// https://drafts.css-houdini.org/css-typed-om-1/#ref-for-dfn-set-the-value-of-an-existing-indexed-property%E2%91%A0
WebIDL::ExceptionOr<void> CSSTransformValue::set_value_of_existing_indexed_property(u32 n, JS::Value new_value)
{
// To set the value of an existing indexed property of a CSSTransformValue this, an index n, and a value new value,
// let values be thiss [[values]] internal slot, and set values[n] to new value.
m_transforms[n] = TRY(transform_component_from_js_value(new_value));
return {};
}
// https://drafts.css-houdini.org/css-typed-om-1/#ref-for-dfn-set-the-value-of-a-new-indexed-property①
WebIDL::ExceptionOr<void> CSSTransformValue::set_value_of_new_indexed_property(u32 n, JS::Value new_value)
{
// To set the value of a new indexed property of a CSSTransformValue this, an index n, and a value new value, let
// values be thiss [[values]] internal slot. If n is not equal to the size of values, throw a RangeError.
// Otherwise, append new value to values.
if (n != m_transforms.size())
return WebIDL::SimpleException { WebIDL::SimpleExceptionType::RangeError, "Index out of range"sv };
m_transforms.append(TRY(transform_component_from_js_value(new_value)));
return {};
}
// https://drafts.css-houdini.org/css-typed-om-1/#dom-csstransformvalue-is2d
bool CSSTransformValue::is_2d() const
{
// The is2D attribute of a CSSTransformValue this must, on getting, return true if, for each func in thiss values
// to iterate over, the funcs is2D attribute would return true; otherwise, the attribute returns false.
return all_of(m_transforms, [](auto& transform) { return transform->is_2d(); });
}
// https://drafts.css-houdini.org/css-typed-om-1/#dom-csstransformvalue-tomatrix
WebIDL::ExceptionOr<GC::Ref<Geometry::DOMMatrix>> CSSTransformValue::to_matrix() const
{
// The toMatrix() method of a CSSTransformValue this must, when called, perform the following steps:
// 1. Let matrix be a new DOMMatrix, initialized to the identity matrix, with its is2D internal slot set to true.
auto matrix = Geometry::DOMMatrix::create(realm());
// 2. For each func in thiss values to iterate over:
for (auto const& function : m_transforms) {
// 1. Let funcMatrix be the DOMMatrix returned by calling toMatrix() on func.
// AD-HOC: This can throw exceptions.
auto function_matrix = TRY(function->to_matrix());
// 2. Set matrix to the result of multiplying matrix and the matrix represented by funcMatrix.
TRY(matrix->multiply_self(*function_matrix));
}
// 3. Return matrix.
return matrix;
}
// https://drafts.css-houdini.org/css-typed-om-1/#serialize-a-csstransformvalue
WebIDL::ExceptionOr<String> CSSTransformValue::to_string() const
{
// 1. Return the result of serializing each item in thiss values to iterate over, then concatenating them
// separated by " ".
StringBuilder builder;
bool first = true;
for (auto const& transform : m_transforms) {
if (!first)
builder.append(" "sv);
first = false;
builder.append(TRY(transform->to_string()));
}
return builder.to_string_without_validation();
}
}

View File

@ -0,0 +1,44 @@
/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/CSS/CSSStyleValue.h>
#include <LibWeb/WebIDL/Types.h>
namespace Web::CSS {
// https://drafts.css-houdini.org/css-typed-om-1/#csstransformvalue
class CSSTransformValue final : public CSSStyleValue {
WEB_PLATFORM_OBJECT(CSSTransformValue, CSSStyleValue);
GC_DECLARE_ALLOCATOR(CSSTransformValue);
public:
[[nodiscard]] static GC::Ref<CSSTransformValue> create(JS::Realm&, Vector<GC::Ref<CSSTransformComponent>>);
static WebIDL::ExceptionOr<GC::Ref<CSSTransformValue>> construct_impl(JS::Realm&, GC::RootVector<GC::Root<CSSTransformComponent>>);
virtual ~CSSTransformValue() override;
WebIDL::UnsignedLong length() const;
virtual Optional<JS::Value> item_value(size_t index) const override;
virtual WebIDL::ExceptionOr<void> set_value_of_existing_indexed_property(u32, JS::Value) override;
virtual WebIDL::ExceptionOr<void> set_value_of_new_indexed_property(u32, JS::Value) override;
bool is_2d() const;
WebIDL::ExceptionOr<GC::Ref<Geometry::DOMMatrix>> to_matrix() const;
virtual WebIDL::ExceptionOr<String> to_string() const override;
private:
explicit CSSTransformValue(JS::Realm&, Vector<GC::Ref<CSSTransformComponent>>);
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Visitor&) override;
Vector<GC::Ref<CSSTransformComponent>> m_transforms;
};
}

View File

@ -0,0 +1,16 @@
#import <CSS/CSSStyleValue.idl>
#import <CSS/CSSTransformComponent.idl>
#import <Geometry/DOMMatrix.idl>
// https://drafts.css-houdini.org/css-typed-om-1/#csstransformvalue
[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)]
interface CSSTransformValue : CSSStyleValue {
constructor(sequence<CSSTransformComponent> transforms);
iterable<CSSTransformComponent>;
readonly attribute unsigned long length;
getter CSSTransformComponent (unsigned long index);
setter undefined (unsigned long index, CSSTransformComponent val);
[ImplementedAs=is_2d] readonly attribute boolean is2D;
DOMMatrix toMatrix();
};

View File

@ -275,6 +275,7 @@ class CSSStyleSheet;
class CSSStyleValue;
class CSSSupportsRule;
class CSSTransformComponent;
class CSSTransformValue;
class CSSTranslate;
class CSSUnitValue;
class CSSUnparsedValue;

View File

@ -70,6 +70,7 @@ libweb_js_bindings(CSS/CSSStyleSheet)
libweb_js_bindings(CSS/CSSStyleValue)
libweb_js_bindings(CSS/CSSSupportsRule)
libweb_js_bindings(CSS/CSSTransformComponent)
libweb_js_bindings(CSS/CSSTransformValue)
libweb_js_bindings(CSS/CSSTransition)
libweb_js_bindings(CSS/CSSTranslate)
libweb_js_bindings(CSS/CSSUnitValue)

View File

@ -82,6 +82,7 @@ CSSStyleSheet
CSSStyleValue
CSSSupportsRule
CSSTransformComponent
CSSTransformValue
CSSTransition
CSSTranslate
CSSUnitValue

View File

@ -2,8 +2,8 @@ Harness status: OK
Found 545 tests
360 Pass
185 Fail
370 Pass
175 Fail
Pass idl_test setup
Pass idl_test validation
Pass Partial interface Element: original interface defined
@ -248,16 +248,16 @@ Pass CSSNumericArray interface: existence and properties of interface prototype
Pass CSSNumericArray interface: existence and properties of interface prototype object's @@unscopables property
Pass CSSNumericArray interface: iterable<CSSNumericValue>
Pass CSSNumericArray interface: attribute length
Fail CSSTransformValue interface: existence and properties of interface object
Fail CSSTransformValue interface object length
Fail CSSTransformValue interface object name
Fail CSSTransformValue interface: existence and properties of interface prototype object
Fail CSSTransformValue interface: existence and properties of interface prototype object's "constructor" property
Fail CSSTransformValue interface: existence and properties of interface prototype object's @@unscopables property
Fail CSSTransformValue interface: iterable<CSSTransformComponent>
Fail CSSTransformValue interface: attribute length
Fail CSSTransformValue interface: attribute is2D
Fail CSSTransformValue interface: operation toMatrix()
Pass CSSTransformValue interface: existence and properties of interface object
Pass CSSTransformValue interface object length
Pass CSSTransformValue interface object name
Pass CSSTransformValue interface: existence and properties of interface prototype object
Pass CSSTransformValue interface: existence and properties of interface prototype object's "constructor" property
Pass CSSTransformValue interface: existence and properties of interface prototype object's @@unscopables property
Pass CSSTransformValue interface: iterable<CSSTransformComponent>
Pass CSSTransformValue interface: attribute length
Pass CSSTransformValue interface: attribute is2D
Pass CSSTransformValue interface: operation toMatrix()
Fail CSSTransformValue must be primary interface of transformValue
Fail Stringification of transformValue
Fail CSSTransformValue interface: transformValue must inherit property "length" with the proper type

View File

@ -1,3 +1,28 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 22 tests
20 Pass
2 Fail
Pass CSSTranslate with 2 arguments serializes correctly
Pass CSSTranslate with 3 arguments serializes correctly
Pass CSSScale with 2 arguments serializes correctly
Pass CSSScale with 3 arguments serializes correctly
Pass CSSRotate with 1 argument serializes correctly
Pass CSSRotate with 4 arguments serializes correctly
Pass CSSSkew serializes correctly
Pass CSSSkew with Y which is 0 value serializes correctly
Pass CSSSkewX serializes correctly
Pass CSSSkewY serializes correctly
Pass CSSPerspective serializes correctly
Pass CSSPerspective with negative length serializes correctly
Pass CSSPerspective with none as string serializes correctly
Pass CSSPerspective with none as CSSKeyword serializes correctly
Pass CSSTransformValue with a single transform serializes correctly
Pass CSSTransformValue with multiple transforms serializes correctly
Fail CSSTransformValue containing CSSMathValues serializes correctly
Pass CSSMathInvert with 0 parameter serializes correctly
Fail CSSMathInvert with 0 parameter and nested serializes correctly
Pass CSSMatrixComponent with 6 elements serializes correctly
Pass CSSMatrixComponent with 16 elements serializes correctly
Pass CSSTransformValue with updated is2D serializes as 2D transforms

View File

@ -2,6 +2,7 @@ Harness status: OK
Found 2 tests
2 Fail
Fail CSSTransformValue.toMatrix() multiplies its component matrices
1 Pass
1 Fail
Pass CSSTransformValue.toMatrix() multiplies its component matrices
Fail CSSTransformValue.toMatrix() respects is2D changes in its components

View File

@ -2,12 +2,12 @@ Harness status: OK
Found 8 tests
8 Fail
Fail Constructing a CSSTransformValue with no components throws TypeError
Fail CSSTransformValue can be constructed with multiple transforms
Fail CSSTransformValue.set correctly sets the CSSTransformComponent at the given index
Fail Setting a component in CSSTransformValue correctly appends the CSSTransformComponent if index specified is greater than length
Fail CSSTransformValue.is2D is false when given mix of 2D and 3D transforms
Fail CSSTransformValue.is2D is true when given only 2D transforms
Fail CSSTransformValue.is2D is readonly
Fail Can iterate through CSSTransformValue components
8 Pass
Pass Constructing a CSSTransformValue with no components throws TypeError
Pass CSSTransformValue can be constructed with multiple transforms
Pass CSSTransformValue.set correctly sets the CSSTransformComponent at the given index
Pass Setting a component in CSSTransformValue correctly appends the CSSTransformComponent if index specified is greater than length
Pass CSSTransformValue.is2D is false when given mix of 2D and 3D transforms
Pass CSSTransformValue.is2D is true when given only 2D transforms
Pass CSSTransformValue.is2D is readonly
Pass Can iterate through CSSTransformValue components

View File

@ -1,3 +1,42 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 37 tests
37 Fail
Fail Can set 'color' to CSS-wide keywords: initial
Fail Can set 'color' to CSS-wide keywords: inherit
Fail Can set 'color' to CSS-wide keywords: unset
Fail Can set 'color' to CSS-wide keywords: revert
Fail Can set 'color' to var() references: var(--A)
Fail Can set 'color' to the 'currentcolor' keyword: currentcolor
Fail Setting 'color' to a length: 0px throws TypeError
Fail Setting 'color' to a length: -3.14em throws TypeError
Fail Setting 'color' to a length: 3.14cm throws TypeError
Fail Setting 'color' to a length: calc(0px + 0em) throws TypeError
Fail Setting 'color' to a percent: 0% throws TypeError
Fail Setting 'color' to a percent: -3.14% throws TypeError
Fail Setting 'color' to a percent: 3.14% throws TypeError
Fail Setting 'color' to a percent: calc(0% + 0%) throws TypeError
Fail Setting 'color' to a time: 0s throws TypeError
Fail Setting 'color' to a time: -3.14ms throws TypeError
Fail Setting 'color' to a time: 3.14s throws TypeError
Fail Setting 'color' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'color' to an angle: 0deg throws TypeError
Fail Setting 'color' to an angle: 3.14rad throws TypeError
Fail Setting 'color' to an angle: -3.14deg throws TypeError
Fail Setting 'color' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'color' to a flexible length: 0fr throws TypeError
Fail Setting 'color' to a flexible length: 1fr throws TypeError
Fail Setting 'color' to a flexible length: -3.14fr throws TypeError
Fail Setting 'color' to a number: 0 throws TypeError
Fail Setting 'color' to a number: -3.14 throws TypeError
Fail Setting 'color' to a number: 3.14 throws TypeError
Fail Setting 'color' to a number: calc(2 + 3) throws TypeError
Fail Setting 'color' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'color' to a transform: perspective(10em) throws TypeError
Fail Setting 'color' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail 'color' does not support 'red'
Fail 'color' does not support '#bbff00'
Fail 'color' does not support 'rgb(255, 255, 128)'
Fail 'color' does not support 'hsl(50, 33%, 25%)'
Fail 'color' does not support 'transparent'

View File

@ -1,3 +1,74 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 69 tests
69 Fail
Fail Can set 'cursor' to CSS-wide keywords: initial
Fail Can set 'cursor' to CSS-wide keywords: inherit
Fail Can set 'cursor' to CSS-wide keywords: unset
Fail Can set 'cursor' to CSS-wide keywords: revert
Fail Can set 'cursor' to var() references: var(--A)
Fail Can set 'cursor' to the 'auto' keyword: auto
Fail Can set 'cursor' to the 'default' keyword: default
Fail Can set 'cursor' to the 'none' keyword: none
Fail Can set 'cursor' to the 'context-menu' keyword: context-menu
Fail Can set 'cursor' to the 'help' keyword: help
Fail Can set 'cursor' to the 'pointer' keyword: pointer
Fail Can set 'cursor' to the 'progress' keyword: progress
Fail Can set 'cursor' to the 'wait' keyword: wait
Fail Can set 'cursor' to the 'cell' keyword: cell
Fail Can set 'cursor' to the 'crosshair' keyword: crosshair
Fail Can set 'cursor' to the 'text' keyword: text
Fail Can set 'cursor' to the 'vertical-text' keyword: vertical-text
Fail Can set 'cursor' to the 'alias' keyword: alias
Fail Can set 'cursor' to the 'copy' keyword: copy
Fail Can set 'cursor' to the 'move' keyword: move
Fail Can set 'cursor' to the 'no-drop' keyword: no-drop
Fail Can set 'cursor' to the 'not-allowed' keyword: not-allowed
Fail Can set 'cursor' to the 'grab' keyword: grab
Fail Can set 'cursor' to the 'grabbing' keyword: grabbing
Fail Can set 'cursor' to the 'e-resize' keyword: e-resize
Fail Can set 'cursor' to the 'n-resize' keyword: n-resize
Fail Can set 'cursor' to the 'ne-resize' keyword: ne-resize
Fail Can set 'cursor' to the 'nw-resize' keyword: nw-resize
Fail Can set 'cursor' to the 's-resize' keyword: s-resize
Fail Can set 'cursor' to the 'se-resize' keyword: se-resize
Fail Can set 'cursor' to the 'sw-resize' keyword: sw-resize
Fail Can set 'cursor' to the 'w-resize' keyword: w-resize
Fail Can set 'cursor' to the 'ew-resize' keyword: ew-resize
Fail Can set 'cursor' to the 'ns-resize' keyword: ns-resize
Fail Can set 'cursor' to the 'nesw-resize' keyword: nesw-resize
Fail Can set 'cursor' to the 'nwse-resize' keyword: nwse-resize
Fail Can set 'cursor' to the 'col-resize' keyword: col-resize
Fail Can set 'cursor' to the 'row-resize' keyword: row-resize
Fail Can set 'cursor' to the 'all-scroll' keyword: all-scroll
Fail Can set 'cursor' to the 'zoom-in' keyword: zoom-in
Fail Can set 'cursor' to the 'zoom-out' keyword: zoom-out
Fail Setting 'cursor' to a length: 0px throws TypeError
Fail Setting 'cursor' to a length: -3.14em throws TypeError
Fail Setting 'cursor' to a length: 3.14cm throws TypeError
Fail Setting 'cursor' to a length: calc(0px + 0em) throws TypeError
Fail Setting 'cursor' to a percent: 0% throws TypeError
Fail Setting 'cursor' to a percent: -3.14% throws TypeError
Fail Setting 'cursor' to a percent: 3.14% throws TypeError
Fail Setting 'cursor' to a percent: calc(0% + 0%) throws TypeError
Fail Setting 'cursor' to a time: 0s throws TypeError
Fail Setting 'cursor' to a time: -3.14ms throws TypeError
Fail Setting 'cursor' to a time: 3.14s throws TypeError
Fail Setting 'cursor' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'cursor' to an angle: 0deg throws TypeError
Fail Setting 'cursor' to an angle: 3.14rad throws TypeError
Fail Setting 'cursor' to an angle: -3.14deg throws TypeError
Fail Setting 'cursor' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'cursor' to a flexible length: 0fr throws TypeError
Fail Setting 'cursor' to a flexible length: 1fr throws TypeError
Fail Setting 'cursor' to a flexible length: -3.14fr throws TypeError
Fail Setting 'cursor' to a number: 0 throws TypeError
Fail Setting 'cursor' to a number: -3.14 throws TypeError
Fail Setting 'cursor' to a number: 3.14 throws TypeError
Fail Setting 'cursor' to a number: calc(2 + 3) throws TypeError
Fail Setting 'cursor' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'cursor' to a transform: perspective(10em) throws TypeError
Fail Setting 'cursor' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail 'cursor' does not support 'url(hand.cur), pointer'
Fail 'cursor' does not support 'url(cursor1.png) 4 12, auto'

View File

@ -1,3 +1,62 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 56 tests
2 Pass
54 Fail
Fail Can set 'display' to CSS-wide keywords: initial
Fail Can set 'display' to CSS-wide keywords: inherit
Fail Can set 'display' to CSS-wide keywords: unset
Fail Can set 'display' to CSS-wide keywords: revert
Fail Can set 'display' to var() references: var(--A)
Fail Can set 'display' to the 'none' keyword: none
Fail Can set 'display' to the 'block' keyword: block
Fail Can set 'display' to the 'inline' keyword: inline
Fail Can set 'display' to the 'flow-root' keyword: flow-root
Fail Can set 'display' to the 'table' keyword: table
Fail Can set 'display' to the 'flex' keyword: flex
Fail Can set 'display' to the 'grid' keyword: grid
Fail Can set 'display' to the 'list-item' keyword: list-item
Fail Can set 'display' to the 'table-row-group' keyword: table-row-group
Fail Can set 'display' to the 'table-header-group' keyword: table-header-group
Fail Can set 'display' to the 'table-footer-group' keyword: table-footer-group
Fail Can set 'display' to the 'table-row' keyword: table-row
Fail Can set 'display' to the 'table-cell' keyword: table-cell
Fail Can set 'display' to the 'table-column-group' keyword: table-column-group
Fail Can set 'display' to the 'table-column' keyword: table-column
Fail Can set 'display' to the 'table-caption' keyword: table-caption
Fail Can set 'display' to the 'contents' keyword: contents
Fail Can set 'display' to the 'inline-block' keyword: inline-block
Fail Can set 'display' to the 'inline-table' keyword: inline-table
Fail Can set 'display' to the 'inline-flex' keyword: inline-flex
Fail Can set 'display' to the 'inline-grid' keyword: inline-grid
Fail Setting 'display' to a length: 0px throws TypeError
Fail Setting 'display' to a length: -3.14em throws TypeError
Fail Setting 'display' to a length: 3.14cm throws TypeError
Fail Setting 'display' to a length: calc(0px + 0em) throws TypeError
Fail Setting 'display' to a percent: 0% throws TypeError
Fail Setting 'display' to a percent: -3.14% throws TypeError
Fail Setting 'display' to a percent: 3.14% throws TypeError
Fail Setting 'display' to a percent: calc(0% + 0%) throws TypeError
Fail Setting 'display' to a time: 0s throws TypeError
Fail Setting 'display' to a time: -3.14ms throws TypeError
Fail Setting 'display' to a time: 3.14s throws TypeError
Fail Setting 'display' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'display' to an angle: 0deg throws TypeError
Fail Setting 'display' to an angle: 3.14rad throws TypeError
Fail Setting 'display' to an angle: -3.14deg throws TypeError
Fail Setting 'display' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'display' to a flexible length: 0fr throws TypeError
Fail Setting 'display' to a flexible length: 1fr throws TypeError
Fail Setting 'display' to a flexible length: -3.14fr throws TypeError
Fail Setting 'display' to a number: 0 throws TypeError
Fail Setting 'display' to a number: -3.14 throws TypeError
Fail Setting 'display' to a number: 3.14 throws TypeError
Fail Setting 'display' to a number: calc(2 + 3) throws TypeError
Fail Setting 'display' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'display' to a transform: perspective(10em) throws TypeError
Fail Setting 'display' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Pass 'display' does not support setting 'inline math'
Pass 'display' does not support setting 'math inline'
Fail 'display' does not support 'block math'
Fail 'display' does not support 'math block'

View File

@ -1,3 +1,10 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 5 tests
5 Fail
Fail 'font' does not support '1.2em "Fira Sans", sans-serif'
Fail 'font' does not support 'italic 1.2em "Fira Sans", serif'
Fail 'font' does not support 'italic small-caps bold 16px/2 cursive'
Fail 'font' does not support 'small-caps bold 24px/1 sans-serif'
Fail 'font' does not support 'caption'

View File

@ -1,3 +1,129 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 124 tests
124 Fail
Fail Can set 'padding-top' to CSS-wide keywords: initial
Fail Can set 'padding-top' to CSS-wide keywords: inherit
Fail Can set 'padding-top' to CSS-wide keywords: unset
Fail Can set 'padding-top' to CSS-wide keywords: revert
Fail Can set 'padding-top' to var() references: var(--A)
Fail Can set 'padding-top' to a percent: 0%
Fail Can set 'padding-top' to a percent: -3.14%
Fail Can set 'padding-top' to a percent: 3.14%
Fail Can set 'padding-top' to a percent: calc(0% + 0%)
Fail Can set 'padding-top' to a length: 0px
Fail Can set 'padding-top' to a length: -3.14em
Fail Can set 'padding-top' to a length: 3.14cm
Fail Can set 'padding-top' to a length: calc(0px + 0em)
Fail Setting 'padding-top' to a time: 0s throws TypeError
Fail Setting 'padding-top' to a time: -3.14ms throws TypeError
Fail Setting 'padding-top' to a time: 3.14s throws TypeError
Fail Setting 'padding-top' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'padding-top' to an angle: 0deg throws TypeError
Fail Setting 'padding-top' to an angle: 3.14rad throws TypeError
Fail Setting 'padding-top' to an angle: -3.14deg throws TypeError
Fail Setting 'padding-top' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'padding-top' to a flexible length: 0fr throws TypeError
Fail Setting 'padding-top' to a flexible length: 1fr throws TypeError
Fail Setting 'padding-top' to a flexible length: -3.14fr throws TypeError
Fail Setting 'padding-top' to a number: 0 throws TypeError
Fail Setting 'padding-top' to a number: -3.14 throws TypeError
Fail Setting 'padding-top' to a number: 3.14 throws TypeError
Fail Setting 'padding-top' to a number: calc(2 + 3) throws TypeError
Fail Setting 'padding-top' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'padding-top' to a transform: perspective(10em) throws TypeError
Fail Setting 'padding-top' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail Can set 'padding-left' to CSS-wide keywords: initial
Fail Can set 'padding-left' to CSS-wide keywords: inherit
Fail Can set 'padding-left' to CSS-wide keywords: unset
Fail Can set 'padding-left' to CSS-wide keywords: revert
Fail Can set 'padding-left' to var() references: var(--A)
Fail Can set 'padding-left' to a percent: 0%
Fail Can set 'padding-left' to a percent: -3.14%
Fail Can set 'padding-left' to a percent: 3.14%
Fail Can set 'padding-left' to a percent: calc(0% + 0%)
Fail Can set 'padding-left' to a length: 0px
Fail Can set 'padding-left' to a length: -3.14em
Fail Can set 'padding-left' to a length: 3.14cm
Fail Can set 'padding-left' to a length: calc(0px + 0em)
Fail Setting 'padding-left' to a time: 0s throws TypeError
Fail Setting 'padding-left' to a time: -3.14ms throws TypeError
Fail Setting 'padding-left' to a time: 3.14s throws TypeError
Fail Setting 'padding-left' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'padding-left' to an angle: 0deg throws TypeError
Fail Setting 'padding-left' to an angle: 3.14rad throws TypeError
Fail Setting 'padding-left' to an angle: -3.14deg throws TypeError
Fail Setting 'padding-left' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'padding-left' to a flexible length: 0fr throws TypeError
Fail Setting 'padding-left' to a flexible length: 1fr throws TypeError
Fail Setting 'padding-left' to a flexible length: -3.14fr throws TypeError
Fail Setting 'padding-left' to a number: 0 throws TypeError
Fail Setting 'padding-left' to a number: -3.14 throws TypeError
Fail Setting 'padding-left' to a number: 3.14 throws TypeError
Fail Setting 'padding-left' to a number: calc(2 + 3) throws TypeError
Fail Setting 'padding-left' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'padding-left' to a transform: perspective(10em) throws TypeError
Fail Setting 'padding-left' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail Can set 'padding-right' to CSS-wide keywords: initial
Fail Can set 'padding-right' to CSS-wide keywords: inherit
Fail Can set 'padding-right' to CSS-wide keywords: unset
Fail Can set 'padding-right' to CSS-wide keywords: revert
Fail Can set 'padding-right' to var() references: var(--A)
Fail Can set 'padding-right' to a percent: 0%
Fail Can set 'padding-right' to a percent: -3.14%
Fail Can set 'padding-right' to a percent: 3.14%
Fail Can set 'padding-right' to a percent: calc(0% + 0%)
Fail Can set 'padding-right' to a length: 0px
Fail Can set 'padding-right' to a length: -3.14em
Fail Can set 'padding-right' to a length: 3.14cm
Fail Can set 'padding-right' to a length: calc(0px + 0em)
Fail Setting 'padding-right' to a time: 0s throws TypeError
Fail Setting 'padding-right' to a time: -3.14ms throws TypeError
Fail Setting 'padding-right' to a time: 3.14s throws TypeError
Fail Setting 'padding-right' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'padding-right' to an angle: 0deg throws TypeError
Fail Setting 'padding-right' to an angle: 3.14rad throws TypeError
Fail Setting 'padding-right' to an angle: -3.14deg throws TypeError
Fail Setting 'padding-right' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'padding-right' to a flexible length: 0fr throws TypeError
Fail Setting 'padding-right' to a flexible length: 1fr throws TypeError
Fail Setting 'padding-right' to a flexible length: -3.14fr throws TypeError
Fail Setting 'padding-right' to a number: 0 throws TypeError
Fail Setting 'padding-right' to a number: -3.14 throws TypeError
Fail Setting 'padding-right' to a number: 3.14 throws TypeError
Fail Setting 'padding-right' to a number: calc(2 + 3) throws TypeError
Fail Setting 'padding-right' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'padding-right' to a transform: perspective(10em) throws TypeError
Fail Setting 'padding-right' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail Can set 'padding-bottom' to CSS-wide keywords: initial
Fail Can set 'padding-bottom' to CSS-wide keywords: inherit
Fail Can set 'padding-bottom' to CSS-wide keywords: unset
Fail Can set 'padding-bottom' to CSS-wide keywords: revert
Fail Can set 'padding-bottom' to var() references: var(--A)
Fail Can set 'padding-bottom' to a percent: 0%
Fail Can set 'padding-bottom' to a percent: -3.14%
Fail Can set 'padding-bottom' to a percent: 3.14%
Fail Can set 'padding-bottom' to a percent: calc(0% + 0%)
Fail Can set 'padding-bottom' to a length: 0px
Fail Can set 'padding-bottom' to a length: -3.14em
Fail Can set 'padding-bottom' to a length: 3.14cm
Fail Can set 'padding-bottom' to a length: calc(0px + 0em)
Fail Setting 'padding-bottom' to a time: 0s throws TypeError
Fail Setting 'padding-bottom' to a time: -3.14ms throws TypeError
Fail Setting 'padding-bottom' to a time: 3.14s throws TypeError
Fail Setting 'padding-bottom' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'padding-bottom' to an angle: 0deg throws TypeError
Fail Setting 'padding-bottom' to an angle: 3.14rad throws TypeError
Fail Setting 'padding-bottom' to an angle: -3.14deg throws TypeError
Fail Setting 'padding-bottom' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'padding-bottom' to a flexible length: 0fr throws TypeError
Fail Setting 'padding-bottom' to a flexible length: 1fr throws TypeError
Fail Setting 'padding-bottom' to a flexible length: -3.14fr throws TypeError
Fail Setting 'padding-bottom' to a number: 0 throws TypeError
Fail Setting 'padding-bottom' to a number: -3.14 throws TypeError
Fail Setting 'padding-bottom' to a number: 3.14 throws TypeError
Fail Setting 'padding-bottom' to a number: calc(2 + 3) throws TypeError
Fail Setting 'padding-bottom' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'padding-bottom' to a transform: perspective(10em) throws TypeError
Fail Setting 'padding-bottom' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError

View File

@ -1,3 +1,38 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 33 tests
33 Fail
Fail Can set 'transform' to CSS-wide keywords: initial
Fail Can set 'transform' to CSS-wide keywords: inherit
Fail Can set 'transform' to CSS-wide keywords: unset
Fail Can set 'transform' to CSS-wide keywords: revert
Fail Can set 'transform' to var() references: var(--A)
Fail Can set 'transform' to the 'none' keyword: none
Fail Can set 'transform' to a transform: translate(50%, 50%)
Fail Can set 'transform' to a transform: perspective(10em)
Fail Can set 'transform' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6)
Fail Setting 'transform' to a length: 0px throws TypeError
Fail Setting 'transform' to a length: -3.14em throws TypeError
Fail Setting 'transform' to a length: 3.14cm throws TypeError
Fail Setting 'transform' to a length: calc(0px + 0em) throws TypeError
Fail Setting 'transform' to a percent: 0% throws TypeError
Fail Setting 'transform' to a percent: -3.14% throws TypeError
Fail Setting 'transform' to a percent: 3.14% throws TypeError
Fail Setting 'transform' to a percent: calc(0% + 0%) throws TypeError
Fail Setting 'transform' to a time: 0s throws TypeError
Fail Setting 'transform' to a time: -3.14ms throws TypeError
Fail Setting 'transform' to a time: 3.14s throws TypeError
Fail Setting 'transform' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'transform' to an angle: 0deg throws TypeError
Fail Setting 'transform' to an angle: 3.14rad throws TypeError
Fail Setting 'transform' to an angle: -3.14deg throws TypeError
Fail Setting 'transform' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'transform' to a flexible length: 0fr throws TypeError
Fail Setting 'transform' to a flexible length: 1fr throws TypeError
Fail Setting 'transform' to a flexible length: -3.14fr throws TypeError
Fail Setting 'transform' to a number: 0 throws TypeError
Fail Setting 'transform' to a number: -3.14 throws TypeError
Fail Setting 'transform' to a number: 3.14 throws TypeError
Fail Setting 'transform' to a number: calc(2 + 3) throws TypeError
Fail 'transform' does not support 'matrix(sibling-index(), 2, 3, 4, 5 ,6)'

View File

@ -1,3 +1,100 @@
Harness status: Error
Harness status: OK
Found 0 tests
Found 95 tests
95 Fail
Fail Can set 'width' to CSS-wide keywords: initial
Fail Can set 'width' to CSS-wide keywords: inherit
Fail Can set 'width' to CSS-wide keywords: unset
Fail Can set 'width' to CSS-wide keywords: revert
Fail Can set 'width' to var() references: var(--A)
Fail Can set 'width' to the 'auto' keyword: auto
Fail Can set 'width' to a percent: 0%
Fail Can set 'width' to a percent: -3.14%
Fail Can set 'width' to a percent: 3.14%
Fail Can set 'width' to a percent: calc(0% + 0%)
Fail Can set 'width' to a length: 0px
Fail Can set 'width' to a length: -3.14em
Fail Can set 'width' to a length: 3.14cm
Fail Can set 'width' to a length: calc(0px + 0em)
Fail Setting 'width' to a time: 0s throws TypeError
Fail Setting 'width' to a time: -3.14ms throws TypeError
Fail Setting 'width' to a time: 3.14s throws TypeError
Fail Setting 'width' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'width' to an angle: 0deg throws TypeError
Fail Setting 'width' to an angle: 3.14rad throws TypeError
Fail Setting 'width' to an angle: -3.14deg throws TypeError
Fail Setting 'width' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'width' to a flexible length: 0fr throws TypeError
Fail Setting 'width' to a flexible length: 1fr throws TypeError
Fail Setting 'width' to a flexible length: -3.14fr throws TypeError
Fail Setting 'width' to a number: 0 throws TypeError
Fail Setting 'width' to a number: -3.14 throws TypeError
Fail Setting 'width' to a number: 3.14 throws TypeError
Fail Setting 'width' to a number: calc(2 + 3) throws TypeError
Fail Setting 'width' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'width' to a transform: perspective(10em) throws TypeError
Fail Setting 'width' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail Can set 'min-width' to CSS-wide keywords: initial
Fail Can set 'min-width' to CSS-wide keywords: inherit
Fail Can set 'min-width' to CSS-wide keywords: unset
Fail Can set 'min-width' to CSS-wide keywords: revert
Fail Can set 'min-width' to var() references: var(--A)
Fail Can set 'min-width' to a percent: 0%
Fail Can set 'min-width' to a percent: -3.14%
Fail Can set 'min-width' to a percent: 3.14%
Fail Can set 'min-width' to a percent: calc(0% + 0%)
Fail Can set 'min-width' to a length: 0px
Fail Can set 'min-width' to a length: -3.14em
Fail Can set 'min-width' to a length: 3.14cm
Fail Can set 'min-width' to a length: calc(0px + 0em)
Fail Setting 'min-width' to a time: 0s throws TypeError
Fail Setting 'min-width' to a time: -3.14ms throws TypeError
Fail Setting 'min-width' to a time: 3.14s throws TypeError
Fail Setting 'min-width' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'min-width' to an angle: 0deg throws TypeError
Fail Setting 'min-width' to an angle: 3.14rad throws TypeError
Fail Setting 'min-width' to an angle: -3.14deg throws TypeError
Fail Setting 'min-width' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'min-width' to a flexible length: 0fr throws TypeError
Fail Setting 'min-width' to a flexible length: 1fr throws TypeError
Fail Setting 'min-width' to a flexible length: -3.14fr throws TypeError
Fail Setting 'min-width' to a number: 0 throws TypeError
Fail Setting 'min-width' to a number: -3.14 throws TypeError
Fail Setting 'min-width' to a number: 3.14 throws TypeError
Fail Setting 'min-width' to a number: calc(2 + 3) throws TypeError
Fail Setting 'min-width' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'min-width' to a transform: perspective(10em) throws TypeError
Fail Setting 'min-width' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError
Fail Can set 'max-width' to CSS-wide keywords: initial
Fail Can set 'max-width' to CSS-wide keywords: inherit
Fail Can set 'max-width' to CSS-wide keywords: unset
Fail Can set 'max-width' to CSS-wide keywords: revert
Fail Can set 'max-width' to var() references: var(--A)
Fail Can set 'max-width' to the 'none' keyword: none
Fail Can set 'max-width' to a percent: 0%
Fail Can set 'max-width' to a percent: -3.14%
Fail Can set 'max-width' to a percent: 3.14%
Fail Can set 'max-width' to a percent: calc(0% + 0%)
Fail Can set 'max-width' to a length: 0px
Fail Can set 'max-width' to a length: -3.14em
Fail Can set 'max-width' to a length: 3.14cm
Fail Can set 'max-width' to a length: calc(0px + 0em)
Fail Setting 'max-width' to a time: 0s throws TypeError
Fail Setting 'max-width' to a time: -3.14ms throws TypeError
Fail Setting 'max-width' to a time: 3.14s throws TypeError
Fail Setting 'max-width' to a time: calc(0s + 0ms) throws TypeError
Fail Setting 'max-width' to an angle: 0deg throws TypeError
Fail Setting 'max-width' to an angle: 3.14rad throws TypeError
Fail Setting 'max-width' to an angle: -3.14deg throws TypeError
Fail Setting 'max-width' to an angle: calc(0rad + 0deg) throws TypeError
Fail Setting 'max-width' to a flexible length: 0fr throws TypeError
Fail Setting 'max-width' to a flexible length: 1fr throws TypeError
Fail Setting 'max-width' to a flexible length: -3.14fr throws TypeError
Fail Setting 'max-width' to a number: 0 throws TypeError
Fail Setting 'max-width' to a number: -3.14 throws TypeError
Fail Setting 'max-width' to a number: 3.14 throws TypeError
Fail Setting 'max-width' to a number: calc(2 + 3) throws TypeError
Fail Setting 'max-width' to a transform: translate(50%, 50%) throws TypeError
Fail Setting 'max-width' to a transform: perspective(10em) throws TypeError
Fail Setting 'max-width' to a transform: translate3d(0px, 1px, 2px) translate(0px, 1px) rotate3d(1, 2, 3, 45deg) rotate(45deg) scale3d(1, 2, 3) scale(1, 2) skew(1deg, 1deg) skewX(1deg) skewY(45deg) perspective(1px) matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) matrix(1, 2, 3, 4, 5, 6) throws TypeError