aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWPT Sync Bot <josh+wptsync@joshmatthews.net>2019-03-08 20:43:08 -0500
committerWPT Sync Bot <josh+wptsync@joshmatthews.net>2019-03-08 22:55:43 -0500
commite9a369631b92c2d8411233080a85543f554b1b6d (patch)
tree5fc1b17a10820bc06bec88d97e64c973c58b09af
parentdb29cb01b0450c29d0ac45c6de2819a4f87e400a (diff)
downloadservo-e9a369631b92c2d8411233080a85543f554b1b6d.tar.gz
servo-e9a369631b92c2d8411233080a85543f554b1b6d.zip
Update web-platform-tests to revision 8fde342d6e62e9820f2c19db634b99b78df796fa
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini6
-rw-r--r--tests/wpt/metadata/MANIFEST.json159
-rw-r--r--tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini3
-rw-r--r--tests/wpt/metadata/custom-elements/reactions/HTMLMeterElement.html.ini37
-rw-r--r--tests/wpt/metadata/custom-elements/reactions/HTMLOptGroupElement.html.ini7
-rw-r--r--tests/wpt/metadata/custom-elements/reactions/HTMLParamElement.html.ini13
-rw-r--r--tests/wpt/metadata/custom-elements/reactions/HTMLProgressElement.html.ini13
-rw-r--r--tests/wpt/metadata/encoding/single-byte-decoder.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini6
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/close-method.window.js.ini7
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini10
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini7
-rw-r--r--tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/iframe_005.html.ini4
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/bindings-inject-key.html82
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/bindings-inject-keys-bypass-setters.html35
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-chain.html35
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-setters.html36
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/playback-rate.https.html381
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html3
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html31
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-blobs-read-blobs-manual.https.html34
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html12
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html6
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-duplicate-mime-type-manual.https.html26
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-image-read-image-manual.https.html22
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html8
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLMeterElement.html55
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptGroupElement.html38
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLParamElement.html41
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLProgressElement.html25
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/testdriver-tutorial.md2
-rw-r--r--tests/wpt/web-platform-tests/element-timing/cross-origin-element.sub.html25
-rw-r--r--tests/wpt/web-platform-tests/element-timing/observe-child-element.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/close-method.window.js39
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webxr.idl5
-rw-r--r--tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html18
-rw-r--r--tests/wpt/web-platform-tests/portals/resources/portal-inside-iframe.html4
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webxr-test.js11
-rw-r--r--tests/wpt/web-platform-tests/svg/painting/parsing/stroke-dashoffset-valid.svg4
-rw-r--r--tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-computed.svg4
-rw-r--r--tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-valid.svg4
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js2
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js14
48 files changed, 1012 insertions, 283 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
index 947e223fb28..3a3d15b8406 100644
--- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
@@ -14,6 +14,9 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
+ [Revoke blob URL after calling fetch, fetch should succeed]
+ expected: FAIL
+
[url-with-fetch.any.html]
[Untitled]
@@ -34,3 +37,6 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
+ [Revoke blob URL after calling fetch, fetch should succeed]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 988d579088a..6ea00a66e58 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -1219,6 +1219,12 @@
{}
]
],
+ "clipboard-apis/async-write-blobs-read-blobs-manual.https.html": [
+ [
+ "clipboard-apis/async-write-blobs-read-blobs-manual.https.html",
+ {}
+ ]
+ ],
"clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html": [
[
"clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html",
@@ -1231,6 +1237,12 @@
{}
]
],
+ "clipboard-apis/async-write-duplicate-mime-type-manual.https.html": [
+ [
+ "clipboard-apis/async-write-duplicate-mime-type-manual.https.html",
+ {}
+ ]
+ ],
"clipboard-apis/async-write-image-read-image-manual.https.html": [
[
"clipboard-apis/async-write-image-read-image-manual.https.html",
@@ -306720,6 +306732,11 @@
{}
]
],
+ "portals/resources/portal-inside-iframe.html": [
+ [
+ {}
+ ]
+ ],
"portals/resources/portals-rendering-portal.html": [
[
{}
@@ -334858,9 +334875,21 @@
{}
]
],
- "IndexedDB/bindings-inject-key.html": [
+ "IndexedDB/bindings-inject-keys-bypass-setters.html": [
+ [
+ "IndexedDB/bindings-inject-keys-bypass-setters.html",
+ {}
+ ]
+ ],
+ "IndexedDB/bindings-inject-values-bypass-chain.html": [
+ [
+ "IndexedDB/bindings-inject-values-bypass-chain.html",
+ {}
+ ]
+ ],
+ "IndexedDB/bindings-inject-values-bypass-setters.html": [
[
- "IndexedDB/bindings-inject-key.html",
+ "IndexedDB/bindings-inject-values-bypass-setters.html",
{}
]
],
@@ -364982,6 +365011,12 @@
{}
]
],
+ "custom-elements/reactions/HTMLMeterElement.html": [
+ [
+ "custom-elements/reactions/HTMLMeterElement.html",
+ {}
+ ]
+ ],
"custom-elements/reactions/HTMLModElement.html": [
[
"custom-elements/reactions/HTMLModElement.html",
@@ -364994,6 +365029,12 @@
{}
]
],
+ "custom-elements/reactions/HTMLOptGroupElement.html": [
+ [
+ "custom-elements/reactions/HTMLOptGroupElement.html",
+ {}
+ ]
+ ],
"custom-elements/reactions/HTMLOptionElement.html": [
[
"custom-elements/reactions/HTMLOptionElement.html",
@@ -365012,6 +365053,18 @@
{}
]
],
+ "custom-elements/reactions/HTMLParamElement.html": [
+ [
+ "custom-elements/reactions/HTMLParamElement.html",
+ {}
+ ]
+ ],
+ "custom-elements/reactions/HTMLProgressElement.html": [
+ [
+ "custom-elements/reactions/HTMLProgressElement.html",
+ {}
+ ]
+ ],
"custom-elements/reactions/HTMLQuoteElement.html": [
[
"custom-elements/reactions/HTMLQuoteElement.html",
@@ -383796,6 +383849,14 @@
}
]
],
+ "html/browsers/the-window-object/close-method.window.js": [
+ [
+ "html/browsers/the-window-object/close-method.window.html",
+ {
+ "script_metadata": []
+ }
+ ]
+ ],
"html/browsers/the-window-object/closed-attribute.window.js": [
[
"html/browsers/the-window-object/closed-attribute.window.html",
@@ -414528,6 +414589,12 @@
{}
]
],
+ "portals/portals-activate-inside-iframe.html": [
+ [
+ "portals/portals-activate-inside-iframe.html",
+ {}
+ ]
+ ],
"portals/portals-activate-no-browsing-context.html": [
[
"portals/portals-activate-no-browsing-context.html",
@@ -477217,8 +477284,16 @@
"589eeabe6c6e6798406759e2d40fd28be2645473",
"testharness"
],
- "IndexedDB/bindings-inject-key.html": [
- "2fbe95ec8fc41878babd2ce1705787c8c4f4aa5f",
+ "IndexedDB/bindings-inject-keys-bypass-setters.html": [
+ "91d586bde35dcfc89da49068b1a3b63295552bb1",
+ "testharness"
+ ],
+ "IndexedDB/bindings-inject-values-bypass-chain.html": [
+ "02fdb8a64ca1774ee8b3a2db40650141149dc684",
+ "testharness"
+ ],
+ "IndexedDB/bindings-inject-values-bypass-setters.html": [
+ "c16c0a4e010f9805796cd93f9cbd1f141e6c91e5",
"testharness"
],
"IndexedDB/clone-before-keypath-eval.html": [
@@ -480474,7 +480549,7 @@
"testharness"
],
"animation-worklet/playback-rate.https.html": [
- "9c975814f1ed09b3e78493df177c3c0eddf74cdd",
+ "5367497b831d87741bb4aca67d4e0efcee6389e2",
"testharness"
],
"animation-worklet/references/translated-box-ref.html": [
@@ -480542,11 +480617,11 @@
"testharness"
],
"animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html": [
- "9841c575d1d76f9601f8c229c9c527618083fd21",
+ "6f981854d38877d42b1c7b63afdb9ec989a32d42",
"reftest"
],
"animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html": [
- "2004e6df905177a6165c66647e271938f6255685",
+ "c6d7314e396e85225f245905f5afa17fb848b469",
"support"
],
"animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden.https.html": [
@@ -480554,11 +480629,11 @@
"reftest"
],
"animation-worklet/worklet-animation-with-scroll-timeline-ref.html": [
- "f30c861fb9a49b5c2691be0aa2f82297be17de41",
+ "fe92232d9afa24f78e9cc7cc3bae341ba2a471bc",
"support"
],
"animation-worklet/worklet-animation-with-scroll-timeline-root-scroller-ref.html": [
- "3b527dced72ee63fba3d5538d679b517ed583a26",
+ "5810e1738c1d5927223037e97a7a14a52c405a5e",
"support"
],
"animation-worklet/worklet-animation-with-scroll-timeline-root-scroller.https.html": [
@@ -483818,23 +483893,31 @@
"testharness"
],
"clipboard-apis/async-navigator-clipboard-basics.https.html": [
- "3c1a0af76c2674960a871f82c908b9044240f967",
+ "2d2ebf6c6c2667e1e2e465baa3dd78b657b97a7c",
"testharness"
],
+ "clipboard-apis/async-write-blobs-read-blobs-manual.https.html": [
+ "e616b5ed794bfd38dbd2199685c622e7ee01ec15",
+ "manual"
+ ],
"clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html": [
- "ea6e9369517976642cf158d3273a56f321249813",
+ "bc8511efa72c6c7db097f2a35d1b864d92359039",
"manual"
],
"clipboard-apis/async-write-blobtext-read-text-manual.https.html": [
- "ecb744a65704a2ff449391f84d6c20e1474a52d5",
+ "b1b85de65e8b3bdef5a462152946617082041d79",
+ "manual"
+ ],
+ "clipboard-apis/async-write-duplicate-mime-type-manual.https.html": [
+ "8e249fc993a810ff1bec41c4ecbccdac8c2982c4",
"manual"
],
"clipboard-apis/async-write-image-read-image-manual.https.html": [
- "a8e2956b7e14784d917a2dcf3f5b7e571b81c042",
+ "76d3d872c980447d46da093800dff8e1116b215d",
"manual"
],
"clipboard-apis/async-write-text-read-blobtext-manual.https.html": [
- "7e682f1dbdd4f02de5a00addf9be1fbdcc4ca8f0",
+ "b54fa609b655d08083bfddd382cd76bb6447392f",
"manual"
],
"clipboard-apis/async-write-text-read-text-manual.https.html": [
@@ -637493,6 +637576,10 @@
"1010aa7367cdada919acf1e22857e4404a681212",
"testharness"
],
+ "custom-elements/reactions/HTMLMeterElement.html": [
+ "a152eb0f5a00f778906751cea58a187756e685f3",
+ "testharness"
+ ],
"custom-elements/reactions/HTMLModElement.html": [
"850fe170a50d21c1a5cb5a042f05bd2fb062d3fd",
"testharness"
@@ -637501,6 +637588,10 @@
"4e53cdb0a510453960feccd2104109610f23e665",
"testharness"
],
+ "custom-elements/reactions/HTMLOptGroupElement.html": [
+ "afa31bb465f33debae79cbc0cbef4de0db382680",
+ "testharness"
+ ],
"custom-elements/reactions/HTMLOptionElement.html": [
"418ef282b32fd5e7c29f21a0a9eb17b6c4796167",
"testharness"
@@ -637513,6 +637604,14 @@
"02e669bc7a75558686dd56b4ab8fc5918892de2e",
"testharness"
],
+ "custom-elements/reactions/HTMLParamElement.html": [
+ "a3f24ddb54ed5026f093f916adb54c8508e1f6e8",
+ "testharness"
+ ],
+ "custom-elements/reactions/HTMLProgressElement.html": [
+ "1be45f8d395b9f4ab6911c04151bd3d1cb45f28a",
+ "testharness"
+ ],
"custom-elements/reactions/HTMLQuoteElement.html": [
"97ab10a170e66eba7e036321111e99dbba8bcff8",
"testharness"
@@ -637814,7 +637913,7 @@
"support"
],
"docs/_writing-tests/testdriver-tutorial.md": [
- "33c4fe31a40da2464b934e09ca711089d1f917aa",
+ "56a2abdb60d024ee6ac221bd296c5bc5a701386e",
"support"
],
"docs/_writing-tests/testdriver.md": [
@@ -640206,7 +640305,7 @@
"testharness"
],
"element-timing/cross-origin-element.sub.html": [
- "ed820d0e66558d1db01109a6c4227c960f15644b",
+ "a122819fc499bde272daf1f8ccf086d856e69a62",
"testharness"
],
"element-timing/cross-origin-iframe-element.sub.html": [
@@ -640226,7 +640325,7 @@
"testharness"
],
"element-timing/observe-child-element.html": [
- "83cc2ef94b3fe929ffd87b6c4a49f7424e6be29b",
+ "9166a4b0e6d129c356d74da2b81a6e02c08105b6",
"testharness"
],
"element-timing/observe-elementtiming.html": [
@@ -648537,6 +648636,10 @@
"a9d42e26dea16afa9743d31aa7b72f3f09e46e68",
"support"
],
+ "html/browsers/the-window-object/close-method.window.js": [
+ "0288f9cab8e1cc54eec5f51d295be771d566ff78",
+ "testharness"
+ ],
"html/browsers/the-window-object/closed-attribute.window.js": [
"88a3beba6f10b80b0b90acdc0b0f957e1a17cefc",
"testharness"
@@ -666778,7 +666881,7 @@
"support"
],
"interfaces/webxr.idl": [
- "e91a50c28ee7acbcc5e04ed9e7b929def64afee3",
+ "1bbe7efd2da4c5f17967257cb52d1c6139624ddf",
"support"
],
"interfaces/worklets.idl": [
@@ -679909,6 +680012,10 @@
"33d91e37d9d9ac77c5243a60b42ce841645d248e",
"testharness"
],
+ "portals/portals-activate-inside-iframe.html": [
+ "3c9149f485d1ac44b8d2303a4448a78ea7525243",
+ "testharness"
+ ],
"portals/portals-activate-no-browsing-context.html": [
"6eebca9f9d982ffd38a96bb72ff0173bcfb07903",
"testharness"
@@ -679973,6 +680080,10 @@
"5043a158ea74ef173f166c0580f9c1a27242bd14",
"support"
],
+ "portals/resources/portal-inside-iframe.html": [
+ "5db75d5b5fd5c12d5a77181ee1cac48f76657a57",
+ "support"
+ ],
"portals/resources/portals-rendering-portal.html": [
"1b6f23f512da5bb7d1c7b5b85e48277470d2e146",
"support"
@@ -690230,7 +690341,7 @@
"support"
],
"resources/chromium/webxr-test.js": [
- "c6c21a6fed6c05a1981b9241d233a1b501fdf3ab",
+ "8816273705806dd8efb9c33a52a61689f802ecf2",
"support"
],
"resources/chromium/webxr-test.js.headers": [
@@ -699570,7 +699681,7 @@
"testharness"
],
"svg/painting/parsing/stroke-dashoffset-valid.svg": [
- "ff913e06e4f849b5b14fac050986f697df9c81d8",
+ "f34774e68d7afa7a336ed7cbd30b44695451d74d",
"testharness"
],
"svg/painting/parsing/stroke-invalid.svg": [
@@ -699630,7 +699741,7 @@
"testharness"
],
"svg/painting/parsing/stroke-width-computed.svg": [
- "71dead0942fc2e660f6ffe239f00ef502c1a8728",
+ "0d14a6651482baff1b9168f304306b28d6edc910",
"testharness"
],
"svg/painting/parsing/stroke-width-invalid.svg": [
@@ -699638,7 +699749,7 @@
"testharness"
],
"svg/painting/parsing/stroke-width-valid.svg": [
- "02bca189f74fe91088ebe913f848b80dfc24868c",
+ "f90781284dcf54b2e864e0607ae3e880a40531e1",
"testharness"
],
"svg/painting/parsing/text-rendering-computed.svg": [
@@ -709230,11 +709341,11 @@
"testharness"
],
"web-animations/animation-model/animation-types/property-list.js": [
- "2d45574a61fcb5d44147ba78dd2b9a79c09762ac",
+ "8d9b296ff74fdd907f94da417bfce1d9021eca48",
"support"
],
"web-animations/animation-model/animation-types/property-types.js": [
- "64a7eb4762754adf693074ee1bc7780c81ffbe3e",
+ "80d3b8f77ff5589f2f4dc5ee69b4fa102786f85a",
"support"
],
"web-animations/animation-model/animation-types/visibility.html": [
diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini
index bcd187f508c..e1a609649d6 100644
--- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini
+++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini
@@ -3,6 +3,3 @@
[scroll-behavior: smooth on DIV element]
expected: FAIL
- [Instant scrolling while doing history navigation.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/custom-elements/reactions/HTMLMeterElement.html.ini b/tests/wpt/metadata/custom-elements/reactions/HTMLMeterElement.html.ini
new file mode 100644
index 00000000000..cd06c4cfd9b
--- /dev/null
+++ b/tests/wpt/metadata/custom-elements/reactions/HTMLMeterElement.html.ini
@@ -0,0 +1,37 @@
+[HTMLMeterElement.html]
+ [max on HTMLMeterElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [high on HTMLMeterElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [min on HTMLMeterElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
+ [optimum on HTMLMeterElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
+ [low on HTMLMeterElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [low on HTMLMeterElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
+ [min on HTMLMeterElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [high on HTMLMeterElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
+ [value on HTMLMeterElement must enqueue an attributeChanged reaction when adding value content attribute]
+ expected: FAIL
+
+ [value on HTMLMeterElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [max on HTMLMeterElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
+ [optimum on HTMLMeterElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/reactions/HTMLOptGroupElement.html.ini b/tests/wpt/metadata/custom-elements/reactions/HTMLOptGroupElement.html.ini
new file mode 100644
index 00000000000..0719908fa8f
--- /dev/null
+++ b/tests/wpt/metadata/custom-elements/reactions/HTMLOptGroupElement.html.ini
@@ -0,0 +1,7 @@
+[HTMLOptGroupElement.html]
+ [label on HTMLOptGroupElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [label on HTMLOptGroupElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/reactions/HTMLParamElement.html.ini b/tests/wpt/metadata/custom-elements/reactions/HTMLParamElement.html.ini
new file mode 100644
index 00000000000..88f230d70bc
--- /dev/null
+++ b/tests/wpt/metadata/custom-elements/reactions/HTMLParamElement.html.ini
@@ -0,0 +1,13 @@
+[HTMLParamElement.html]
+ [value on HTMLParamElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [value on HTMLParamElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
+ [name on HTMLParamElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [name on HTMLParamElement must enqueue an attributeChanged reaction when adding a new attribute]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/reactions/HTMLProgressElement.html.ini b/tests/wpt/metadata/custom-elements/reactions/HTMLProgressElement.html.ini
new file mode 100644
index 00000000000..19974beabaf
--- /dev/null
+++ b/tests/wpt/metadata/custom-elements/reactions/HTMLProgressElement.html.ini
@@ -0,0 +1,13 @@
+[HTMLProgressElement.html]
+ [max on HTMLProgressElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
+ [max on HTMLProgressElement must enqueue an attributeChanged reaction when adding max content attribute]
+ expected: FAIL
+
+ [value on HTMLProgressElement must enqueue an attributeChanged reaction when adding value content attribute]
+ expected: FAIL
+
+ [value on HTMLProgressElement must enqueue an attributeChanged reaction when replacing an existing attribute]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini
index 7c5a3721677..a346db99b7c 100644
--- a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini
+++ b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini
@@ -32,7 +32,7 @@
[single-byte-decoder.html?XMLHttpRequest]
- expected: TIMEOUT
+ expected: CRASH
[ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index 75eee535970..18f786d4963 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -312,9 +312,3 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
- [<iframe>: separate response Content-Type: */* text/html]
- expected: FAIL
-
- [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index f8988fcd904..87c807a49ff 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,9 +11,3 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
- [X-Content-Type-Options%3A%20'NosniFF']
- expected: FAIL
-
- [Content-Type-Options%3A%20nosniff]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
new file mode 100644
index 00000000000..51f8272a6de
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_3.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/close-method.window.js.ini b/tests/wpt/metadata/html/browsers/the-window-object/close-method.window.js.ini
new file mode 100644
index 00000000000..7af149760cd
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/the-window-object/close-method.window.js.ini
@@ -0,0 +1,7 @@
+[close-method.window.html]
+ [window.close() affects name targeting immediately]
+ expected: FAIL
+
+ [window.close() queues a task to discard, but window.closed knows immediately]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
new file mode 100644
index 00000000000..8cc42056d34
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
@@ -0,0 +1,10 @@
+[non-active-document.html]
+ [DOMParser]
+ expected: FAIL
+
+ [createHTMLDocument]
+ expected: FAIL
+
+ [<template>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
new file mode 100644
index 00000000000..9e522297c94
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
@@ -0,0 +1,7 @@
+[toggleEvent.html]
+ [Calling open twice on 'details' fires only one toggle event]
+ expected: FAIL
+
+ [Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/iframe_005.html.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/iframe_005.html.ini
deleted file mode 100644
index 6cf9d13975c..00000000000
--- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/iframe_005.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[iframe_005.html]
- [document.write external script into iframe write back into parent]
- expected: FAIL
-
diff --git a/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-key.html b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-key.html
deleted file mode 100644
index 2fbe95ec8fc..00000000000
--- a/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-key.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>IndexedDB: ES bindings - Inject a key into a value</title>
-<meta name="help" href="https://w3c.github.io/IndexedDB/#inject-key-into-value">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="support-promises.js"></script>
-<script>
-
-promise_test(async t => {
- const db = await createDatabase(t, db => {
- db.createObjectStore('store');
- });
-
- let setter_called = false;
- Object.defineProperty(Object.prototype, '10', {
- configurable: true,
- set: value => { setter_called = true; },
- });
- t.add_cleanup(() => { delete Object.prototype['10']; });
-
- const tx = db.transaction('store', 'readwrite');
- const result = await promiseForRequest(t, tx.objectStore('store').put(
- 'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']));
-
- assert_false(setter_called,
- 'Setter should not be called for key result.');
- assert_true(result.hasOwnProperty('10'),
- 'Result should have own-property overriding prototype setter.');
- assert_equals(result[10], 'key',
- 'Result should have expected property.');
-}, 'Returning keys to script should bypass prototype setters');
-
-promise_test(async t => {
- const db = await createDatabase(t, db => {
- db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'});
- });
-
- let setter_called = false;
- Object.defineProperty(Object.prototype, 'id', {
- configurable: true,
- set: value => { setter_called = true; },
- });
- t.add_cleanup(() => { delete Object.prototype['id']; });
-
- const tx = db.transaction('store', 'readwrite');
- tx.objectStore('store').put({});
- const result = await promiseForRequest(t, tx.objectStore('store').get(1));
-
- assert_false(setter_called,
- 'Setter should not be called for key result.');
- assert_true(result.hasOwnProperty('id'),
- 'Result should have own-property overriding prototype setter.');
- assert_equals(result.id, 1,
- 'Own property should match primary key generator value');
-}, 'Returning values to script should bypass prototype setters');
-
-promise_test(async t => {
- const db = await createDatabase(t, db => {
- db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.c'});
- });
-
- Object.prototype.a = {b: {c: 'on proto'}};
- t.add_cleanup(() => { delete Object.prototype.a; });
-
- const tx = db.transaction('store', 'readwrite');
- tx.objectStore('store').put({});
- const result = await promiseForRequest(t, tx.objectStore('store').get(1));
-
- assert_true(result.hasOwnProperty('a'),
- 'Result should have own-properties overriding prototype.');
- assert_true(result.a.hasOwnProperty('b'),
- 'Result should have own-properties overriding prototype.');
- assert_true(result.a.b.hasOwnProperty('c'),
- 'Result should have own-properties overriding prototype.');
- assert_equals(result.a.b.c, 1,
- 'Own property should match primary key generator value');
- assert_equals(Object.prototype.a.b.c, 'on proto',
- 'Prototype should not be modified');
-}, 'Returning values to script should bypass prototype chain');
-
-</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-keys-bypass-setters.html b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-keys-bypass-setters.html
new file mode 100644
index 00000000000..91d586bde35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-keys-bypass-setters.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>IndexedDB: ES bindings - Inject a key into a value - Keys bypass setters</title>
+<meta name="help"
+href="https://w3c.github.io/IndexedDB/#inject-key-into-value-keys-bypass-setters">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(async t => {
+ const db = await createDatabase(t, db => {
+ db.createObjectStore('store');
+ });
+
+ let setter_called = false;
+ Object.defineProperty(Object.prototype, '10', {
+ configurable: true,
+ set: value => { setter_called = true; },
+ });
+ t.add_cleanup(() => { delete Object.prototype['10']; });
+
+ const tx = db.transaction('store', 'readwrite');
+ const result = await promiseForRequest(t, tx.objectStore('store').put(
+ 'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']));
+
+ assert_false(setter_called,
+ 'Setter should not be called for key result.');
+ assert_true(result.hasOwnProperty('10'),
+ 'Result should have own-property overriding prototype setter.');
+ assert_equals(result[10], 'key',
+ 'Result should have expected property.');
+}, 'Returning keys to script should bypass prototype setters');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-chain.html b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-chain.html
new file mode 100644
index 00000000000..02fdb8a64ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-chain.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>IndexedDB: ES bindings - Inject a key into a value - Values bypass chain</title>
+<meta name="help"
+href="https://w3c.github.io/IndexedDB/#inject-key-into-value-values-bypass-chain">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(async t => {
+ const db = await createDatabase(t, db => {
+ db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.c'});
+ });
+
+ Object.prototype.a = {b: {c: 'on proto'}};
+ t.add_cleanup(() => { delete Object.prototype.a; });
+
+ const tx = db.transaction('store', 'readwrite');
+ tx.objectStore('store').put({});
+ const result = await promiseForRequest(t, tx.objectStore('store').get(1));
+
+ assert_true(result.hasOwnProperty('a'),
+ 'Result should have own-properties overriding prototype.');
+ assert_true(result.a.hasOwnProperty('b'),
+ 'Result should have own-properties overriding prototype.');
+ assert_true(result.a.b.hasOwnProperty('c'),
+ 'Result should have own-properties overriding prototype.');
+ assert_equals(result.a.b.c, 1,
+ 'Own property should match primary key generator value');
+ assert_equals(Object.prototype.a.b.c, 'on proto',
+ 'Prototype should not be modified');
+}, 'Returning values to script should bypass prototype chain');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-setters.html b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-setters.html
new file mode 100644
index 00000000000..c16c0a4e010
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/bindings-inject-values-bypass-setters.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>IndexedDB: ES bindings - Inject a key into a value - Values bypass
+ setters</title>
+<meta name="help"
+href="https://w3c.github.io/IndexedDB/#inject-key-into-value-values-bypass-setters">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(async t => {
+ const db = await createDatabase(t, db => {
+ db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'});
+ });
+
+ let setter_called = false;
+ Object.defineProperty(Object.prototype, 'id', {
+ configurable: true,
+ set: value => { setter_called = true; },
+ });
+ t.add_cleanup(() => { delete Object.prototype['id']; });
+
+ const tx = db.transaction('store', 'readwrite');
+ tx.objectStore('store').put({});
+ const result = await promiseForRequest(t, tx.objectStore('store').get(1));
+
+ assert_false(setter_called,
+ 'Setter should not be called for key result.');
+ assert_true(result.hasOwnProperty('id'),
+ 'Result should have own-property overriding prototype setter.');
+ assert_equals(result.id, 1,
+ 'Own property should match primary key generator value');
+}, 'Returning values to script should bypass prototype setters');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/animation-worklet/playback-rate.https.html b/tests/wpt/web-platform-tests/animation-worklet/playback-rate.https.html
index 9c975814f1e..5367497b831 100644
--- a/tests/wpt/web-platform-tests/animation-worklet/playback-rate.https.html
+++ b/tests/wpt/web-platform-tests/animation-worklet/playback-rate.https.html
@@ -15,126 +15,339 @@ window.assert_times_equal = (actual, expected, description) => {
</script>
<script src="/web-animations/testcommon.js"></script>
<script src="common.js"></script>
+<style>
+ .scroller {
+ overflow: auto;
+ height: 100px;
+ width: 100px;
+ }
+ .contents {
+ height: 1000px;
+ width: 100%;
+ }
+</style>
<body>
<div id="log"></div>
<script>
'use strict';
-function InstantiateWorkletAnimation(test) {
+function createWorkletAnimation(test) {
const DURATION = 10000; // ms
- const KEYFRAMES = { height : ['100px', '50px'] };
+ const KEYFRAMES = { transform: ['translateY(100px)', 'translateY(200px)'] };
return new WorkletAnimation('passthrough', new KeyframeEffect(createDiv(test),
KEYFRAMES, DURATION), document.timeline);
}
-promise_test(async t => {
- await registerPassthroughAnimator();
- const animation = InstantiateWorkletAnimation(t);
+function createScroller(test) {
+ var scroller = createDiv(test);
+ scroller.innerHTML = "<div class='contents'></div>";
+ scroller.classList.add('scroller');
+ return scroller;
+}
+
+function createScrollLinkedWorkletAnimation(test) {
+ const timeline = new ScrollTimeline({
+ scrollSource: createScroller(test),
+ timeRange: 1000
+ });
+ const DURATION = 10000; // ms
+ const KEYFRAMES = { transform: ['translateY(100px)', 'translateY(200px)'] };
+ return new WorkletAnimation('passthrough', new KeyframeEffect(createDiv(test),
+ KEYFRAMES, DURATION), timeline);
+}
+
+setup(setupAndRegisterTests, {explicit_done: true});
+
+function setupAndRegisterTests() {
+ registerPassthroughAnimator().then(() => {
+
+ promise_test(async t => {
+ const animation = createWorkletAnimation(t);
+
+ animation.playbackRate = 0.5;
+ animation.play();
+ assert_equals(animation.currentTime, 0,
+ 'Zero current time is not affected by playbackRate.');
+ }, 'Zero current time is not affected by playbackRate set while the ' +
+ 'animation is in idle state.');
+
+ promise_test(async t => {
+ const animation = createWorkletAnimation(t);
+
+ animation.play();
+ animation.playbackRate = 0.5;
+ assert_equals(animation.currentTime, 0,
+ 'Zero current time is not affected by playbackRate.');
+ }, 'Zero current time is not affected by playbackRate set while the ' +
+ 'animation is in play-pending state.');
+
+ promise_test(async t => {
+ const animation = createWorkletAnimation(t);
+ const playbackRate = 2;
- animation.playbackRate = 0.5;
- animation.play();
- assert_equals(animation.currentTime, 0,
- 'Zero current time is not affected by playbackRate.');
-}, 'Zero current time is not affected by playbackRate set while the animation is in idle state.');
+ animation.play();
-promise_test(async t => {
- await registerPassthroughAnimator();
- const animation = InstantiateWorkletAnimation(t);
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+ // Make sure the current time is not Zero.
+ await waitForDocumentTimelineAdvance();
- animation.play();
- animation.playbackRate = 0.5;
- assert_equals(animation.currentTime, 0,
- 'Zero current time is not affected by playbackRate.');
-}, 'Zero current time is not affected by playbackRate set while the animation is in play-pending state.');
+ // Set playback rate while the animation is playing.
+ const prevCurrentTime = animation.currentTime;
+ animation.playbackRate = playbackRate;
-promise_test(async t => {
- await registerPassthroughAnimator();
- const animation = InstantiateWorkletAnimation(t);
- const playbackRate = 2;
+ assert_times_equal(animation.currentTime, prevCurrentTime,
+ 'The current time should stay unaffected by setting playback rate.');
+ }, 'Non zero current time is not affected by playbackRate set while the ' +
+ 'animation is in play state.');
- animation.play();
+ promise_test(async t => {
+ const animation = createWorkletAnimation(t);
+ const playbackRate = 0.2;
- await waitForNextFrame();
+ animation.play();
- // Set playback rate while the animation is playing.
- const prevCurrentTime = animation.currentTime;
- animation.playbackRate = playbackRate;
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
- assert_times_equal(animation.currentTime, prevCurrentTime,
- 'The current time should stay unaffected by setting playback rate.');
-}, 'Non zero current time is not affected by playbackRate set while the animation is in play state.');
+ // Set playback rate while the animation is playing.
+ const prevCurrentTime = animation.currentTime;
+ const prevTimelineTime = document.timeline.currentTime;
+ animation.playbackRate = playbackRate;
-promise_test(async t => {
- await registerPassthroughAnimator();
- const animation = InstantiateWorkletAnimation(t);
- const playbackRate = 2;
+ // Play the animation some more.
+ await waitForDocumentTimelineAdvance();
- animation.play();
+ const currentTime = animation.currentTime;
+ const currentTimelineTime = document.timeline.currentTime;
- await waitForNextFrame();
+ assert_times_equal(
+ currentTime - prevCurrentTime,
+ (currentTimelineTime - prevTimelineTime) * playbackRate,
+ 'The current time should increase 0.2 times faster than timeline.');
+ }, 'The playback rate affects the rate of progress of the current time.');
- // Set playback rate while the animation is playing
- const prevCurrentTime = animation.currentTime;
- const prevTimelineTime = document.timeline.currentTime;
- animation.playbackRate = playbackRate;
+ promise_test(async t => {
+ const animation = createWorkletAnimation(t);
+ const playbackRate = 2;
- // Play the animation some more.
- await waitForNextFrame();
+ // Set playback rate while the animation is in 'idle' state.
+ animation.playbackRate = playbackRate;
+ const prevTimelineTime = document.timeline.currentTime;
+ animation.play();
- const currentTime = animation.currentTime;
- const currentTimelineTime = document.timeline.currentTime;
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+ await waitForDocumentTimelineAdvance();
- assert_times_equal(currentTime - prevCurrentTime, (currentTimelineTime - prevTimelineTime) * playbackRate,
- 'The current time should increase two times faster than timeline.');
+ const currentTime = animation.currentTime;
+ const timelineTime = document.timeline.currentTime;
+ assert_times_equal(
+ currentTime,
+ (timelineTime - prevTimelineTime) * playbackRate,
+ 'The current time should increase two times faster than timeline.');
+ }, 'The playback rate set before the animation started playing affects ' +
+ 'the rate of progress of the current time');
-}, 'The playback rate affects the rate of progress of the current time.');
+ promise_test(async t => {
+ const timing = { duration: 100,
+ easing: 'linear',
+ fill: 'none',
+ iterations: 1
+ };
+ // TODO(crbug.com/937382): Currently composited
+ // workletAnimation.currentTime and the corresponding
+ // effect.getComputedTiming().localTime are computed by main and
+ // compositing threads respectively and, as a result, don't match.
+ // To workaround this limitation we compare the output of two identical
+ // animations that only differ in playback rate. The expectation is that
+ // their output matches after taking their playback rates into
+ // consideration. This works since these two animations start at the same
+ // time on the same thread.
+ // Once the issue is fixed, this test needs to change so expected
+ // effect.getComputedTiming().localTime is compared against
+ // workletAnimation.currentTime.
+ const target = createDiv(t);
+ const targetRef = createDiv(t);
+ const keyframeEffect = new KeyframeEffect(
+ target, { opacity: [1, 0] }, timing);
+ const keyframeEffectRef = new KeyframeEffect(
+ targetRef, { opacity: [1, 0] }, timing);
+ const animation = new WorkletAnimation(
+ 'passthrough', keyframeEffect, document.timeline);
+ const animationRef = new WorkletAnimation(
+ 'passthrough', keyframeEffectRef, document.timeline);
+ const playbackRate = 2;
+ animation.playbackRate = playbackRate;
+ animation.play();
+ animationRef.play();
-promise_test(async t => {
- await registerPassthroughAnimator();
- const animation = InstantiateWorkletAnimation(t);;
- const playbackRate = 2;
+ // wait until local times are synced back to the main thread.
+ await waitForAnimationFrameWithCondition(_ => {
+ return getComputedStyle(target).opacity != '1';
+ });
- // Set playback rate while the animation is in 'idle' state.
- animation.playbackRate = playbackRate;
- animation.play();
- const prevTimelineTime = document.timeline.currentTime;
+ assert_times_equal(
+ keyframeEffect.getComputedTiming().localTime,
+ keyframeEffectRef.getComputedTiming().localTime * playbackRate,
+ 'When playback rate is set on WorkletAnimation, the underlying ' +
+ 'effect\'s timing should be properly updated.');
- await waitForNextFrame();
+ assert_approx_equals(
+ 1 - Number(getComputedStyle(target).opacity),
+ (1 - Number(getComputedStyle(targetRef).opacity)) * playbackRate,
+ 0.001,
+ 'When playback rate is set on WorkletAnimation, the underlying effect' +
+ ' should produce correct visual result.');
+ }, 'When playback rate is updated, the underlying effect is properly ' +
+ 'updated with the current time of its WorkletAnimation and produces ' +
+ 'correct visual result.');
- const currentTime = animation.currentTime;
- const timelineTime = document.timeline.currentTime;
- assert_times_equal(currentTime, (timelineTime - prevTimelineTime) * playbackRate,
- 'The current time should increase two times faster than timeline.');
-}, 'The playback rate set before the animation started playing affects the ' +
- 'rate of progress of the current time');
+ promise_test(async t => {
+ const animation = createScrollLinkedWorkletAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const timeRange = animation.timeline.timeRange;
+ scroller.scrollTop = 0.2 * maxScroll;
-promise_test(async t => {
- await registerPassthroughAnimator();
- const timing = { duration: 100,
- easing: 'linear',
- fill: 'none',
- iterations: 1
- };
- const target = createDiv(t);
- const keyframeEffect = new KeyframeEffect(target, { opacity: [0, 1] }, timing);
- const animation = new WorkletAnimation('passthrough', keyframeEffect, document.timeline);
- const playbackRate = 2;
+ animation.playbackRate = 0.5;
+ animation.play();
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+ assert_equals(animation.currentTime, 0.2 * timeRange * 0.5,
+ 'Initial current time is scaled by playbackRate.');
+ }, 'Initial current time is scaled by playbackRate set while ' +
+ 'scroll-linked animation is in idle state.');
- animation.play();
- animation.playbackRate = playbackRate;
+ promise_test(async t => {
+ const animation = createScrollLinkedWorkletAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const timeRange = animation.timeline.timeRange;
+ scroller.scrollTop = 0.2 * maxScroll;
- await waitForNextFrame();
+ animation.play();
+ animation.playbackRate = 0.5;
- assert_times_equal(keyframeEffect.getComputedTiming().localTime, animation.currentTime,
- 'When playback rate is set on WorkletAnimation, the underlying effect\'s timing should be properly updated.');
+ assert_equals(animation.currentTime, 0.2 * timeRange,
+ 'Initial current time is not affected by playbackRate.');
+ }, 'Initial current time is not affected by playbackRate set while '+
+ 'scroll-linked animation is in play-pending state.');
- assert_approx_equals(Number(getComputedStyle(target).opacity),
- animation.currentTime / 100, 0.001,
- 'When playback rate is set on WorkletAnimation, the underlying effect should produce correct visual result.');
+ promise_test(async t => {
+ const animation = createScrollLinkedWorkletAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const timeRange = animation.timeline.timeRange;
+ const playbackRate = 2;
-}, 'When playback rate is updated, the underlying effect is properly updated ' +
- 'with the current time of its WorkletAnimation and produces correct ' +
- 'visual result.');
+ animation.play();
+ scroller.scrollTop = 0.2 * maxScroll;
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+ // Set playback rate while the animation is playing.
+ animation.playbackRate = playbackRate;
+ assert_times_equal(animation.currentTime, 0.2 * timeRange,
+ 'The current time should stay unaffected by setting playback rate.');
+ }, 'The current time is not affected by playbackRate set while the ' +
+ 'scroll-linked animation is in play state.');
+ promise_test(async t => {
+ const animation = createScrollLinkedWorkletAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const playbackRate = 2;
+ const timeRange = animation.timeline.timeRange;
+
+ animation.play();
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+ scroller.scrollTop = 0.1 * maxScroll;
+
+ // Set playback rate while the animation is playing.
+ animation.playbackRate = playbackRate;
+
+ scroller.scrollTop = 0.2 * maxScroll;
+
+ assert_times_equal(
+ animation.currentTime - 0.1 * timeRange, 0.1 * timeRange * playbackRate,
+ 'The current time should increase twice faster than scroll timeline.');
+ }, 'Scroll-linked animation playback rate affects the rate of progress ' +
+ 'of the current time.');
+
+ promise_test(async t => {
+ const animation = createScrollLinkedWorkletAnimation(t);
+ const scroller = animation.timeline.scrollSource;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const timeRange = animation.timeline.timeRange;
+ const playbackRate = 2;
+
+ // Set playback rate while the animation is in 'idle' state.
+ animation.playbackRate = playbackRate;
+ animation.play();
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+ scroller.scrollTop = 0.2 * maxScroll;
+
+ assert_times_equal(animation.currentTime, 0.2 * timeRange * playbackRate,
+ 'The current time should increase two times faster than timeline.');
+ }, 'The playback rate set before scroll-linked animation started playing ' +
+ 'affects the rate of progress of the current time');
+
+ promise_test(async t => {
+ const scroller = createScroller(t);
+ const timeline = new ScrollTimeline({
+ scrollSource: scroller,
+ timeRange: 1000
+ });
+ const timing = { duration: 1000,
+ easing: 'linear',
+ fill: 'none',
+ iterations: 1
+ };
+ const target = createDiv(t);
+ const keyframeEffect = new KeyframeEffect(
+ target, { opacity: [1, 0] }, timing);
+ const animation = new WorkletAnimation(
+ 'passthrough', keyframeEffect, timeline);
+ const playbackRate = 2;
+ const maxScroll = scroller.scrollHeight - scroller.clientHeight;
+ const timeRange = timeline.timeRange;
+
+ animation.play();
+ animation.playbackRate = playbackRate;
+ await waitForAnimationFrameWithCondition(_=> {
+ return animation.playState == "running"
+ });
+
+ scroller.scrollTop = 0.2 * maxScroll;
+ // wait until local times are synced back to the main thread.
+ await waitForAnimationFrameWithCondition(_ => {
+ return getComputedStyle(target).opacity != '1';
+ });
+
+ assert_times_equal(
+ keyframeEffect.getComputedTiming().localTime,
+ 0.2 * timeRange * playbackRate,
+ 'When playback rate is set on WorkletAnimation, the underlying ' +
+ 'effect\'s timing should be properly updated.');
+ assert_approx_equals(
+ Number(getComputedStyle(target).opacity),
+ 1 - 0.2 * timeRange * playbackRate / 1000, 0.001,
+ 'When playback rate is set on WorkletAnimation, the underlying ' +
+ 'effect should produce correct visual result.');
+ }, 'When playback rate is updated, the underlying effect is properly ' +
+ 'updated with the current time of its scroll-linked WorkletAnimation ' +
+ 'and produces correct visual result.');
+ done();
+ });
+}
</script>
</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html
index 9841c575d1d..6f981854d38 100644
--- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html
+++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html
@@ -61,7 +61,10 @@
const animation = new WorkletAnimation('passthrough', effect, timeline);
animation.play();
+ // Ensure that the WorkletAnimation will have been started on the compositor.
waitForAsyncAnimationFrames(1).then(_ => {
+ // Now return the scroller to the world, which will cause it to be composited
+ // and the animation should update on the compositor side.
scroller.classList.remove('removed');
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = 0.5 * maxScroll;
diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html
index 2004e6df905..c6d7314e396 100644
--- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html
+++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html
@@ -7,6 +7,7 @@
background-color: green;
transform: translate(0, 100px);
opacity: 0.5;
+ will-change: transform; /* force compositing */
}
#covered {
@@ -19,6 +20,7 @@
overflow: hidden;
height: 100px;
width: 100px;
+ will-change: transform; /* force compositing */
}
#contents {
diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-ref.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-ref.html
index f30c861fb9a..fe92232d9af 100644
--- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-ref.html
+++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-ref.html
@@ -7,6 +7,7 @@
background-color: green;
transform: translate(0, 100px);
opacity: 0.5;
+ will-change: transform; /* force compositing */
}
#covered {
@@ -19,8 +20,7 @@
overflow: auto;
height: 100px;
width: 100px;
- /* TODO(yigu): Rewrite the test to not rely on compositing. */
- will-change: transform;
+ will-change: transform; /* force compositing */
}
#contents {
diff --git a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller-ref.html b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller-ref.html
index 3b527dced72..5810e1738c1 100644
--- a/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller-ref.html
+++ b/tests/wpt/web-platform-tests/animation-worklet/worklet-animation-with-scroll-timeline-root-scroller-ref.html
@@ -14,6 +14,7 @@
background-color: green;
transform: translate(0, 100px);
opacity: 0.5;
+ will-change: transform; /* force compositing */
}
#covered {
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html
index 3c1a0af76c2..2d2ebf6c6c2 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html
@@ -11,32 +11,25 @@ test(() => {
assert_equals(navigator.clipboard, navigator.clipboard);
}, "navigator.clipboard exists");
-/* clipboard.write(text/plain Blob) */
-
promise_test(async () => {
const blob = new Blob(["hello"], {type: 'text/plain'});
- await navigator.clipboard.write(blob);
-}, "navigator.clipboard.write(text/plain Blob) succeeds");
-
-/* clipboard.write(invalid input) */
+ await navigator.clipboard.write([blob]);
+}, "navigator.clipboard.write([text/plain Blob]) succeeds");
promise_test(async t => {
await promise_rejects(t, new TypeError(),
navigator.clipboard.write());
-}, "navigator.clipboard.write() fails (expect Blob)");
+}, "navigator.clipboard.write() fails (expect [Blob])");
promise_test(async t => {
await promise_rejects(t, new TypeError(),
navigator.clipboard.write(null));
-}, "navigator.clipboard.write(null) fails (expect Blob)");
+}, "navigator.clipboard.write(null) fails (expect [Blob])");
promise_test(async t => {
await promise_rejects(t, new TypeError(),
navigator.clipboard.write("Bad string"));
-}, "navigator.clipboard.write(DOMString) fails (expect Blob)");
-
-
-/* clipboard.writeText() */
+}, "navigator.clipboard.write(DOMString) fails (expect [Blob])");
promise_test(async () => {
await navigator.clipboard.writeText("New clipboard text");
@@ -47,27 +40,21 @@ promise_test(async t => {
navigator.clipboard.writeText());
}, "navigator.clipboard.writeText() fails (expect DOMString)");
-/* clipboard.write(image/png Blob) */
-
promise_test(async () => {
const fetched = await fetch(
'http://localhost:8001/clipboard-apis/resources/greenbox.png');
const image = await fetched.blob();
- await navigator.clipboard.write(image);
-}, "navigator.clipboard.write(image/png Blob) succeeds");
-
-/* text/plain or image/png Blob clipboard.read() */
+ await navigator.clipboard.write([image]);
+}, "navigator.clipboard.write([image/png Blob]) succeeds");
promise_test(async () => {
const result = await navigator.clipboard.read();
- assert_true(result instanceof Blob);
+ assert_true(result instanceof Array);
+ assert_true(result[0] instanceof Blob);
assert_equals(typeof result, "object");
}, "navigator.clipboard.read() succeeds");
-
-/* clipboard.readText() */
-
promise_test(async () => {
const result = await navigator.clipboard.readText();
assert_equals(typeof result, "string");
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobs-read-blobs-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobs-read-blobs-manual.https.html
new file mode 100644
index 00000000000..e616b5ed794
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobs-read-blobs-manual.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>
+ Async Clipboard write blobs -> read blobs tests
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+async function loadBlob(fileName) {
+ const fetched = await fetch(fileName);
+ return await fetched.blob();
+}
+
+promise_test(async t => {
+ const blobText = new Blob(["test text"], {type: 'text/plain'});
+ const blobImage = await loadBlob('resources/greenbox.png');
+
+ assert_equals(blobText.type, "text/plain");
+ assert_equals(blobImage.type, "image/png");
+
+ await navigator.clipboard.write([blobText, blobImage]);
+ const output = await navigator.clipboard.read();
+
+ assert_equals(output.length, 2);
+ assert_equals(output[0].type, "text/plain");
+ assert_equals(output[1].type, "image/png");
+}, "Verify write and read clipboard (multiple blobs)");
+</script>
+<p>
+ Note: This is a manual test because it writes/reads to the shared system
+ clipboard and thus cannot be run async with other tests that might interact
+ with the clipboard.
+</p>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html
index ea6e9369517..bc8511efa72 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-blobtext-manual.https.html
@@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>Async Clipboard write (text/plain Blob) -> read (text/plain Blob) tests</title>
+<title>
+ Async Clipboard write ([text/plain Blob]) -> read ([text/plain Blob]) tests
+</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
@@ -8,8 +10,10 @@ async function readWriteTest(textInput) {
promise_test(async t => {
const blobInput = new Blob([textInput], {type: 'text/plain'});
- await navigator.clipboard.write(blobInput);
- const blobOutput = await navigator.clipboard.read();
+ await navigator.clipboard.write([blobInput]);
+ const blobsOutput = await navigator.clipboard.read();
+ assert_equals(blobsOutput.length, 1);
+ const blobOutput = blobsOutput[0];
assert_equals(blobOutput.type, "text/plain");
const textOutput = await (new Response(blobOutput)).text();
@@ -17,7 +21,7 @@ async function readWriteTest(textInput) {
}, "Verify write and read clipboard given text: " + textInput);
}
-readWriteTest("Clipboard write (text/plain Blob) -> read (text/plain Blob) test");
+readWriteTest("Clipboard write ([text/plain Blob]) -> read ([text/plain Blob]) test");
readWriteTest("non-Latin1 text encoding test データ");
</script>
<p>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html
index ecb744a6570..b1b85de65e8 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-blobtext-read-text-manual.https.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>Async Clipboard write (text/plain Blob) -> readText tests</title>
+<title>Async Clipboard write ([text/plain Blob]) -> readText tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
@@ -8,14 +8,14 @@ async function readWriteTest(textInput) {
promise_test(async t => {
const blobInput = new Blob([textInput], {type: 'text/plain'});
- await navigator.clipboard.write(blobInput);
+ await navigator.clipboard.write([blobInput]);
const textOutput = await navigator.clipboard.readText();
assert_equals(textOutput, textInput);
}, "Verify write and read clipboard given text: " + textInput);
}
-readWriteTest("Clipboard write (text/plain Blob) -> read text test");
+readWriteTest("Clipboard write ([text/plain Blob]) -> read text test");
readWriteTest("non-Latin1 text encoding test データ");
</script>
<p>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-duplicate-mime-type-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-duplicate-mime-type-manual.https.html
new file mode 100644
index 00000000000..8e249fc993a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-duplicate-mime-type-manual.https.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>
+ Async Clipboard write duplicate mime type test
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+promise_test(async t => {
+ const blobText = new Blob(["test text"], {type: 'text/plain'});
+ const blobText2 = new Blob(["test text"], {type: 'text/plain'});
+
+ assert_equals(blobText.type, "text/plain");
+ assert_equals(blobText2.type, "text/plain");
+
+
+ await promise_rejects(t, 'NotAllowedError',
+ navigator.clipboard.write([blobText, blobText2]));
+}, "Verify write and read clipboard (multiple blobs)");
+</script>
+<p>
+ Note: This is a manual test because it writes/reads to the shared system
+ clipboard and thus cannot be run async with other tests that might interact
+ with the clipboard.
+</p>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-image-read-image-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-image-read-image-manual.https.html
index a8e2956b7e1..76d3d872c98 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-image-read-image-manual.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-image-read-image-manual.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>
- Async Clipboard write image/png Blob -> read image/png Blob tests
+ Async Clipboard write [image/png Blob] -> read [image/png Blob] tests
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -37,21 +37,23 @@ async function loadBlob(fileName) {
}
promise_test(async t => {
- const input = await loadBlob('resources/greenbox.png');
+ const blobInput = await loadBlob('resources/greenbox.png');
- assert_equals(input.type, "image/png");
- await navigator.clipboard.write(input);
- const output = await navigator.clipboard.read();
- assert_equals(output.type, "image/png");
+ assert_equals(blobInput.type, "image/png");
+ await navigator.clipboard.write([blobInput]);
+ const blobsOutput = await navigator.clipboard.read();
+ assert_equals(blobsOutput.length, 1);
+ const blobOutput = blobsOutput[0];
+ assert_equals(blobOutput.type, "image/png");
document.getElementById('image-on-clipboard').src =
- window.URL.createObjectURL(output);
+ window.URL.createObjectURL(blobOutput);
- const comparableInput = await getBitmapString(input);
- const comparableOutput = await getBitmapString(output);
+ const comparableInput = await getBitmapString(blobInput);
+ const comparableOutput = await getBitmapString(blobOutput);
assert_equals(comparableOutput, comparableInput);
-}, "Verify write and read clipboard (DOMString)");
+}, "Verify write and read clipboard ([image/png Blob])");
</script>
<p>
Note: This is a manual test because it writes/reads to the shared system
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html
index 7e682f1dbdd..b54fa609b65 100644
--- a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-blobtext-manual.https.html
@@ -1,13 +1,15 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>Async Clipboard writeText -> read (text/plain Blob) tests</title>
+<title>Async Clipboard writeText -> read ([text/plain Blob]) tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async function readWriteTest(textInput) {
promise_test(async t => {
await navigator.clipboard.writeText(textInput);
- const blobOutput = await navigator.clipboard.read();
+ const blobsOutput = await navigator.clipboard.read();
+ assert_equals(blobsOutput.length, 1);
+ const blobOutput = blobsOutput[0];
assert_equals(blobOutput.type, "text/plain");
const textOutput = await (new Response(blobOutput)).text();
@@ -15,7 +17,7 @@ async function readWriteTest(textInput) {
}, "Verify write and read clipboard given text: " + textInput);
}
-readWriteTest("Clipboard write text -> read (text/plain Blob) test");
+readWriteTest("Clipboard write text -> read ([text/plain Blob]) test");
readWriteTest("non-Latin1 text encoding test データ");
</script>
<p>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLMeterElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLMeterElement.html
new file mode 100644
index 00000000000..a152eb0f5a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLMeterElement.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<title>Custom Elements: CEReactions on HTMLMeterElement interface</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<meta name="assert" content="value, min, max, low, high, optimum of
+ HTMLMeterElement interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#the-meter-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+
+<body>
+<script>
+
+function getParentElement() {
+ return document.body;
+}
+
+function setAttributes(instance) {
+ instance.setAttribute('value', '0.6');
+}
+
+testReflectAttribute(
+ 'value', 'value', '0.3',
+ '0.4', 'value on HTMLMeterElement', 'meter',
+ HTMLMeterElement
+);
+testReflectAttributeWithDependentAttributes(
+ 'min', 'min', '0.1',
+ '0.2', 'min on HTMLMeterElement', 'meter',
+ getParentElement, instance => setAttributes(instance), HTMLMeterElement
+);
+testReflectAttributeWithDependentAttributes(
+ 'max', 'max', '2',
+ '3', 'max on HTMLMeterElement', 'meter',
+ getParentElement, instance => setAttributes(instance), HTMLMeterElement
+);
+testReflectAttributeWithDependentAttributes(
+ 'low', 'low', '0.1',
+ '0.2', 'low on HTMLMeterElement', 'meter',
+ getParentElement, instance => setAttributes(instance), HTMLMeterElement
+);
+testReflectAttributeWithDependentAttributes(
+ 'high', 'high', '2',
+ '3', 'high on HTMLMeterElement', 'meter',
+ getParentElement, instance => setAttributes(instance), HTMLMeterElement
+);
+testReflectAttributeWithDependentAttributes(
+ 'optimum', 'optimum', '0.3',
+ '0.4', 'optimum on HTMLMeterElement', 'meter',
+ getParentElement, instance => setAttributes(instance), HTMLMeterElement
+);
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptGroupElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptGroupElement.html
new file mode 100644
index 00000000000..afa31bb465f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptGroupElement.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>Custom Elements: CEReactions on HTMLOptGroupElement interface</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<meta name="assert" content="disabled, label of
+ HTMLOptGroupElement interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#the-optgroup-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+
+<body>
+<script>
+
+function getParentElement() {
+ let element = document.createElement('select');
+ document.body.appendChild(element);
+ return element;
+}
+
+function setAttributes(instance) {
+ instance.setAttribute('label', 'group1');
+}
+
+testReflectBooleanAttributeWithDependentAttributes(
+ 'disabled', 'disabled', 'disabled on HTMLOptGroupElement',
+ 'optgroup', getParentElement, instance => setAttributes(instance),
+ HTMLOptGroupElement
+);
+
+testReflectAttributeWithParentNode(
+ 'label', 'label', 'group1',
+ 'group2', 'label on HTMLOptGroupElement', 'optgroup',
+ getParentElement, HTMLOptGroupElement
+);
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLParamElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLParamElement.html
new file mode 100644
index 00000000000..a3f24ddb54e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLParamElement.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>Custom Elements: CEReactions on HTMLParamElement interface</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<meta name="assert" content="name, value of HTMLParamElement
+ interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#the-param-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+
+<body>
+<script>
+
+function getParentElement() {
+ let element = document.createElement('object');
+ element['type'] = 'image/png';
+ element['data'] = '/images/blue.png';
+ document.body.appendChild(element);
+ return element;
+}
+
+function setAttributes(instance, attribute, value) {
+ instance.setAttribute(attribute, value);
+}
+
+testReflectAttributeWithDependentAttributes(
+ 'name', 'name', 'image1',
+ 'image2', 'name on HTMLParamElement', 'param',
+ getParentElement, instance => setAttributes(instance, 'value', 'blue'),
+ HTMLParamElement
+);
+testReflectAttributeWithDependentAttributes(
+ 'value', 'value', 'blue1',
+ 'blue2', 'value on HTMLParamElement', 'param',
+ getParentElement, instance => setAttributes(instance, 'name', 'image'),
+ HTMLParamElement
+);
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLProgressElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLProgressElement.html
new file mode 100644
index 00000000000..1be45f8d395
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLProgressElement.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>Custom Elements: CEReactions on HTMLProgressElement interface</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<meta name="assert" content="value, max of HTMLProgressElement
+ interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#the-progress-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+
+<script>
+
+testReflectAttribute(
+ 'value', 'value', '0.15',
+ '0.2', 'value on HTMLProgressElement', 'progress',
+ HTMLProgressElement
+);
+testReflectAttribute(
+ 'max', 'max', '2',
+ '4', 'max on HTMLProgressElement', 'progress',
+ HTMLProgressElement
+);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver-tutorial.md b/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver-tutorial.md
index 33c4fe31a40..56a2abdb60d 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver-tutorial.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/testdriver-tutorial.md
@@ -239,7 +239,7 @@ class SeleniumProtocol(Protocol):
### Firefox
-We use the [set window rect](http://marionette-client.readthedocs.io/en/master/reference.html#marionette_driver.marionette.Marionette.set_window_rect) Marionette command.
+We use the [set window rect](https://firefox-source-docs.mozilla.org/python/marionette_driver.html#marionette_driver.marionette.Marionette.set_window_rect) Marionette command.
We will use [executormarionette](tools/wptrunner/wptrunner/executors/executormarionette.py) and use the Marionette Python API.
diff --git a/tests/wpt/web-platform-tests/element-timing/cross-origin-element.sub.html b/tests/wpt/web-platform-tests/element-timing/cross-origin-element.sub.html
index ed820d0e665..a122819fc49 100644
--- a/tests/wpt/web-platform-tests/element-timing/cross-origin-element.sub.html
+++ b/tests/wpt/web-platform-tests/element-timing/cross-origin-element.sub.html
@@ -1,15 +1,27 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
-<title>Element Timing: do NOT observe cross-origin images</title>
+<title>Element Timing: observe cross-origin images but without startTime</title>
<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/element-timing-helpers.js"></script>
<script>
async_test((t) => {
+ const pathname = 'http://{{domains[www]}}:{{ports[http][1]}}'
+ + '/element-timing/resources/square100.png';
const observer = new PerformanceObserver(
t.step_func_done((entryList) => {
- assert_unreached("We should not observe a cross origin element.");
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkElement(entry, pathname, 'my_image', 0);
+ assert_equals(entry.startTime, 0,
+ 'The startTime of a cross-origin image should be 0.');
+ checkRect(entry, [0, 100, 0, 100]);
})
);
observer.observe({entryTypes: ['element']});
@@ -19,15 +31,8 @@
window.onload = t.step_func(() => {
// Add a cross origin image resource.
const img = document.createElement('img');
- img.src = 'http://{{domains[www]}}:{{ports[http][1]}}'
- + '/element-timing/resources/square100.png';
+ img.src = pathname;
img.setAttribute('elementtiming', 'my_image');
- img.onload = t.step_func(() => {
- t.step_timeout( () => {
- // After some wait, assume observer did not receive the entry, so the test passes.
- t.done();
- }, 100);
- });
document.body.appendChild(img);
});
}, 'Cross-origin image element is NOT observable.');
diff --git a/tests/wpt/web-platform-tests/element-timing/observe-child-element.html b/tests/wpt/web-platform-tests/element-timing/observe-child-element.html
index 83cc2ef94b3..9166a4b0e6d 100644
--- a/tests/wpt/web-platform-tests/element-timing/observe-child-element.html
+++ b/tests/wpt/web-platform-tests/element-timing/observe-child-element.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
-<title>Element Timing: observe elements from same-origin iframes</title>
+<title>Element Timing: do NOT observe elements from same-origin iframes</title>
<body>
<style>
body {
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/close-method.window.js b/tests/wpt/web-platform-tests/html/browsers/the-window-object/close-method.window.js
new file mode 100644
index 00000000000..0288f9cab8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/close-method.window.js
@@ -0,0 +1,39 @@
+function assert_closed_opener(w, closed, opener) {
+ assert_equals(w.closed, closed);
+ assert_equals(w.opener, opener);
+}
+
+async_test(t => {
+ const openee = window.open();
+ assert_closed_opener(openee, false, self);
+ openee.onunload = t.step_func(() => {
+ assert_closed_opener(openee, true, self);
+ t.step_timeout(() => {
+ assert_closed_opener(openee, true, null);
+ t.done();
+ }, 0);
+ });
+ openee.close();
+ assert_closed_opener(openee, true, self);
+}, "window.close() queues a task to discard, but window.closed knows immediately");
+
+async_test(t => {
+ const openee = window.open("", "greatname");
+ assert_closed_opener(openee, false, self);
+ openee.close();
+ assert_closed_opener(openee, true, self);
+ const openee2 = window.open("", "greatname");
+ assert_not_equals(openee, openee2);
+ assert_closed_opener(openee, true, self); // Ensure second window.open() call was synchronous
+ openee2.onunload = t.step_func(() => {
+ assert_closed_opener(openee2, true, self);
+ t.step_timeout(() => {
+ assert_closed_opener(openee, true, null);
+ assert_closed_opener(openee2, true, null);
+ t.done();
+ }, 0);
+ });
+ openee2.close();
+ assert_closed_opener(openee, true, self); // Ensure second close() call was synchronous
+ assert_closed_opener(openee2, true, self);
+}, "window.close() affects name targeting immediately");
diff --git a/tests/wpt/web-platform-tests/interfaces/webxr.idl b/tests/wpt/web-platform-tests/interfaces/webxr.idl
index e91a50c28ee..1bbe7efd2da 100644
--- a/tests/wpt/web-platform-tests/interfaces/webxr.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webxr.idl
@@ -133,7 +133,6 @@ enum XREye {
[SecureContext, Exposed=Window] interface XRView {
readonly attribute XREye eye;
readonly attribute Float32Array projectionMatrix;
- readonly attribute Float32Array viewMatrix;
readonly attribute XRRigidTransform transform;
};
@@ -150,6 +149,8 @@ interface XRRigidTransform {
readonly attribute DOMPointReadOnly position;
readonly attribute DOMPointReadOnly orientation;
readonly attribute Float32Array matrix;
+
+ XRRigidTransform inverse();
};
[SecureContext, Exposed=Window,
@@ -200,6 +201,7 @@ dictionary XRWebGLLayerInit {
boolean depth = true;
boolean stencil = false;
boolean alpha = true;
+ boolean ignoreDepthValues = false;
double framebufferScaleFactor = 1.0;
};
@@ -214,6 +216,7 @@ interface XRWebGLLayer : XRLayer {
readonly attribute boolean depth;
readonly attribute boolean stencil;
readonly attribute boolean alpha;
+ readonly attribute boolean ignoreDepthValues;
readonly attribute WebGLFramebuffer framebuffer;
readonly attribute unsigned long framebufferWidth;
diff --git a/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html b/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html
new file mode 100644
index 00000000000..3c9149f485d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+ <script>
+ promise_test(async t => {
+ var iframe = document.createElement("iframe");
+ iframe.src = "resources/portal-inside-iframe.html"
+ var waitForLoad = new Promise((resolve, reject) => {
+ iframe.onload = resolve;
+ });
+ document.body.appendChild(iframe);
+ await waitForLoad;
+ const portal = iframe.contentDocument.getElementById("portal");
+ return promise_rejects(t, "InvalidStateError", portal.activate());
+ }, "activating portal inside iframe should fail");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/portals/resources/portal-inside-iframe.html b/tests/wpt/web-platform-tests/portals/resources/portal-inside-iframe.html
new file mode 100644
index 00000000000..5db75d5b5fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/portals/resources/portal-inside-iframe.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<body>
+ <portal id="portal" />
+</body>
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
index c6c21a6fed6..88162737058 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
@@ -328,11 +328,18 @@ class MockRuntime {
}
getEnvironmentIntegrationProvider(environmentProviderRequest) {
- let environmentProviderBinding = new mojo.AssociatedBinding(
+ this.environmentProviderBinding_ = new mojo.AssociatedBinding(
device.mojom.XREnvironmentIntegrationProvider, this,
environmentProviderRequest);
}
+ // Note that if getEnvironmentProvider hasn't finished running yet this will
+ // be undefined. It's recommended that you allow a successful task to post
+ // first before attempting to close.
+ closeEnvironmentIntegrationProvider() {
+ this.environmentProviderBinding_.close();
+ }
+
updateSessionGeometry(frame_size, display_rotation) {
// This function must exist to ensure that calls to it do not crash, but we
// do not have any use for this data at present.
@@ -429,4 +436,4 @@ class MockXRPresentationProvider {
}
}
-let XRTest = new ChromeXRTest(); \ No newline at end of file
+let XRTest = new ChromeXRTest();
diff --git a/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-dashoffset-valid.svg b/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-dashoffset-valid.svg
index ff913e06e4f..f34774e68d7 100644
--- a/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-dashoffset-valid.svg
+++ b/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-dashoffset-valid.svg
@@ -13,10 +13,10 @@
<h:script src="/css/support/parsing-testcommon.js"/>
<script><![CDATA[
-test_valid_value("stroke-dashoffset", "0");
+test_valid_value("stroke-dashoffset", "0", "0px");
test_valid_value("stroke-dashoffset", "10px");
test_valid_value("stroke-dashoffset", "-20%");
-test_valid_value("stroke-dashoffset", "30");
+test_valid_value("stroke-dashoffset", "30", "30px");
test_valid_value("stroke-dashoffset", "40Q", "40q");
test_valid_value("stroke-dashoffset", "calc(2em + 3ex)");
diff --git a/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-computed.svg b/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-computed.svg
index 71dead0942f..0d14a665148 100644
--- a/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-computed.svg
+++ b/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-computed.svg
@@ -50,9 +50,9 @@ for (let lengthUnit of lengthUnits) {
target.style.strokeWidth = length;
const ref = document.getElementById('ref');
- ref.style.wordSpacing = length;
+ ref.style.textIndent = length;
- assert_equals(getComputedStyle(target).strokeWidth, getComputedStyle(ref).wordSpacing);
+ assert_equals(getComputedStyle(target).strokeWidth, getComputedStyle(ref).textIndent);
}, 'stroke-width computes ' + lengthUnit + ' lengths');
}
diff --git a/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-valid.svg b/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-valid.svg
index 02bca189f74..f90781284dc 100644
--- a/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-valid.svg
+++ b/tests/wpt/web-platform-tests/svg/painting/parsing/stroke-width-valid.svg
@@ -13,8 +13,8 @@
<h:script src="/css/support/parsing-testcommon.js"/>
<script><![CDATA[
-test_valid_value("stroke-width", "0");
-test_valid_value("stroke-width", "10");
+test_valid_value("stroke-width", "0", "0px");
+test_valid_value("stroke-width", "10", "10px");
test_valid_value("stroke-width", "1px");
test_valid_value("stroke-width", "calc(2em + 3ex)");
test_valid_value("stroke-width", "4%");
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
index 2d45574a61f..8d9b296ff74 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
@@ -1218,7 +1218,7 @@ const gCSSProperties = {
// https://svgwg.org/svg2-draft/painting.html#StrokeDasharrayProperty
types: [
'dasharray',
- { type: 'discrete', options: [ [ 'none', '10, 20' ] ] }
+ { type: 'discrete', options: [ [ 'none', '10px, 20px' ] ] }
]
},
'stroke-dashoffset': {
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js
index 64a7eb47627..80d3b8f77ff 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js
@@ -473,14 +473,14 @@ const lengthPercentageOrCalcType = {
};
const positiveNumberType = {
- testInterpolation: (property, setup) => {
+ testInterpolation: (property, setup, expectedUnit='') => {
test(t => {
const idlName = propertyToIDL(property);
const target = createTestElement(t, setup);
const animation = target.animate({ [idlName]: [1.1, 1.5] },
{ duration: 1000, fill: 'both' });
testAnimationSamples(animation, idlName,
- [{ time: 500, expected: '1.3' }]);
+ [{ time: 500, expected: '1.3' + expectedUnit }]);
}, `${property} supports animating as a positive number`);
},
@@ -2622,7 +2622,7 @@ const rectType = {
const dasharrayType = {
testInterpolation: (property, setup) => {
percentageType.testInterpolation(property, setup);
- positiveNumberType.testInterpolation(property, setup);
+ positiveNumberType.testInterpolation(property, setup, 'px');
test(t => {
const idlName = propertyToIDL(property);
@@ -2633,7 +2633,7 @@ const dasharrayType = {
{ duration: 1000, fill: 'both' });
testAnimationSamples(
animation, idlName,
- [{ time: 500, expected: '6, 12, 8, 12, 10, 6, 10, 16, 4, 8, 14, 10' }]);
+ [{ time: 500, expected: '6px, 12px, 8px, 12px, 10px, 6px, 10px, 16px, 4px, 8px, 14px, 10px' }]);
}, `${property} supports animating as a dasharray (mismatched length)`);
test(t => {
@@ -2645,8 +2645,8 @@ const dasharrayType = {
{ duration: 1000, fill: 'both' });
testAnimationSamples(
animation, idlName,
- [{ time: 500, expected: '4, 40%, 4, 6' }]);
- }, `${property} supports animating as a dasharray (mixed number and percentage)`);
+ [{ time: 500, expected: '4px, 40%, 4px, 6px' }]);
+ }, `${property} supports animating as a dasharray (mixed lengths and percentages)`);
},
@@ -2665,7 +2665,7 @@ const dasharrayType = {
{ duration: 1000, composite });
testAnimationSamples(
animation, idlName,
- [{ time: 0, expected: '1, 2, 3, 4, 5' }]);
+ [{ time: 0, expected: '1px, 2px, 3px, 4px, 5px' }]);
}, `${property}: dasharray`);
},