Update css/support directory in WPT
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 26 Oct 2019 14:50:23 +0000 (14:50 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 26 Oct 2019 14:50:23 +0000 (14:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=203452

Reviewed by Antti Koivisto.

Various WPT are relying on new functionality in css/support (e.g. test_shorthand_value).
In addition, the behavior for testing computed style of properties which don't exist has changed,
causing changes in test output.

* resources/import-expectations.json:
* web-platform-tests/css/css-animations/parsing/animation-computed-expected.txt:
* web-platform-tests/css/css-animations/parsing/animation-shorthand-expected.txt:
* web-platform-tests/css/css-animations/parsing/animation-timing-function-computed-expected.txt:
* web-platform-tests/css/css-images/inheritance-expected.txt:
* web-platform-tests/css/css-images/parsing/image-orientation-computed-expected.txt:
* web-platform-tests/css/css-images/parsing/image-rendering-computed-expected.txt:
* web-platform-tests/css/css-images/parsing/object-fit-computed-expected.txt:
* web-platform-tests/css/css-masking/parsing/clip-path-computed-expected.txt:
* web-platform-tests/css/css-overflow/inheritance-expected.txt:
* web-platform-tests/css/css-overflow/parsing/overflow-computed-expected.txt:
* web-platform-tests/css/css-overscroll-behavior/inheritance-expected.txt:
* web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt:
* web-platform-tests/css/css-text/inheritance-expected.txt:
* web-platform-tests/css/css-transitions/parsing/transition-shorthand-expected.txt:
* web-platform-tests/css/css-transitions/parsing/transition-timing-function-computed-expected.txt:
* web-platform-tests/css/css-values/clamp-length-computed-expected.txt:
* web-platform-tests/css/css-values/minmax-length-computed-expected.txt:
* web-platform-tests/css/css-values/minmax-length-percent-computed-expected.txt:
* web-platform-tests/css/cssom-view/inheritance-expected.txt:
* web-platform-tests/css/support/computed-testcommon.js:
(test_computed_value):
* web-platform-tests/css/support/inheritance-testcommon.js:
(assert_initial):
* web-platform-tests/css/support/parsing-testcommon.js:
* web-platform-tests/css/support/w3c-import.log:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251634 268f45cc-cd09-0410-ab3c-d52691b4dbfc

28 files changed:
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/resources/import-expectations.json
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/parsing/animation-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/parsing/animation-shorthand-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-animations/parsing/animation-timing-function-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-images/inheritance-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-orientation-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/image-rendering-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-images/parsing/object-fit-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-masking/parsing/clip-path-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/inheritance-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-overflow/parsing/overflow-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-overscroll-behavior/inheritance-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-text/inheritance-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-transitions/parsing/transition-shorthand-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-transitions/parsing/transition-timing-function-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-values/clamp-length-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-percent-computed-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/cssom-view/inheritance-expected.txt
LayoutTests/imported/w3c/web-platform-tests/css/support/computed-testcommon.js
LayoutTests/imported/w3c/web-platform-tests/css/support/inheritance-testcommon.js
LayoutTests/imported/w3c/web-platform-tests/css/support/interpolation-testcommon.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/css/support/parsing-testcommon.js
LayoutTests/imported/w3c/web-platform-tests/css/support/red-rect.svg [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/css/support/shorthand-testcommon.js [new file with mode: 0644]
LayoutTests/imported/w3c/web-platform-tests/css/support/w3c-import.log

index 2418506..17e4f26 100644 (file)
@@ -1,3 +1,41 @@
+2019-10-25  Simon Fraser  <simon.fraser@apple.com>
+
+        Update css/support directory in WPT
+        https://bugs.webkit.org/show_bug.cgi?id=203452
+
+        Reviewed by Antti Koivisto.
+
+        Various WPT are relying on new functionality in css/support (e.g. test_shorthand_value).
+        In addition, the behavior for testing computed style of properties which don't exist has changed,
+        causing changes in test output.
+
+        * resources/import-expectations.json:
+        * web-platform-tests/css/css-animations/parsing/animation-computed-expected.txt:
+        * web-platform-tests/css/css-animations/parsing/animation-shorthand-expected.txt:
+        * web-platform-tests/css/css-animations/parsing/animation-timing-function-computed-expected.txt:
+        * web-platform-tests/css/css-images/inheritance-expected.txt:
+        * web-platform-tests/css/css-images/parsing/image-orientation-computed-expected.txt:
+        * web-platform-tests/css/css-images/parsing/image-rendering-computed-expected.txt:
+        * web-platform-tests/css/css-images/parsing/object-fit-computed-expected.txt:
+        * web-platform-tests/css/css-masking/parsing/clip-path-computed-expected.txt:
+        * web-platform-tests/css/css-overflow/inheritance-expected.txt:
+        * web-platform-tests/css/css-overflow/parsing/overflow-computed-expected.txt:
+        * web-platform-tests/css/css-overscroll-behavior/inheritance-expected.txt:
+        * web-platform-tests/css/css-shapes/parsing/shape-outside-computed-expected.txt:
+        * web-platform-tests/css/css-text/inheritance-expected.txt:
+        * web-platform-tests/css/css-transitions/parsing/transition-shorthand-expected.txt:
+        * web-platform-tests/css/css-transitions/parsing/transition-timing-function-computed-expected.txt:
+        * web-platform-tests/css/css-values/clamp-length-computed-expected.txt:
+        * web-platform-tests/css/css-values/minmax-length-computed-expected.txt:
+        * web-platform-tests/css/css-values/minmax-length-percent-computed-expected.txt:
+        * web-platform-tests/css/cssom-view/inheritance-expected.txt:
+        * web-platform-tests/css/support/computed-testcommon.js:
+        (test_computed_value):
+        * web-platform-tests/css/support/inheritance-testcommon.js:
+        (assert_initial):
+        * web-platform-tests/css/support/parsing-testcommon.js:
+        * web-platform-tests/css/support/w3c-import.log:
+
 2019-10-26  Chris Lord  <clord@igalia.com>
 
         Put OffscreenCanvas behind a build flag
index f921b33..67733ea 100644 (file)
@@ -2,6 +2,7 @@
     "apng": "import", 
     "css/css-values": "import", 
     "css/geometry": "import", 
+    "css/support": "import", 
     "custom-elements": "import", 
     "shadow-dom": "import", 
     "tools": "import", 
index 7dce591..96cd995 100644 (file)
@@ -1,13 +1,13 @@
 
-PASS Property animation value '1s' computes to '1s ease 0s 1 normal none running none' 
-PASS Property animation value 'cubic-bezier(0, -2, 1, 3)' computes to '0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none' 
-PASS Property animation value '1s -3s' computes to '1s ease -3s 1 normal none running none' 
-PASS Property animation value '4' computes to '0s ease 0s 4 normal none running none' 
-PASS Property animation value 'reverse' computes to '0s ease 0s 1 reverse none running none' 
-PASS Property animation value 'both' computes to '0s ease 0s 1 normal both running none' 
-PASS Property animation value 'paused' computes to '0s ease 0s 1 normal none paused none' 
-PASS Property animation value 'none' computes to '0s ease 0s 1 normal none running none' 
-PASS Property animation value 'anim' computes to '0s ease 0s 1 normal none running anim' 
-PASS Property animation value 'anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim' 
-PASS Property animation value 'anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none' 
+FAIL Property animation value '1s' computes to '1s ease 0s 1 normal none running none' assert_equals: expected "1s ease 0s 1 normal none running none" but got ""
+FAIL Property animation value 'cubic-bezier(0, -2, 1, 3)' computes to '0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none' assert_equals: expected "0s cubic-bezier(0, -2, 1, 3) 0s 1 normal none running none" but got ""
+FAIL Property animation value '1s -3s' computes to '1s ease -3s 1 normal none running none' assert_equals: expected "1s ease -3s 1 normal none running none" but got ""
+FAIL Property animation value '4' computes to '0s ease 0s 4 normal none running none' assert_equals: expected "0s ease 0s 4 normal none running none" but got ""
+FAIL Property animation value 'reverse' computes to '0s ease 0s 1 reverse none running none' assert_equals: expected "0s ease 0s 1 reverse none running none" but got ""
+FAIL Property animation value 'both' computes to '0s ease 0s 1 normal both running none' assert_equals: expected "0s ease 0s 1 normal both running none" but got ""
+FAIL Property animation value 'paused' computes to '0s ease 0s 1 normal none paused none' assert_equals: expected "0s ease 0s 1 normal none paused none" but got ""
+FAIL Property animation value 'none' computes to '0s ease 0s 1 normal none running none' assert_equals: expected "0s ease 0s 1 normal none running none" but got ""
+FAIL Property animation value 'anim' computes to '0s ease 0s 1 normal none running anim' assert_equals: expected "0s ease 0s 1 normal none running anim" but got ""
+FAIL Property animation value 'anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim' assert_equals: expected "1s cubic-bezier(0, -2, 1, 3) -3s 4 reverse both paused anim" but got ""
+FAIL Property animation value 'anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)' computes to '0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none' assert_equals: expected "0s ease 0s 1 reverse both paused anim, 1s cubic-bezier(0, -2, 1, 3) -3s 4 normal none running none" but got ""
 
index 0ff4807..0278687 100644 (file)
@@ -1,4 +1,29 @@
-CONSOLE MESSAGE: line 14: ReferenceError: Can't find variable: test_shorthand_value
 
-FAIL CSS Animations: animation sets longhands ReferenceError: Can't find variable: test_shorthand_value
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-delay 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-direction 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-duration 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-fill-mode 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-iteration-count 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-name 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-play-state 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-timing-function 
+PASS e.style['animation'] = "anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)" should not set unrelated longhands 
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-delay assert_equals: animation-delay should be canonical expected "0s, -3s" but got "initial, -3s"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-direction assert_equals: animation-direction should be canonical expected "reverse, normal" but got "reverse, initial"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-duration assert_equals: animation-duration should be canonical expected "0s, 1s" but got "initial, 1s"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-fill-mode assert_equals: animation-fill-mode should be canonical expected "both, none" but got "both, initial"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-iteration-count assert_equals: animation-iteration-count should be canonical expected "1, 4" but got "initial, 4"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-name assert_equals: animation-name should be canonical expected "anim, none" but got "anim, initial"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-play-state assert_equals: animation-play-state should be canonical expected "paused, running" but got "paused, initial"
+FAIL e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should set animation-timing-function assert_equals: animation-timing-function should be canonical expected "ease, cubic-bezier(0, -2, 1, 3)" but got "initial, cubic-bezier(0, -2, 1, 3)"
+PASS e.style['animation'] = "anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)" should not set unrelated longhands 
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-delay assert_equals: animation-delay should be canonical expected "-3s, 0s" but got "-3s, initial"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-direction assert_equals: animation-direction should be canonical expected "normal, reverse" but got "initial, reverse"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-duration assert_equals: animation-duration should be canonical expected "1s, 0s" but got "1s, initial"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-fill-mode assert_equals: animation-fill-mode should be canonical expected "none, both" but got "initial, both"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-iteration-count assert_equals: animation-iteration-count should be canonical expected "4, 1" but got "4, initial"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-name assert_equals: animation-name should be canonical expected "none, anim" but got "initial, anim"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-play-state assert_equals: animation-play-state should be canonical expected "running, paused" but got "initial, paused"
+FAIL e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should set animation-timing-function assert_equals: animation-timing-function should be canonical expected "cubic-bezier(0, -2, 1, 3), ease" but got "cubic-bezier(0, -2, 1, 3), initial"
+PASS e.style['animation'] = "4 1s -3s cubic-bezier(0, -2, 1, 3), anim paused both reverse" should not set unrelated longhands 
 
index ca0b2f6..418c358 100644 (file)
@@ -9,9 +9,9 @@ PASS Property animation-timing-function value 'cubic-bezier(0, -2, 1, 3)' comput
 PASS Property animation-timing-function value 'cubic-bezier(0, 0.7, 1, 1.3)' computes to 'cubic-bezier(0, 0.7, 1, 1.3)' 
 PASS Property animation-timing-function value 'steps(4, start)' computes to 'steps(4, start)' 
 FAIL Property animation-timing-function value 'steps(2, end)' computes to 'steps(2)' assert_equals: expected "steps(2)" but got "steps(2, end)"
-FAIL Property animation-timing-function value 'steps(2, jump-start)' computes to 'steps(2, jump-start)' assert_equals: expected "steps(2, jump-start)" but got "ease"
-FAIL Property animation-timing-function value 'steps(2, jump-end)' computes to 'steps(2)' assert_equals: expected "steps(2)" but got "ease"
-FAIL Property animation-timing-function value 'steps(2, jump-both)' computes to 'steps(2, jump-both)' assert_equals: expected "steps(2, jump-both)" but got "ease"
-FAIL Property animation-timing-function value 'steps(2, jump-none)' computes to 'steps(2, jump-none)' assert_equals: expected "steps(2, jump-none)" but got "ease"
+FAIL Property animation-timing-function value 'steps(2, jump-start)' computes to 'steps(2, jump-start)' assert_true: 'steps(2, jump-start)' is a supported value for animation-timing-function. expected true got false
+FAIL Property animation-timing-function value 'steps(2, jump-end)' computes to 'steps(2)' assert_true: 'steps(2, jump-end)' is a supported value for animation-timing-function. expected true got false
+FAIL Property animation-timing-function value 'steps(2, jump-both)' computes to 'steps(2, jump-both)' assert_true: 'steps(2, jump-both)' is a supported value for animation-timing-function. expected true got false
+FAIL Property animation-timing-function value 'steps(2, jump-none)' computes to 'steps(2, jump-none)' assert_true: 'steps(2, jump-none)' is a supported value for animation-timing-function. expected true got false
 PASS Property animation-timing-function value 'linear, ease, linear' computes to 'linear, ease, linear' 
 
index e819ec7..a2fdd4c 100644 (file)
@@ -1,6 +1,6 @@
 
-PASS Property image-orientation has initial value 0deg 
-PASS Property image-orientation inherits 
+FAIL Property image-orientation has initial value 0deg assert_true: image-orientation doesn't seem to be supported in the computed style expected true got false
+FAIL Property image-orientation inherits assert_true: image-orientation doesn't seem to be supported in the computed style expected true got false
 PASS Property image-rendering has initial value auto 
 PASS Property image-rendering inherits 
 PASS Property object-fit has initial value fill 
index 3e1b103..93822f2 100644 (file)
@@ -1,4 +1,4 @@
 
-PASS Property image-orientation value 'from-image' computes to 'from-image' 
-PASS Property image-orientation value 'none' computes to 'none' 
+FAIL Property image-orientation value 'from-image' computes to 'from-image' assert_true: image-orientation doesn't seem to be supported in the computed style expected true got false
+FAIL Property image-orientation value 'none' computes to 'none' assert_true: image-orientation doesn't seem to be supported in the computed style expected true got false
 
index 0c34b8a..e17575f 100644 (file)
@@ -1,7 +1,7 @@
 
 PASS Property image-rendering value 'auto' computes to 'auto' 
-FAIL Property image-rendering value 'smooth' computes to 'smooth' assert_equals: expected "smooth" but got "auto"
-FAIL Property image-rendering value 'high-quality' computes to 'high-quality' assert_equals: expected "high-quality" but got "auto"
+FAIL Property image-rendering value 'smooth' computes to 'smooth' assert_true: 'smooth' is a supported value for image-rendering. expected true got false
+FAIL Property image-rendering value 'high-quality' computes to 'high-quality' assert_true: 'high-quality' is a supported value for image-rendering. expected true got false
 PASS Property image-rendering value 'crisp-edges' computes to 'crisp-edges' 
 PASS Property image-rendering value 'pixelated' computes to 'pixelated' 
 
index b4032b2..c435a53 100644 (file)
@@ -1,7 +1,7 @@
 
 PASS Property object-fit value 'contain' computes to 'contain' 
 PASS Property object-fit value 'cover' computes to 'cover' 
-FAIL Property object-fit value 'cover scale-down' computes to 'cover scale-down' assert_equals: expected "cover scale-down" but got "fill"
+FAIL Property object-fit value 'cover scale-down' computes to 'cover scale-down' assert_true: 'cover scale-down' is a supported value for object-fit. expected true got false
 PASS Property object-fit value 'fill' computes to 'fill' 
 PASS Property object-fit value 'none' computes to 'none' 
 PASS Property object-fit value 'scale-down' computes to 'scale-down' 
index 5975a47..c8912a4 100644 (file)
@@ -1,6 +1,6 @@
 
-FAIL Property clip-path value 'circle(calc(10px + 0.5em) at -50% 50%)' computes to 'circle(30px at -50% 50%)' assert_equals: expected "circle(30px at -50% 50%)" but got "none"
-FAIL Property clip-path value 'circle(calc(10px - 0.5em) at 50% -50%)' computes to 'circle(0px at 50% -50%)' assert_equals: expected "circle(0px at 50% -50%)" but got "none"
-FAIL Property clip-path value 'ellipse(at 50% 50%)' computes to 'ellipse(at 50% 50%)' assert_equals: expected "ellipse(at 50% 50%)" but got "none"
-FAIL Property clip-path value 'ellipse(60% closest-side at 50% 50%)' computes to 'ellipse(60% closest-side at 50% 50%)' assert_equals: expected "ellipse(60% closest-side at 50% 50%)" but got "none"
+FAIL Property clip-path value 'circle(calc(10px + 0.5em) at -50% 50%)' computes to 'circle(30px at -50% 50%)' assert_true: 'circle(calc(10px + 0.5em) at -50% 50%)' is a supported value for clip-path. expected true got false
+FAIL Property clip-path value 'circle(calc(10px - 0.5em) at 50% -50%)' computes to 'circle(0px at 50% -50%)' assert_true: 'circle(calc(10px - 0.5em) at 50% -50%)' is a supported value for clip-path. expected true got false
+FAIL Property clip-path value 'ellipse(at 50% 50%)' computes to 'ellipse(at 50% 50%)' assert_true: 'ellipse(at 50% 50%)' is a supported value for clip-path. expected true got false
+FAIL Property clip-path value 'ellipse(60% closest-side at 50% 50%)' computes to 'ellipse(60% closest-side at 50% 50%)' assert_true: 'ellipse(60% closest-side at 50% 50%)' is a supported value for clip-path. expected true got false
 
index 422d788..28d32be 100644 (file)
@@ -1,14 +1,14 @@
 
-PASS Property block-ellipsis has initial value none 
-PASS Property block-ellipsis inherits 
-PASS Property continue has initial value auto 
-PASS Property continue does not inherit 
-PASS Property max-lines has initial value none 
-PASS Property max-lines does not inherit 
-PASS Property overflow-block has initial value visible 
-PASS Property overflow-block does not inherit 
-PASS Property overflow-inline has initial value visible 
-PASS Property overflow-inline does not inherit 
+FAIL Property block-ellipsis has initial value none assert_true: block-ellipsis doesn't seem to be supported in the computed style expected true got false
+FAIL Property block-ellipsis inherits assert_true: block-ellipsis doesn't seem to be supported in the computed style expected true got false
+FAIL Property continue has initial value auto assert_true: continue doesn't seem to be supported in the computed style expected true got false
+FAIL Property continue does not inherit assert_true: expected true got false
+FAIL Property max-lines has initial value none assert_true: max-lines doesn't seem to be supported in the computed style expected true got false
+FAIL Property max-lines does not inherit assert_true: expected true got false
+FAIL Property overflow-block has initial value visible assert_true: overflow-block doesn't seem to be supported in the computed style expected true got false
+FAIL Property overflow-block does not inherit assert_true: expected true got false
+FAIL Property overflow-inline has initial value visible assert_true: overflow-inline doesn't seem to be supported in the computed style expected true got false
+FAIL Property overflow-inline does not inherit assert_true: expected true got false
 PASS Property overflow-x has initial value visible 
 PASS Property overflow-x does not inherit 
 PASS Property overflow-y has initial value visible 
index 7c9052f..2fd842d 100644 (file)
@@ -1,20 +1,20 @@
 
 PASS Property overflow value 'visible' computes to 'visible' 
 PASS Property overflow value 'hidden' computes to 'hidden' 
-FAIL Property overflow value 'clip' computes to 'clip' assert_equals: expected "clip" but got "visible"
+FAIL Property overflow value 'clip' computes to 'clip' assert_true: 'clip' is a supported value for overflow. expected true got false
 PASS Property overflow value 'scroll' computes to 'scroll' 
 PASS Property overflow value 'auto' computes to 'auto' 
 PASS Property overflow value 'auto auto' computes to 'auto' 
-FAIL Property overflow value 'auto clip' computes to 'auto hidden' assert_equals: expected "auto hidden" but got "visible"
+FAIL Property overflow value 'auto clip' computes to 'auto hidden' assert_true: 'auto clip' is a supported value for overflow. expected true got false
 PASS Property overflow value 'auto visible' computes to 'auto' 
-FAIL Property overflow value 'clip auto' computes to 'hidden auto' assert_equals: expected "hidden auto" but got "visible"
-FAIL Property overflow value 'clip clip' computes to 'clip' assert_equals: expected "clip" but got "visible"
-FAIL Property overflow value 'clip hidden' computes to 'hidden' assert_equals: expected "hidden" but got "visible"
-FAIL Property overflow value 'clip scroll' computes to 'hidden scroll' assert_equals: expected "hidden scroll" but got "visible"
-FAIL Property overflow value 'hidden clip' computes to 'hidden' assert_equals: expected "hidden" but got "visible"
+FAIL Property overflow value 'clip auto' computes to 'hidden auto' assert_true: 'clip auto' is a supported value for overflow. expected true got false
+FAIL Property overflow value 'clip clip' computes to 'clip' assert_true: 'clip clip' is a supported value for overflow. expected true got false
+FAIL Property overflow value 'clip hidden' computes to 'hidden' assert_true: 'clip hidden' is a supported value for overflow. expected true got false
+FAIL Property overflow value 'clip scroll' computes to 'hidden scroll' assert_true: 'clip scroll' is a supported value for overflow. expected true got false
+FAIL Property overflow value 'hidden clip' computes to 'hidden' assert_true: 'hidden clip' is a supported value for overflow. expected true got false
 PASS Property overflow value 'hidden visible' computes to 'hidden auto' 
 PASS Property overflow value 'scroll auto' computes to 'scroll auto' 
-FAIL Property overflow value 'scroll clip' computes to 'scroll hidden' assert_equals: expected "scroll hidden" but got "visible"
+FAIL Property overflow value 'scroll clip' computes to 'scroll hidden' assert_true: 'scroll clip' is a supported value for overflow. expected true got false
 PASS Property overflow value 'scroll visible' computes to 'scroll auto' 
 PASS Property overflow value 'visible auto' computes to 'auto' 
 PASS Property overflow value 'visible hidden' computes to 'auto hidden' 
@@ -23,12 +23,12 @@ PASS Property overflow value 'visible visible' computes to 'visible'
 PASS Property overflow-x value 'scroll' computes to 'scroll' 
 PASS Property overflow-x value 'hidden' computes to 'hidden' 
 PASS Property overflow-x value 'visible' computes to 'visible' 
-FAIL Property overflow-y value 'clip' computes to 'clip' assert_equals: expected "clip" but got "visible"
+FAIL Property overflow-y value 'clip' computes to 'clip' assert_true: 'clip' is a supported value for overflow-y. expected true got false
 PASS Property overflow-y value 'auto' computes to 'auto' 
 PASS Property overflow-y value 'visible' computes to 'visible' 
-PASS Property overflow-block value 'hidden' computes to 'hidden' 
-PASS Property overflow-block value 'clip' computes to 'clip' 
-PASS Property overflow-block value 'visible' computes to 'visible' 
-PASS Property overflow-inline value 'scroll' computes to 'scroll' 
-PASS Property overflow-inline value 'visible' computes to 'visible' 
+FAIL Property overflow-block value 'hidden' computes to 'hidden' assert_true: overflow-block doesn't seem to be supported in the computed style expected true got false
+FAIL Property overflow-block value 'clip' computes to 'clip' assert_true: overflow-block doesn't seem to be supported in the computed style expected true got false
+FAIL Property overflow-block value 'visible' computes to 'visible' assert_true: overflow-block doesn't seem to be supported in the computed style expected true got false
+FAIL Property overflow-inline value 'scroll' computes to 'scroll' assert_true: overflow-inline doesn't seem to be supported in the computed style expected true got false
+FAIL Property overflow-inline value 'visible' computes to 'visible' assert_true: overflow-inline doesn't seem to be supported in the computed style expected true got false
 
index 437d187..50340f0 100644 (file)
@@ -1,6 +1,6 @@
 
-PASS Property overscroll-behavior-x has initial value auto 
-PASS Property overscroll-behavior-x does not inherit 
-PASS Property overscroll-behavior-y has initial value auto 
-PASS Property overscroll-behavior-y does not inherit 
+FAIL Property overscroll-behavior-x has initial value auto assert_true: overscroll-behavior-x doesn't seem to be supported in the computed style expected true got false
+FAIL Property overscroll-behavior-x does not inherit assert_true: expected true got false
+FAIL Property overscroll-behavior-y has initial value auto assert_true: overscroll-behavior-y doesn't seem to be supported in the computed style expected true got false
+FAIL Property overscroll-behavior-y does not inherit assert_true: expected true got false
 
index 24b74e1..44c48bb 100644 (file)
@@ -5,7 +5,7 @@ PASS Property shape-outside value 'circle(calc(10px - 0.5em) at 50% -50%) border
 PASS Property shape-outside value 'ellipse(60% closest-side at 50% 50%)' computes to 'ellipse(60% closest-side at 50% 50%)' 
 PASS Property shape-outside value 'ellipse(calc(10px + 0.5em) calc(10px - 0.5em) at -50% 50%) padding-box' computes to 'ellipse(30px 0px at -50% 50%) padding-box' 
 PASS Property shape-outside value 'ellipse(calc(10px - 0.5em) calc(10px + 0.5em) at 50% -50%) border-box' computes to 'ellipse(0px 30px at 50% -50%) border-box' 
-PASS Property polygon(evenodd, -10px, -20px, -30px, -40px, -50px, -60px) margin-box value 'undefined' computes to 'undefined' 
-PASS Property polygon(10%, 20%, 30%, 40%, 50%, 60%) content-box value 'undefined' computes to 'undefined' 
-PASS Property polygon(calc(10px - 0.5em), 20%, 30%, 40%, 50%, calc(10px - 0.5em)) value 'polygon(-10px, 20%, 30%, 40%, 50%, -10px)' computes to 'polygon(-10px, 20%, 30%, 40%, 50%, -10px)' 
+FAIL Property polygon(evenodd, -10px, -20px, -30px, -40px, -50px, -60px) margin-box value 'undefined' computes to 'undefined' assert_true: polygon(evenodd, -10px, -20px, -30px, -40px, -50px, -60px) margin-box doesn't seem to be supported in the computed style expected true got false
+FAIL Property polygon(10%, 20%, 30%, 40%, 50%, 60%) content-box value 'undefined' computes to 'undefined' assert_true: polygon(10%, 20%, 30%, 40%, 50%, 60%) content-box doesn't seem to be supported in the computed style expected true got false
+FAIL Property polygon(calc(10px - 0.5em), 20%, 30%, 40%, 50%, calc(10px - 0.5em)) value 'polygon(-10px, 20%, 30%, 40%, 50%, -10px)' computes to 'polygon(-10px, 20%, 30%, 40%, 50%, -10px)' assert_true: polygon(calc(10px - 0.5em), 20%, 30%, 40%, 50%, calc(10px - 0.5em)) doesn't seem to be supported in the computed style expected true got false
 
index 1fff9fa..f6ef923 100644 (file)
@@ -1,8 +1,8 @@
 
 PASS Property hanging-punctuation has initial value none 
 PASS Property hanging-punctuation inherits 
-PASS Property hyphens has initial value manual 
-PASS Property hyphens inherits 
+FAIL Property hyphens has initial value manual assert_true: hyphens doesn't seem to be supported in the computed style expected true got false
+FAIL Property hyphens inherits assert_true: hyphens doesn't seem to be supported in the computed style expected true got false
 PASS Property letter-spacing has initial value normal 
 PASS Property letter-spacing inherits 
 PASS Property line-break has initial value auto 
@@ -11,14 +11,14 @@ PASS Property overflow-wrap has initial value normal
 FAIL Property overflow-wrap inherits assert_equals: expected "break-word" but got "normal"
 PASS Property tab-size has initial value 8 
 PASS Property tab-size inherits 
-PASS Property text-align-all has initial value start 
-PASS Property text-align-all inherits 
-PASS Property text-align-last has initial value auto 
-PASS Property text-align-last inherits 
+FAIL Property text-align-all has initial value start assert_true: text-align-all doesn't seem to be supported in the computed style expected true got false
+FAIL Property text-align-all inherits assert_true: text-align-all doesn't seem to be supported in the computed style expected true got false
+FAIL Property text-align-last has initial value auto assert_true: text-align-last doesn't seem to be supported in the computed style expected true got false
+FAIL Property text-align-last inherits assert_true: text-align-last doesn't seem to be supported in the computed style expected true got false
 PASS Property text-indent has initial value 0px 
 PASS Property text-indent inherits 
-PASS Property text-justify has initial value auto 
-PASS Property text-justify inherits 
+FAIL Property text-justify has initial value auto assert_true: text-justify doesn't seem to be supported in the computed style expected true got false
+FAIL Property text-justify inherits assert_true: text-justify doesn't seem to be supported in the computed style expected true got false
 PASS Property text-transform has initial value none 
 PASS Property text-transform inherits 
 PASS Property white-space has initial value normal 
index 7300b4c..2841a2b 100644 (file)
@@ -1,4 +1,17 @@
-CONSOLE MESSAGE: line 14: ReferenceError: Can't find variable: test_shorthand_value
 
-FAIL CSS Transitions: transition sets longhands ReferenceError: Can't find variable: test_shorthand_value
+PASS e.style['transition'] = "1s -3s cubic-bezier(0, -2, 1, 3) top" should set transition-delay 
+PASS e.style['transition'] = "1s -3s cubic-bezier(0, -2, 1, 3) top" should set transition-duration 
+PASS e.style['transition'] = "1s -3s cubic-bezier(0, -2, 1, 3) top" should set transition-property 
+PASS e.style['transition'] = "1s -3s cubic-bezier(0, -2, 1, 3) top" should set transition-timing-function 
+PASS e.style['transition'] = "1s -3s cubic-bezier(0, -2, 1, 3) top" should not set unrelated longhands 
+FAIL e.style['transition'] = "1s -3s, cubic-bezier(0, -2, 1, 3) top" should set transition-delay assert_equals: transition-delay should be canonical expected "-3s, 0s" but got "-3s, initial"
+FAIL e.style['transition'] = "1s -3s, cubic-bezier(0, -2, 1, 3) top" should set transition-duration assert_equals: transition-duration should be canonical expected "1s, 0s" but got "1s, initial"
+FAIL e.style['transition'] = "1s -3s, cubic-bezier(0, -2, 1, 3) top" should set transition-property assert_equals: transition-property should be canonical expected "all, top" but got "initial, top"
+FAIL e.style['transition'] = "1s -3s, cubic-bezier(0, -2, 1, 3) top" should set transition-timing-function assert_equals: transition-timing-function should be canonical expected "ease, cubic-bezier(0, -2, 1, 3)" but got "initial, cubic-bezier(0, -2, 1, 3)"
+PASS e.style['transition'] = "1s -3s, cubic-bezier(0, -2, 1, 3) top" should not set unrelated longhands 
+FAIL e.style['transition'] = "cubic-bezier(0, -2, 1, 3) top, 1s -3s" should set transition-delay assert_equals: transition-delay should be canonical expected "0s, -3s" but got "initial, -3s"
+FAIL e.style['transition'] = "cubic-bezier(0, -2, 1, 3) top, 1s -3s" should set transition-duration assert_equals: transition-duration should be canonical expected "0s, 1s" but got "initial, 1s"
+FAIL e.style['transition'] = "cubic-bezier(0, -2, 1, 3) top, 1s -3s" should set transition-property assert_equals: transition-property should be canonical expected "top, all" but got "top, initial"
+FAIL e.style['transition'] = "cubic-bezier(0, -2, 1, 3) top, 1s -3s" should set transition-timing-function assert_equals: transition-timing-function should be canonical expected "cubic-bezier(0, -2, 1, 3), ease" but got "cubic-bezier(0, -2, 1, 3), initial"
+PASS e.style['transition'] = "cubic-bezier(0, -2, 1, 3) top, 1s -3s" should not set unrelated longhands 
 
index cf730df..140dead 100644 (file)
@@ -1,6 +1,6 @@
 
 PASS Property transition-timing-function value 'linear' computes to 'linear' 
-PASS Property transition-timing-function value '' computes to 'ease' 
+FAIL Property transition-timing-function value '' computes to 'ease' assert_true: '' is a supported value for transition-timing-function. expected true got false
 PASS Property transition-timing-function value 'initial' computes to 'ease' 
 PASS Property transition-timing-function value 'ease' computes to 'ease' 
 PASS Property transition-timing-function value 'ease-in' computes to 'ease-in' 
@@ -14,9 +14,9 @@ FAIL Property transition-timing-function value 'step-end' computes to 'steps(1)'
 FAIL Property transition-timing-function value 'steps(4)' computes to 'steps(4)' assert_equals: expected "steps(4)" but got "steps(4, end)"
 PASS Property transition-timing-function value 'steps(4, start)' computes to 'steps(4, start)' 
 FAIL Property transition-timing-function value 'steps(2, end)' computes to 'steps(2)' assert_equals: expected "steps(2)" but got "steps(2, end)"
-FAIL Property transition-timing-function value 'steps(2, jump-start)' computes to 'steps(2, jump-start)' assert_equals: expected "steps(2, jump-start)" but got "ease"
-FAIL Property transition-timing-function value 'steps(2, jump-end)' computes to 'steps(2)' assert_equals: expected "steps(2)" but got "ease"
-FAIL Property transition-timing-function value 'steps(2, jump-both)' computes to 'steps(2, jump-both)' assert_equals: expected "steps(2, jump-both)" but got "ease"
-FAIL Property transition-timing-function value 'steps(2, jump-none)' computes to 'steps(2, jump-none)' assert_equals: expected "steps(2, jump-none)" but got "ease"
+FAIL Property transition-timing-function value 'steps(2, jump-start)' computes to 'steps(2, jump-start)' assert_true: 'steps(2, jump-start)' is a supported value for transition-timing-function. expected true got false
+FAIL Property transition-timing-function value 'steps(2, jump-end)' computes to 'steps(2)' assert_true: 'steps(2, jump-end)' is a supported value for transition-timing-function. expected true got false
+FAIL Property transition-timing-function value 'steps(2, jump-both)' computes to 'steps(2, jump-both)' assert_true: 'steps(2, jump-both)' is a supported value for transition-timing-function. expected true got false
+FAIL Property transition-timing-function value 'steps(2, jump-none)' computes to 'steps(2, jump-none)' assert_true: 'steps(2, jump-none)' is a supported value for transition-timing-function. expected true got false
 FAIL Property transition-timing-function value 'linear, ease, linear' computes to 'linear, ease, linear' assert_equals: expected "linear, ease, linear" but got "linear"
 
index b6be441..d7811b5 100644 (file)
@@ -1,6 +1,6 @@
 
-FAIL Property letter-spacing value 'clamp(10px, 20px, 30px)' computes to '20px' assert_equals: expected "20px" but got "normal"
-FAIL Property letter-spacing value 'clamp(10px, 5px, 30px)' computes to '10px' assert_equals: expected "10px" but got "normal"
-FAIL Property letter-spacing value 'clamp(10px, 35px, 30px)' computes to '30px' assert_equals: expected "30px" but got "normal"
-FAIL Property letter-spacing value 'clamp(30px, 100px, 20px)' computes to '30px' assert_equals: expected "30px" but got "normal"
+FAIL Property letter-spacing value 'clamp(10px, 20px, 30px)' computes to '20px' assert_true: 'clamp(10px, 20px, 30px)' is a supported value for letter-spacing. expected true got false
+FAIL Property letter-spacing value 'clamp(10px, 5px, 30px)' computes to '10px' assert_true: 'clamp(10px, 5px, 30px)' is a supported value for letter-spacing. expected true got false
+FAIL Property letter-spacing value 'clamp(10px, 35px, 30px)' computes to '30px' assert_true: 'clamp(10px, 35px, 30px)' is a supported value for letter-spacing. expected true got false
+FAIL Property letter-spacing value 'clamp(30px, 100px, 20px)' computes to '30px' assert_true: 'clamp(30px, 100px, 20px)' is a supported value for letter-spacing. expected true got false
 
index 4670a01..77138d1 100644 (file)
@@ -2,7 +2,7 @@
 PASS Property letter-spacing value 'min(1px)' computes to '1px' 
 PASS Property letter-spacing value 'min(1cm)' computes to '37.7952766418457px' 
 PASS Property letter-spacing value 'min(1mm)' computes to '3.7795276641845703px' 
-PASS Property letter-spacing value 'min(1Q)' computes to 'normal' 
+FAIL Property letter-spacing value 'min(1Q)' computes to 'normal' assert_true: 'min(1Q)' is a supported value for letter-spacing. expected true got false
 PASS Property letter-spacing value 'min(1in)' computes to '96px' 
 PASS Property letter-spacing value 'min(1pc)' computes to '16px' 
 PASS Property letter-spacing value 'min(1pt)' computes to '1.3333333730697632px' 
@@ -17,7 +17,7 @@ PASS Property letter-spacing value 'min(1vmax)' computes to '8px'
 PASS Property letter-spacing value 'max(1px)' computes to '1px' 
 PASS Property letter-spacing value 'max(1cm)' computes to '37.7952766418457px' 
 PASS Property letter-spacing value 'max(1mm)' computes to '3.7795276641845703px' 
-PASS Property letter-spacing value 'max(1Q)' computes to 'normal' 
+FAIL Property letter-spacing value 'max(1Q)' computes to 'normal' assert_true: 'max(1Q)' is a supported value for letter-spacing. expected true got false
 PASS Property letter-spacing value 'max(1in)' computes to '96px' 
 PASS Property letter-spacing value 'max(1pc)' computes to '16px' 
 PASS Property letter-spacing value 'max(1pt)' computes to '1.3333333730697632px' 
@@ -32,7 +32,7 @@ PASS Property letter-spacing value 'max(1vmax)' computes to '8px'
 PASS Property letter-spacing value 'min(1px, 2px)' computes to '1px' 
 PASS Property letter-spacing value 'min(1cm, 2cm)' computes to '37.7952766418457px' 
 PASS Property letter-spacing value 'min(1mm, 2mm)' computes to '3.7795276641845703px' 
-PASS Property letter-spacing value 'min(1Q, 2Q)' computes to 'normal' 
+FAIL Property letter-spacing value 'min(1Q, 2Q)' computes to 'normal' assert_true: 'min(1Q, 2Q)' is a supported value for letter-spacing. expected true got false
 PASS Property letter-spacing value 'min(1in, 2in)' computes to '96px' 
 PASS Property letter-spacing value 'min(1pc, 2pc)' computes to '16px' 
 PASS Property letter-spacing value 'min(1pt, 2pt)' computes to '1.3333333730697632px' 
@@ -47,7 +47,7 @@ PASS Property letter-spacing value 'min(1vmax, 2vmax)' computes to '8px'
 PASS Property letter-spacing value 'max(1px, 2px)' computes to '2px' 
 PASS Property letter-spacing value 'max(1cm, 2cm)' computes to '75.5905532836914px' 
 PASS Property letter-spacing value 'max(1mm, 2mm)' computes to '7.559055328369141px' 
-PASS Property letter-spacing value 'max(1Q, 2Q)' computes to 'normal' 
+FAIL Property letter-spacing value 'max(1Q, 2Q)' computes to 'normal' assert_true: 'max(1Q, 2Q)' is a supported value for letter-spacing. expected true got false
 PASS Property letter-spacing value 'max(1in, 2in)' computes to '192px' 
 PASS Property letter-spacing value 'max(1pc, 2pc)' computes to '32px' 
 PASS Property letter-spacing value 'max(1pt, 2pt)' computes to '2.6666667461395264px' 
index 1d5db9e..9c0507b 100644 (file)
@@ -2,7 +2,7 @@
 PASS Property margin-left value 'min(1px + 1%)' computes to '5px' 
 PASS Property margin-left value 'min(1cm + 1%)' computes to '41.78125px' 
 PASS Property margin-left value 'min(1mm + 1%)' computes to '7.765625px' 
-PASS Property margin-left value 'min(1Q + 1%)' computes to '0px' 
+FAIL Property margin-left value 'min(1Q + 1%)' computes to '0px' assert_true: 'min(1Q + 1%)' is a supported value for margin-left. expected true got false
 PASS Property margin-left value 'min(1in + 1%)' computes to '100px' 
 PASS Property margin-left value 'min(1pc + 1%)' computes to '20px' 
 PASS Property margin-left value 'min(1pt + 1%)' computes to '5.328125px' 
@@ -17,7 +17,7 @@ PASS Property margin-left value 'min(1vmax + 1%)' computes to '12px'
 PASS Property margin-left value 'max(1px + 1%)' computes to '5px' 
 PASS Property margin-left value 'max(1cm + 1%)' computes to '41.78125px' 
 PASS Property margin-left value 'max(1mm + 1%)' computes to '7.765625px' 
-PASS Property margin-left value 'max(1Q + 1%)' computes to '0px' 
+FAIL Property margin-left value 'max(1Q + 1%)' computes to '0px' assert_true: 'max(1Q + 1%)' is a supported value for margin-left. expected true got false
 PASS Property margin-left value 'max(1in + 1%)' computes to '100px' 
 PASS Property margin-left value 'max(1pc + 1%)' computes to '20px' 
 PASS Property margin-left value 'max(1pt + 1%)' computes to '5.328125px' 
index 875a727..3ac0a37 100644 (file)
@@ -1,4 +1,4 @@
 
-PASS Property scroll-behavior has initial value auto 
-PASS Property scroll-behavior does not inherit 
+FAIL Property scroll-behavior has initial value auto assert_true: scroll-behavior doesn't seem to be supported in the computed style expected true got false
+FAIL Property scroll-behavior does not inherit assert_true: expected true got false
 
index 0999418..1e87f2a 100644 (file)
@@ -6,17 +6,37 @@
  *
  * @param {string} property  The name of the CSS property being tested.
  * @param {string} specified A specified value for the property.
- * @param {string} computed  The expected computed value. If omitted,
-                             defaults to specified.
+ * @param {string|array} computed  The expected computed value,
+ *                                 or an array of permitted computed value.
+ *                                 If omitted, defaults to specified.
  */
 function test_computed_value(property, specified, computed) {
   if (!computed)
     computed = specified;
+
+  let computedDesc = "'" + computed + "'";
+  if (Array.isArray(computed))
+    computedDesc = '[' + computed.map(e => "'" + e + "'").join(' or ') + ']';
+
   test(() => {
-    if (!getComputedStyle(target)[property])
-      return;
+    const target = document.getElementById('target');
+    assert_true(property in getComputedStyle(target), property + " doesn't seem to be supported in the computed style");
+    assert_true(CSS.supports(property, specified), "'" + specified + "' is a supported value for " + property + ".");
     target.style[property] = '';
     target.style[property] = specified;
-    assert_equals(getComputedStyle(target)[property], computed);
-  }, "Property " + property + " value '" + specified + "' computes to '" + computed + "'");
+
+    let readValue = getComputedStyle(target)[property];
+    if (Array.isArray(computed)) {
+      assert_in_array(readValue, computed);
+    } else {
+      assert_equals(readValue, computed);
+    }
+    if (readValue !== specified) {
+      target.style[property] = '';
+      target.style[property] = readValue;
+      assert_equals(getComputedStyle(target)[property], readValue,
+                    'computed value should round-trip');
+    }
+  }, "Property " + property + " value '" + specified + "' computes to " +
+     computedDesc);
 }
index 9229f12..38ac94e 100644 (file)
@@ -3,14 +3,21 @@
 (function() {
 
 function assert_initial(property, initial) {
+  let initialDesc = initial;
+  if (Array.isArray(initial))
+    initialDesc = '[' + initial.map(e => "'" + e + "'").join(' or ') + ']';
+
   test(() => {
     const target = document.getElementById('target');
-    if (!getComputedStyle(target)[property])
-      return;
+    assert_true(property in getComputedStyle(target), property + " doesn't seem to be supported in the computed style");
     target.style[property] = 'initial';
-    assert_equals(getComputedStyle(target)[property], initial);
+    if (Array.isArray(initial)) {
+      assert_in_array(getComputedStyle(target)[property], initial);
+    } else {
+      assert_equals(getComputedStyle(target)[property], initial);
+    }
     target.style[property] = '';
-  }, 'Property ' + property + ' has initial value ' + initial);
+  }, 'Property ' + property + ' has initial value ' + initialDesc);
 }
 
 /**
@@ -18,19 +25,21 @@ function assert_initial(property, initial) {
  *
  * The current document must have an element #target within element #container.
  *
- * @param {string} property  The name of the CSS property being tested.
- * @param {string} initial   The computed value for 'initial'.
- * @param {string} other     An arbitrary value for the property that round
- *                           trips and is distinct from the initial value.
+ * @param {string}        property  The name of the CSS property being tested.
+ * @param {string|array}  initial   The computed value for 'initial' or a list
+ *                                  of acceptable computed value serializations.
+ * @param {string}        other     An arbitrary value for the property that
+ *                                  round trips and is distinct from the initial
+ *                                  value.
  */
 function assert_inherited(property, initial, other) {
-  assert_initial(property, initial);
+  if (initial)
+    assert_initial(property, initial);
 
   test(() => {
     const container = document.getElementById('container');
     const target = document.getElementById('target');
-    if (!getComputedStyle(target)[property])
-      return;
+    assert_true(property in getComputedStyle(target), property + " doesn't seem to be supported in the computed style");
     container.style[property] = 'initial';
     target.style[property] = 'unset';
     assert_not_equals(getComputedStyle(container)[property], other);
@@ -54,10 +63,12 @@ function assert_inherited(property, initial, other) {
  *
  * The current document must have an element #target within element #container.
  *
- * @param {string} property  The name of the CSS property being tested.
- * @param {string} initial   The computed value for 'initial'.
- * @param {string} other     An arbitrary value for the property that round
- *                           trips and is distinct from the initial value.
+ * @param {string}        property  The name of the CSS property being tested.
+ * @param {string|array}  initial   The computed value for 'initial' or a list
+ *                                  of acceptable computed value serializations.
+ * @param {string}        other     An arbitrary value for the property that
+ *                                  round trips and is distinct from the initial
+ *                                  value.
  */
 function assert_not_inherited(property, initial, other) {
   assert_initial(property, initial);
@@ -65,8 +76,7 @@ function assert_not_inherited(property, initial, other) {
   test(() => {
     const container = document.getElementById('container');
     const target = document.getElementById('target');
-    if (!getComputedStyle(target)[property])
-      return;
+    assert_true(property in getComputedStyle(target));
     container.style[property] = 'initial';
     target.style[property] = 'unset';
     assert_not_equals(getComputedStyle(container)[property], other);
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/support/interpolation-testcommon.js b/LayoutTests/imported/w3c/web-platform-tests/css/support/interpolation-testcommon.js
new file mode 100644 (file)
index 0000000..9e63b02
--- /dev/null
@@ -0,0 +1,332 @@
+'use strict';
+(function() {
+  var interpolationTests = [];
+  var cssAnimationsData = {
+    sharedStyle: null,
+    nextID: 0,
+  };
+  var expectNoInterpolation = {};
+  var neutralKeyframe = {};
+  function isNeutralKeyframe(keyframe) {
+    return keyframe === neutralKeyframe;
+  }
+
+  // For the CSS interpolation methods set the delay to be negative half the
+  // duration, so we are immediately at the halfway point of the animation.
+  // We then use an easing function that maps halfway to whatever progress
+  // we actually want.
+
+  var cssAnimationsInterpolation = {
+    name: 'CSS Animations',
+    supportsProperty: function() {return true;},
+    supportsValue: function() {return true;},
+    setup: function() {},
+    nonInterpolationExpectations: function(from, to) {
+      return expectFlip(from, to, 0.5);
+    },
+    interpolate: function(property, from, to, at, target) {
+      var id = cssAnimationsData.nextID++;
+      if (!cssAnimationsData.sharedStyle) {
+        cssAnimationsData.sharedStyle = createElement(document.body, 'style');
+      }
+      cssAnimationsData.sharedStyle.textContent += '' +
+        '@keyframes animation' + id + ' {' +
+          (isNeutralKeyframe(from) ? '' : `from {${property}:${from};}`) +
+          (isNeutralKeyframe(to) ? '' : `to {${property}:${to};}`) +
+        '}';
+      target.style.animationName = 'animation' + id;
+      target.style.animationDuration = '100s';
+      target.style.animationDelay = '-50s';
+      target.style.animationTimingFunction = createEasing(at);
+    },
+  };
+
+  var cssTransitionsInterpolation = {
+    name: 'CSS Transitions',
+    supportsProperty: function() {return true;},
+    supportsValue: function() {return true;},
+    setup: function(property, from, target) {
+      target.style.setProperty(property, isNeutralKeyframe(from) ? '' : from);
+    },
+    nonInterpolationExpectations: function(from, to) {
+      return expectFlip(from, to, -Infinity);
+    },
+    interpolate: function(property, from, to, at, target) {
+      // Force a style recalc on target to set the 'from' value.
+      getComputedStyle(target).getPropertyValue(property);
+      target.style.transitionDuration = '100s';
+      target.style.transitionDelay = '-50s';
+      target.style.transitionTimingFunction = createEasing(at);
+      target.style.transitionProperty = property;
+      target.style.setProperty(property, isNeutralKeyframe(to) ? '' : to);
+    },
+  };
+
+  var cssTransitionAllInterpolation = {
+    name: 'CSS Transitions with transition: all',
+    // The 'all' value doesn't cover custom properties.
+    supportsProperty: function(property) {return property.indexOf('--') !== 0;},
+    supportsValue: function() {return true;},
+    setup: function(property, from, target) {
+      target.style.setProperty(property, isNeutralKeyframe(from) ? '' : from);
+    },
+    nonInterpolationExpectations: function(from, to) {
+      return expectFlip(from, to, -Infinity);
+    },
+    interpolate: function(property, from, to, at, target) {
+      // Force a style recalc on target to set the 'from' value.
+      getComputedStyle(target).getPropertyValue(property);
+      target.style.transitionDuration = '100s';
+      target.style.transitionDelay = '-50s';
+      target.style.transitionTimingFunction = createEasing(at);
+      target.style.transitionProperty = 'all';
+      target.style.setProperty(property, isNeutralKeyframe(to) ? '' : to);
+    },
+  };
+
+  var webAnimationsInterpolation = {
+    name: 'Web Animations',
+    supportsProperty: function(property) {return true;},
+    supportsValue: function(value) {return value !== '';},
+    setup: function() {},
+    nonInterpolationExpectations: function(from, to) {
+      return expectFlip(from, to, 0.5);
+    },
+    interpolate: function(property, from, to, at, target) {
+      this.interpolateComposite(property, from, 'replace', to, 'replace', at, target);
+    },
+    interpolateComposite: function(property, from, fromComposite, to, toComposite, at, target) {
+      // Convert standard properties to camelCase.
+      if (!property.startsWith('--')) {
+        for (var i = property.length - 2; i > 0; --i) {
+          if (property[i] === '-') {
+            property = property.substring(0, i) + property[i + 1].toUpperCase() + property.substring(i + 2);
+          }
+        }
+        if (property === 'offset') {
+          property = 'cssOffset';
+        } else if (property === 'float') {
+          property = 'cssFloat';
+        }
+      }
+      var keyframes = [];
+      if (!isNeutralKeyframe(from)) {
+        keyframes.push({
+          offset: 0,
+          composite: fromComposite,
+          [property]: from,
+        });
+      }
+      if (!isNeutralKeyframe(to)) {
+        keyframes.push({
+          offset: 1,
+          composite: toComposite,
+          [property]: to,
+        });
+      }
+      var animation = target.animate(keyframes, {
+        fill: 'forwards',
+        duration: 100 * 1000,
+        easing: createEasing(at),
+      });
+      animation.pause();
+      animation.currentTime = 50 * 1000;
+    },
+  };
+
+  function expectFlip(from, to, flipAt) {
+    return [-0.3, 0, 0.3, 0.5, 0.6, 1, 1.5].map(function(at) {
+      return {
+        at: at,
+        expect: at < flipAt ? from : to
+      };
+    });
+  }
+
+  // Constructs a timing function which produces 'y' at x = 0.5
+  function createEasing(y) {
+    if (y == 0) {
+      return 'steps(1, end)';
+    }
+    if (y == 1) {
+      return 'steps(1, start)';
+    }
+    if (y == 0.5) {
+      return 'linear';
+    }
+    // Approximate using a bezier.
+    var b = (8 * y - 1) / 6;
+    return 'cubic-bezier(0, ' + b + ', 1, ' + b + ')';
+  }
+
+  function createElement(parent, tag, text) {
+    var element = document.createElement(tag || 'div');
+    element.textContent = text || '';
+    parent.appendChild(element);
+    return element;
+  }
+
+  function createTargetContainer(parent, className) {
+    var targetContainer = createElement(parent);
+    targetContainer.classList.add('container');
+    var template = document.querySelector('#target-template');
+    if (template) {
+      targetContainer.appendChild(template.content.cloneNode(true));
+    }
+    var target = targetContainer.querySelector('.target') || targetContainer;
+    target.classList.add('target', className);
+    target.parentElement.classList.add('parent');
+    targetContainer.target = target;
+    return targetContainer;
+  }
+
+  function roundNumbers(value) {
+    return value.
+        // Round numbers to two decimal places.
+        replace(/-?\d*\.\d+(e-?\d+)?/g, function(n) {
+          return (parseFloat(n).toFixed(2)).
+              replace(/\.\d+/, function(m) {
+                return m.replace(/0+$/, '');
+              }).
+              replace(/\.$/, '').
+              replace(/^-0$/, '0');
+        });
+  }
+
+  var anchor = document.createElement('a');
+  function sanitizeUrls(value) {
+    var matches = value.match(/url\("([^#][^\)]*)"\)/g);
+    if (matches !== null) {
+      for (var i = 0; i < matches.length; ++i) {
+        var url = /url\("([^#][^\)]*)"\)/g.exec(matches[i])[1];
+        anchor.href = url;
+        anchor.pathname = '...' + anchor.pathname.substring(anchor.pathname.lastIndexOf('/'));
+        value = value.replace(matches[i], 'url(' + anchor.href + ')');
+      }
+    }
+    return value;
+  }
+
+  function normalizeValue(value) {
+    return roundNumbers(sanitizeUrls(value)).
+        // Place whitespace between tokens.
+        replace(/([\w\d.]+|[^\s])/g, '$1 ').
+        replace(/\s+/g, ' ');
+  }
+
+  function stringify(text) {
+    if (!text.includes("'")) {
+      return `'${text}'`;
+    }
+    return `"${text.replace('"', '\\"')}"`;
+  }
+
+  function keyframeText(keyframe) {
+    return isNeutralKeyframe(keyframe) ? 'neutral' : `[${keyframe}]`;
+  }
+
+  function keyframeCode(keyframe) {
+    return isNeutralKeyframe(keyframe) ? 'neutralKeyframe' : `${stringify(keyframe)}`;
+  }
+
+  function createInterpolationTestTargets(interpolationMethod, interpolationMethodContainer, interpolationTest) {
+    var property = interpolationTest.options.property;
+    var from = interpolationTest.options.from;
+    var to = interpolationTest.options.to;
+    var comparisonFunction = interpolationTest.options.comparisonFunction;
+
+    if ((interpolationTest.options.method && interpolationTest.options.method != interpolationMethod.name)
+      || !interpolationMethod.supportsProperty(property)
+      || !interpolationMethod.supportsValue(from)
+      || !interpolationMethod.supportsValue(to)) {
+      return;
+    }
+
+    var testText = `${interpolationMethod.name}: property <${property}> from ${keyframeText(from)} to ${keyframeText(to)}`;
+    var testContainer = createElement(interpolationMethodContainer, 'div');
+    createElement(testContainer);
+    var expectations = interpolationTest.expectations;
+    if (expectations === expectNoInterpolation) {
+      expectations = interpolationMethod.nonInterpolationExpectations(from, to);
+    }
+
+    // Setup a standard equality function if an override is not provided.
+    if (!comparisonFunction) {
+      comparisonFunction = (actual, expected) => {
+        assert_equals(normalizeValue(actual), normalizeValue(expected));
+      };
+    }
+
+    return expectations.map(function(expectation) {
+      var actualTargetContainer = createTargetContainer(testContainer, 'actual');
+      var expectedTargetContainer = createTargetContainer(testContainer, 'expected');
+      if (!isNeutralKeyframe(expectation.expect)) {
+        expectedTargetContainer.target.style.setProperty(property, expectation.expect);
+      }
+      var target = actualTargetContainer.target;
+      interpolationMethod.setup(property, from, target);
+      target.interpolate = function() {
+        interpolationMethod.interpolate(property, from, to, expectation.at, target);
+      };
+      target.measure = function() {
+        var expectedValue = getComputedStyle(expectedTargetContainer.target).getPropertyValue(property);
+        test(function() {
+          if (from && from !== neutralKeyframe) {
+            assert_true(CSS.supports(property, from), '\'from\' value should be supported');
+          }
+          if (to && to !== neutralKeyframe) {
+            assert_true(CSS.supports(property, to), '\'to\' value should be supported');
+          }
+          if (typeof underlying !== 'undefined') {
+            assert_true(CSS.supports(property, underlying), '\'underlying\' value should be supported');
+          }
+
+          comparisonFunction(
+              getComputedStyle(target).getPropertyValue(property),
+              expectedValue);
+        }, `${testText} at (${expectation.at}) should be [${sanitizeUrls(expectation.expect)}]`);
+      };
+      return target;
+    });
+  }
+
+  function createTestTargets(interpolationMethods, interpolationTests, container) {
+    var targets = [];
+    for (var interpolationMethod of interpolationMethods) {
+      var interpolationMethodContainer = createElement(container);
+      for (var interpolationTest of interpolationTests) {
+        [].push.apply(targets, createInterpolationTestTargets(interpolationMethod, interpolationMethodContainer, interpolationTest));
+      }
+    }
+    return targets;
+  }
+
+  function test_no_interpolation(options) {
+    test_interpolation(options, expectNoInterpolation);
+  }
+
+  function test_interpolation(options, expectations) {
+    interpolationTests.push({options, expectations});
+    var interpolationMethods = [
+      cssTransitionsInterpolation,
+      cssTransitionAllInterpolation,
+      cssAnimationsInterpolation,
+      webAnimationsInterpolation,
+    ];
+    var container = createElement(document.body);
+    var targets = createTestTargets(interpolationMethods, interpolationTests, container);
+    // Separate interpolation and measurement into different phases to avoid O(n^2) of the number of targets.
+    for (var target of targets) {
+      target.interpolate();
+    }
+    for (var target of targets) {
+      target.measure();
+    }
+    container.remove();
+    interpolationTests = [];
+  }
+
+  window.test_interpolation = test_interpolation;
+  window.test_no_interpolation = test_no_interpolation;
+  window.neutralKeyframe = neutralKeyframe;
+})();
index 7ecd588..647bc12 100644 (file)
@@ -36,3 +36,62 @@ function test_invalid_value(property, value) {
         assert_equals(div.style.getPropertyValue(property), "");
     }, "e.style['" + property + "'] = " + stringifiedValue + " should not set the property value");
 }
+
+// serializedSelector can be the expected serialization of selector,
+// or an array of permitted serializations,
+// or omitted if value should serialize as selector.
+function test_valid_selector(selector, serializedSelector) {
+    if (arguments.length < 2)
+        serializedSelector = selector;
+
+    const stringifiedSelector = JSON.stringify(selector);
+
+    test(function(){
+        document.querySelector(selector);
+        assert_true(true, stringifiedSelector + " should not throw in querySelector");
+
+        const style = document.createElement("style");
+        document.head.append(style);
+        const {sheet} = style;
+        document.head.removeChild(style);
+        const {cssRules} = sheet;
+
+        assert_equals(cssRules.length, 0, "Sheet should have no rule");
+        sheet.insertRule(selector + "{}");
+        assert_equals(cssRules.length, 1, "Sheet should have 1 rule");
+
+        const readSelector = cssRules[0].selectorText;
+        if (Array.isArray(serializedSelector))
+            assert_in_array(readSelector, serializedSelector, "serialization should be sound");
+        else
+            assert_equals(readSelector, serializedSelector, "serialization should be canonical");
+
+        sheet.deleteRule(0);
+        assert_equals(cssRules.length, 0, "Sheet should have no rule");
+        sheet.insertRule(readSelector + "{}");
+        assert_equals(cssRules.length, 1, "Sheet should have 1 rule");
+
+        assert_equals(cssRules[0].selectorText, readSelector, "serialization should round-trip");
+    }, stringifiedSelector + " should be a valid selector");
+}
+
+function test_invalid_selector(selector) {
+    const stringifiedSelector = JSON.stringify(selector);
+
+    test(function(){
+        assert_throws(
+          DOMException.SYNTAX_ERR,
+          () => document.querySelector(selector),
+          stringifiedSelector + " should throw in querySelector");
+
+        const style = document.createElement("style");
+        document.head.append(style);
+        const {sheet} = style;
+        document.head.removeChild(style);
+
+        assert_throws(
+          DOMException.SYNTAX_ERR,
+          () => sheet.insertRule(selector + "{}"),
+          stringifiedSelector + " should throw in insertRule");
+    }, stringifiedSelector + " should be an invalid selector");
+}
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/support/red-rect.svg b/LayoutTests/imported/w3c/web-platform-tests/css/support/red-rect.svg
new file mode 100644 (file)
index 0000000..3fe10a2
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
+              "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 100">
+    <rect width="200" height="100" style="fill:red;" />
+</svg>
diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/support/shorthand-testcommon.js b/LayoutTests/imported/w3c/web-platform-tests/css/support/shorthand-testcommon.js
new file mode 100644 (file)
index 0000000..ab1f379
--- /dev/null
@@ -0,0 +1,40 @@
+'use strict';
+
+function test_shorthand_value(property, value, longhands) {
+    const stringifiedValue = JSON.stringify(value);
+
+    for (let longhand of Object.keys(longhands).sort()) {
+        test(function(){
+            var div = document.getElementById('target') || document.createElement('div');
+            div.style[property] = "";
+            try {
+                div.style[property] = value;
+
+                const readValue = div.style[longhand];
+                assert_equals(readValue, longhands[longhand], longhand + " should be canonical");
+
+                div.style[longhand] = "";
+                div.style[longhand] = readValue;
+                assert_equals(div.style[longhand], readValue, "serialization should round-trip");
+            } finally {
+                div.style[property] = "";
+            }
+        }, "e.style['" + property + "'] = " + stringifiedValue + " should set " + longhand);
+    }
+
+    test(function(){
+        var div = document.getElementById('target') || document.createElement('div');
+        div.style[property] = "";
+        try {
+            const expectedLength = div.style.length;
+            div.style[property] = value;
+            assert_true(CSS.supports(property, value));
+            for (let longhand of Object.keys(longhands).sort()) {
+                div.style[longhand] = "";
+            }
+            assert_equals(div.style.length, expectedLength);
+        } finally {
+            div.style[property] = "";
+        }
+    }, "e.style['" + property + "'] = " + stringifiedValue + " should not set unrelated longhands");
+}
index a8060f2..570b020 100644 (file)
@@ -37,16 +37,19 @@ List of files:
 /LayoutTests/imported/w3c/web-platform-tests/css/support/import-green.css
 /LayoutTests/imported/w3c/web-platform-tests/css/support/import-red.css
 /LayoutTests/imported/w3c/web-platform-tests/css/support/inheritance-testcommon.js
+/LayoutTests/imported/w3c/web-platform-tests/css/support/interpolation-testcommon.js
 /LayoutTests/imported/w3c/web-platform-tests/css/support/parsing-testcommon.js
 /LayoutTests/imported/w3c/web-platform-tests/css/support/pattern-grg-rgr-grg.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/pattern-grg-rrg-rgg.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/pattern-rgr-grg-rgr.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/pattern-tr.png
+/LayoutTests/imported/w3c/web-platform-tests/css/support/red-rect.svg
 /LayoutTests/imported/w3c/web-platform-tests/css/support/red.ico
 /LayoutTests/imported/w3c/web-platform-tests/css/support/ruler-h-50%.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/ruler-h-50px.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/ruler-v-100px.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/ruler-v-50px.png
+/LayoutTests/imported/w3c/web-platform-tests/css/support/shorthand-testcommon.js
 /LayoutTests/imported/w3c/web-platform-tests/css/support/square-purple.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/square-teal.png
 /LayoutTests/imported/w3c/web-platform-tests/css/support/square-white.png