aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/MANIFEST.json218
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-origin-in-shadow.html.ini5
-rw-r--r--tests/wpt/metadata/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini2
-rw-r--r--tests/wpt/metadata/dom/abort/event.any.js.ini30
-rw-r--r--tests/wpt/metadata/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js.ini22
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini60
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-001.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-002.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-003.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-parsing-001.html144
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-001.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-002.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-003.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-004.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/gap-parsing-001.html226
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/grid-column-gap-parsing-001.html144
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/grid-gap-parsing-001.html226
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/grid-row-gap-parsing-001.html144
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-001.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-002.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-003.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-parsing-001.html144
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms/transform-origin-in-shadow.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html5
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg27
-rw-r--r--tests/wpt/web-platform-tests/dom/abort/event.any.js47
-rw-r--r--tests/wpt/web-platform-tests/dom/interfaces.html17
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js38
-rw-r--r--tests/wpt/web-platform-tests/payment-request/interfaces.https.html11
-rw-r--r--tests/wpt/web-platform-tests/picture-in-picture/enter-picture-in-picture.html2
-rw-r--r--tests/wpt/web-platform-tests/picture-in-picture/leave-picture-in-picture.html41
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/local-url-inherit-controller-frame.html21
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py13
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html8
35 files changed, 1957 insertions, 43 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index ac47357a908..ba00fbcc937 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -307623,6 +307623,102 @@
{}
]
],
+ "css/css-align/gaps/column-gap-animation-001.html": [
+ [
+ "/css/css-align/gaps/column-gap-animation-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/column-gap-animation-002.html": [
+ [
+ "/css/css-align/gaps/column-gap-animation-002.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/column-gap-animation-003.html": [
+ [
+ "/css/css-align/gaps/column-gap-animation-003.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/column-gap-parsing-001.html": [
+ [
+ "/css/css-align/gaps/column-gap-parsing-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/gap-animation-001.html": [
+ [
+ "/css/css-align/gaps/gap-animation-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/gap-animation-002.html": [
+ [
+ "/css/css-align/gaps/gap-animation-002.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/gap-animation-003.html": [
+ [
+ "/css/css-align/gaps/gap-animation-003.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/gap-animation-004.html": [
+ [
+ "/css/css-align/gaps/gap-animation-004.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/gap-parsing-001.html": [
+ [
+ "/css/css-align/gaps/gap-parsing-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/grid-column-gap-parsing-001.html": [
+ [
+ "/css/css-align/gaps/grid-column-gap-parsing-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/grid-gap-parsing-001.html": [
+ [
+ "/css/css-align/gaps/grid-gap-parsing-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/grid-row-gap-parsing-001.html": [
+ [
+ "/css/css-align/gaps/grid-row-gap-parsing-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/row-gap-animation-001.html": [
+ [
+ "/css/css-align/gaps/row-gap-animation-001.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/row-gap-animation-002.html": [
+ [
+ "/css/css-align/gaps/row-gap-animation-002.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/row-gap-animation-003.html": [
+ [
+ "/css/css-align/gaps/row-gap-animation-003.html",
+ {}
+ ]
+ ],
+ "css/css-align/gaps/row-gap-parsing-001.html": [
+ [
+ "/css/css-align/gaps/row-gap-parsing-001.html",
+ {}
+ ]
+ ],
"css/css-align/self-alignment/parse-align-self-001.html": [
[
"/css/css-align/self-alignment/parse-align-self-001.html",
@@ -311983,6 +312079,12 @@
{}
]
],
+ "css/css-transforms/transform-origin-in-shadow.html": [
+ [
+ "/css/css-transforms/transform-origin-in-shadow.html",
+ {}
+ ]
+ ],
"css/css-transforms/transform_translate.html": [
[
"/css/css-transforms/transform_translate.html",
@@ -314881,6 +314983,12 @@
{}
]
],
+ "custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg": [
+ [
+ "/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg",
+ {}
+ ]
+ ],
"custom-elements/parser/parser-uses-registry-of-owner-document.html": [
[
"/custom-elements/parser/parser-uses-registry-of-owner-document.html",
@@ -322451,6 +322559,12 @@
{}
]
],
+ "html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js": [
+ [
+ "/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.html",
+ {}
+ ]
+ ],
"html/browsers/windows/auxiliary-browsing-contexts/opener.html": [
[
"/html/browsers/windows/auxiliary-browsing-contexts/opener.html",
@@ -345203,6 +345317,14 @@
}
]
],
+ "picture-in-picture/leave-picture-in-picture.html": [
+ [
+ "/picture-in-picture/leave-picture-in-picture.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"picture-in-picture/not-processing-user-gesture.html": [
[
"/picture-in-picture/not-processing-user-gesture.html",
@@ -475228,6 +475350,70 @@
"6fd28a5bf615ce822ed935de90ce5c1a41d39104",
"reftest"
],
+ "css/css-align/gaps/column-gap-animation-001.html": [
+ "00023e39b6fafbfb31cabb30ed4ddf77a71b248f",
+ "testharness"
+ ],
+ "css/css-align/gaps/column-gap-animation-002.html": [
+ "97e93d1aff94b4e88fe56f981cd61dbd09f07bf9",
+ "testharness"
+ ],
+ "css/css-align/gaps/column-gap-animation-003.html": [
+ "110e9460fdc86b6eda713f089b7293c075b49e82",
+ "testharness"
+ ],
+ "css/css-align/gaps/column-gap-parsing-001.html": [
+ "d0b1255896cde1a3b3f2539c8533fdf65dd77f94",
+ "testharness"
+ ],
+ "css/css-align/gaps/gap-animation-001.html": [
+ "9145456dea1f21bdef2159b6033853a73efc716b",
+ "testharness"
+ ],
+ "css/css-align/gaps/gap-animation-002.html": [
+ "de302cf09e0410430064dccc5517c87e2998b32d",
+ "testharness"
+ ],
+ "css/css-align/gaps/gap-animation-003.html": [
+ "1c31795623818f5e08e47cc5221831c11299602a",
+ "testharness"
+ ],
+ "css/css-align/gaps/gap-animation-004.html": [
+ "e2c2dc0ed64e3c8e70959c64108cbb798ea49827",
+ "testharness"
+ ],
+ "css/css-align/gaps/gap-parsing-001.html": [
+ "bd3a5bb6b7e4605e6f1a44f232d34c5e7d6342af",
+ "testharness"
+ ],
+ "css/css-align/gaps/grid-column-gap-parsing-001.html": [
+ "13ce1945b50ed1c4d40f837cac8777b6b8a90066",
+ "testharness"
+ ],
+ "css/css-align/gaps/grid-gap-parsing-001.html": [
+ "441feb52cc17178d4486f92d10a1c132600788a3",
+ "testharness"
+ ],
+ "css/css-align/gaps/grid-row-gap-parsing-001.html": [
+ "7302a4efd2ea5eccf65ec269175e6c15cc1771b4",
+ "testharness"
+ ],
+ "css/css-align/gaps/row-gap-animation-001.html": [
+ "c7aa90cd3b586b6fd8f81d190895ecc56643b8c1",
+ "testharness"
+ ],
+ "css/css-align/gaps/row-gap-animation-002.html": [
+ "e5c9a9eb63a876798a79a5260486668b4fca53e2",
+ "testharness"
+ ],
+ "css/css-align/gaps/row-gap-animation-003.html": [
+ "d1605b849b3a328857772b850af2a7d329ac2cb8",
+ "testharness"
+ ],
+ "css/css-align/gaps/row-gap-parsing-001.html": [
+ "46a9930dd28a133d1df2c9209b35716093457d5c",
+ "testharness"
+ ],
"css/css-align/reference/ttwf-reftest-alignContent-ref.html": [
"d87177e45f584e4a67695529b8dbf2d3c3c52839",
"support"
@@ -511640,6 +511826,10 @@
"391c925801c9f166285b9aa5ea4bec194af13748",
"reftest"
],
+ "css/css-transforms/transform-origin-in-shadow.html": [
+ "3a30f869d047c0677f7e989e919f0345d32fb28a",
+ "testharness"
+ ],
"css/css-transforms/transform-origin-name-001.html": [
"ca659829faa1079070d79ff0ed9ddeedc02d670c",
"reftest"
@@ -514525,7 +514715,7 @@
"testharness"
],
"css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html": [
- "fdc7e5f43de941a0d79b0c4c13ae515038e028d1",
+ "71591a5fdc7f90841dcc204c70f1a3e611024edc",
"testharness"
],
"css/css-typed-om/stylevalue-serialization/cssUnitValue.tentative.html": [
@@ -536736,6 +536926,10 @@
"ed5476ab5b9a8d23ab7d84665c5d3224bb53dd18",
"testharness"
],
+ "custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg": [
+ "51ecc75f42124e8071a767ef908ecc915cbf0fc1",
+ "testharness"
+ ],
"custom-elements/parser/parser-uses-registry-of-owner-document.html": [
"a62669ffcc75d54df38b65e33463566238c8644c",
"testharness"
@@ -537121,7 +537315,7 @@
"support"
],
"dom/abort/event.any.js": [
- "25e9c1104acb9b0092d1303190588a3953cf635d",
+ "d41904ddfc56e5ef3e89d965a4e5fa392e996ef9",
"testharness"
],
"dom/collections/HTMLCollection-as-proto-length-get-throws.html": [
@@ -537349,7 +537543,7 @@
"testharness"
],
"dom/interfaces.html": [
- "7d00e3a778083a91156f4e042c7abd270060a7fc",
+ "3308c9f3341c12ce99217309eba608e50cca669d",
"testharness"
],
"dom/lists/DOMTokenList-Iterable.html": [
@@ -546116,6 +546310,10 @@
"a0c935eac75021b6dcef4e170848acbdec5b3e4a",
"testharness"
],
+ "html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js": [
+ "013632c1b8c86241d757ecbdf66b2a0a2dcc77cb",
+ "testharness"
+ ],
"html/browsers/windows/auxiliary-browsing-contexts/opener.html": [
"a8ffd6dfa93df903e592af7f9dd6855dbcbb05ea",
"testharness"
@@ -572729,7 +572927,7 @@
"testharness"
],
"payment-request/interfaces.https.html": [
- "87fb3213b7442ceb3f096d88b6bae3074f96d29c",
+ "d269e8378f2a84ba96c981536667817e0db9e2d1",
"testharness"
],
"payment-request/payment-request-abort-method.https.html": [
@@ -572929,13 +573127,17 @@
"testharness"
],
"picture-in-picture/enter-picture-in-picture.html": [
- "c0d29867a380b7e780ed14c229fa5598626a75aa",
+ "1286b5349d7787be49ad00f910e2bd7ec80ed87e",
"testharness"
],
"picture-in-picture/exit-picture-in-picture.html": [
"b1103b96927872de07fc6eb5f34668a0267da6a2",
"testharness"
],
+ "picture-in-picture/leave-picture-in-picture.html": [
+ "178275fc27367da45895150124e1d2a0051f73d5",
+ "testharness"
+ ],
"picture-in-picture/not-processing-user-gesture.html": [
"0bfb194f9fd96db340177d8ff9e62becb1dd9f5e",
"testharness"
@@ -584141,7 +584343,7 @@
"support"
],
"service-workers/service-worker/resources/local-url-inherit-controller-frame.html": [
- "12822899ad84cef80d4f67cb33475a93ca1d56ed",
+ "595ab725fd213218d5f6016945cc2ce02b50452c",
"support"
],
"service-workers/service-worker/resources/local-url-inherit-controller-worker.js": [
@@ -595669,11 +595871,11 @@
"reftest"
],
"webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused-ref.html": [
- "5b8a5f597777418b7dba44e6e07d05625c599ce7",
+ "c5af748ae8fd0d476c20926f2cc7ad2103b22aa4",
"support"
],
"webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html": [
- "5f9e48b0160ac1916034ac29cce97282ce9b1ecf",
+ "e1eb138e07d42f488051ab6cb4ead266981c5ed8",
"reftest"
],
"webvtt/rendering/cues-with-video/processing-model/enable_controls_reposition-ref.html": [
diff --git a/tests/wpt/metadata/css/css-transforms/transform-origin-in-shadow.html.ini b/tests/wpt/metadata/css/css-transforms/transform-origin-in-shadow.html.ini
new file mode 100644
index 00000000000..b2be2c2114f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transforms/transform-origin-in-shadow.html.ini
@@ -0,0 +1,5 @@
+[transform-origin-in-shadow.html]
+ expected: ERROR
+ ['transform-origin' on <svg> being direct descendant of shadow root]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini b/tests/wpt/metadata/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini
new file mode 100644
index 00000000000..916fe7b6d09
--- /dev/null
+++ b/tests/wpt/metadata/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg.ini
@@ -0,0 +1,2 @@
+[parser-uses-create-an-element-for-a-token-svg.svg]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/dom/abort/event.any.js.ini b/tests/wpt/metadata/dom/abort/event.any.js.ini
index b2330c67e73..350ec2d56a2 100644
--- a/tests/wpt/metadata/dom/abort/event.any.js.ini
+++ b/tests/wpt/metadata/dom/abort/event.any.js.ini
@@ -3,9 +3,39 @@
[AbortController() basics]
expected: FAIL
+ [AbortController abort() should fire event synchronously]
+ expected: FAIL
+
+ [controller.signal should always return the same object]
+ expected: FAIL
+
+ [controller.abort() should do nothing the second time it is called]
+ expected: FAIL
+
+ [event handler should not be called if added after controller.abort()]
+ expected: FAIL
+
+ [the abort event should have the right properties]
+ expected: FAIL
+
[event.any.worker.html]
type: testharness
[AbortController() basics]
expected: FAIL
+ [AbortController abort() should fire event synchronously]
+ expected: FAIL
+
+ [controller.signal should always return the same object]
+ expected: FAIL
+
+ [controller.abort() should do nothing the second time it is called]
+ expected: FAIL
+
+ [event handler should not be called if added after controller.abort()]
+ expected: FAIL
+
+ [the abort event should have the right properties]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js.ini b/tests/wpt/metadata/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js.ini
new file mode 100644
index 00000000000..9d293d228ba
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js.ini
@@ -0,0 +1,22 @@
+[opener-setter.window.html]
+ [Setting window.opener to undefined]
+ expected: FAIL
+
+ [Setting window.opener to 42]
+ expected: FAIL
+
+ [Setting window.opener to function () { return "hi" }]
+ expected: FAIL
+
+ [Setting window.opener to hi]
+ expected: FAIL
+
+ [Setting window.opener to [object Object\]]
+ expected: FAIL
+
+ [Setting window.opener to ]
+ expected: FAIL
+
+ [Setting window.opener to Symbol()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini
index 1de3f8d68b2..559c27de134 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/image-maps/image-map-processing-model/hash-name-reference.html.ini
@@ -172,3 +172,63 @@
[XHTML img usemap="http://example.org/#garbage-before-hash-id"]
expected: FAIL
+ [HTML (quirks) IMG usemap="no-hash-name"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="no-hash-id"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="hash-last#"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap=""]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="#"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="#percent-escape-name-%41"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="#percent-escape-id-%41"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="#no-such-map"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="#different-CASE-name"]
+ expected: FAIL
+
+ [HTML (quirks) IMG usemap="#different-CASE-id"]
+ expected: FAIL
+
+ [XHTML img usemap="no-hash-name"]
+ expected: FAIL
+
+ [XHTML img usemap="no-hash-id"]
+ expected: FAIL
+
+ [XHTML img usemap="hash-last#"]
+ expected: FAIL
+
+ [XHTML img usemap=""]
+ expected: FAIL
+
+ [XHTML img usemap="#"]
+ expected: FAIL
+
+ [XHTML img usemap="#percent-escape-name-%41"]
+ expected: FAIL
+
+ [XHTML img usemap="#percent-escape-id-%41"]
+ expected: FAIL
+
+ [XHTML img usemap="#no-such-map"]
+ expected: FAIL
+
+ [XHTML img usemap="#different-CASE-name"]
+ expected: FAIL
+
+ [XHTML img usemap="#different-CASE-id"]
+ expected: FAIL
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-001.html
new file mode 100644
index 00000000000..03c06249cc0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-001.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: column-gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that column-gap property is interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes column-gap-0-to-100 {
+ from { column-gap: 0px; }
+ to { column-gap: 100px; }
+ }
+
+ #target {
+ animation-name: column-gap-0-to-100;
+ animation-timing-function: linear;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).columnGap, "50px");
+ }, "column-gap is interpolable");
+ </script>
+</body>
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-002.html b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-002.html
new file mode 100644
index 00000000000..133b98a31c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-002.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: column-gap normal test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that 'normal' value for column-gap property is not interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes column-gap-normal-to-100 {
+ from { column-gap: normal; }
+ to { column-gap: 100px; }
+ }
+
+ #target {
+ animation-name: column-gap-normal-to-100;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).columnGap, "100px");
+ }, "column-gap: normal is not interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-003.html b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-003.html
new file mode 100644
index 00000000000..ef8f0e52e4b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-animation-003.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: Default column-gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that the default value for column-gap property, which is 'normal', is not interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes column-gap-to-100 {
+ to { column-gap: 100px; }
+ }
+
+ #target {
+ animation-name: column-gap-to-100;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).columnGap, "100px");
+ }, "Default column-gap is not interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-parsing-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-parsing-001.html
new file mode 100644
index 00000000000..f0bcea4d98d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/column-gap-parsing-001.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: column-gap parsing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .columnGapPx { column-gap: 12px; }
+ #columnGapEm { column-gap: 2em; font: 10px/1 Monospace; }
+ #columnGapVw { column-gap: 2vw; }
+ #columnGapPercent { column-gap: 15%; }
+ #columnGapCalc { column-gap: calc(10px + 4px); }
+ .columnGapInitial { column-gap: initial; }
+ .columnGapInherit { column-gap: inherit; }
+
+ #invalidColumnGapNegative { column-gap: -10px; }
+ #invalidColumnGapMaxContent { column-gap: max-content; }
+ #invalidColumnGapNone { column-gap: none; }
+ #invalidColumnGapMultiple { column-gap: 10px 1px; }
+ #invalidColumnGapAngle { column-gap: 3rad; }
+ #invalidColumnGapResolution { column-gap: 2dpi; }
+ #invalidColumnGapTime { column-gap: 200ms; }
+</style>
+<body>
+ <div id="log"></div>
+
+ <div id="default"></div>
+ <div id="columnGapPx" class="columnGapPx"></div>
+ <div id="columnGapEm"></div>
+ <div id="columnGapVw"></div>
+ <div id="columnGapPercent"></div>
+ <div id="columnGapCalc"></div>
+ <div id="columnGapInitial" class="columnGapInitial"></div>
+ <div class="columnGapPx">
+ <div id="columnGapInitialPx" class="columnGapInitial"></div>
+ </div>
+ <div id="columnGapInherit" class="columnGapInherit"></div>
+ <div class="columnGapPx">
+ <div id="columnGapInheritPx" class="columnGapInherit"></div>
+ </div>
+
+ <div id="invalidColumnGapNegative"></div>
+ <div id="invalidColumnGapMaxContent"></div>
+ <div id="invalidColumnGapNone"></div>
+ <div id="invalidColumnGapMultiple"></div>
+ <div id="invalidColumnGapAngle"></div>
+ <div id="invalidColumnGapResolution"></div>
+ <div id="invalidColumnGapTime"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("default");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Default column-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("columnGapPx");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "column-gap accepts pixels");
+ test(
+ function(){
+ var target = document.getElementById("columnGapEm");
+ assert_equals(getComputedStyle(target).columnGap, "20px");
+ }, "column-gap accepts em");
+ test(
+ function(){
+ var target = document.getElementById("columnGapVw");
+ // The columnGap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).columnGap, "normal");
+ }, "column-gap accepts vw");
+ test(
+ function(){
+ var target = document.getElementById("columnGapPercent");
+ assert_equals(getComputedStyle(target).columnGap, "15%");
+ }, "column-gap accepts percentage");
+ test(
+ function(){
+ var target = document.getElementById("columnGapCalc");
+ assert_equals(getComputedStyle(target).columnGap, "14px");
+ }, "column-gap accepts calc()");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInitial");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial column-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInitialPx");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial column-gap is 'normal' 2");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInherit");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial inherited column-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInheritPx");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "column-gap is inheritable");
+
+
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapNegative");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Negative column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapMaxContent");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'max-content' column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapNone");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'none' column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapMultiple");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "column-gap with multiple values is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapAngle");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Angle column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapResolution");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Resolution column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapTime");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Time column-gap is invalid");
+ </script>
+</body>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-001.html
new file mode 100644
index 00000000000..881bb18446e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-001.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that gap property is interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes gap-0-to-100 {
+ from { gap: 0px; }
+ to { gap: 100px; }
+ }
+
+ #target {
+ animation-name: gap-0-to-100;
+ animation-timing-function: linear;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).gap, "50px 50px");
+ assert_equals(getComputedStyle(target).rowGap, "50px");
+ assert_equals(getComputedStyle(target).columnGap, "50px");
+ }, "gap is interpolable");
+ </script>
+</body>
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-002.html b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-002.html
new file mode 100644
index 00000000000..44d8c70b3a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-002.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: gap normal test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that 'normal' value for gap property is not interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes gap-normal-to-100 {
+ from { gap: normal; }
+ to { gap: 100px; }
+ }
+
+ #target {
+ animation-name: gap-normal-to-100;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).gap, "100px 100px");
+ assert_equals(getComputedStyle(target).rowGap, "100px");
+ assert_equals(getComputedStyle(target).columnGap, "100px");
+ }, "gap: normal is not interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-003.html b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-003.html
new file mode 100644
index 00000000000..c047946fb7f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-003.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: Default gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that the default value for gap property, which is 'normal', is not interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes gap-to-100 {
+ to { gap: 100px; }
+ }
+
+ #target {
+ animation-name: gap-to-100;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).gap, "100px 100px");
+ assert_equals(getComputedStyle(target).rowGap, "100px");
+ assert_equals(getComputedStyle(target).columnGap, "100px");
+ }, "Default gap is not interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-004.html b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-004.html
new file mode 100644
index 00000000000..8b6fbe440f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-animation-004.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that gap property is interpolable for each longhand (row-gap and column-gap) independently.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes gap-100-200-to-200-400 {
+ from { gap: 100px 200px; }
+ to { gap: 200px 400px; }
+ }
+
+ #target {
+ animation-name: gap-100-200-to-200-400;
+ animation-timing-function: linear;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).gap, "150px 300px");
+ assert_equals(getComputedStyle(target).rowGap, "150px");
+ assert_equals(getComputedStyle(target).columnGap, "300px");
+ }, "gap is interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/gap-parsing-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-parsing-001.html
new file mode 100644
index 00000000000..48856128184
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/gap-parsing-001.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: gap shorthand parsing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#row-row-gap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .gapPx { gap: 12px; }
+ #gapPxTwo { gap: 12px 8px; }
+ #gapPxPercent { gap: 12px 10%; }
+ #gapEm { gap: 2em; font: 10px/1 Monospace; }
+ #gapEmTwo { gap: 2em 4em; font: 10px/1 Monospace; }
+ #gapVw { gap: 2vw; }
+ #gapVwTwo { gap: 2vw 1vh; }
+ #gapPercent { gap: 15%; }
+ #gapPercentTwo { gap: 15% 10%; }
+ #gapCalc { gap: calc(10px + 4px); }
+ #gapCalcTwo { gap: calc(10px + 4px) calc(20px - 8px); }
+ .gapInitial { gap: initial; }
+ .gapInherit { gap: inherit; }
+
+ #invalidGapNegative { gap: -10px; }
+ #invalidGapMaxContent { gap: max-content; }
+ #invalidGapNone { gap: none; }
+ #invalidGapAngle { gap: 3rad; }
+ #invalidGapResolution { gap: 2dpi; }
+ #invalidGapTime { gap: 200ms; }
+ #invalidGapThree { gap: 10px 1px 5px; }
+ #invalidGapSlash { gap: 10px / 5px; }
+ #invalidGapOneWrong { gap: 10px -5px; }
+</style>
+<body>
+ <div id="log"></div>
+
+ <div id="default"></div>
+ <div id="gapPx" class="gapPx"></div>
+ <div id="gapPxTwo"></div>
+ <div id="gapPxPercent"></div>
+ <div id="gapEm"></div>
+ <div id="gapEmTwo"></div>
+ <div id="gapVw"></div>
+ <div id="gapVwTwo"></div>
+ <div id="gapPercent"></div>
+ <div id="gapPercentTwo"></div>
+ <div id="gapCalc"></div>
+ <div id="gapCalcTwo"></div>
+ <div id="gapInitial" class="gapInitial"></div>
+ <div class="gapPx">
+ <div id="gapInitialPx" class="gapInitial"></div>
+ </div>
+ <div id="gapInherit" class="gapInherit"></div>
+ <div class="gapPx">
+ <div id="gapInheritPx" class="gapInherit"></div>
+ </div>
+
+ <div id="invalidGapNegative"></div>
+ <div id="invalidGapMaxContent"></div>
+ <div id="invalidGapNone"></div>
+ <div id="invalidGapAngle"></div>
+ <div id="invalidGapResolution"></div>
+ <div id="invalidGapTime"></div>
+ <div id="invalidGapThree"></div>
+ <div id="invalidGapSlash"></div>
+ <div id="invalidGapOneWrong"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("default");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Default gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("gapPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "gap accepts pixels");
+ test(
+ function(){
+ var target = document.getElementById("gapPxTwo");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "8px");
+ }, "gap accepts pixels 2");
+ test(
+ function(){
+ var target = document.getElementById("gapPxPercent");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "10%");
+ }, "gap accepts pixels combined with percentage");
+ test(
+ function(){
+ var target = document.getElementById("gapEm");
+ assert_equals(getComputedStyle(target).rowGap, "20px");
+ assert_equals(getComputedStyle(target).columnGap, "20px");
+ }, "gap accepts em");
+ test(
+ function(){
+ var target = document.getElementById("gapEmTwo");
+ assert_equals(getComputedStyle(target).rowGap, "20px");
+ assert_equals(getComputedStyle(target).columnGap, "40px");
+ }, "gap accepts em 2");
+ test(
+ function(){
+ var target = document.getElementById("gapVw");
+ // The gap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).rowGap, "normal");
+ assert_not_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap accepts vw");
+ test(
+ function(){
+ var target = document.getElementById("gapVwTwo");
+ // The gap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).rowGap, "normal");
+ assert_not_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap accepts vw and vh");
+ test(
+ function(){
+ var target = document.getElementById("gapPercent");
+ assert_equals(getComputedStyle(target).rowGap, "15%");
+ assert_equals(getComputedStyle(target).columnGap, "15%");
+ }, "gap accepts percentage");
+ test(
+ function(){
+ var target = document.getElementById("gapPercentTwo");
+ assert_equals(getComputedStyle(target).rowGap, "15%");
+ assert_equals(getComputedStyle(target).columnGap, "10%");
+ }, "gap accepts percentage 2");
+ test(
+ function(){
+ var target = document.getElementById("gapCalc");
+ assert_equals(getComputedStyle(target).rowGap, "14px");
+ assert_equals(getComputedStyle(target).columnGap, "14px");
+ }, "gap accepts calc()");
+ test(
+ function(){
+ var target = document.getElementById("gapCalcTwo");
+ assert_equals(getComputedStyle(target).rowGap, "14px");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "gap accepts calc() 2");
+ test(
+ function(){
+ var target = document.getElementById("gapInitial");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("gapInitialPx");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial gap is 'normal' 2");
+ test(
+ function(){
+ var target = document.getElementById("gapInherit");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial inherited gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("gapInheritPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "gap is inheritable");
+
+ test(
+ function(){
+ var target = document.getElementById("invalidGapNegative");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Negative gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapMaxContent");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'max-content' gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapNone");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'none' gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapAngle");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Angle gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapResolution");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Resolution gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapTime");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Time gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapThree");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap with three values is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapSlash");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap with slash is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGapOneWrong");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap with one wrong value is invalid");
+ </script>
+</body>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/grid-column-gap-parsing-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/grid-column-gap-parsing-001.html
new file mode 100644
index 00000000000..a552463950c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/grid-column-gap-parsing-001.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: column-gap parsing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-legacy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .columnGapPx { column-gap: 12px; }
+ #columnGapEm { column-gap: 2em; font: 10px/1 Monospace; }
+ #columnGapVw { column-gap: 2vw; }
+ #columnGapPercent { column-gap: 15%; }
+ #columnGapCalc { column-gap: calc(10px + 4px); }
+ .columnGapInitial { column-gap: initial; }
+ .columnGapInherit { column-gap: inherit; }
+
+ #invalidColumnGapNegative { column-gap: -10px; }
+ #invalidColumnGapMaxContent { column-gap: max-content; }
+ #invalidColumnGapNone { column-gap: none; }
+ #invalidColumnGapMultiple { column-gap: 10px 1px; }
+ #invalidColumnGapAngle { column-gap: 3rad; }
+ #invalidColumnGapResolution { column-gap: 2dpi; }
+ #invalidColumnGapTime { column-gap: 200ms; }
+</style>
+<body>
+ <div id="log"></div>
+
+ <div id="default"></div>
+ <div id="columnGapPx" class="columnGapPx"></div>
+ <div id="columnGapEm"></div>
+ <div id="columnGapVw"></div>
+ <div id="columnGapPercent"></div>
+ <div id="columnGapCalc"></div>
+ <div id="columnGapInitial" class="columnGapInitial"></div>
+ <div class="columnGapPx">
+ <div id="columnGapInitialPx" class="columnGapInitial"></div>
+ </div>
+ <div id="columnGapInherit" class="columnGapInherit"></div>
+ <div class="columnGapPx">
+ <div id="columnGapInheritPx" class="columnGapInherit"></div>
+ </div>
+
+ <div id="invalidColumnGapNegative"></div>
+ <div id="invalidColumnGapMaxContent"></div>
+ <div id="invalidColumnGapNone"></div>
+ <div id="invalidColumnGapMultiple"></div>
+ <div id="invalidColumnGapAngle"></div>
+ <div id="invalidColumnGapResolution"></div>
+ <div id="invalidColumnGapTime"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("default");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Default column-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("columnGapPx");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "column-gap accepts pixels");
+ test(
+ function(){
+ var target = document.getElementById("columnGapEm");
+ assert_equals(getComputedStyle(target).columnGap, "20px");
+ }, "column-gap accepts em");
+ test(
+ function(){
+ var target = document.getElementById("columnGapVw");
+ // The columnGap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).columnGap, "normal");
+ }, "column-gap accepts vw");
+ test(
+ function(){
+ var target = document.getElementById("columnGapPercent");
+ assert_equals(getComputedStyle(target).columnGap, "15%");
+ }, "column-gap accepts percentage");
+ test(
+ function(){
+ var target = document.getElementById("columnGapCalc");
+ assert_equals(getComputedStyle(target).columnGap, "14px");
+ }, "column-gap accepts calc()");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInitial");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial column-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInitialPx");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial column-gap is 'normal' 2");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInherit");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial inherited column-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("columnGapInheritPx");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "column-gap is inheritable");
+
+
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapNegative");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Negative column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapMaxContent");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'max-content' column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapNone");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'none' column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapMultiple");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "column-gap with multiple values is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapAngle");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Angle column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapResolution");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Resolution column-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidColumnGapTime");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Time column-gap is invalid");
+ </script>
+</body>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/grid-gap-parsing-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/grid-gap-parsing-001.html
new file mode 100644
index 00000000000..614b23a7a4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/grid-gap-parsing-001.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: gap shorthand parsing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-legacy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .gapPx { grid-gap: 12px; }
+ #gapPxTwo { grid-gap: 12px 8px; }
+ #gapPxPercent { grid-gap: 12px 10%; }
+ #gapEm { grid-gap: 2em; font: 10px/1 Monospace; }
+ #gapEmTwo { grid-gap: 2em 4em; font: 10px/1 Monospace; }
+ #gapVw { grid-gap: 2vw; }
+ #gapVwTwo { grid-gap: 2vw 1vh; }
+ #gapPercent { grid-gap: 15%; }
+ #gapPercentTwo { grid-gap: 15% 10%; }
+ #gapCalc { grid-gap: calc(10px + 4px); }
+ #gapCalcTwo { grid-gap: calc(10px + 4px) calc(20px - 8px); }
+ .gapInitial { grid-gap: initial; }
+ .gapInherit { grid-gap: inherit; }
+
+ #invalidGridGapNegative { grid-gap: -10px; }
+ #invalidGridGapMaxContent { grid-gap: max-content; }
+ #invalidGridGapNone { grid-gap: none; }
+ #invalidGridGapAngle { grid-gap: 3rad; }
+ #invalidGridGapResolution { grid-gap: 2dpi; }
+ #invalidGridGapTime { grid-gap: 200ms; }
+ #invalidGridGapThree { grid-gap: 10px 1px 5px; }
+ #invalidGridGapSlash { grid-gap: 10px / 5px; }
+ #invalidGridGapOneWrong { grid-gap: 10px -5px; }
+</style>
+<body>
+ <div id="log"></div>
+
+ <div id="default"></div>
+ <div id="gapPx" class="gapPx"></div>
+ <div id="gapPxTwo"></div>
+ <div id="gapPxPercent"></div>
+ <div id="gapEm"></div>
+ <div id="gapEmTwo"></div>
+ <div id="gapVw"></div>
+ <div id="gapVwTwo"></div>
+ <div id="gapPercent"></div>
+ <div id="gapPercentTwo"></div>
+ <div id="gapCalc"></div>
+ <div id="gapCalcTwo"></div>
+ <div id="gapInitial" class="gapInitial"></div>
+ <div class="gapPx">
+ <div id="gapInitialPx" class="gapInitial"></div>
+ </div>
+ <div id="gapInherit" class="gapInherit"></div>
+ <div class="gapPx">
+ <div id="gapInheritPx" class="gapInherit"></div>
+ </div>
+
+ <div id="invalidGridGapNegative"></div>
+ <div id="invalidGridGapMaxContent"></div>
+ <div id="invalidGridGapNone"></div>
+ <div id="invalidGridGapAngle"></div>
+ <div id="invalidGridGapResolution"></div>
+ <div id="invalidGridGapTime"></div>
+ <div id="invalidGridGapThree"></div>
+ <div id="invalidGridGapSlash"></div>
+ <div id="invalidGridGapOneWrong"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("default");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Default gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("gapPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "gap accepts pixels");
+ test(
+ function(){
+ var target = document.getElementById("gapPxTwo");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "8px");
+ }, "gap accepts pixels 2");
+ test(
+ function(){
+ var target = document.getElementById("gapPxPercent");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "10%");
+ }, "gap accepts pixels combined with percentage");
+ test(
+ function(){
+ var target = document.getElementById("gapEm");
+ assert_equals(getComputedStyle(target).rowGap, "20px");
+ assert_equals(getComputedStyle(target).columnGap, "20px");
+ }, "gap accepts em");
+ test(
+ function(){
+ var target = document.getElementById("gapEmTwo");
+ assert_equals(getComputedStyle(target).rowGap, "20px");
+ assert_equals(getComputedStyle(target).columnGap, "40px");
+ }, "gap accepts em 2");
+ test(
+ function(){
+ var target = document.getElementById("gapVw");
+ // The gap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).rowGap, "normal");
+ assert_not_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap accepts vw");
+ test(
+ function(){
+ var target = document.getElementById("gapVwTwo");
+ // The gap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).rowGap, "normal");
+ assert_not_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap accepts vw and vh");
+ test(
+ function(){
+ var target = document.getElementById("gapPercent");
+ assert_equals(getComputedStyle(target).rowGap, "15%");
+ assert_equals(getComputedStyle(target).columnGap, "15%");
+ }, "gap accepts percentage");
+ test(
+ function(){
+ var target = document.getElementById("gapPercentTwo");
+ assert_equals(getComputedStyle(target).rowGap, "15%");
+ assert_equals(getComputedStyle(target).columnGap, "10%");
+ }, "gap accepts percentage 2");
+ test(
+ function(){
+ var target = document.getElementById("gapCalc");
+ assert_equals(getComputedStyle(target).rowGap, "14px");
+ assert_equals(getComputedStyle(target).columnGap, "14px");
+ }, "gap accepts calc()");
+ test(
+ function(){
+ var target = document.getElementById("gapCalcTwo");
+ assert_equals(getComputedStyle(target).rowGap, "14px");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "gap accepts calc() 2");
+ test(
+ function(){
+ var target = document.getElementById("gapInitial");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("gapInitialPx");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial gap is 'normal' 2");
+ test(
+ function(){
+ var target = document.getElementById("gapInherit");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Initial inherited gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("gapInheritPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ assert_equals(getComputedStyle(target).columnGap, "12px");
+ }, "gap is inheritable");
+
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapNegative");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Negative gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapMaxContent");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'max-content' gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapNone");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "'none' gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapAngle");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Angle gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapResolution");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Resolution gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapTime");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "Time gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapThree");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap with three values is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapSlash");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap with slash is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidGridGapOneWrong");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ assert_equals(getComputedStyle(target).columnGap, "normal");
+ }, "gap with one wrong value is invalid");
+ </script>
+</body>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/grid-row-gap-parsing-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/grid-row-gap-parsing-001.html
new file mode 100644
index 00000000000..9dc8c8da59a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/grid-row-gap-parsing-001.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: row-gap parsing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#gap-legacy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .rowGapPx { row-gap: 12px; }
+ #rowGapEm { row-gap: 2em; font: 10px/1 Monospace; }
+ #rowGapVw { row-gap: 2vw; }
+ #rowGapPercent { row-gap: 15%; }
+ #rowGapCalc { row-gap: calc(10px + 4px); }
+ .rowGapInitial { row-gap: initial; }
+ .rowGapInherit { row-gap: inherit; }
+
+ #invalidRowGapNegative { row-gap: -10px; }
+ #invalidRowGapMaxContent { row-gap: max-content; }
+ #invalidRowGapNone { row-gap: none; }
+ #invalidRowGapMultiple { row-gap: 10px 1px; }
+ #invalidRowGapAngle { row-gap: 3rad; }
+ #invalidRowGapResolution { row-gap: 2dpi; }
+ #invalidRowGapTime { row-gap: 200ms; }
+</style>
+<body>
+ <div id="log"></div>
+
+ <div id="default"></div>
+ <div id="rowGapPx" class="rowGapPx"></div>
+ <div id="rowGapEm"></div>
+ <div id="rowGapVw"></div>
+ <div id="rowGapPercent"></div>
+ <div id="rowGapCalc"></div>
+ <div id="rowGapInitial" class="rowGapInitial"></div>
+ <div class="rowGapPx">
+ <div id="rowGapInitialPx" class="rowGapInitial"></div>
+ </div>
+ <div id="rowGapInherit" class="rowGapInherit"></div>
+ <div class="rowGapPx">
+ <div id="rowGapInheritPx" class="rowGapInherit"></div>
+ </div>
+
+ <div id="invalidRowGapNegative"></div>
+ <div id="invalidRowGapMaxContent"></div>
+ <div id="invalidRowGapNone"></div>
+ <div id="invalidRowGapMultiple"></div>
+ <div id="invalidRowGapAngle"></div>
+ <div id="invalidRowGapResolution"></div>
+ <div id="invalidRowGapTime"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("default");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Default row-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("rowGapPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ }, "row-gap accepts pixels");
+ test(
+ function(){
+ var target = document.getElementById("rowGapEm");
+ assert_equals(getComputedStyle(target).rowGap, "20px");
+ }, "row-gap accepts em");
+ test(
+ function(){
+ var target = document.getElementById("rowGapVw");
+ // The rowGap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).rowGap, "normal");
+ }, "row-gap accepts vw");
+ test(
+ function(){
+ var target = document.getElementById("rowGapPercent");
+ assert_equals(getComputedStyle(target).rowGap, "15%");
+ }, "row-gap accepts percentage");
+ test(
+ function(){
+ var target = document.getElementById("rowGapCalc");
+ assert_equals(getComputedStyle(target).rowGap, "14px");
+ }, "row-gap accepts calc()");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInitial");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Initial row-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInitialPx");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Initial row-gap is 'normal' 2");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInherit");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Initial inherited row-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInheritPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ }, "row-gap is inheritable");
+
+
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapNegative");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Negative row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapMaxContent");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "'max-content' row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapNone");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "'none' row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapMultiple");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "row-gap with multiple values is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapAngle");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Angle row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapResolution");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Resolution row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapTime");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Time row-gap is invalid");
+ </script>
+</body>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-001.html
new file mode 100644
index 00000000000..da4a235deda
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-001.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: row-gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that row-gap property is interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes row-gap-0-to-100 {
+ from { row-gap: 0px; }
+ to { row-gap: 100px; }
+ }
+
+ #target {
+ animation-name: row-gap-0-to-100;
+ animation-timing-function: linear;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).rowGap, "50px");
+ }, "row-gap is interpolable");
+ </script>
+</body>
+
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-002.html b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-002.html
new file mode 100644
index 00000000000..330e1054f14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-002.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: row-gap normal test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that 'normal' value for row-gap property is not interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes row-gap-normal-to-100 {
+ from { row-gap: normal; }
+ to { row-gap: 100px; }
+ }
+
+ #target {
+ animation-name: row-gap-normal-to-100;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).rowGap, "100px");
+ }, "row-gap: normal is not interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-003.html b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-003.html
new file mode 100644
index 00000000000..574e3ff7c85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-animation-003.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: Default row-gap test animation</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<link rel="help" href="https://www.w3.org/TR/css-animations-1/#keyframes">
+<meta name="assert" content="This test checks that the default value for row-gap property, which is 'normal', is not interpolable.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @keyframes row-gap-to-100 {
+ to { row-gap: 100px; }
+ }
+
+ #target {
+ animation-name: row-gap-to-100;
+ animation-duration: 2s;
+ animation-delay: -1s;
+ animation-play-state: paused;
+ }
+</style>
+<body>
+ <div id="target"></div>
+ <div id="log"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("target");
+ assert_equals(getComputedStyle(target).rowGap, "100px");
+ }, "Default row-gap is not interpolable");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-parsing-001.html b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-parsing-001.html
new file mode 100644
index 00000000000..6de848c3c2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/gaps/row-gap-parsing-001.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Box Alignment Test: row-gap parsing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#column-row-gap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .rowGapPx { row-gap: 12px; }
+ #rowGapEm { row-gap: 2em; font: 10px/1 Monospace; }
+ #rowGapVw { row-gap: 2vw; }
+ #rowGapPercent { row-gap: 15%; }
+ #rowGapCalc { row-gap: calc(10px + 4px); }
+ .rowGapInitial { row-gap: initial; }
+ .rowGapInherit { row-gap: inherit; }
+
+ #invalidRowGapNegative { row-gap: -10px; }
+ #invalidRowGapMaxContent { row-gap: max-content; }
+ #invalidRowGapNone { row-gap: none; }
+ #invalidRowGapMultiple { row-gap: 10px 1px; }
+ #invalidRowGapAngle { row-gap: 3rad; }
+ #invalidRowGapResolution { row-gap: 2dpi; }
+ #invalidRowGapTime { row-gap: 200ms; }
+</style>
+<body>
+ <div id="log"></div>
+
+ <div id="default"></div>
+ <div id="rowGapPx" class="rowGapPx"></div>
+ <div id="rowGapEm"></div>
+ <div id="rowGapVw"></div>
+ <div id="rowGapPercent"></div>
+ <div id="rowGapCalc"></div>
+ <div id="rowGapInitial" class="rowGapInitial"></div>
+ <div class="rowGapPx">
+ <div id="rowGapInitialPx" class="rowGapInitial"></div>
+ </div>
+ <div id="rowGapInherit" class="rowGapInherit"></div>
+ <div class="rowGapPx">
+ <div id="rowGapInheritPx" class="rowGapInherit"></div>
+ </div>
+
+ <div id="invalidRowGapNegative"></div>
+ <div id="invalidRowGapMaxContent"></div>
+ <div id="invalidRowGapNone"></div>
+ <div id="invalidRowGapMultiple"></div>
+ <div id="invalidRowGapAngle"></div>
+ <div id="invalidRowGapResolution"></div>
+ <div id="invalidRowGapTime"></div>
+
+ <script>
+ test(
+ function(){
+ var target = document.getElementById("default");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Default row-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("rowGapPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ }, "row-gap accepts pixels");
+ test(
+ function(){
+ var target = document.getElementById("rowGapEm");
+ assert_equals(getComputedStyle(target).rowGap, "20px");
+ }, "row-gap accepts em");
+ test(
+ function(){
+ var target = document.getElementById("rowGapVw");
+ // The rowGap size would depend on the viewport width, so to make the test pass
+ // in any window size we just check it's not "normal".
+ assert_not_equals(getComputedStyle(target).rowGap, "normal");
+ }, "row-gap accepts vw");
+ test(
+ function(){
+ var target = document.getElementById("rowGapPercent");
+ assert_equals(getComputedStyle(target).rowGap, "15%");
+ }, "row-gap accepts percentage");
+ test(
+ function(){
+ var target = document.getElementById("rowGapCalc");
+ assert_equals(getComputedStyle(target).rowGap, "14px");
+ }, "row-gap accepts calc()");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInitial");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Initial row-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInitialPx");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Initial row-gap is 'normal' 2");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInherit");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Initial inherited row-gap is 'normal'");
+ test(
+ function(){
+ var target = document.getElementById("rowGapInheritPx");
+ assert_equals(getComputedStyle(target).rowGap, "12px");
+ }, "row-gap is inheritable");
+
+
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapNegative");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Negative row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapMaxContent");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "'max-content' row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapNone");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "'none' row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapMultiple");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "row-gap with multiple values is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapAngle");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Angle row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapResolution");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Resolution row-gap is invalid");
+ test(
+ function(){
+ var target = document.getElementById("invalidRowGapTime");
+ assert_equals(getComputedStyle(target).rowGap, "normal");
+ }, "Time row-gap is invalid");
+ </script>
+</body>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-transforms/transform-origin-in-shadow.html b/tests/wpt/web-platform-tests/css/css-transforms/transform-origin-in-shadow.html
new file mode 100644
index 00000000000..ebbc616ff8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms/transform-origin-in-shadow.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>'transform-origin' on &lt;svg> being direct descendant of shadow root</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://drafts.csswg.org/css-transforms/#transform-origin-property">
+<template>
+ <style>
+ #target {
+ height: 100px;
+ width: 100px;
+ background-color: green;
+ transform: rotate(90deg);
+ }
+ </style>
+ <svg id="target"></svg>
+</template>
+<div style="position: relative; height: 100px">
+ <div style="width: 100px; height: 100px; background-color: red; position: absolute"></div>
+ <div style="position: absolute" id="wrapper"></div>
+</div>
+<script>
+setup(function() {
+ const wrapper = document.querySelector('#wrapper');
+ wrapper.attachShadow({mode: "open"});
+ wrapper.shadowRoot.appendChild(
+ document.querySelector("template").content.cloneNode(true));
+});
+
+test(function() {
+ const wrapper = document.querySelector('#wrapper');
+ const target = wrapper.shadowRoot.getElementById('target');
+ assert_equals(getComputedStyle(target, null).transformOrigin, '50px 50px');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html
index 8662b4fd2af..00d723fc6db 100644
--- a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-serialization/cssTransformValue.tentative.html
@@ -45,6 +45,11 @@ const gTestCases = [
desc: 'CSSSkew'
},
{
+ value: new CSSSkew(CSS.deg(90), CSS.turn(0)),
+ cssText: 'skew(90deg)',
+ desc: 'CSSSkew with Y which is 0 value'
+ },
+ {
value: new CSSPerspective(CSS.px(1)),
cssText: 'perspective(1px)',
desc: 'CSSPerspective'
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg
new file mode 100644
index 00000000000..526de0f63fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-create-an-element-for-a-token-svg.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg:svg xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/1999/xhtml"
+ width="100%" height="100%" viewBox="0 0 800 600">
+<svg:title>XML parser should use "create an element for a token"</svg:title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/xhtml.html#parsing-xhtml-documents:create-an-element-for-the-token"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script><![CDATA[
+class MyElement1 extends HTMLElement {}
+customElements.define('my-element', MyElement1);
+class MyElement2 extends HTMLDivElement {}
+customElements.define('my-div', MyElement2, { extends: 'div' });
+
+var test1 = async_test('XML parser should create autonomous custom elements.');
+window.addEventListener('load', test1.step_func_done(() => {
+ assert_true(document.getElementById('me1') instanceof MyElement1);
+}));
+
+var test2 = async_test('XML parser should create custom built-in elements.');
+window.addEventListener('load', test2.step_func_done(() => {
+ assert_true(document.getElementById('me2') instanceof MyElement2);
+}));
+]]></script>
+<my-element id="me1"></my-element>
+<div is="my-div" id="me2"></div>
+</svg:svg>
diff --git a/tests/wpt/web-platform-tests/dom/abort/event.any.js b/tests/wpt/web-platform-tests/dom/abort/event.any.js
index 3b25702c2e4..a67e6f400fc 100644
--- a/tests/wpt/web-platform-tests/dom/abort/event.any.js
+++ b/tests/wpt/web-platform-tests/dom/abort/event.any.js
@@ -17,6 +17,51 @@ test(t => {
assert_true(s.aborted);
c.abort();
-}, "AbortController() basics");
+}, "AbortController abort() should fire event synchronously");
+
+test(t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ assert_equals(controller.signal, signal,
+ "value of controller.signal should not have changed");
+ controller.abort();
+ assert_equals(controller.signal, signal,
+ "value of controller.signal should still not have changed");
+}, "controller.signal should always return the same object");
+
+test(t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ let eventCount = 0;
+ signal.onabort = () => {
+ ++eventCount;
+ };
+ controller.abort();
+ assert_true(signal.aborted);
+ assert_equals(eventCount, 1, "event handler should have been called once");
+ controller.abort();
+ assert_true(signal.aborted);
+ assert_equals(eventCount, 1,
+ "event handler should not have been called again");
+}, "controller.abort() should do nothing the second time it is called");
+
+test(t => {
+ const controller = new AbortController();
+ controller.abort();
+ controller.signal.onabort =
+ t.unreached_func("event handler should not be called");
+}, "event handler should not be called if added after controller.abort()");
+
+test(t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ signal.onabort = t.step_func(e => {
+ assert_equals(e.type, "abort", "event type should be abort");
+ assert_equals(e.target, signal, "event target should be signal");
+ assert_false(e.bubbles, "event should not bubble");
+ assert_true(e.isTrusted, "event should be trusted");
+ });
+ controller.abort();
+}, "the abort event should have the right properties");
done();
diff --git a/tests/wpt/web-platform-tests/dom/interfaces.html b/tests/wpt/web-platform-tests/dom/interfaces.html
index 8e9572d0f09..3cb08f405a5 100644
--- a/tests/wpt/web-platform-tests/dom/interfaces.html
+++ b/tests/wpt/web-platform-tests/dom/interfaces.html
@@ -18,8 +18,12 @@ element.setAttribute("bar", "baz");
var idlArray = new IdlArray();
-function doTest(idl) {
- idlArray.add_idls(idl);
+function doTest([html, dom]) {
+ // HTML is needed for EventHandler. Provide a dummy interface for
+ // LinkStyle which HTML depends on but we're not testing.
+ idlArray.add_untested_idls('interface LinkStyle {};');
+ idlArray.add_untested_idls(html);
+ idlArray.add_idls(dom);
idlArray.add_objects({
EventTarget: ['new EventTarget()'],
Event: ['document.createEvent("Event")', 'new Event("foo")'],
@@ -46,8 +50,13 @@ function doTest(idl) {
idlArray.test();
}
+function fetchText(url) {
+ return fetch(url).then((response) => response.text());
+}
+
promise_test(function() {
- return fetch("/interfaces/dom.idl").then(response => response.text())
- .then(doTest);
+ return Promise.all(['/interfaces/html.idl',
+ '/interfaces/dom.idl'].map(fetchText))
+ .then(doTest);
}, "Test driver");
</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js
new file mode 100644
index 00000000000..6d540ce97c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/windows/auxiliary-browsing-contexts/opener-setter.window.js
@@ -0,0 +1,38 @@
+[
+ undefined,
+ 42,
+ function() { return "hi" },
+ "hi",
+ {},
+ [],
+ Symbol()
+].forEach(val => {
+ test(t => {
+ const frame = document.body.appendChild(document.createElement("iframe")),
+ win = frame.contentWindow;
+ t.add_cleanup(() => frame.remove());
+
+ assert_own_property(win, "opener");
+ assert_equals(win.opener, null);
+ const beforeDesc = Object.getOwnPropertyDescriptor(win, "opener"),
+ openerGet = beforeDesc.get,
+ openerSet = beforeDesc.set;
+ assert_own_property(beforeDesc, "get");
+ assert_own_property(beforeDesc, "set");
+ assert_true(beforeDesc.enumerable);
+ assert_true(beforeDesc.configurable);
+
+ win.opener = val;
+ assert_equals(win.opener, val);
+ assert_equals(openerGet(), null);
+
+ const desc = Object.getOwnPropertyDescriptor(win, "opener");
+ assert_equals(desc.value, val);
+ assert_true(desc.writable);
+ assert_true(desc.enumerable);
+ assert_true(desc.configurable);
+
+ openerSet("x");
+ assert_equals(win.opener, "x");
+ }, "Setting window.opener to " + String(val)); // String() needed for symbols
+});
diff --git a/tests/wpt/web-platform-tests/payment-request/interfaces.https.html b/tests/wpt/web-platform-tests/payment-request/interfaces.https.html
index bfbcad48afe..a7ec323f0cd 100644
--- a/tests/wpt/web-platform-tests/payment-request/interfaces.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/interfaces.https.html
@@ -7,12 +7,13 @@
<script src=/resources/idlharness.js></script>
<script>
promise_test(async () => {
- const idlURLs = ["/interfaces/dom.idl", "/interfaces/payment-request.idl"];
+ const urls = ["/interfaces/dom.idl", "/interfaces/payment-request.idl"];
+ const [dom, payment_request] = await Promise.all(
+ urls.map(url => fetch(url).then(r => r.text())));
const idlArray = new IdlArray();
- for(const url of idlURLs){
- const idlText = await fetch(url).then(r => r.text());
- idlArray.add_idls(idlText);
- }
+ idlArray.add_untested_idls(dom);
+ idlArray.add_idls(payment_request);
+
// typedef EventHandler from HTML
// https://html.spec.whatwg.org/#eventhandler
idlArray.add_idls(`
diff --git a/tests/wpt/web-platform-tests/picture-in-picture/enter-picture-in-picture.html b/tests/wpt/web-platform-tests/picture-in-picture/enter-picture-in-picture.html
index e44087c3ff1..8830ab018bf 100644
--- a/tests/wpt/web-platform-tests/picture-in-picture/enter-picture-in-picture.html
+++ b/tests/wpt/web-platform-tests/picture-in-picture/enter-picture-in-picture.html
@@ -7,7 +7,7 @@
<script src="resources/picture-in-picture-helpers.js"></script>
<body></body>
<script>
-async_test(t => {
+promise_test(t => {
const video = document.createElement('video');
video.addEventListener('enterpictureinpicture', t.step_func_done(event => {
diff --git a/tests/wpt/web-platform-tests/picture-in-picture/leave-picture-in-picture.html b/tests/wpt/web-platform-tests/picture-in-picture/leave-picture-in-picture.html
new file mode 100644
index 00000000000..a0d4cc26f35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/picture-in-picture/leave-picture-in-picture.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>Test leavepictureinpicture event</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/picture-in-picture-helpers.js"></script>
+<body></body>
+<script>
+promise_test(t => {
+ const video = document.createElement('video');
+
+ video.addEventListener('leavepictureinpicture', t.step_func_done(event => {
+ assert_equals(event.target, video);
+ assert_equals(event.bubbles, true);
+ assert_equals(event.cancelable, false);
+ assert_equals(event.composed, false);
+ assert_equals(document.pictureInPictureElement, null);
+ }));
+
+ return requestPictureInPictureWithTrustedClick(video)
+ .then(() => document.exitPictureInPicture())
+}, 'leavepictureinpicture event is fired if document.exitPictureInPicture');
+
+promise_test(t => {
+ const video = document.createElement('video');
+
+ video.addEventListener('leavepictureinpicture', t.step_func_done(event => {
+ assert_equals(event.target, video);
+ assert_equals(event.bubbles, true);
+ assert_equals(event.cancelable, false);
+ assert_equals(event.composed, false);
+ assert_equals(document.pictureInPictureElement, null);
+ }));
+
+ return requestPictureInPictureWithTrustedClick(video)
+ .then(() => {
+ video.disablePictureInPicture = true;
+ });
+}, 'leavepictureinpicture event is fired if video.disablePictureInPicture is set to true');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/local-url-inherit-controller-frame.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/local-url-inherit-controller-frame.html
index d70e2141377..b331f88d471 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/local-url-inherit-controller-frame.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/local-url-inherit-controller-frame.html
@@ -6,10 +6,16 @@ const fetchURL = new URL('dummy.txt', window.location).href;
const frameControllerText =
`<script>
- let t = navigator.serviceWorker.controller
- ? navigator.serviceWorker.controller.scriptURL
- : null;
- parent.postMessage({ data: t }, '*');
+ let t = null;
+ try {
+ if (navigator.serviceWorker.controller) {
+ t = navigator.serviceWorker.controller.scriptURL;
+ }
+ } catch (e) {
+ t = e.message;
+ } finally {
+ parent.postMessage({ data: t }, '*');
+ }
</` + `script>`;
const frameFetchText =
@@ -67,14 +73,15 @@ function getChildText(opts) {
}
function makeURL(opts) {
+ let mimetype = opts.child === 'iframe' ? 'text/html'
+ : 'text/javascript';
+
if (opts.scheme === 'blob') {
- let blob = new Blob([getChildText(opts)]);
+ let blob = new Blob([getChildText(opts)], { type: mimetype });
return URL.createObjectURL(blob);
}
if (opts.scheme === 'data') {
- let mimetype = opts.child === 'iframe' ? 'text/html'
- : 'text/javascript';
return `data:${mimetype},${getChildText(opts)}`;
}
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
index ef3b7d6694b..a76074bb284 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/browser.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -8,6 +8,7 @@ import subprocess
import sys
from abc import ABCMeta, abstractmethod
from ConfigParser import RawConfigParser
+from datetime import datetime, timedelta
from distutils.spawn import find_executable
from io import BytesIO
@@ -158,9 +159,15 @@ class Firefox(Browser):
dest = os.path.join(dest, "profiles")
if not os.path.exists(dest):
os.makedirs(dest)
- with open(os.path.join(dest, "prefs_general.js"), "wb") as f:
- resp = get("https://hg.mozilla.org/mozilla-central/raw-file/tip/testing/profiles/prefs_general.js")
- f.write(resp.content)
+ prefs_path = os.path.join(dest, "prefs_general.js")
+
+ now = datetime.now()
+ if (not os.path.exists(prefs_path) or
+ (datetime.fromtimestamp(os.stat(prefs_path).st_mtime) <
+ now - timedelta(days=2))):
+ with open(prefs_path, "wb") as f:
+ resp = get("https://hg.mozilla.org/mozilla-central/raw-file/tip/testing/profiles/prefs_general.js")
+ f.write(resp.content)
return dest
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused-ref.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused-ref.html
index 66505b22bf5..60f7bb0cd38 100644
--- a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused-ref.html
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused-ref.html
@@ -1,14 +1,13 @@
<!DOCTYPE html>
+<html class="reftest-wait">
<title>Reference for WebVTT rendering, cue text should be removed when removing them using the DOM APIs while paused</title>
+<script src="/common/reftest-wait.js"></script>
<style>
-html { overflow:hidden }
-body { margin:0 }
-.video {
- display: inline-block;
- width: 320px;
- height: 180px;
- position: relative;
- font-size: 9px;
-}
+html { overflow: hidden }
+body { margin: 0 }
</style>
-<div class="video"></div>
+<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();">
+ <source src="/media/white.webm" type="video/webm">
+ <source src="/media/white.mp4" type="video/mp4">
+</video>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html
index 708eba98c01..9233df874cf 100644
--- a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html
+++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/dom_override_remove_cue_while_paused.html
@@ -2,15 +2,15 @@
<html class="reftest-wait">
<title>WebVTT rendering, cue text should be removed when removing them using the DOM APIs while paused</title>
<link rel="match" href="dom_override_remove_cue_while_paused-ref.html">
+<script src="/common/reftest-wait.js"></script>
<style>
-html { overflow:hidden }
-body { margin:0 }
+html { overflow: hidden }
+body { margin: 0 }
::cue {
font-family: Ahem, sans-serif;
color: green
}
</style>
-<script src="/common/reftest-wait.js"></script>
<script>
var i = 0;
function updateCue() {
@@ -24,7 +24,7 @@ body { margin:0 }
takeScreenshotDelayed(1000);
}
</script>
-<video id="video" width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); updateCue();">
+<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); updateCue();">
<source src="/media/white.webm" type="video/webm">
<source src="/media/white.mp4" type="video/mp4">
<track id="track" src="support/test.vtt" onload="updateCue();">