LibWeb/CSS: Use ShorthandStyleValue to serialize shorthands

This wins us 65 new WPT subtest passes! It also shows up that we're
doing the wrong thing in ShorthandStyleValue in places, notably with
the grid properties. However, having one place to fix instead of two
will make it easier to correct them. :^)

In order to be fully correct, we should use the algorithm here:
https://drafts.csswg.org/cssom/#serialize-a-css-value

However, it's quite hand-wavy. What we do have in the meantime is
`ShorthandStyleValue::to_string()`, where we special-case the
serialization rules for shorthands with a generic fallback that's
equivalent to what the previous `get_property_value()` code was doing.
This commit is contained in:
Sam Atkins 2024-11-29 13:02:30 +00:00 committed by Andreas Kling
commit e4d55a6037
Notes: github-actions[bot] 2024-11-30 10:03:02 +00:00
13 changed files with 127 additions and 121 deletions

View file

@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2018-2024, Andreas Kling <andreas@ladybird.org> * Copyright (c) 2018-2024, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2023-2024, Sam Atkins <sam@ladybird.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
*/ */
@ -11,6 +12,7 @@
#include <LibWeb/CSS/Parser/Parser.h> #include <LibWeb/CSS/Parser/Parser.h>
#include <LibWeb/CSS/StyleComputer.h> #include <LibWeb/CSS/StyleComputer.h>
#include <LibWeb/CSS/StyleValues/ImageStyleValue.h> #include <LibWeb/CSS/StyleValues/ImageStyleValue.h>
#include <LibWeb/CSS/StyleValues/ShorthandStyleValue.h>
#include <LibWeb/DOM/Document.h> #include <LibWeb/DOM/Document.h>
#include <LibWeb/DOM/Element.h> #include <LibWeb/DOM/Element.h>
#include <LibWeb/Infra/Strings.h> #include <LibWeb/Infra/Strings.h>
@ -277,11 +279,12 @@ String CSSStyleDeclaration::get_property_value(StringView property_name) const
// 2. If property is a shorthand property, then follow these substeps: // 2. If property is a shorthand property, then follow these substeps:
if (property_is_shorthand(property_id.value())) { if (property_is_shorthand(property_id.value())) {
// 1. Let list be a new empty array. // 1. Let list be a new empty array.
StringBuilder list; Vector<ValueComparingNonnullRefPtr<CSSStyleValue const>> list;
Optional<Important> last_important_flag; Optional<Important> last_important_flag;
// 2. For each longhand property longhand that property maps to, in canonical order, follow these substeps: // 2. For each longhand property longhand that property maps to, in canonical order, follow these substeps:
for (auto longhand_property_id : longhands_for_shorthand(property_id.value())) { Vector<PropertyID> longhand_ids = longhands_for_shorthand(property_id.value());
for (auto longhand_property_id : longhand_ids) {
// 1. If longhand is a case-sensitive match for a property name of a CSS declaration in the declarations, let declaration be that CSS declaration, or null otherwise. // 1. If longhand is a case-sensitive match for a property name of a CSS declaration in the declarations, let declaration be that CSS declaration, or null otherwise.
auto declaration = property(longhand_property_id); auto declaration = property(longhand_property_id);
@ -290,9 +293,7 @@ String CSSStyleDeclaration::get_property_value(StringView property_name) const
return {}; return {};
// 3. Append the declaration to list. // 3. Append the declaration to list.
if (!list.is_empty()) list.append(declaration->value);
list.append(' ');
list.append(declaration->value->to_string());
if (last_important_flag.has_value() && declaration->important != *last_important_flag) if (last_important_flag.has_value() && declaration->important != *last_important_flag)
return {}; return {};
@ -300,7 +301,8 @@ String CSSStyleDeclaration::get_property_value(StringView property_name) const
} }
// 3. If important flags of all declarations in list are same, then return the serialization of list. // 3. If important flags of all declarations in list are same, then return the serialization of list.
return list.to_string_without_validation(); // NOTE: Currently we implement property-specific shorthand serialization in ShorthandStyleValue::to_string().
return ShorthandStyleValue::create(property_id.value(), longhand_ids, list)->to_string();
// 4. Return the empty string. // 4. Return the empty string.
// NOTE: This is handled by the loop. // NOTE: This is handled by the loop.

View file

@ -1,41 +1,41 @@
=== place-items: normal === place-items: normal
place-items: normal normal place-items: normal
align-items: normal align-items: normal
justify-items: normal justify-items: normal
=== place-items: stretch === place-items: stretch
place-items: stretch stretch place-items: stretch
align-items: stretch align-items: stretch
justify-items: stretch justify-items: stretch
=== place-items: start === place-items: start
place-items: start start place-items: start
align-items: start align-items: start
justify-items: start justify-items: start
=== place-items: end === place-items: end
place-items: end end place-items: end
align-items: end align-items: end
justify-items: end justify-items: end
=== place-items: self-start === place-items: self-start
place-items: self-start self-start place-items: self-start
align-items: self-start align-items: self-start
justify-items: self-start justify-items: self-start
=== place-items: self-end === place-items: self-end
place-items: self-end self-end place-items: self-end
align-items: self-end align-items: self-end
justify-items: self-end justify-items: self-end
=== place-items: center === place-items: center
place-items: center center place-items: center
align-items: center align-items: center
justify-items: center justify-items: center
=== place-items: flex-start === place-items: flex-start
place-items: flex-start flex-start place-items: flex-start
align-items: flex-start align-items: flex-start
justify-items: flex-start justify-items: flex-start
=== place-items: flex-end === place-items: flex-end
place-items: flex-end flex-end place-items: flex-end
align-items: flex-end align-items: flex-end
justify-items: flex-end justify-items: flex-end
=== place-items: baseline === place-items: baseline
place-items: baseline baseline place-items: baseline
align-items: baseline align-items: baseline
justify-items: baseline justify-items: baseline
=== place-items: normal start === place-items: normal start

View file

@ -57,9 +57,9 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'WebkitBorderBottomRightRadius': '0px' 'WebkitBorderBottomRightRadius': '0px'
'webkitBorderBottomRightRadius': '0px' 'webkitBorderBottomRightRadius': '0px'
'-webkit-border-bottom-right-radius': '0px' '-webkit-border-bottom-right-radius': '0px'
'WebkitBorderRadius': '0px 0px 0px 0px' 'WebkitBorderRadius': '0px 0px 0px 0px / 0px 0px 0px 0px'
'webkitBorderRadius': '0px 0px 0px 0px' 'webkitBorderRadius': '0px 0px 0px 0px / 0px 0px 0px 0px'
'-webkit-border-radius': '0px 0px 0px 0px' '-webkit-border-radius': '0px 0px 0px 0px / 0px 0px 0px 0px'
'WebkitBorderTopLeftRadius': '0px' 'WebkitBorderTopLeftRadius': '0px'
'webkitBorderTopLeftRadius': '0px' 'webkitBorderTopLeftRadius': '0px'
'-webkit-border-top-left-radius': '0px' '-webkit-border-top-left-radius': '0px'
@ -159,7 +159,7 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'aspect-ratio': 'auto' 'aspect-ratio': 'auto'
'backdropFilter': 'none' 'backdropFilter': 'none'
'backdrop-filter': 'none' 'backdrop-filter': 'none'
'background': 'scroll border-box rgba(0, 0, 0, 0) none padding-box left 0% top 0% repeat auto auto' 'background': 'rgba(0, 0, 0, 0) none left 0% top 0% auto auto repeat scroll padding-box border-box'
'backgroundAttachment': 'scroll' 'backgroundAttachment': 'scroll'
'background-attachment': 'scroll' 'background-attachment': 'scroll'
'backgroundClip': 'border-box' 'backgroundClip': 'border-box'
@ -205,8 +205,8 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'border-left-style': 'none' 'border-left-style': 'none'
'borderLeftWidth': 'medium' 'borderLeftWidth': 'medium'
'border-left-width': 'medium' 'border-left-width': 'medium'
'borderRadius': '0px 0px 0px 0px' 'borderRadius': '0px 0px 0px 0px / 0px 0px 0px 0px'
'border-radius': '0px 0px 0px 0px' 'border-radius': '0px 0px 0px 0px / 0px 0px 0px 0px'
'borderRight': 'medium none rgb(0, 0, 0)' 'borderRight': 'medium none rgb(0, 0, 0)'
'border-right': 'medium none rgb(0, 0, 0)' 'border-right': 'medium none rgb(0, 0, 0)'
'borderRightColor': 'rgb(0, 0, 0)' 'borderRightColor': 'rgb(0, 0, 0)'
@ -255,7 +255,7 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'column-span': 'none' 'column-span': 'none'
'columnWidth': 'auto' 'columnWidth': 'auto'
'column-width': 'auto' 'column-width': 'auto'
'columns': 'auto auto' 'columns': 'auto'
'content': 'normal' 'content': 'normal'
'contentVisibility': 'visible' 'contentVisibility': 'visible'
'content-visibility': 'visible' 'content-visibility': 'visible'
@ -290,7 +290,7 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'flexWrap': 'nowrap' 'flexWrap': 'nowrap'
'flex-wrap': 'nowrap' 'flex-wrap': 'nowrap'
'float': 'none' 'float': 'none'
'font': 'serif 16px normal normal normal 400 normal' 'font': 'normal normal 400 normal 16px / normal serif'
'fontFamily': 'serif' 'fontFamily': 'serif'
'font-family': 'serif' 'font-family': 'serif'
'fontFeatureSettings': 'normal' 'fontFeatureSettings': 'normal'
@ -312,17 +312,17 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'fontWidth': 'normal' 'fontWidth': 'normal'
'font-width': 'normal' 'font-width': 'normal'
'gap': 'normal normal' 'gap': 'normal normal'
'grid': 'none auto auto' 'grid': ''
'gridArea': 'auto auto auto auto' 'gridArea': ''
'grid-area': 'auto auto auto auto' 'grid-area': ''
'gridAutoColumns': 'auto' 'gridAutoColumns': 'auto'
'grid-auto-columns': 'auto' 'grid-auto-columns': 'auto'
'gridAutoFlow': 'row' 'gridAutoFlow': 'row'
'grid-auto-flow': 'row' 'grid-auto-flow': 'row'
'gridAutoRows': 'auto' 'gridAutoRows': 'auto'
'grid-auto-rows': 'auto' 'grid-auto-rows': 'auto'
'gridColumn': 'auto auto' 'gridColumn': 'auto'
'grid-column': 'auto auto' 'grid-column': 'auto'
'gridColumnEnd': 'auto' 'gridColumnEnd': 'auto'
'grid-column-end': 'auto' 'grid-column-end': 'auto'
'gridColumnGap': 'normal' 'gridColumnGap': 'normal'
@ -331,16 +331,16 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'grid-column-start': 'auto' 'grid-column-start': 'auto'
'gridGap': 'normal normal' 'gridGap': 'normal normal'
'grid-gap': 'normal normal' 'grid-gap': 'normal normal'
'gridRow': 'auto auto' 'gridRow': 'auto'
'grid-row': 'auto auto' 'grid-row': 'auto'
'gridRowEnd': 'auto' 'gridRowEnd': 'auto'
'grid-row-end': 'auto' 'grid-row-end': 'auto'
'gridRowGap': 'normal' 'gridRowGap': 'normal'
'grid-row-gap': 'normal' 'grid-row-gap': 'normal'
'gridRowStart': 'auto' 'gridRowStart': 'auto'
'grid-row-start': 'auto' 'grid-row-start': 'auto'
'gridTemplate': 'none auto auto' 'gridTemplate': ''
'grid-template': 'none auto auto' 'grid-template': ''
'gridTemplateAreas': 'none' 'gridTemplateAreas': 'none'
'grid-template-areas': 'none' 'grid-template-areas': 'none'
'gridTemplateColumns': 'auto' 'gridTemplateColumns': 'auto'
@ -376,8 +376,8 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'letter-spacing': 'normal' 'letter-spacing': 'normal'
'lineHeight': 'normal' 'lineHeight': 'normal'
'line-height': 'normal' 'line-height': 'normal'
'listStyle': 'disc outside none' 'listStyle': 'outside none disc'
'list-style': 'disc outside none' 'list-style': 'outside none disc'
'listStyleImage': 'none' 'listStyleImage': 'none'
'list-style-image': 'none' 'list-style-image': 'none'
'listStylePosition': 'outside' 'listStylePosition': 'outside'
@ -469,12 +469,12 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'padding-right': '0px' 'padding-right': '0px'
'paddingTop': '0px' 'paddingTop': '0px'
'padding-top': '0px' 'padding-top': '0px'
'placeContent': 'normal normal' 'placeContent': 'normal'
'place-content': 'normal normal' 'place-content': 'normal'
'placeItems': 'normal legacy' 'placeItems': 'normal legacy'
'place-items': 'normal legacy' 'place-items': 'normal legacy'
'placeSelf': 'auto auto' 'placeSelf': 'auto'
'place-self': 'auto auto' 'place-self': 'auto'
'pointerEvents': 'auto' 'pointerEvents': 'auto'
'pointer-events': 'auto' 'pointer-events': 'auto'
'position': 'static' 'position': 'static'
@ -518,8 +518,8 @@ All supported properties and their default values exposed from CSSStyleDeclarati
'text-align': 'start' 'text-align': 'start'
'textAnchor': 'start' 'textAnchor': 'start'
'text-anchor': 'start' 'text-anchor': 'start'
'textDecoration': 'rgb(0, 0, 0) none solid auto' 'textDecoration': 'none auto solid rgb(0, 0, 0)'
'text-decoration': 'rgb(0, 0, 0) none solid auto' 'text-decoration': 'none auto solid rgb(0, 0, 0)'
'textDecorationColor': 'rgb(0, 0, 0)' 'textDecorationColor': 'rgb(0, 0, 0)'
'text-decoration-color': 'rgb(0, 0, 0)' 'text-decoration-color': 'rgb(0, 0, 0)'
'textDecorationLine': 'none' 'textDecorationLine': 'none'

View file

@ -6,11 +6,11 @@ Rerun
Found 30 tests Found 30 tests
6 Pass 9 Pass
24 Fail 21 Fail
Details Details
Result Test Name MessageFail Property grid-area value 'auto / auto / auto / auto' Result Test Name MessageFail Property grid-area value 'auto / auto / auto / auto'
Fail Property grid-row value 'auto / auto' Pass Property grid-row value 'auto / auto'
Pass Property grid-column-end value 'auto' Pass Property grid-column-end value 'auto'
Fail Property grid-row value '-zπ' Fail Property grid-row value '-zπ'
Pass Property grid-row-start value 'AZ' Pass Property grid-row-start value 'AZ'
@ -25,7 +25,7 @@ Fail Property grid-column-start value '-44 Z'
Fail Property grid-row-end value '1 -πA' Fail Property grid-row-end value '1 -πA'
Fail Property grid-column-end value '5 π_' Fail Property grid-column-end value '5 π_'
Fail Property grid-area value 'span 2 i / auto / auto / auto' Fail Property grid-area value 'span 2 i / auto / auto / auto'
Fail Property grid-row value 'span 2 / auto' Pass Property grid-row value 'span 2 / auto'
Fail Property grid-column-start value 'span 1 i' Fail Property grid-column-start value 'span 1 i'
Pass Property grid-row-start value 'span 1' Pass Property grid-row-start value 'span 1'
Fail Property grid-row-end value 'span 2 i' Fail Property grid-row-end value 'span 2 i'
@ -35,7 +35,7 @@ Fail Property grid-row value 'span i / auto'
Fail Property grid-area value 'auto / i / auto / i' Fail Property grid-area value 'auto / i / auto / i'
Fail Property grid-area value 'auto / i / 2 j' Fail Property grid-area value 'auto / i / 2 j'
Fail Property grid-area value 'auto / i / 2 j / span 3 k' Fail Property grid-area value 'auto / i / 2 j / span 3 k'
Fail Property grid-row value 'auto / i' Pass Property grid-row value 'auto / i'
Fail Property grid-column value '2 j / span 3 k' Fail Property grid-column value '2 j / span 3 k'
Fail Property grid-column-end value '\31st' Fail Property grid-column-end value '\31st'
Fail Property grid-column-end value '\31 st' Fail Property grid-column-end value '\31 st'

View file

@ -6,16 +6,16 @@ Rerun
Found 57 tests Found 57 tests
6 Pass 13 Pass
51 Fail 44 Fail
Details Details
Result Test Name MessageFail e.style['grid-area'] = "auto" should set the property value Result Test Name MessageFail e.style['grid-area'] = "auto" should set the property value
Fail e.style['grid-area'] = "auto / auto" should set the property value Fail e.style['grid-area'] = "auto / auto" should set the property value
Fail e.style['grid-area'] = "auto / auto / auto" should set the property value Fail e.style['grid-area'] = "auto / auto / auto" should set the property value
Fail e.style['grid-area'] = "auto / auto / auto / auto" should set the property value Fail e.style['grid-area'] = "auto / auto / auto / auto" should set the property value
Fail e.style['grid-area'] = "AuTo" should set the property value Fail e.style['grid-area'] = "AuTo" should set the property value
Fail e.style['grid-row'] = "auto" should set the property value Pass e.style['grid-row'] = "auto" should set the property value
Fail e.style['grid-row'] = "auto/auto" should set the property value Pass e.style['grid-row'] = "auto/auto" should set the property value
Pass e.style['grid-column-end'] = "AuTo" should set the property value Pass e.style['grid-column-end'] = "AuTo" should set the property value
Fail e.style['grid-area'] = "--a" should set the property value Fail e.style['grid-area'] = "--a" should set the property value
Fail e.style['grid-row'] = "-zπ" should set the property value Fail e.style['grid-row'] = "-zπ" should set the property value
@ -27,7 +27,7 @@ Pass e.style['grid-row-end'] = "_9" should set the property value
Fail e.style['grid-area'] = "1" should set the property value Fail e.style['grid-area'] = "1" should set the property value
Fail e.style['grid-area'] = "+90 -a-" should set the property value Fail e.style['grid-area'] = "+90 -a-" should set the property value
Fail e.style['grid-row'] = "az 2" should set the property value Fail e.style['grid-row'] = "az 2" should set the property value
Fail e.style['grid-column'] = "9" should set the property value Pass e.style['grid-column'] = "9" should set the property value
Fail e.style['grid-column'] = "-19 zA" should set the property value Fail e.style['grid-column'] = "-19 zA" should set the property value
Fail e.style['grid-column'] = "-A0 33" should set the property value Fail e.style['grid-column'] = "-A0 33" should set the property value
Pass e.style['grid-row-start'] = "-19" should set the property value Pass e.style['grid-row-start'] = "-19" should set the property value
@ -39,7 +39,7 @@ Fail e.style['grid-column-end'] = "π_ +5" should set the property value
Fail e.style['grid-area'] = "span 2 i" should set the property value Fail e.style['grid-area'] = "span 2 i" should set the property value
Fail e.style['grid-area'] = "i 2 SpAn" should set the property value Fail e.style['grid-area'] = "i 2 SpAn" should set the property value
Fail e.style['grid-area'] = "span 1 i" should set the property value Fail e.style['grid-area'] = "span 1 i" should set the property value
Fail e.style['grid-row'] = "span 2" should set the property value Pass e.style['grid-row'] = "span 2" should set the property value
Fail e.style['grid-column'] = "i SpAn" should set the property value Fail e.style['grid-column'] = "i SpAn" should set the property value
Fail e.style['grid-row-start'] = "span i" should set the property value Fail e.style['grid-row-start'] = "span i" should set the property value
Fail e.style['grid-column-start'] = "SpAn i 2" should set the property value Fail e.style['grid-column-start'] = "SpAn i 2" should set the property value
@ -51,17 +51,17 @@ Fail e.style['grid-area'] = "auto / i / auto / 2 i" should set the property valu
Fail e.style['grid-area'] = "1 / i / auto / i" should set the property value Fail e.style['grid-area'] = "1 / i / auto / i" should set the property value
Fail e.style['grid-area'] = "1 / auto / auto / auto" should set the property value Fail e.style['grid-area'] = "1 / auto / auto / auto" should set the property value
Fail e.style['grid-area'] = "1 / auto / i / auto" should set the property value Fail e.style['grid-area'] = "1 / auto / i / auto" should set the property value
Fail e.style['grid-area'] = "1 / j / i / k" should set the property value Pass e.style['grid-area'] = "1 / j / i / k" should set the property value
Fail e.style['grid-area'] = "1 / auto / 2 / auto" should set the property value Fail e.style['grid-area'] = "1 / auto / 2 / auto" should set the property value
Fail e.style['grid-area'] = "1 / i / 2 / auto" should set the property value Fail e.style['grid-area'] = "1 / i / 2 / auto" should set the property value
Fail e.style['grid-area'] = "i / i / auto / auto" should set the property value Fail e.style['grid-area'] = "i / i / auto / auto" should set the property value
Fail e.style['grid-area'] = "i / auto / i / auto" should set the property value Fail e.style['grid-area'] = "i / auto / i / auto" should set the property value
Fail e.style['grid-area'] = "auto / i / 2 j" should set the property value Fail e.style['grid-area'] = "auto / i / 2 j" should set the property value
Fail e.style['grid-area'] = "auto / i / 2 j / span 3 k" should set the property value Fail e.style['grid-area'] = "auto / i / 2 j / span 3 k" should set the property value
Fail e.style['grid-row'] = "auto / i" should set the property value Pass e.style['grid-row'] = "auto / i" should set the property value
Fail e.style['grid-row'] = "i / auto" should set the property value Fail e.style['grid-row'] = "i / auto" should set the property value
Fail e.style['grid-row'] = "2 i / auto" should set the property value Fail e.style['grid-row'] = "2 i / auto" should set the property value
Fail e.style['grid-row'] = "1 / auto" should set the property value Pass e.style['grid-row'] = "1 / auto" should set the property value
Fail e.style['grid-column'] = "2 j / span 3 k" should set the property value Fail e.style['grid-column'] = "2 j / span 3 k" should set the property value
Fail e.style['grid-column-end'] = "\\31st" should set the property value Fail e.style['grid-column-end'] = "\\31st" should set the property value
Fail e.style['grid-column-end'] = "\\31 st" should set the property value Fail e.style['grid-column-end'] = "\\31 st" should set the property value

View file

@ -6,18 +6,19 @@ Rerun
Found 16 tests Found 16 tests
16 Fail 8 Pass
8 Fail
Details Details
Result Test Name MessageFail Property grid-column value 'auto / auto' Result Test Name MessagePass Property grid-column value 'auto / auto'
Fail Property grid-column value 'auto' Pass Property grid-column value 'auto'
Fail Property grid-column value '10 / auto' Pass Property grid-column value '10 / auto'
Fail Property grid-column value '10' Pass Property grid-column value '10'
Fail Property grid-column value '-10 / auto' Pass Property grid-column value '-10 / auto'
Fail Property grid-column value '-10' Pass Property grid-column value '-10'
Fail Property grid-column value 'first / first' Fail Property grid-column value 'first / first'
Fail Property grid-column value 'first' Fail Property grid-column value 'first'
Fail Property grid-column value 'span 2 / auto' Pass Property grid-column value 'span 2 / auto'
Fail Property grid-column value 'span 2' Pass Property grid-column value 'span 2'
Fail Property grid-column value '2 first / auto' Fail Property grid-column value '2 first / auto'
Fail Property grid-column value '2 first' Fail Property grid-column value '2 first'
Fail Property grid-column value 'span first / auto' Fail Property grid-column value 'span first / auto'

View file

@ -6,16 +6,17 @@ Rerun
Found 15 tests Found 15 tests
15 Fail 8 Pass
7 Fail
Details Details
Result Test Name MessageFail Property grid-row value 'auto / auto' Result Test Name MessagePass Property grid-row value 'auto / auto'
Fail Property grid-row value 'auto' Pass Property grid-row value 'auto'
Fail Property grid-row value '10 / auto' Pass Property grid-row value '10 / auto'
Fail Property grid-row value '10' Pass Property grid-row value '10'
Fail Property grid-row value '-10 / auto' Pass Property grid-row value '-10 / auto'
Fail Property grid-row value '-10' Pass Property grid-row value '-10'
Fail Property grid-row value 'span 2 / auto' Pass Property grid-row value 'span 2 / auto'
Fail Property grid-row value 'span 2' Pass Property grid-row value 'span 2'
Fail Property grid-row value '3 last / auto' Fail Property grid-row value '3 last / auto'
Fail Property grid-row value '3 last' Fail Property grid-row value '3 last'
Fail Property grid-row value 'span first / auto' Fail Property grid-row value 'span first / auto'

View file

@ -6,40 +6,40 @@ Rerun
Found 34 tests Found 34 tests
8 Pass 21 Pass
26 Fail 13 Fail
Details Details
Result Test Name MessagePass e.style['grid'] = "none none" should not set the property value Result Test Name MessagePass e.style['grid'] = "none none" should not set the property value
Pass e.style['grid'] = "none []" should not set the property value Pass e.style['grid'] = "none []" should not set the property value
Fail e.style['grid'] = "10px" should not set the property value Fail e.style['grid'] = "10px" should not set the property value
Fail e.style['grid'] = "20%" should not set the property value Fail e.style['grid'] = "20%" should not set the property value
Fail e.style['grid'] = "5fr" should not set the property value Fail e.style['grid'] = "5fr" should not set the property value
Fail e.style['grid'] = "[a]" should not set the property value Pass e.style['grid'] = "[a]" should not set the property value
Fail e.style['grid'] = "[a] 10px" should not set the property value Fail e.style['grid'] = "[a] 10px" should not set the property value
Fail e.style['grid'] = "[a] 10px []" should not set the property value Fail e.style['grid'] = "[a] 10px []" should not set the property value
Fail e.style['grid'] = "[]" should not set the property value Pass e.style['grid'] = "[]" should not set the property value
Fail e.style['grid'] = "10px \"a\"" should not set the property value Fail e.style['grid'] = "10px \"a\"" should not set the property value
Fail e.style['grid'] = "[] 10px \"a\"" should not set the property value Fail e.style['grid'] = "[] 10px \"a\"" should not set the property value
Fail e.style['grid'] = "10px [] \"a\"" should not set the property value Fail e.style['grid'] = "10px [] \"a\"" should not set the property value
Fail e.style['grid'] = "[] [] \"a\"" should not set the property value Pass e.style['grid'] = "[] [] \"a\"" should not set the property value
Fail e.style['grid'] = "\"a\" none" should not set the property value Pass e.style['grid'] = "\"a\" none" should not set the property value
Fail e.style['grid'] = "\"a\" 10px 10px" should not set the property value Fail e.style['grid'] = "\"a\" 10px 10px" should not set the property value
Fail e.style['grid'] = "\"a\" [a] 10px" should not set the property value Fail e.style['grid'] = "\"a\" [a] 10px" should not set the property value
Fail e.style['grid'] = "\"a\" [a] 10px [a]" should not set the property value Fail e.style['grid'] = "\"a\" [a] 10px [a]" should not set the property value
Fail e.style['grid'] = "\"a\" [a] [a] 10px" should not set the property value Fail e.style['grid'] = "\"a\" [a] [a] 10px" should not set the property value
Fail e.style['grid'] = "\"a\" 10px [a] [a]" should not set the property value Fail e.style['grid'] = "\"a\" 10px [a] [a]" should not set the property value
Fail e.style['grid'] = "\"a\" [a] [a]" should not set the property value Pass e.style['grid'] = "\"a\" [a] [a]" should not set the property value
Fail e.style['grid'] = "[a] \"a\" [a] [a]" should not set the property value Pass e.style['grid'] = "[a] \"a\" [a] [a]" should not set the property value
Fail e.style['grid'] = "\"a\" \"a\" [a] [a]" should not set the property value Pass e.style['grid'] = "\"a\" \"a\" [a] [a]" should not set the property value
Fail e.style['grid'] = "\"a\" [a] [a] / none" should not set the property value Pass e.style['grid'] = "\"a\" [a] [a] / none" should not set the property value
Fail e.style['grid'] = "\"a\" \"a\" [a] [a] / none" should not set the property value Pass e.style['grid'] = "\"a\" \"a\" [a] [a] / none" should not set the property value
Fail e.style['grid'] = "none / \"a\"" should not set the property value Pass e.style['grid'] = "none / \"a\"" should not set the property value
Fail e.style['grid'] = "\"a\" / none" should not set the property value Pass e.style['grid'] = "\"a\" / none" should not set the property value
Fail e.style['grid'] = "none / [] \"a\"" should not set the property value Pass e.style['grid'] = "none / [] \"a\"" should not set the property value
Pass e.style['grid'] = "none / \"a\" []" should not set the property value Pass e.style['grid'] = "none / \"a\" []" should not set the property value
Pass e.style['grid'] = "none / \"a\" [] 10px" should not set the property value Pass e.style['grid'] = "none / \"a\" [] 10px" should not set the property value
Pass e.style['grid'] = "auto-flow 100px" should not set the property value Pass e.style['grid'] = "auto-flow 100px" should not set the property value
Fail e.style['grid'] = "auto-flow / auto-flow" should not set the property value Pass e.style['grid'] = "auto-flow / auto-flow" should not set the property value
Pass e.style['grid'] = "auto-flow 1fr / auto-flow 1fr" should not set the property value Pass e.style['grid'] = "auto-flow 1fr / auto-flow 1fr" should not set the property value
Pass e.style['grid'] = "dense auto-flow / dense auto-flow" should not set the property value Pass e.style['grid'] = "dense auto-flow / dense auto-flow" should not set the property value
Pass e.style['grid'] = "auto / auto-flow foo()" should not set the property value Pass e.style['grid'] = "auto / auto-flow foo()" should not set the property value

View file

@ -6,8 +6,8 @@ Rerun
Found 121 tests Found 121 tests
26 Pass 30 Pass
95 Fail 91 Fail
Details Details
Result Test Name MessageFail e.style.cssText = grid: auto-flow auto / 100px 100px should set grid Result Test Name MessageFail e.style.cssText = grid: auto-flow auto / 100px 100px should set grid
Fail e.style.cssText = grid: auto-flow auto / 100px 100px should set grid-template-areas Fail e.style.cssText = grid: auto-flow auto / 100px 100px should set grid-template-areas
@ -17,7 +17,7 @@ Fail e.style.cssText = grid: auto-flow auto / 100px 100px; grid-template-areas:
Fail e.style.cssText = grid: auto-flow auto / 100px 100px; grid-template-areas: "one two" "three four" should set grid-template-areas Fail e.style.cssText = grid: auto-flow auto / 100px 100px; grid-template-areas: "one two" "three four" should set grid-template-areas
Fail e.style.cssText = grid: 30px 40px / 50px 60px; grid-auto-flow: column should set grid Fail e.style.cssText = grid: 30px 40px / 50px 60px; grid-auto-flow: column should set grid
Pass e.style.cssText = grid: 30px 40px / 50px 60px; grid-auto-flow: column should set grid-auto-flow Pass e.style.cssText = grid: 30px 40px / 50px 60px; grid-auto-flow: column should set grid-auto-flow
Fail e.style.cssText = grid: 30px 40px / 50px 60px; grid-auto-flow: column should set grid-template Pass e.style.cssText = grid: 30px 40px / 50px 60px; grid-auto-flow: column should set grid-template
Fail cssText ('grid: 30px 40px / 50px 60px; grid-auto-flow: column') must contain 'grid-template: 30px 40px / 50px 60px;' in its serialization Fail cssText ('grid: 30px 40px / 50px 60px; grid-auto-flow: column') must contain 'grid-template: 30px 40px / 50px 60px;' in its serialization
Fail cssText ('grid: 30px 40px / 50px 60px; grid-auto-flow: column') must contain 'grid-auto-rows: auto;' in its serialization Fail cssText ('grid: 30px 40px / 50px 60px; grid-auto-flow: column') must contain 'grid-auto-rows: auto;' in its serialization
Fail cssText ('grid: 30px 40px / 50px 60px; grid-auto-flow: column') must contain 'grid-auto-columns: auto;' in its serialization Fail cssText ('grid: 30px 40px / 50px 60px; grid-auto-flow: column') must contain 'grid-auto-columns: auto;' in its serialization
@ -45,10 +45,10 @@ Fail e.style.cssText = grid: auto-flow / 10px; grid-template-columns: repeat(aut
Fail e.style.cssText = grid: auto-flow / 10px; grid-template-columns: repeat(auto-fit, 20px) should set grid Fail e.style.cssText = grid: auto-flow / 10px; grid-template-columns: repeat(auto-fit, 20px) should set grid
Fail e.style.cssText = grid: auto-flow / 10px; grid-template-columns: repeat(auto-fit, 20px) should set grid-template-columns Fail e.style.cssText = grid: auto-flow / 10px; grid-template-columns: repeat(auto-fit, 20px) should set grid-template-columns
Pass e.style.cssText = grid: auto-flow 1px / 2px; grid-auto-flow: inherit should set grid Pass e.style.cssText = grid: auto-flow 1px / 2px; grid-auto-flow: inherit should set grid
Fail e.style.cssText = grid: 1px / 2px; grid-auto-flow: row should set grid Pass e.style.cssText = grid: 1px / 2px; grid-auto-flow: row should set grid
Fail e.style.cssText = grid: none / 2px; grid-auto-flow: row should set grid Fail e.style.cssText = grid: none / 2px; grid-auto-flow: row should set grid
Fail e.style.cssText = grid: 1px / 2px; grid-auto-columns: auto should set grid Pass e.style.cssText = grid: 1px / 2px; grid-auto-columns: auto should set grid
Fail e.style.cssText = grid: 1px / 2px; grid-auto-rows: auto should set grid Pass e.style.cssText = grid: 1px / 2px; grid-auto-rows: auto should set grid
Fail e.style.cssText = grid: 1px / auto-flow 2px; grid-auto-rows: auto should set grid Fail e.style.cssText = grid: 1px / auto-flow 2px; grid-auto-rows: auto should set grid
Fail e.style.cssText = grid: 1px / auto-flow; grid-auto-columns: auto should set grid Fail e.style.cssText = grid: 1px / auto-flow; grid-auto-columns: auto should set grid
Fail e.style.cssText = grid: auto-flow 1px / 2px; grid-auto-columns: auto should set grid Fail e.style.cssText = grid: auto-flow 1px / 2px; grid-auto-columns: auto should set grid

View file

@ -6,11 +6,12 @@ Rerun
Found 49 tests Found 49 tests
49 Fail 5 Pass
44 Fail
Details Details
Result Test Name MessageFail e.style['grid'] = "none" should set the property value Result Test Name MessageFail e.style['grid'] = "none" should set the property value
Fail e.style['grid'] = "none / none" should set the property value Fail e.style['grid'] = "none / none" should set the property value
Fail e.style['grid'] = "auto / auto" should set the property value Pass e.style['grid'] = "auto / auto" should set the property value
Fail e.style['grid'] = "none / [a] 0px" should set the property value Fail e.style['grid'] = "none / [a] 0px" should set the property value
Fail e.style['grid'] = "none / [] 0px" should set the property value Fail e.style['grid'] = "none / [] 0px" should set the property value
Fail e.style['grid'] = "[a] 10px / auto" should set the property value Fail e.style['grid'] = "[a] 10px / auto" should set the property value
@ -18,8 +19,8 @@ Fail e.style['grid'] = "[a] 10px / none" should set the property value
Fail e.style['grid'] = "[] 10px [] / [] auto []" should set the property value Fail e.style['grid'] = "[] 10px [] / [] auto []" should set the property value
Fail e.style['grid'] = "[a] \"a\" 10px" should set the property value Fail e.style['grid'] = "[a] \"a\" 10px" should set the property value
Fail e.style['grid'] = "[a] \"a\" 10px []" should set the property value Fail e.style['grid'] = "[a] \"a\" 10px []" should set the property value
Fail e.style['grid'] = "\"a\" 10px" should set the property value Pass e.style['grid'] = "\"a\" 10px" should set the property value
Fail e.style['grid'] = "[] \"a\" 10px" should set the property value Pass e.style['grid'] = "[] \"a\" 10px" should set the property value
Fail e.style['grid'] = "[a] \"a\" 10px [a]" should set the property value Fail e.style['grid'] = "[a] \"a\" 10px [a]" should set the property value
Fail e.style['grid'] = "\"a\"" should set the property value Fail e.style['grid'] = "\"a\"" should set the property value
Fail e.style['grid'] = "\"a\" auto" should set the property value Fail e.style['grid'] = "\"a\" auto" should set the property value
@ -35,7 +36,7 @@ Fail e.style['grid'] = "\"a\" [] \"b\"" should set the property value
Fail e.style['grid'] = "\"a\" [a] [b] \"b\"" should set the property value Fail e.style['grid'] = "\"a\" [a] [b] \"b\"" should set the property value
Fail e.style['grid'] = "\"a\" [a] \"b\"" should set the property value Fail e.style['grid'] = "\"a\" [a] \"b\"" should set the property value
Fail e.style['grid'] = "\"a\" / 0" should set the property value Fail e.style['grid'] = "\"a\" / 0" should set the property value
Fail e.style['grid'] = "\"a\" 10px / 10px" should set the property value Pass e.style['grid'] = "\"a\" 10px / 10px" should set the property value
Fail e.style['grid'] = "\"a\" [a] \"b\" 10px" should set the property value Fail e.style['grid'] = "\"a\" [a] \"b\" 10px" should set the property value
Fail e.style['grid'] = "\"a\" [a] \"b\" 10px [a]" should set the property value Fail e.style['grid'] = "\"a\" [a] \"b\" 10px [a]" should set the property value
Fail e.style['grid'] = "\"a\" [a] [a] \"b\" 10px" should set the property value Fail e.style['grid'] = "\"a\" [a] [a] \"b\" 10px" should set the property value
@ -56,4 +57,4 @@ Fail e.style['grid'] = "none / auto-flow 100px" should set the property value
Fail e.style['grid'] = "auto-flow 1fr / none" should set the property value Fail e.style['grid'] = "auto-flow 1fr / none" should set the property value
Fail e.style['grid'] = "auto / auto-flow 100px" should set the property value Fail e.style['grid'] = "auto / auto-flow 100px" should set the property value
Fail e.style['grid'] = "auto-flow 1fr / auto" should set the property value Fail e.style['grid'] = "auto-flow 1fr / auto" should set the property value
Fail e.style['grid'] = "1fr / 1fr" should set the property value Pass e.style['grid'] = "1fr / 1fr" should set the property value

View file

@ -6,6 +6,6 @@ Rerun
Found 1 tests Found 1 tests
1 Fail 1 Pass
Details Details
Result Test Name MessageFail grid-template followed by !important Result Test Name MessagePass grid-template followed by !important

View file

@ -6,8 +6,8 @@ Rerun
Found 66 tests Found 66 tests
7 Pass 19 Pass
59 Fail 47 Fail
Details Details
Result Test Name MessageFail e.style['grid-template'] = "auto" should not set the property value Result Test Name MessageFail e.style['grid-template'] = "auto" should not set the property value
Pass e.style['grid-template'] = "none none" should not set the property value Pass e.style['grid-template'] = "none none" should not set the property value
@ -15,7 +15,7 @@ Pass e.style['grid-template'] = "none []" should not set the property value
Fail e.style['grid-template'] = "10px" should not set the property value Fail e.style['grid-template'] = "10px" should not set the property value
Fail e.style['grid-template'] = "20%" should not set the property value Fail e.style['grid-template'] = "20%" should not set the property value
Fail e.style['grid-template'] = "5fr" should not set the property value Fail e.style['grid-template'] = "5fr" should not set the property value
Fail e.style['grid-template'] = "[a]" should not set the property value Pass e.style['grid-template'] = "[a]" should not set the property value
Fail e.style['grid-template'] = "[a] 10px" should not set the property value Fail e.style['grid-template'] = "[a] 10px" should not set the property value
Fail e.style['grid-template'] = "[a] repeat(2, 10px)" should not set the property value Fail e.style['grid-template'] = "[a] repeat(2, 10px)" should not set the property value
Fail e.style['grid-template'] = "[a] repeat(auto-fill, 10px)" should not set the property value Fail e.style['grid-template'] = "[a] repeat(auto-fill, 10px)" should not set the property value
@ -24,7 +24,7 @@ Fail e.style['grid-template'] = "[a] 10px []" should not set the property value
Fail e.style['grid-template'] = "[a] repeat(2, 10px) []" should not set the property value Fail e.style['grid-template'] = "[a] repeat(2, 10px) []" should not set the property value
Fail e.style['grid-template'] = "[a] repeat(auto-fill, 10px) []" should not set the property value Fail e.style['grid-template'] = "[a] repeat(auto-fill, 10px) []" should not set the property value
Fail e.style['grid-template'] = "[a] repeat(auto-fit, 10px) []" should not set the property value Fail e.style['grid-template'] = "[a] repeat(auto-fit, 10px) []" should not set the property value
Fail e.style['grid-template'] = "[]" should not set the property value Pass e.style['grid-template'] = "[]" should not set the property value
Fail e.style['grid-template'] = "10px \"a\"" should not set the property value Fail e.style['grid-template'] = "10px \"a\"" should not set the property value
Fail e.style['grid-template'] = "repeat(2, 10px) \"a\"" should not set the property value Fail e.style['grid-template'] = "repeat(2, 10px) \"a\"" should not set the property value
Fail e.style['grid-template'] = "repeat(auto-fill, 10px) \"a\"" should not set the property value Fail e.style['grid-template'] = "repeat(auto-fill, 10px) \"a\"" should not set the property value
@ -37,8 +37,8 @@ Fail e.style['grid-template'] = "10px [] \"a\"" should not set the property valu
Fail e.style['grid-template'] = "repeat(2, 10px) [] \"a\"" should not set the property value Fail e.style['grid-template'] = "repeat(2, 10px) [] \"a\"" should not set the property value
Fail e.style['grid-template'] = "repeat(auto-fill, 10px) [] \"a\"" should not set the property value Fail e.style['grid-template'] = "repeat(auto-fill, 10px) [] \"a\"" should not set the property value
Fail e.style['grid-template'] = "repeat(auto-fit, 10px) [] \"a\"" should not set the property value Fail e.style['grid-template'] = "repeat(auto-fit, 10px) [] \"a\"" should not set the property value
Fail e.style['grid-template'] = "[] [] \"a\"" should not set the property value Pass e.style['grid-template'] = "[] [] \"a\"" should not set the property value
Fail e.style['grid-template'] = "\"a\" none" should not set the property value Pass e.style['grid-template'] = "\"a\" none" should not set the property value
Fail e.style['grid-template'] = "\"a\" 10px 10px" should not set the property value Fail e.style['grid-template'] = "\"a\" 10px 10px" should not set the property value
Fail e.style['grid-template'] = "\"a\" repeat(2, 10px) 10px" should not set the property value Fail e.style['grid-template'] = "\"a\" repeat(2, 10px) 10px" should not set the property value
Fail e.style['grid-template'] = "\"a\" 10px repeat(2, 10px)" should not set the property value Fail e.style['grid-template'] = "\"a\" 10px repeat(2, 10px)" should not set the property value
@ -62,14 +62,14 @@ Fail e.style['grid-template'] = "\"a\" 10px [a] [a]" should not set the property
Fail e.style['grid-template'] = "\"a\" repeat(2, 10px) [a] [a]" should not set the property value Fail e.style['grid-template'] = "\"a\" repeat(2, 10px) [a] [a]" should not set the property value
Fail e.style['grid-template'] = "\"a\" repeat(auto-fill, 10px) [a] [a]" should not set the property value Fail e.style['grid-template'] = "\"a\" repeat(auto-fill, 10px) [a] [a]" should not set the property value
Fail e.style['grid-template'] = "\"a\" repeat(auto-fit, 10px) [a] [a]" should not set the property value Fail e.style['grid-template'] = "\"a\" repeat(auto-fit, 10px) [a] [a]" should not set the property value
Fail e.style['grid-template'] = "\"a\" [a] [a]" should not set the property value Pass e.style['grid-template'] = "\"a\" [a] [a]" should not set the property value
Fail e.style['grid-template'] = "[a] \"a\" [a] [a]" should not set the property value Pass e.style['grid-template'] = "[a] \"a\" [a] [a]" should not set the property value
Fail e.style['grid-template'] = "\"a\" \"a\" [a] [a]" should not set the property value Pass e.style['grid-template'] = "\"a\" \"a\" [a] [a]" should not set the property value
Fail e.style['grid-template'] = "\"a\" [a] [a] / none" should not set the property value Pass e.style['grid-template'] = "\"a\" [a] [a] / none" should not set the property value
Fail e.style['grid-template'] = "\"a\" \"a\" [a] [a] / none" should not set the property value Pass e.style['grid-template'] = "\"a\" \"a\" [a] [a] / none" should not set the property value
Fail e.style['grid-template'] = "none / \"a\"" should not set the property value Pass e.style['grid-template'] = "none / \"a\"" should not set the property value
Fail e.style['grid-template'] = "\"a\" / none" should not set the property value Pass e.style['grid-template'] = "\"a\" / none" should not set the property value
Fail e.style['grid-template'] = "none / [] \"a\"" should not set the property value Pass e.style['grid-template'] = "none / [] \"a\"" should not set the property value
Pass e.style['grid-template'] = "none / \"a\" []" should not set the property value Pass e.style['grid-template'] = "none / \"a\" []" should not set the property value
Pass e.style['grid-template'] = "none / \"a\" [] 10px" should not set the property value Pass e.style['grid-template'] = "none / \"a\" [] 10px" should not set the property value
Pass e.style['grid-template'] = "none / \"a\" [] repeat(2, 10px)" should not set the property value Pass e.style['grid-template'] = "none / \"a\" [] repeat(2, 10px)" should not set the property value

View file

@ -6,11 +6,12 @@ Rerun
Found 40 tests Found 40 tests
40 Fail 4 Pass
36 Fail
Details Details
Result Test Name MessageFail e.style['grid-template'] = "none" should set the property value Result Test Name MessageFail e.style['grid-template'] = "none" should set the property value
Fail e.style['grid-template'] = "none / none" should set the property value Fail e.style['grid-template'] = "none / none" should set the property value
Fail e.style['grid-template'] = "auto / auto" should set the property value Pass e.style['grid-template'] = "auto / auto" should set the property value
Fail e.style['grid-template'] = "none / [a] 0px" should set the property value Fail e.style['grid-template'] = "none / [a] 0px" should set the property value
Fail e.style['grid-template'] = "none / [] 0px" should set the property value Fail e.style['grid-template'] = "none / [] 0px" should set the property value
Fail e.style['grid-template'] = "[a] 10px / auto" should set the property value Fail e.style['grid-template'] = "[a] 10px / auto" should set the property value
@ -18,8 +19,8 @@ Fail e.style['grid-template'] = "[a] 10px / none" should set the property value
Fail e.style['grid-template'] = "[] 10px [] / [] auto []" should set the property value Fail e.style['grid-template'] = "[] 10px [] / [] auto []" should set the property value
Fail e.style['grid-template'] = "[a] \"a\" 10px" should set the property value Fail e.style['grid-template'] = "[a] \"a\" 10px" should set the property value
Fail e.style['grid-template'] = "[a] \"a\" 10px []" should set the property value Fail e.style['grid-template'] = "[a] \"a\" 10px []" should set the property value
Fail e.style['grid-template'] = "\"a\" 10px" should set the property value Pass e.style['grid-template'] = "\"a\" 10px" should set the property value
Fail e.style['grid-template'] = "[] \"a\" 10px" should set the property value Pass e.style['grid-template'] = "[] \"a\" 10px" should set the property value
Fail e.style['grid-template'] = "[a] \"a\" 10px [a]" should set the property value Fail e.style['grid-template'] = "[a] \"a\" 10px [a]" should set the property value
Fail e.style['grid-template'] = "\"a\"" should set the property value Fail e.style['grid-template'] = "\"a\"" should set the property value
Fail e.style['grid-template'] = "\"a\" auto" should set the property value Fail e.style['grid-template'] = "\"a\" auto" should set the property value
@ -35,7 +36,7 @@ Fail e.style['grid-template'] = "\"a\" [] \"b\"" should set the property value
Fail e.style['grid-template'] = "\"a\" [a] [b] \"b\"" should set the property value Fail e.style['grid-template'] = "\"a\" [a] [b] \"b\"" should set the property value
Fail e.style['grid-template'] = "\"a\" [a] \"b\"" should set the property value Fail e.style['grid-template'] = "\"a\" [a] \"b\"" should set the property value
Fail e.style['grid-template'] = "\"a\" / 0" should set the property value Fail e.style['grid-template'] = "\"a\" / 0" should set the property value
Fail e.style['grid-template'] = "\"a\" 10px / 10px" should set the property value Pass e.style['grid-template'] = "\"a\" 10px / 10px" should set the property value
Fail e.style['grid-template'] = "\"a\" calc(100% - 10px) / calc(10px)" should set the property value Fail e.style['grid-template'] = "\"a\" calc(100% - 10px) / calc(10px)" should set the property value
Fail e.style['grid-template'] = "\"a\" [a] \"b\" 10px" should set the property value Fail e.style['grid-template'] = "\"a\" [a] \"b\" 10px" should set the property value
Fail e.style['grid-template'] = "\"a\" [a] \"b\" 10px [a]" should set the property value Fail e.style['grid-template'] = "\"a\" [a] \"b\" 10px [a]" should set the property value