diff options
author | bors-servo <servo-ops@mozilla.com> | 2020-04-03 10:45:09 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-03 10:45:09 -0400 |
commit | e23fbd25e65397a8f53812085edb5538f2d1ff44 (patch) | |
tree | 7a1bec5643f9dc01e110151636818a1acf6ecd62 | |
parent | e66ab111a6fb5ea9fc7684a0ebeddbe6aa2134f1 (diff) | |
parent | e1af489ea290c721b30c8a2f8e19107b88e0f5ab (diff) | |
download | servo-e23fbd25e65397a8f53812085edb5538f2d1ff44.tar.gz servo-e23fbd25e65397a8f53812085edb5538f2d1ff44.zip |
Auto merge of #26101 - servo-wpt-sync:wpt_update_03-04-2020, r=jdm
Sync WPT with upstream (03-04-2020)
Automated downstream sync of changes from upstream as of 03-04-2020.
[no-wpt-sync]
r? @servo-wpt-sync
141 files changed, 2808 insertions, 430 deletions
diff --git a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini index 3605e8f3fc9..76b44d9e9cf 100644 --- a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -4,7 +4,7 @@ expected: TIMEOUT [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Fetching a blob URL immediately before revoking it works in an iframe.] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini new file mode 100644 index 00000000000..f64b45fea6b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-002.html] + [Hit test float] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini b/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini new file mode 100644 index 00000000000..2f5ce8f80b3 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini @@ -0,0 +1,3 @@ +[element-replacement-on-replaced-element.tentative.html] + expected: + if os == "linux": FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-002.html.ini index d473487df51..b1fad0756d1 100644 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-002.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-002.html.ini @@ -11,3 +11,6 @@ [.flexbox, .inline-flexbox 4] expected: FAIL + [.flexbox 1] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-heights-012.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-heights-012.html.ini new file mode 100644 index 00000000000..3c67e32d98f --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-heights-012.html.ini @@ -0,0 +1,19 @@ +[percentage-heights-012.html] + [.flexbox 4] + expected: FAIL + + [.flexbox 5] + expected: FAIL + + [.flexbox 1] + expected: FAIL + + [.flexbox 2] + expected: FAIL + + [.flexbox 3] + expected: FAIL + + [.flexbox 9] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-margins-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-margins-001.html.ini new file mode 100644 index 00000000000..2527dc22c4b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-margins-001.html.ini @@ -0,0 +1,4 @@ +[percentage-margins-001.html] + [.flexbox 1] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini new file mode 100644 index 00000000000..c2f9ab54381 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini @@ -0,0 +1,4 @@ +[radiobutton-min-size.html] + [two radio button sizes are identical] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/stretch-input-in-column.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/stretch-input-in-column.html.ini new file mode 100644 index 00000000000..198674c9407 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/stretch-input-in-column.html.ini @@ -0,0 +1,2 @@ +[stretch-input-in-column.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini b/tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini new file mode 100644 index 00000000000..6a1308e92be --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini @@ -0,0 +1,2 @@ +[svg-image-orientation-aspect-ratio.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation.html.ini b/tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation.html.ini new file mode 100644 index 00000000000..9e4d35bad36 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation.html.ini @@ -0,0 +1,2 @@ +[svg-image-orientation.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-computed.html.ini b/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-computed.html.ini index 75fc7dd1634..1505e84b957 100644 --- a/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-computed.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-computed.html.ini @@ -14,3 +14,9 @@ [Property text-underline-position value 'auto'] expected: FAIL + [Property text-underline-position value 'from-font'] + expected: FAIL + + [Property text-underline-position value 'from-font left'] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-valid.html.ini b/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-valid.html.ini index 421e11a73b2..c48bf0d1909 100644 --- a/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-valid.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-valid.html.ini @@ -17,3 +17,12 @@ [e.style['text-underline-position'\] = "under" should set the property value] expected: FAIL + [e.style['text-underline-position'\] = "from-font left" should set the property value] + expected: FAIL + + [e.style['text-underline-position'\] = "from-font" should set the property value] + expected: FAIL + + [e.style['text-underline-position'\] = "right from-font" should set the property value] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini index c884dc82eab..628b1fab770 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini @@ -2,6 +2,3 @@ [listeners are called when <iframe> is resized] expected: FAIL - [listeners are called correct number of times] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-001.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-001.html.ini new file mode 100644 index 00000000000..e38782d8c85 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-001.html.ini @@ -0,0 +1,4 @@ +[elementFromPoint-001.html] + [CSSOM View - 5 - extensions to the Document interface] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini index 6ef8bb1049f..171592fc08f 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini @@ -2,6 +2,3 @@ [elementsFromPoint on the root document for points in iframe elements] expected: FAIL - [elementsFromPoint on inner documents] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397f..00000000000 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini index 278607f18fd..e3aa2c0f5fb 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini @@ -327,3 +327,12 @@ [<iframe>: combined response Content-Type: text/html */*;charset=gbk] expected: FAIL + [<iframe>: combined response Content-Type: */* text/html] + expected: FAIL + + [<iframe>: separate response Content-Type: text/html;" text/plain] + expected: FAIL + + [<iframe>: separate response Content-Type: text/html */*] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini index ef3edb78985..a63e414f43a 100644 --- a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,6 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%0C] expected: FAIL - [X-Content-Type-Options%3A%20%22nosniFF%22] + [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/fetch/origin/assorted.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/origin/assorted.window.js.ini new file mode 100644 index 00000000000..1beba7ef558 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/fetch/origin/assorted.window.js.ini @@ -0,0 +1,128 @@ +[assorted.window.html] + expected: TIMEOUT + [Origin header and POST same-origin fetch cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and POST cross-origin fetch cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and POST same-origin fetch cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and POST same-origin navigation with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and POST same-origin navigation with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and POST same-origin fetch no-cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and 308 redirect] + expected: FAIL + + [Origin header and POST same-origin fetch no-cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST cross-origin fetch no-cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and POST cross-origin fetch cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and POST cross-origin fetch no-cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST same-origin fetch no-cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST cross-origin navigation with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST cross-origin fetch no-cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and POST cross-origin fetch cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and POST cross-origin fetch no-cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST cross-origin navigation with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST navigation] + expected: TIMEOUT + + [Origin header and POST cross-origin navigation with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and POST cross-origin navigation with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST cross-origin fetch cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST same-origin fetch no-cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and POST cross-origin fetch cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST same-origin navigation with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST same-origin fetch no-cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and POST cross-origin fetch no-cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST same-origin navigation with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST same-origin fetch cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and POST same-origin navigation with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST same-origin fetch cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and POST same-origin fetch cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and POST cross-origin navigation with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + diff --git a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini new file mode 100644 index 00000000000..87b07c3e670 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini @@ -0,0 +1,4 @@ +[traverse_the_history_1.html] + [Multiple history traversals from the same task] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini deleted file mode 100644 index 51f8272a6de..00000000000 --- a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_3.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index 7a36937927c..f4f994c5d6f 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,4 +1,5 @@ [iframe_sandbox_popups_nonescaping-3.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini index 1b102217678..86a5be6e204 100644 --- a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini +++ b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini @@ -41,3 +41,6 @@ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44052 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 17995.\n\t[17995\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] expected: FAIL + [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 38772 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 15790.\n\t[15790\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 14112.\n\t[14112\]\t-9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index cabc18f2e05..004169c5c1e 100644 --- a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -71,3 +71,9 @@ [X SNR (-205.02827087155055 dB) is not greater than or equal to 85.58. Got -205.02827087155055.] expected: FAIL + [X SNR (-156.86209628697182 dB) is not greater than or equal to 85.58. Got -156.86209628697182.] + expected: FAIL + + [X Stitched sine-wave buffers at sample rate 44100 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.000090957,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[31080\]\t-1.0346872832000000e+10\t5.6332010030746460e-1\t1.0346872832563320e+10\t1.8367661347280018e+10\t9.0957000000000003e-5\n\t[31081\]\t4.5699145518560934e-41\t6.1397600173950195e-1\t6.1397600173950195e-1\t1.0000000000000000e+0\t9.0957000000000003e-5\n\tMax AbsError of 1.0346872832563320e+10 at index of 31080.\n\tMax RelError of 1.8367661347280018e+10 at index of 31080.\n] + expected: FAIL + diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index faa00f45ecf..d4f62ed7113 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -7,7 +7,7 @@ expected: FAIL [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Opening a blob URL in a noopener about:blank window immediately before revoking it works.] expected: TIMEOUT diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 780ae210e29..6c672ba3c9a 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -127768,6 +127768,32 @@ {} ] ], + "element-replacement-image-alt.html": [ + "89cd63e5c4e626ad4974fd088580132ba46fe534", + [ + null, + [ + [ + "/css/css-content/element-replacement-ref.html", + "==" + ] + ], + {} + ] + ], + "element-replacement-on-replaced-element.tentative.html": [ + "79a465541f3975c3ba8e0d9bff051aba7d3c2cff", + [ + null, + [ + [ + "/css/css-content/element-replacement-on-replaced-element-ref.html", + "==" + ] + ], + {} + ] + ], "element-replacement.html": [ "a78e9f713b2428763ed4244aae1b6269a15d6637", [ @@ -133348,6 +133374,19 @@ {} ] ], + "flexbox-flex-direction-column-percentage-ignored.html": [ + "037ef3e83f8731680c1741921904403deeaa72bd", + [ + null, + [ + [ + "/css/css-flexbox/reference/flexbox-flex-direction-column-percentage-ignored-ref.html", + "==" + ] + ], + {} + ] + ], "flexbox-flex-direction-column-reverse.htm": [ "31fe1bb9ba74345a4cf7adccae713d48452a5373", [ @@ -137055,6 +137094,19 @@ {} ] ], + "stretch-input-in-column.html": [ + "4136c45d17a6bf946a4f788d95458c04ac6c6a6d", + [ + null, + [ + [ + "/css/css-flexbox/reference/stretch-input-in-column-ref.html", + "==" + ] + ], + {} + ] + ], "stretch-obeys-min-max-001.html": [ "4b7eb5a1f76a39fdad6956953270ab9bdf8a14c1", [ @@ -145037,6 +145089,64 @@ ] } ] + ], + "svg-image-orientation-aspect-ratio.html": [ + "ee053442d0d65ad48e0ee03cd7f08a4da5b8555e", + [ + null, + [ + [ + "/css/css-images/image-orientation/reference/svg-image-orientation-aspect-ratio-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] + ], + "svg-image-orientation.html": [ + "3b8255f2d41407e634ac127adb5c6d2809231b7c", + [ + null, + [ + [ + "/css/css-images/image-orientation/reference/svg-image-orientation-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 10, + 10 + ], + [ + 100, + 100 + ] + ] + ] + ] + } + ] ] }, "image-set": { @@ -151650,6 +151760,19 @@ {} ] ], + "multicol-overflow-clip.html": [ + "af59ff92d4f740ee71c6e3e1378704dd6a1ebe86", + [ + null, + [ + [ + "/css/css-multicol/multicol-overflow-clip-ref.html", + "==" + ] + ], + {} + ] + ], "multicol-overflowing-001.xht": [ "c4130df72992d4acacab2b81d0f2ce8b4f3c145b", [ @@ -166588,7 +166711,7 @@ ] ], "line-breaking-009.html": [ - "9111e15983887cd57ad7fbd9c9aa2c468ca63a95", + "c5e4a55b46fa1f44fa2918c1e050392ae87ec761", [ null, [ @@ -166601,7 +166724,7 @@ ] ], "line-breaking-010.html": [ - "b74646d718e0b8e43537491cb57fd0693444c2fd", + "2d735cdf6dd005d88f5e32f43ac6a5b288c64e90", [ null, [ @@ -166614,7 +166737,7 @@ ] ], "line-breaking-011.html": [ - "65a537ee50147b253746b0a165fa9020e9cba7e5", + "1a3c4f00768a3020db3133487a371a06784a571b", [ null, [ @@ -166861,7 +166984,7 @@ ] ], "line-breaking-ic-001.html": [ - "6cfe6f86a452c19eae31a076710f02dfc8c4ec4e", + "5d34a05692ae4ea2f3e1d0ecb2c2f7f644e9593f", [ null, [ @@ -166874,7 +166997,7 @@ ] ], "line-breaking-ic-002.html": [ - "dc8851e5cf2f860e07cbaaa01fb9ac3b19ca85f9", + "83f1a200eb7818e238eedce7dd9166e1d586b6b4", [ null, [ @@ -166887,7 +167010,7 @@ ] ], "line-breaking-ic-003.html": [ - "09dc11dd1d2b9a325b131c5033a4cc20f6450711", + "8ba5e004116bb1123f58ff618b565f3fc91ded0c", [ null, [ @@ -175684,7 +175807,7 @@ ] ], "text-decoration-style-multiple.html": [ - "567229f6e570c9bc76528b76aef592e1b6e24c35", + "8068e8ee37496549471cf118a904ae43f4d69d75", [ null, [ @@ -175697,7 +175820,7 @@ ] ], "text-decoration-style-recalc.html": [ - "d4538e7c7b45356d08cf5dc90273b6aee77c49fa", + "299d5c9eddbf0869b5c5d7180ef54be0536c22ab", [ null, [ @@ -186296,19 +186419,6 @@ {} ] ], - "appearance-button-bevel-001.html": [ - "03748528154acc19f6d9dc8fb00ee8423a2c60bf", - [ - null, - [ - [ - "/css/css-ui/appearance-auto-ref.html", - "==" - ] - ], - {} - ] - ], "appearance-checkbox-001.html": [ "54ebef94f24cd207f1e7a3f40f45cc825698df1c", [ @@ -187051,7 +187161,7 @@ ] ], "outline-023.html": [ - "5b50c84d939f77d24984d5693e7d0d7cc3d7ea02", + "a6f35351cec0e9902ed28c4dd55de7c4859b1802", [ null, [ @@ -187570,19 +187680,6 @@ {} ] ], - "webkit-appearance-button-bevel-001.html": [ - "3c860f23ae12ca204a2c76d7e181cb12c4de63c5", - [ - null, - [ - [ - "/css/css-ui/appearance-auto-ref.html", - "==" - ] - ], - {} - ] - ], "webkit-appearance-checkbox-001.html": [ "09dd3d76cd66d59522b02d1b6a0c0126bb5eda2a", [ @@ -284034,6 +284131,10 @@ "ef8a6f3953c239733026c92541789ca5b942178b", [] ], + "element-replacement-on-replaced-element-ref.html": [ + "a13d0fdb4b6f0d566cf6a46f187e67da033cbaa0", + [] + ], "element-replacement-ref.html": [ "d301f1d6a1b047daff753ff2fcb28d626e2f70dd", [] @@ -285447,6 +285548,10 @@ "0d14362a371ba90dafb26ce8028784a521aee011", [] ], + "flexbox-flex-direction-column-percentage-ignored-ref.html": [ + "812b6797eeadf69ff1b60e6073523871649b96db", + [] + ], "flexbox-flex-direction-ref.htm": [ "d95339e8575bf7ae4efdc2d0b6c02c9bf5dc029c", [] @@ -285519,6 +285624,10 @@ "4943f537f747e6bf10c4e6c91ad8ae1fb58b72c6", [] ], + "stretch-input-in-column-ref.html": [ + "85d2a49e3ec6576dd3d0599c13e56ec453000606", + [] + ], "stretching-orthogonal-flows-ref.html": [ "3a3efaad5dd9abc98f1da0c37ddb33f6aba45594", [] @@ -293477,6 +293586,14 @@ "image-orientation-none-ref.html": [ "c4d140f1533b0aa31a7bcee6884f9b5f0fd206f5", [] + ], + "svg-image-orientation-aspect-ratio-ref.html": [ + "728bfb202f22da7d155536d8d0e2fb88869cc384", + [] + ], + "svg-image-orientation-ref.html": [ + "345d6698fcf376051a0ffe33cd6c5496b4b362c8", + [] ] }, "support": { @@ -294806,6 +294923,10 @@ "58f1d57bc39beed37d14eea0dc9c1cbc47c33717", [] ], + "multicol-overflow-clip-ref.html": [ + "c061a1d6114572c307d058f545e4828e4910250a", + [] + ], "multicol-overflowing-001-ref.xht": [ "d3a6c6e03c58c17f0dfa4f2e6d9b945e352216af", [] @@ -318010,7 +318131,7 @@ [] ], "report.py": [ - "1f628ca878d6bcaf8f32e2c6ed524e6f0eeda4ca", + "dd1a047c72a155997eaf019f4bdb13002d219574", [] ], "reporting-empty-frame.html": [ @@ -327500,7 +327621,7 @@ [] ], "cssom.idl": [ - "dc9b78fda6180dba6b7958c3429a77e0fb5048b2", + "f102510db4792b726ef853d140565486e21d0e87", [] ], "dom.idl": [ @@ -327588,7 +327709,7 @@ [] ], "intersection-observer.idl": [ - "133622e508c7f2f223e5584b33e47af219282d8b", + "46fad3522ed2539d04a688cc4f5d05c8e76ef24f", [] ], "js-self-profiling.idl": [ @@ -329943,7 +330064,7 @@ [] ], "tests2d.yaml": [ - "1d2e1210ed180903ab40a6bbf205ca076d65835d", + "846dc8b3eedc80171b4ea103b936eaa863b81d6c", [] ] } @@ -334862,7 +334983,7 @@ [] ], "fetch-event-handled-worker.js": [ - "4af58e20d05c902d74511579e6b74894731d1239", + "0dc6de005dba08cda134aa657e56191362cf28a8", [] ], "fetch-event-network-error-controllee-iframe.html": [ @@ -345600,7 +345721,7 @@ }, "support": { "__init__.py": [ - "e5e43c4e655170d57d3de7a85d4ebb639c31aee0", + "fda74ce835cd108fb6deb6ffa2ff74430dc0577f", [] ], "asserts.py": [ @@ -346155,6 +346276,22 @@ [] ] }, + "third_party": { + "README.md": [ + "56a2295dd103db76836d17fa513f56d09891c586", + [] + ], + "sdp": { + "LICENSE": [ + "09502ec0a1d874095c2017b5d80b9d2ff8decf00", + [] + ], + "sdp.js": [ + "d2a28706115bc5d3519f2cb0717967783ce52fab", + [] + ] + } + }, "tools": { ".eslintrc.js": [ "09f9c60c9835f4ef1f041e5710a4afc12b3f64f3", @@ -346194,6 +346331,18 @@ [] ] }, + "webrtc-insertable-streams": { + "resources": { + "blank.html": [ + "a3c3a4689a62b45b1e429f6b7a94690e556a1259", + [] + ], + "serviceworker-failure.js": [ + "e7aa8e11be396cc32eda592ae9618391ad6fee40", + [] + ] + } + }, "webrtc-quic": { "META.yml": [ "740c8d2fe84beafbcb7f98cef29aff2378721132", @@ -367788,7 +367937,7 @@ ] ], "inactive-timeline.https.html": [ - "bdd46f9abc0c8702931965f981b9beab2792380f", + "a7167d4391bddfc31d9a32e294a927b1240ebdb4", [ null, {} @@ -381544,7 +381693,7 @@ ] ], "change-column-flex-width.html": [ - "bea59bc2444758c778bad914d3c18c4f2eb1cf7c", + "8dc370ac9d3e0da7837d10250a868c177c78af38", [ null, {} @@ -381662,6 +381811,13 @@ {} ] ], + "flex-minimum-size-002.html": [ + "41a8cd705d0c3bbd970f923b0b1dbfdbcff2de57", + [ + null, + {} + ] + ], "flex-minimum-width-flex-items-014.html": [ "080169b52d7fdf39cbf6ff970c3100480e46d2a3", [ @@ -381690,6 +381846,13 @@ {} ] ], + "flexbox-lines-must-be-stretched-by-default.html": [ + "f705a3882b456244e6b916898ab1342a3cce5207", + [ + null, + {} + ] + ], "flexbox_first-letter.html": [ "dbbb03d524e165de213fe66dbe6598ece5c94b07", [ @@ -381698,7 +381861,7 @@ ] ], "flexbox_width-change-and-relayout-children.html": [ - "a5f086d181454d67c5123cc0f9ff0525d21fa72c", + "06342679b62777213483442128b6429290f091d1", [ null, {} @@ -382590,6 +382753,20 @@ {} ] ], + "percentage-heights-012.html": [ + "63f63aa8ec91b441ebae0754153260cc7b8d6d37", + [ + null, + {} + ] + ], + "percentage-margins-001.html": [ + "b98bfa1af875b6961b4819fa0e7f82a24fcf783d", + [ + null, + {} + ] + ], "percentage-padding-001.html": [ "8bba5d60f5cae1b93df70c1973a473f163020a51", [ @@ -382632,6 +382809,20 @@ {} ] ], + "radiobutton-min-size.html": [ + "5703861bf7333b765c3edce6627db5f64e741626", + [ + null, + {} + ] + ], + "relayout-align-items.html": [ + "0569d5143981259400bac7f5998e56338e617ef1", + [ + null, + {} + ] + ], "shrinking-column-flexbox.html": [ "680dc7eb7f36e508437fab444660d58d03f00bfe", [ @@ -394230,21 +394421,21 @@ ] ], "text-underline-position-computed.html": [ - "9019a58fa4830ae5541b3882bf42f385504d0bd4", + "a1bf54b068bc848a9e253500f692eeff692f4e61", [ null, {} ] ], "text-underline-position-invalid.html": [ - "5feea8ed531de3de31b0692603ae48c065056819", + "d3d0fe8838b15c25e341cb4622c34e6cf85ffb84", [ null, {} ] ], "text-underline-position-valid.html": [ - "fa05448f09e40f34de18ac6896d81269c1103dfa", + "ee238f075e5474604e89dcc55cf40cf4361a822e", [ null, {} @@ -395275,7 +395466,7 @@ ] ], "transition-background-position-with-edge-offset.html": [ - "b6aa43ead266ae289aa566d17651c5a07161057e", + "4ac115e17d7389c3deaee099a2db17a6b80f7883", [ null, {} @@ -395338,7 +395529,7 @@ ] ], "transitioncancel-001.html": [ - "457689476735f871a9d800363615a01051cd45ed", + "6546195259fd9d1870942402fa80d1cb0ff13ea4", [ null, { @@ -397853,7 +398044,7 @@ ] ], "inheritance.html": [ - "6315316d8224b7c2f3d4f575e2e48d9527a22223", + "c2aab07a23b9502353c7c3bbe798963442c651fe", [ null, {} @@ -397973,7 +398164,7 @@ ] ], "outline-offset-computed.html": [ - "feb7732df35583849fb5fce78e02c8afce0de376", + "3ba35217ce1905b2e99f1a3055b169e46d4a9af3", [ null, {} @@ -401357,7 +401548,7 @@ ] ], "DOMPoint-001.html": [ - "e3d8d1d3ba5a945227d7bc3d6687bfec9293fec4", + "945f4674dea7b81c744229ab8668c5a936540165", [ null, {} @@ -401371,7 +401562,7 @@ ] ], "DOMQuad-001.html": [ - "42cb29fa95a0bb37119ce6faf35b7e726fbce629", + "6fa765bbabce7c07111855acbe06ba45bd1343d9", [ null, {} @@ -403465,7 +403656,7 @@ ] ], "Event-dispatch-redispatch.html": [ - "b4584fb72008d421a4e024c27af996c9a8f9e221", + "893f57f07703c069e20cf52d96ed1e568f400d9f", [ null, { @@ -423685,7 +423876,7 @@ }, "origin": { "assorted.window.js": [ - "cc37dbd8ed990c60a0e9347f0f25336f2c9f70d3", + "fc6dd1a02870e29f43531821a8958b59ed6cfc1d", [ "fetch/origin/assorted.window.html", { @@ -427123,7 +427314,7 @@ ] ], "cache-storage-reporting-dedicated-worker.https.html": [ - "9493a64b39c71a255f90c7d93c1a526d80afdebd", + "c9c2a9ac715658dc8c7a1d5f66bf0e8d93912aa4", [ null, { @@ -427173,7 +427364,7 @@ ] ], "dedicated-worker-cache-storage.https.html": [ - "dced705206fd02ede82ef4c3ed29bbd8f5f1ea2c", + "2c97e6f87540ac603300c0b85050f81316f9fa19", [ null, {} @@ -461477,112 +461668,112 @@ ] ], "2d.text.measure.actualBoundingBox.html": [ - "9b2e5eaeed34454fc77cd35a137db69a957620c6", + "8c3606be19d563c816e590e7346f8df611442863", [ null, {} ] ], "2d.text.measure.actualBoundingBox.worker.js": [ - "de9370c7d5fa225cf88f085c383a316da61ab9b8", + "4b4d859dc30ea5111335bdae491a9e6c205b34ac", [ "offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.html", {} ] ], "2d.text.measure.advances.html": [ - "aa26e529d8bc8186f113885ac6bb7a651af140a5", + "2c35113c47f934b7f1648d4b0e402130e450d2b7", [ null, {} ] ], "2d.text.measure.advances.worker.js": [ - "85fcd38089569215da97b616ed2271669865de17", + "bc111e2c3219d556c24d5a16dc665811b7257a01", [ "offscreen-canvas/text/2d.text.measure.advances.worker.html", {} ] ], "2d.text.measure.baselines.html": [ - "a09e9508a7c8e4338715fbd7f2b51f5542f90f36", + "2d27995407f34f00cefc2e53423fd5733c3dc242", [ null, {} ] ], "2d.text.measure.baselines.worker.js": [ - "8dbaa3b01c93e517cf5c958486e8d056aa987889", + "902e9d69549de8278c1219ec0551a99864b947e8", [ "offscreen-canvas/text/2d.text.measure.baselines.worker.html", {} ] ], "2d.text.measure.emHeights.html": [ - "cadbce72bae4b8a972c374e6145a49cc0a8616b8", + "aadf53d7aee4e7a92d21783a4a4792e285911106", [ null, {} ] ], "2d.text.measure.emHeights.worker.js": [ - "db217e190af4c66acf9d4e17eed1300e08f2bd9a", + "86a79b5fd2709dbfcddce63c5851401a2a776e00", [ "offscreen-canvas/text/2d.text.measure.emHeights.worker.html", {} ] ], "2d.text.measure.fontBoundingBox.html": [ - "b1075b015a10a8037f532fc1afd2a1b8bbd0684e", + "c5d50acfe52129f52ba60b29c15ac0753f14d6a2", [ null, {} ] ], "2d.text.measure.fontBoundingBox.worker.js": [ - "de97ef641f1d8e959a53f44baf4dea66cb064bca", + "e3d8d88892f878902a8e365978b2e8ff82981c45", [ "offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.html", {} ] ], "2d.text.measure.width.basic.html": [ - "c7edb163d311e1dd4d245b2f37023c24374690a3", + "678a059e37288cf8f3d027b1c1156456d2fa8dcc", [ null, {} ] ], "2d.text.measure.width.basic.worker.js": [ - "11b36c082b1ec7a1e68f7d4e2262a2aeb5e302c6", + "3e1454fc87e746552863a26eaaf5761a24134458", [ "offscreen-canvas/text/2d.text.measure.width.basic.worker.html", {} ] ], "2d.text.measure.width.empty.html": [ - "b1044623b2441842c151f44a5171f3e53e27d773", + "304d6b2248e8aedc0b30c6f15bbbec96cc4c9559", [ null, {} ] ], "2d.text.measure.width.empty.worker.js": [ - "124353c5afc1d5e273a23e3ddd13d67929ef5b4d", + "7dd1677b96497bfeacb2c81d74d628af6c0f2ea0", [ "offscreen-canvas/text/2d.text.measure.width.empty.worker.html", {} ] ], "2d.text.measure.width.space.html": [ - "b3cb2fc4420d69692effc54b19e788391e9e28ef", + "b452fc98b6b567dd7ee4a286d3bbce99cddc076e", [ null, {} ] ], "2d.text.measure.width.space.worker.js": [ - "a1232dd4f79d29380b0cf93a0cc08bffde00e352", + "3d78110f7e636cdeb02dc75d3f35d1410fd4c0c2", [ "offscreen-canvas/text/2d.text.measure.width.space.worker.html", {} @@ -477982,7 +478173,7 @@ ] ], "constructor.html": [ - "5d13035f6a1f527c2467f5768908e6b27eda6995", + "7cb7013c00685aa07f2a5a4acee22365a5d08293", [ null, {} @@ -477996,21 +478187,21 @@ ] ], "current-time-root-scroller.html": [ - "8e600e6ef05e17e0b1d93ce3fa12f6dbe8fe50c6", + "e0c42f010d931c7bbe632f3725eeaae432ab1163", [ null, {} ] ], "current-time-writing-modes.html": [ - "243f152ec7128015e8400c4240fdebc0b1971fdf", + "5a53d43f037f9bda10f25e906af98518d554e084", [ null, {} ] ], "current-time.html": [ - "cb710aa089010e3e1f57a4cc39ed59eccb207b0c", + "18913bb9b042c6d0e5c52fcf168ba25648dea944", [ null, {} @@ -478035,35 +478226,35 @@ ] ], "scroll-animation.html": [ - "711314789b12a892b0ef342c35abec89c0da3b53", + "521c64d328d114a1bcefb361d0a5f63c5a01c578", [ null, {} ] ], "scroll-timeline-invalidation.html": [ - "143943c4236725ab08a2d460f090f7b82c2e30db", + "7ab59a140be40ef53c26ec5f9aee46721d6292c8", [ null, {} ] ], "scroll-timeline-phases.tentative.html": [ - "48ca749d24d5725acaea0981cada6383f0b3a45b", + "ec59a12d91a1cb674507b593f537d81ce9653621", [ null, {} ] ], "setting-current-time.html": [ - "069a7cc149eaa69234580345854e1560804d5c1a", + "0b7dcc60034d16207b9e88f8da34bddeb044b23d", [ null, {} ] ], "setting-playback-rate.html": [ - "a5fdf09b01e791f2a9de44f22c46d63bdb004fb4", + "0575464337fdc909fefcdd4af4d68b230d448ac4", [ null, {} @@ -479486,7 +479677,7 @@ ] ], "fetch-event-handled.https.html": [ - "2d6f6c86d876daf40ea8f41be01bca2c549bcc41", + "89f3d79a681a22cfd6889b3c0603f7388d460472", [ null, {} @@ -491165,6 +491356,13 @@ {} ] ], + "default-policy-callback-arguments.tentative.https.html": [ + "5944b0e92d67117a8140430dc96028cc3d8ab8ce", + [ + null, + {} + ] + ], "default-policy-report-only.tentative.https.html": [ "1cff751a80194bfaef6095617a89a423b76e70b2", [ @@ -491367,6 +491565,13 @@ } ] ], + "trusted-types-svg-script.tentative.https.html": [ + "330efc0c0ac8cc316019367c298e14fdc0439af6", + [ + null, + {} + ] + ], "tt-block-eval.tentative.https.html": [ "13178bd44bf17f06c6d6d46433dcad273367a364", [ @@ -500432,7 +500637,7 @@ ] ], "createcredential-passing.https.html": [ - "a94be363da20214ac84950b2bb701d428372dd10", + "30fef13bbdc9efb5659460652054d119399ce819", [ null, { @@ -500482,7 +500687,7 @@ ] ], "getcredential-extensions.https.html": [ - "820f9b529f16e5644d3d288f406db6e71a72cf34", + "af03086ee048567c32338636560ff2d76351892b", [ null, { @@ -502039,7 +502244,7 @@ ] ], "RTCPeerConnection-removeTrack.https.html": [ - "9e61ef785edf7f672b9161b14c86ee8b1cd16501", + "83095c085a8b20512b5173b2d36c9842122fc4cc", [ null, {} @@ -502420,7 +502625,7 @@ ] ], "idlharness.https.window.js": [ - "93341278ac628f7ecc514283f01ad6d9ad90bc28", + "ae18cc6353831a8c18928f1e68e6a80ac400bb0d", [ "webrtc/idlharness.https.window.html", { @@ -502436,8 +502641,13 @@ [ "script", "./RTCPeerConnection-helper.js" + ], + [ + "timeout", + "long" ] - ] + ], + "timeout": "long" } ] ], @@ -502667,6 +502877,22 @@ ] ] }, + "webrtc-insertable-streams": { + "RTCEncodedAudioFrame-serviceworker-failure.https.html": [ + "fda89f36dcb52668e28d8c017112f6efb1f169a8", + [ + null, + {} + ] + ], + "RTCEncodedVideoFrame-serviceworker-failure.https.html": [ + "93b9a6a0f36098e3d20762adc9e1d30b61fc7b15", + [ + null, + {} + ] + ] + }, "webrtc-quic": { "RTCQuicStream.https.html": [ "e99914ad40387316e82ed32ed4626888f1011e43", diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini new file mode 100644 index 00000000000..f64b45fea6b --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini @@ -0,0 +1,4 @@ +[hit-test-floats-002.html] + [Hit test float] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-flexbox/flex-minimum-size-002.html.ini b/tests/wpt/metadata/css/css-flexbox/flex-minimum-size-002.html.ini new file mode 100644 index 00000000000..d1e789aaf5a --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/flex-minimum-size-002.html.ini @@ -0,0 +1,4 @@ +[flex-minimum-size-002.html] + [.flexbox 1] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-heights-012.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-heights-012.html.ini new file mode 100644 index 00000000000..3c67e32d98f --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/percentage-heights-012.html.ini @@ -0,0 +1,19 @@ +[percentage-heights-012.html] + [.flexbox 4] + expected: FAIL + + [.flexbox 5] + expected: FAIL + + [.flexbox 1] + expected: FAIL + + [.flexbox 2] + expected: FAIL + + [.flexbox 3] + expected: FAIL + + [.flexbox 9] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-margins-001.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-margins-001.html.ini new file mode 100644 index 00000000000..2527dc22c4b --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/percentage-margins-001.html.ini @@ -0,0 +1,4 @@ +[percentage-margins-001.html] + [.flexbox 1] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-flexbox/radiobutton-min-size.html.ini b/tests/wpt/metadata/css/css-flexbox/radiobutton-min-size.html.ini new file mode 100644 index 00000000000..c2f9ab54381 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/radiobutton-min-size.html.ini @@ -0,0 +1,4 @@ +[radiobutton-min-size.html] + [two radio button sizes are identical] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-flexbox/stretch-input-in-column.html.ini b/tests/wpt/metadata/css/css-flexbox/stretch-input-in-column.html.ini new file mode 100644 index 00000000000..198674c9407 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/stretch-input-in-column.html.ini @@ -0,0 +1,2 @@ +[stretch-input-in-column.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini new file mode 100644 index 00000000000..6a1308e92be --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini @@ -0,0 +1,2 @@ +[svg-image-orientation-aspect-ratio.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation.html.ini new file mode 100644 index 00000000000..9e4d35bad36 --- /dev/null +++ b/tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation.html.ini @@ -0,0 +1,2 @@ +[svg-image-orientation.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-computed.html.ini b/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-computed.html.ini index 9bb540564a3..237e4e4ee57 100644 --- a/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-computed.html.ini +++ b/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-computed.html.ini @@ -29,3 +29,9 @@ [Property text-underline-position value 'auto'] expected: FAIL + [Property text-underline-position value 'from-font'] + expected: FAIL + + [Property text-underline-position value 'from-font left'] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-valid.html.ini b/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-valid.html.ini index 421e11a73b2..c48bf0d1909 100644 --- a/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-valid.html.ini +++ b/tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-valid.html.ini @@ -17,3 +17,12 @@ [e.style['text-underline-position'\] = "under" should set the property value] expected: FAIL + [e.style['text-underline-position'\] = "from-font left" should set the property value] + expected: FAIL + + [e.style['text-underline-position'\] = "from-font" should set the property value] + expected: FAIL + + [e.style['text-underline-position'\] = "right from-font" should set the property value] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini index c884dc82eab..628b1fab770 100644 --- a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini +++ b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini @@ -2,6 +2,3 @@ [listeners are called when <iframe> is resized] expected: FAIL - [listeners are called correct number of times] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini new file mode 100644 index 00000000000..e38782d8c85 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini @@ -0,0 +1,4 @@ +[elementFromPoint-001.html] + [CSSOM View - 5 - extensions to the Document interface] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini index 6ef8bb1049f..171592fc08f 100644 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini @@ -2,6 +2,3 @@ [elementsFromPoint on the root document for points in iframe elements] expected: FAIL - [elementsFromPoint on inner documents] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397f..00000000000 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - 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 6cf7e8e25e3..81b31a1596f 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -327,3 +327,12 @@ [<iframe>: combined response Content-Type: text/html */*;charset=gbk] expected: FAIL + [<iframe>: combined response Content-Type: */* text/html] + expected: FAIL + + [<iframe>: separate response Content-Type: text/html;" text/plain] + expected: FAIL + + [<iframe>: separate response Content-Type: text/html */*] + 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 58de838d890..61682d248e2 100644 --- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini +++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini @@ -11,6 +11,6 @@ [X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!] expected: FAIL - [X-Content-Type-Options%3A%20%22nosniFF%22] + [X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff] expected: FAIL diff --git a/tests/wpt/metadata/fetch/origin/assorted.window.js.ini b/tests/wpt/metadata/fetch/origin/assorted.window.js.ini index 185f7f93787..df3c82a4219 100644 --- a/tests/wpt/metadata/fetch/origin/assorted.window.js.ini +++ b/tests/wpt/metadata/fetch/origin/assorted.window.js.ini @@ -96,3 +96,33 @@ [Origin header and POST cross-origin navigation with Referrer-Policy no-referrer-when-downgrade] expected: NOTRUN + [Origin header and GET same-origin fetch cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy no-referrer-when-downgrade] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and GET same-origin fetch cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy unsafe-url] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy same-origin] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy no-referrer] + expected: NOTRUN + + [Origin header and GET cross-origin fetch cors mode with Referrer-Policy origin-when-cross-origin] + expected: NOTRUN + diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini new file mode 100644 index 00000000000..87b07c3e670 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini @@ -0,0 +1,4 @@ +[traverse_the_history_1.html] + [Multiple history traversals from the same task] + 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 deleted file mode 100644 index 51f8272a6de..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_3.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index dc856a3d5a3..e440b1e38c6 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,5 +1,6 @@ [iframe_sandbox_popups_nonescaping-3.html] type: testharness + expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: FAIL + expected: NOTRUN diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini index 343e45156a9..a012bab4355 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini @@ -110,3 +110,6 @@ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44052 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 17995.\n\t[17995\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 12348.\n\t[12348\]\t9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] expected: FAIL + [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 38772 more errors.\n\tMax AbsError of 1.9986916780471802e+0 at index of 15790.\n\t[15790\]\t9.9994289875030518e-1\t-9.9874877929687500e-1\t1.9986916780471802e+0\t2.0011956154322119e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 14112.\n\t[14112\]\t-9.5105654001235962e-1\t0.0000000000000000e+0\t9.5105654001235962e-1\tInfinity\t3.0517578125000000e-5\n] + expected: FAIL + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index 78f64aa06cc..059fadbd2df 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -302,3 +302,9 @@ [X SNR (-205.02827087155055 dB) is not greater than or equal to 85.58. Got -205.02827087155055.] expected: FAIL + [X SNR (-156.86209628697182 dB) is not greater than or equal to 85.58. Got -156.86209628697182.] + expected: FAIL + + [X Stitched sine-wave buffers at sample rate 44100 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.000090957,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[31080\]\t-1.0346872832000000e+10\t5.6332010030746460e-1\t1.0346872832563320e+10\t1.8367661347280018e+10\t9.0957000000000003e-5\n\t[31081\]\t4.5699145518560934e-41\t6.1397600173950195e-1\t6.1397600173950195e-1\t1.0000000000000000e+0\t9.0957000000000003e-5\n\tMax AbsError of 1.0346872832563320e+10 at index of 31080.\n\tMax RelError of 1.8367661347280018e+10 at index of 31080.\n] + expected: FAIL + diff --git a/tests/wpt/web-platform-tests/animation-worklet/inactive-timeline.https.html b/tests/wpt/web-platform-tests/animation-worklet/inactive-timeline.https.html index bdd46f9abc0..a7167d4391b 100644 --- a/tests/wpt/web-platform-tests/animation-worklet/inactive-timeline.https.html +++ b/tests/wpt/web-platform-tests/animation-worklet/inactive-timeline.https.html @@ -95,8 +95,10 @@ function setupAndRegisterTests() { 'timeline is inactive.'); // Make the timeline active. - scroller.style.display = "" - scroller.scrollTop; + scroller.style.display = ""; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal(animation.currentTime, 200, 'Current time must be initialized.'); @@ -114,7 +116,7 @@ function setupAndRegisterTests() { // Make the timeline inactive again. scroller.style.display = "none" - scroller.scrollTop; + await waitForNextFrame(); assert_times_equal(animation.currentTime, 200, 'Current time must be the previous current time.'); @@ -122,7 +124,6 @@ function setupAndRegisterTests() { 'Initial start time must be unresolved.'); scrollerRef.scrollTop = 0.6 * maxScroll; - scrollerRef.scrollTop; // Wait until local times are synced back to the main thread. await waitForAnimationFrameWithCondition(_ => { return animationRef.effect.getComputedTiming().localTime == 600; diff --git a/tests/wpt/web-platform-tests/css/css-content/element-replacement-image-alt.html b/tests/wpt/web-platform-tests/css/css-content/element-replacement-image-alt.html new file mode 100644 index 00000000000..89cd63e5c4e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-content/element-replacement-image-alt.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title>Content CSS property on img with alt and no src is honored</title> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="match" href="element-replacement-ref.html" /> +<link rel="help" href="https://drafts.csswg.org/css-content-3/#content-property"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1625805"> +<style> + img { + content: url('resources/rect.svg'); + } +</style> +<img alt="Something"> diff --git a/tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element-ref.html b/tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element-ref.html new file mode 100644 index 00000000000..a13d0fdb4b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element-ref.html @@ -0,0 +1,3 @@ +<!doctype html> +<title>CSS Test Reference</title> +<video poster="/images/blue.png" style="object-fit: cover; content: url(/images/yellow.png)" width=100 height=100></video> diff --git a/tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element.tentative.html b/tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element.tentative.html new file mode 100644 index 00000000000..79a465541f3 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element.tentative.html @@ -0,0 +1,8 @@ +<!doctype html> +<title>content: url() works (or not) consistently on replaced elements</title> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="help" href="https://drafts.csswg.org/css-content-3/#content-property"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2831"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1625805#c6"> +<link rel="match" href="element-replacement-on-replaced-element-ref.html"> +<img src="/images/blue.png" style="content: url(/images/yellow.png)" width=100 height=100> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/change-column-flex-width.html b/tests/wpt/web-platform-tests/css/css-flexbox/change-column-flex-width.html index bea59bc2444..8dc370ac9d3 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/change-column-flex-width.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/change-column-flex-width.html @@ -8,6 +8,15 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/check-layout-th.js"></script> +<script> +function change() { + document.body.offsetTop; + var flex = document.getElementById("flex"); + flex.style.width = "100px"; + checkLayout("#container"); +} +</script> +<body onload="change()"> <p>There should be a green square below. No red.</p> <!-- #container is just here to make sure the test fails more reliably visually if the bug is present. --> <div id="container" style="width:500px;"> @@ -18,9 +27,4 @@ </div> </div> </div> -<script> - document.body.offsetTop; - var flex = document.getElementById("flex"); - flex.style.width = "100px"; - checkLayout("#container"); -</script> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-size-002.html b/tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-size-002.html new file mode 100644 index 00000000000..41a8cd705d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-size-002.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>CSS Flexbox: min-size when the child has a percentage min-size</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-main-item"> +<meta name="assert" content="This test ensures that min-size can not be negative when the child has a percentage min-size."> +<link href="support/flexbox.css" rel="stylesheet"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<body onload="checkLayout('.flexbox')"> +<div id=log></div> + +<div class="flexbox column" style="max-height: 0; overflow: hidden; line-height: 13px;" data-expected-height="0"> + <div style="min-height: 100%;" data-expected-height="0">This is a flex item.</div> + <div style="flex: none;" data-expected-height="13">Inflexible</div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flexbox-flex-direction-column-percentage-ignored.html b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox-flex-direction-column-percentage-ignored.html new file mode 100644 index 00000000000..037ef3e83f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox-flex-direction-column-percentage-ignored.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>CSS Flexbox: height of a child of a flexbox with flex-direction: column</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes"> +<link rel="bookmark" href="https://crbug.com/404337"> +<link rel="match" href="reference/flexbox-flex-direction-column-percentage-ignored-ref.html"> +<meta name="assert" content="This test ensures that the percentage height of child of a flexbox with 'flex-direction: column' and no explicit height but with max-height set should be treated as 'auto'."> +<link href="support/flexbox.css" rel="stylesheet"> +<style> +.flexbox { + max-height: 10px; + overflow: hidden; +} +</style> + +<div class="flexbox column"> + <div style="height: 1%"> + The height here should be ignored. + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flexbox-lines-must-be-stretched-by-default.html b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox-lines-must-be-stretched-by-default.html new file mode 100644 index 00000000000..f705a3882b4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox-lines-must-be-stretched-by-default.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<title>CSS Flexbox: align-content initial value.</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#align-content-property"> +<meta name="assert" content="This test ensures that a flexbox container's align-content value default to 'stretch'."/> +<style> +.flex-container { + display: flex; + height: 100px; + width: 200px; + background-color: pink; + flex-wrap: wrap; +} +.flex-item1 { + width: 100%; + background-color: blue; + border: 1px solid; + border-color: red; +} +.flex-item2 { + width: 100%; + background-color: blue; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<body onload="checkLayout('.flex-container')"> + <div id="flexContainer" class="flex-container"> + <div id="flexItem1" class="flex-item1" data-expected-height=51></div> + <div id="flexItem2" class="flex-item2" data-expected-height=49></div> + </div> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_width-change-and-relayout-children.html b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_width-change-and-relayout-children.html index a5f086d1814..06342679b62 100644 --- a/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_width-change-and-relayout-children.html +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_width-change-and-relayout-children.html @@ -20,21 +20,23 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/check-layout-th.js"></script> +<script> +function change() { + var container = document.getElementById('container'); + container.offsetWidth; + container.style.width = "200px"; + checkLayout("#container"); +} +</script> </head> -<body> +<body onload="change()"> <div id=log></div> <div id="container" style="width: 100px" data-expected-width="200"> -<div class="flexbox column" data-expected-width="200"> + <div class="flexbox column" data-expected-width="200"> <div class="flexitem" data-expected-width="200"> - <div class="child" data-expected-width="200">This div should be 200px wide.</div> + <div class="child" data-expected-width="200">This div should be 200px wide.</div> </div> + </div> </div> -</div> -<script> -var container = document.getElementById('container'); -container.offsetWidth; -container.style.width = "200px"; -checkLayout("#container"); -</script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/percentage-heights-012.html b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-heights-012.html new file mode 100644 index 00000000000..63f63aa8ec9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-heights-012.html @@ -0,0 +1,82 @@ +<!DOCTYPE html> +<title>CSS Flexbox: percentages in flex items</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes"> +<link rel="help" href="https://crbug.com/341310"> +<meta name="assert" content="This test ensures that percentages are resolved in flex items."> +<link href="support/flexbox.css" rel="stylesheet"> +<style> +.horizontal { + height: 50px; + background-color: purple; + position: relative; +} +.vertical { + width: 50px; + height: 10px; + background-color: purple; + position: relative; + writing-mode: vertical-rl; +} +.flex-one { + background-color: red; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script> +function changeHeight() +{ + document.getElementById('dynamicHorizontalChild').style.height = "90%"; + document.getElementById('dynamicVerticalChild').style.width = "30%"; + checkLayout('.flexbox'); +} +</script> +<body onload="changeHeight()"> +<div class="flexbox horizontal"> + <div data-expected-height="50" class="flex-one"> + <div data-expected-height="35" style="height: 70%; background-color: lime"></div> + </div> +</div> +<div class="flexbox horizontal"> + <div data-expected-height="50" class="flex-one"> + <div id="dynamicHorizontalChild" data-expected-height="45" style="height: 70%; background-color: lime"></div> + </div> +</div> +<div class="flexbox horizontal"> + <div data-expected-height="50" class="flex-one" style="padding: 10px; border: 2px solid black"> + <div data-expected-height="18" style="height: 70%; background-color: lime"></div> + </div> +</div> +<div class="flexbox horizontal"> + <img data-expected-height="25" style="max-height: 50%" src="support/10x10-green.png" /> +</div> +<div class="flexbox horizontal"> + <div data-expected-height="25" class="flex-one" style="max-height:50%"> + <div data-expected-height="13" style="height: 50%; background-color: lime"></div> + </div> +</div> +<div class="flexbox vertical"> + <div data-expected-width="50" class="flex-one"> + <div data-expected-width="25" style="width: 50%; background-color: lime"></div> + </div> +</div> +<div class="flexbox vertical"> + <div data-expected-width="50" class="flex-one"> + <div id="dynamicVerticalChild" data-expected-width="15" style="width: 50%; background-color: lime"></div> + </div> +</div> +<div class="flexbox vertical"> + <div data-expected-width="50" class="flex-one" style="padding: 10px; border: 2px solid black"> + <div data-expected-width="13" style="width: 50%; background-color: lime"></div> + </div> +</div> +<div class="flexbox vertical"> + <img data-expected-width="25" style="max-width: 50%" src="support/10x10-green.png" /> +</div> +<div class="flexbox vertical"> + <div data-expected-width="25" class="flex-one" style="max-width: 50%"> + <div data-expected-width="13" style="width: 50%; background-color: lime"></div> + </div> +</div> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/percentage-margins-001.html b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-margins-001.html new file mode 100644 index 00000000000..b98bfa1af87 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-margins-001.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>CSS Flexbox: percent margins with flex child</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-containers"> +<link rel="help" href="https://drafts.csswg.org/css2/box.html#margin-properties"> +<link rel="help" href="https://bugs.webkit.org/show_bug.cgi?id=93411"> +<meta name="assert" content="This test ensures that percent margins always are computed with respect to the containing block's width even when there is flex on any child."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<body onload="checkLayout('.flexbox')"> +<div id=log></div> + +<div class="flexbox" style="display:flex; flex-direction: column; background-color: salmon; height: 300px; width: 400px;"> + <div style="margin: 10%; background-color: orange; height: 5px; flex: 1" data-expected-width=320 data-expected-height=135></div> + <div style="margin: 10%; background-color: orange; height: 5px;" data-expected-width=320 data-expected-height=5></div> +</div> + +<div class="flexbox" style="display:flex; background-color: salmon; height: 300px; width: 400px;"> + <div style="margin: 10%; background-color: orange; height: 5px; flex: 1 5px" data-expected-width=235 data-expected-height=5></div> + <div style="margin: 10%; background-color: orange; height: 5px; width: 5px" data-expected-width=5 data-expected-height=5></div> +</div> + +<div class="flexbox" style="display:flex; background-color: salmon; height: 300px; width: 400px; padding: 100px;"> + <div style="margin: 10%; background-color: orange; height: 5px; flex: 1 5px" data-expected-width=235 data-expected-height=5></div> + <div style="margin: 10%; background-color: orange; height: 5px; width: 5px" data-expected-width=5 data-expected-height=5></div> +</div> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/radiobutton-min-size.html b/tests/wpt/web-platform-tests/css/css-flexbox/radiobutton-min-size.html new file mode 100644 index 00000000000..5703861bf73 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/radiobutton-min-size.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<title>CSS Flexbox: minimum size of the radio button</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-property"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto"> +<meta name="assert" content="This test ensures that radio buttons used as flex items do not shrink below their default sizes."> +<style> +.flex { + display: flex; + width: 500px; +} + +.wide { + width: 600px; + flex: none; +} +</style> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<p>You should see two identical-looking lines, both with a radio button at the +beginning.</p> + +<div class="flex"> + <input type="radio" id="check"> + <div class="wide">Text</div> +</div> + +<div> + <input type="radio" style="vertical-align: top;" id="ref"><span>Text</span> +</div> + +<script> +var ref = document.getElementById("ref"); +var check = document.getElementById("check"); + +test(function() { + assert_equals(ref.offsetWidth, check.offsetWidth, "width should be equal"); + assert_equals(ref.offsetHeight, check.offsetHeight, + "height should be equal"); +}, "two radio button sizes are identical"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/reference/flexbox-flex-direction-column-percentage-ignored-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/reference/flexbox-flex-direction-column-percentage-ignored-ref.html new file mode 100644 index 00000000000..812b6797eea --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/reference/flexbox-flex-direction-column-percentage-ignored-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> +<style> +.flexbox { + max-height: 10px; + overflow: hidden; +} +</style> + +<body> + +<div class="flexbox"> + <div> + The height here should be ignored. + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/reference/stretch-input-in-column-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox/reference/stretch-input-in-column-ref.html new file mode 100644 index 00000000000..85d2a49e3ec --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/reference/stretch-input-in-column-ref.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> +<link href="../support/flexbox.css" rel="stylesheet"> +<style> +.flexbox { + background-color: grey; +} +.flexbox > * { + flex: 1; +} +</style> +<body> +<p>This test passes if none of the form controls overflow.</p> +<div class="flexbox"> + <input> +</div> +<div class="flexbox"> + <textarea></textarea> +</div> +<div class="flexbox"> + <input type="button"> +</div> +<div class="flexbox"> + <select></select> +</div> +<div class="flexbox"> + <legend style="border: 2px solid black">legend</legend> +</div> +<div class="flexbox"> + <div type="border: 4px solid black; padding: 10px;"> +</div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/relayout-align-items.html b/tests/wpt/web-platform-tests/css/css-flexbox/relayout-align-items.html new file mode 100644 index 00000000000..0569d514398 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/relayout-align-items.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> +<head> +<title>CSS Flexbox: Relayout align flex items</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-property"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#align-items-property"> +<meta name="assert" content="This test ensures that align items work properly after changing existing values with 'flex-end' and 'stretch'."> +<link href="support/flexbox.css" rel="stylesheet"> +<style> +.flexbox { + height: 100px; + position: relative; +} +.flexbox > div { + border: 5px solid green; + width: 50px; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +</head> +<body> +<div id=log></div> +<div id="from-stretch" class="flexbox"> + <div data-expected-height="10" data-offset-y="90"></div> + <div data-expected-height="10" data-offset-y="90" class="align-self-auto"></div> + <div data-expected-height="10" data-offset-y="0" class="align-self-flex-start"></div> + <div data-expected-height="10" data-offset-y="90" class="align-self-flex-end"></div> + <div data-expected-height="10" data-offset-y="45" class="align-self-center"></div> + <div data-expected-height="10" data-offset-y="0" class="align-self-baseline"></div> + <div data-expected-height="100" data-offset-y="0" class="align-self-stretch"></div> +</div> + +<div id="to-stretch" class="flexbox align-items-flex-start"> + <div data-expected-height="100" data-offset-y="0"></div> + <div data-expected-height="100" data-offset-y="0" class="align-self-auto"></div> + <div data-expected-height="10" data-offset-y="0" class="align-self-flex-start"></div> + <div data-expected-height="10" data-offset-y="90" class="align-self-flex-end"></div> + <div data-expected-height="10" data-offset-y="45" class="align-self-center"></div> + <div data-expected-height="10" data-offset-y="0" class="align-self-baseline"></div> + <div data-expected-height="100" data-offset-y="0" class="align-self-stretch"></div> +</div> +<script> +document.body.offsetLeft; +document.getElementById("from-stretch").style.alignItems = "flex-end"; +document.getElementById("to-stretch").style.alignItems = "stretch"; +checkLayout(".flexbox"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/stretch-input-in-column.html b/tests/wpt/web-platform-tests/css/css-flexbox/stretch-input-in-column.html new file mode 100644 index 00000000000..4136c45d17a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/stretch-input-in-column.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<title>CSS Flexbox: Stretch input form controls in flexbox column</title> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-property"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#align-items-property"> +<link rel="match" href="reference/stretch-input-in-column-ref.html"> +<link href="support/flexbox.css" rel="stylesheet"> +<meta name="assert" content="This test ensures that input form controls that are stretched in +a column flexbox should not overflow the flexbox."> +<style> +.flexbox { + background-color: grey; +} +</style> +<body> +<p>This test passes if none of the form controls overflow.</p> +<div class="flexbox column"> + <input> +</div> +<div class="flexbox column align-content-flex-start"> + <textarea class="align-self-stretch"></textarea> +</div> +<div class="flexbox column wrap"> + <input type="button"> +</div> +<div class="flexbox column"> + <select></select> +</div> +<div class="flexbox column"> + <legend style="border: 2px solid black">legend</legend> +</div> +<div class="flexbox column wrap"> + <div type="border: 4px solid black; padding: 10px;"> +</div> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-aspect-ratio-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-aspect-ratio-ref.html new file mode 100644 index 00000000000..728bfb202f2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-aspect-ratio-ref.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: svg image respects orientation</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +</head> +<body style="margin:0"> + <svg style="width: 600px; height: 600px"> + <image xlink:href="../support/exif-orientation-2-ur-pre-rotated.jpg" x="0" y="0" width="150" height="150" preserveAspectRatio="xMinYMin meet"></image> + <image xlink:href="../support/exif-orientation-8-llo-pre-rotated.jpg" x="200" y="0" width="150" height="150" preserveAspectRatio="xMidYMin meet"></image> + <image xlink:href="../support/exif-orientation-2-ur-pre-rotated.jpg" x="400" y="0" width="150" height="150" preserveAspectRatio="xMaxYMin meet"></image> + <image xlink:href="../support/exif-orientation-8-llo-pre-rotated.jpg" x="0" y="150" width="150" height="150" preserveAspectRatio="xMinYMid slice"></image> + <image xlink:href="../support/exif-orientation-2-ur-pre-rotated.jpg" x="200" y="150" width="150" height="150" preserveAspectRatio="xMidYMid slice"></image> + <image xlink:href="../support/exif-orientation-8-llo-pre-rotated.jpg" x="400" y="150" width="150" height="150" preserveAspectRatio="xMaxYMid slice"></image> + <image xlink:href="../support/exif-orientation-8-llo-pre-rotated.jpg" x="0" y="300" width="150" height="150" preserveAspectRatio="xMinYMax meet"></image> + <image xlink:href="../support/exif-orientation-2-ur-pre-rotated.jpg" x="200" y="300" width="150" height="150" preserveAspectRatio="xMidYMax meet"></image> + <image xlink:href="../support/exif-orientation-8-llo-pre-rotated.jpg" x="400" y="300" width="150" height="150" preserveAspectRatio="xMaxYMax meet"></image> + <image xlink:href="../support/exif-orientation-2-ur-pre-rotated.jpg" x="0" y="450" width="150" height="150" preserveAspectRatio="none"></image> + <image xlink:href="../support/exif-orientation-8-llo-pre-rotated.jpg" x="200" y="450" width="150" height="150" preserveAspectRatio="none"></image> + </svg> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-ref.html new file mode 100644 index 00000000000..345d6698fcf --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-ref.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: svg image respects orientation</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +</head> +<body> + <svg style="width: 500px; height: 650px"> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg" X="0" Y="0"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg" X="125" Y="0"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg" X="250" Y="0"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg" X="375" Y="0"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg" X="0" Y="125"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg" X="125" Y="125"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg" X="250" Y="125"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg" X="375" Y="125"></image> + <image xlink:href="../../../css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg" X="0" Y="250"></image> + </svg> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html new file mode 100644 index 00000000000..ee053442d0d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: svg image respects orientation and preserveAspectRatio</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/svg-image-orientation-aspect-ratio-ref.html"> +<meta name=fuzzy content="10;100"> +</head> +<body style="margin:0"> + <svg style="width: 600px; height: 600px"> + <image xlink:href="support/exif-orientation-2-ur.jpg" x="0" y="0" width="150" height="150" preserveAspectRatio="xMinYMin meet"></image> + <image xlink:href="support/exif-orientation-8-llo.jpg" x="200" y="0" width="150" height="150" preserveAspectRatio="xMidYMin meet"></image> + <image xlink:href="support/exif-orientation-2-ur.jpg" x="400" y="0" width="150" height="150" preserveAspectRatio="xMaxYMin meet"></image> + <image xlink:href="support/exif-orientation-8-llo.jpg" x="0" y="150" width="150" height="150" preserveAspectRatio="xMinYMid slice"></image> + <image xlink:href="support/exif-orientation-2-ur.jpg" x="200" y="150" width="150" height="150" preserveAspectRatio="xMidYMid slice"></image> + <image xlink:href="support/exif-orientation-8-llo.jpg" x="400" y="150" width="150" height="150" preserveAspectRatio="xMaxYMid slice"></image> + <image xlink:href="support/exif-orientation-8-llo.jpg" x="0" y="300" width="150" height="150" preserveAspectRatio="xMinYMax meet"></image> + <image xlink:href="support/exif-orientation-2-ur.jpg" x="200" y="300" width="150" height="150" preserveAspectRatio="xMidYMax meet"></image> + <image xlink:href="support/exif-orientation-8-llo.jpg" x="400" y="300" width="150" height="150" preserveAspectRatio="xMaxYMax meet"></image> + <image xlink:href="support/exif-orientation-2-ur.jpg" x="0" y="450" width="150" height="150" preserveAspectRatio="none"></image> + <image xlink:href="support/exif-orientation-8-llo.jpg" x="200" y="450" width="150" height="150" preserveAspectRatio="none"></image> + </svg> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation.html new file mode 100644 index 00000000000..3b8255f2d41 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: svg image respects orientation</title> +<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation"> +<link rel="match" href="reference/svg-image-orientation-ref.html"> +<meta name=fuzzy content="10;100"> +</head> +<body> + <svg style="width: 500px; height: 650px"> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-1-ul.jpg" X="0" Y="0"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-2-ur.jpg" X="125" Y="0"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-3-lr.jpg" X="250" Y="0"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-4-lol.jpg" X="375" Y="0"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-5-lu.jpg" X="0" Y="125"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-6-ru.jpg" X="125" Y="125"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-7-rl.jpg" X="250" Y="125"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-8-llo.jpg" X="375" Y="125"></image> + <image xlink:href="../../css/css-images/image-orientation/support/exif-orientation-9-u.jpg" X="0" Y="250"></image> + </svg> +</body> +</html>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip-ref.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip-ref.html new file mode 100644 index 00000000000..c061a1d6114 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip-ref.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<style> +.multicol { + column-count: 3; +} +.parent { + background: green; + height: 50px; +} +</style> +<div class="multicol"> + <div class="parent"></div> + <div class="parent"></div> + <div class="parent"></div> +</div> + diff --git a/tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip.html b/tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip.html new file mode 100644 index 00000000000..af59ff92d4f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<title>CSS Multi-column Layout Test: multicol with overflow-clipped content</title> +<link rel="help" href="https://www.w3.org/TR/css-multicol-1/"> +<link rel="match" href="multicol-overflow-clip-ref.html"> +<meta name="assert" content="Overflow clip should work under multicol."> +<style> +.multicol { + column-count: 3; +} +.parent { + background: green; + height: 50px; + overflow: hidden; +} +.child2 { + margin-top: 50px; + background: darkred; + color: red; + height: 100px; +} +</style> +<div class="multicol"> + <div class="parent"> + <div class="child2">This should be hidden.</div> + </div> + <div class="parent"> + <div class="child2">This should be hidden.</div> + </div> + <div class="parent"> + <div class="child2">This should be hidden.</div> + </div> +</div> + diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-computed.html b/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-computed.html index 9019a58fa48..a1bf54b068b 100644 --- a/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-computed.html +++ b/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-computed.html @@ -15,9 +15,11 @@ test_computed_value("text-underline-position", "auto"); test_computed_value("text-underline-position", "under"); +test_computed_value("text-underline-position", "from-font"); test_computed_value("text-underline-position", "left"); test_computed_value("text-underline-position", "right"); test_computed_value("text-underline-position", "under left"); +test_computed_value("text-underline-position", "from-font left"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-invalid.html b/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-invalid.html index 5feea8ed531..d3d0fe8838b 100644 --- a/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-invalid.html +++ b/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-invalid.html @@ -8,7 +8,9 @@ <script src="/css/support/parsing-testcommon.js"></script> <script> test_invalid_value("text-underline-position", "auto under"); +test_invalid_value("text-underline-position", "auto from-font"); test_invalid_value("text-underline-position", "left auto"); test_invalid_value("text-underline-position", "left right"); test_invalid_value("text-underline-position", "right under left"); +test_invalid_value("text-underline-position", "under from-font"); </script> diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-valid.html b/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-valid.html index fa05448f09e..ee238f075e5 100644 --- a/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-valid.html +++ b/tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-valid.html @@ -10,8 +10,11 @@ test_valid_value("text-underline-position", "auto"); test_valid_value("text-underline-position", "under"); +test_valid_value("text-underline-position", "from-font"); test_valid_value("text-underline-position", "left"); test_valid_value("text-underline-position", "right"); test_valid_value("text-underline-position", "under left"); +test_valid_value("text-underline-position", "from-font left"); test_valid_value("text-underline-position", "right under", "under right"); +test_valid_value("text-underline-position", "right from-font", "from-font right"); </script> diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-multiple.html b/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-multiple.html index 567229f6e57..8068e8ee374 100644 --- a/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-multiple.html +++ b/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-multiple.html @@ -1,5 +1,5 @@ <!doctype html> -<link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-decoration-style"> +<link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-decoration-style-property"> <link rel="match" href="reference/text-decoration-style-multiple-ref.html"> <style> div { diff --git a/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-recalc.html b/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-recalc.html index d4538e7c7b4..299d5c9eddb 100644 --- a/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-recalc.html +++ b/tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-recalc.html @@ -1,5 +1,5 @@ <!doctype html> -<link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-decoration-style"> +<link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#text-decoration-style-property"> <link rel="match" href="reference/text-decoration-style-recalc-ref.html"> <style> div { diff --git a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-009.html b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-009.html index 9111e159838..c5e4a55b46f 100644 --- a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-009.html +++ b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-009.html @@ -2,7 +2,7 @@ <html> <meta charset="utf-8"> <title>CSS Text — line breaking at element boundary</title> -<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking."> +<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the white-space property on nearest common ancestor of the two characters controls breaking."> <link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details"> <link rel=match href="reference/line-breaking-001-ref.html"> <link rel=author title="Florian Rivoal" href="http://florian.rivoal.net"> diff --git a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-010.html b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-010.html index b74646d718e..2d735cdf6dd 100644 --- a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-010.html +++ b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-010.html @@ -2,7 +2,7 @@ <html> <meta charset="utf-8"> <title>CSS Text — line breaking at element boundary 2</title> -<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking."> +<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the white-space property on nearest common ancestor of the two characters controls breaking."> <link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details"> <link rel=match href="reference/line-breaking-001-ref.html"> <link rel=author title="Florian Rivoal" href="http://florian.rivoal.net"> diff --git a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-011.html b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-011.html index 65a537ee501..1a3c4f00768 100644 --- a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-011.html +++ b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-011.html @@ -2,7 +2,7 @@ <html> <meta charset="utf-8"> <title>CSS Text — line breaking at element boundary 3</title> -<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking."> +<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the white-space property on nearest common ancestor of the two characters controls breaking."> <link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details"> <link rel=match href="reference/line-breaking-001-ref.html"> <link rel=author title="Florian Rivoal" href="http://florian.rivoal.net"> diff --git a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-001.html b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-001.html index 6cfe6f86a45..5d34a05692a 100644 --- a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-001.html +++ b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-001.html @@ -2,7 +2,7 @@ <html> <meta charset="utf-8"> <title>CSS Text — line breaking at element boundary with ideographic caracters 1</title> -<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking."> +<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the white-space property on nearest common ancestor of the two characters controls breaking."> <link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details"> <link rel=match href="reference/line-breaking-ic-001-ref.html"> <link rel=author title="Florian Rivoal" href="http://florian.rivoal.net"> diff --git a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-002.html b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-002.html index dc8851e5cf2..83f1a200eb7 100644 --- a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-002.html +++ b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-002.html @@ -2,7 +2,7 @@ <html> <meta charset="utf-8"> <title>CSS Text — line breaking at element boundary with ideographic caracters 2</title> -<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking."> +<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the white-space property on nearest common ancestor of the two characters controls breaking."> <link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details"> <link rel=match href="reference/line-breaking-ic-001-ref.html"> <link rel=author title="Florian Rivoal" href="http://florian.rivoal.net"> diff --git a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-003.html b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-003.html index 09dc11dd1d2..8ba5e004116 100644 --- a/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-003.html +++ b/tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-003.html @@ -2,7 +2,7 @@ <html> <meta charset="utf-8"> <title>CSS Text — line breaking at element boundary with ideographic caracters 1</title> -<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking."> +<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the white-space property on nearest common ancestor of the two characters controls breaking."> <link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details"> <link rel=match href="reference/line-breaking-ic-001-ref.html"> <link rel=author title="Florian Rivoal" href="http://florian.rivoal.net"> diff --git a/tests/wpt/web-platform-tests/css/css-transitions/transition-background-position-with-edge-offset.html b/tests/wpt/web-platform-tests/css/css-transitions/transition-background-position-with-edge-offset.html index b6aa43ead26..4ac115e17d7 100644 --- a/tests/wpt/web-platform-tests/css/css-transitions/transition-background-position-with-edge-offset.html +++ b/tests/wpt/web-platform-tests/css/css-transitions/transition-background-position-with-edge-offset.html @@ -3,7 +3,7 @@ <title>CSS Transitions Test: transition-property - background-position</title> <link rel="author" title="Zhuoyu Qian" href="mailto:zhuoyu.qian@samsung.com"> <link rel="help" href="https://drafts.csswg.org/web-animations-1/#animation-type"> -<link rel="help" href="https://www.w3.org/TR/CSS1/#background-position"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-position"> <meta name="assert" content="Test checks that the 'background-position' property with edge offset is animatable."> <script src="/resources/testharness.js" type="text/javascript"></script> <script src="/resources/testharnessreport.js" type="text/javascript"></script> diff --git a/tests/wpt/web-platform-tests/css/css-transitions/transitioncancel-001.html b/tests/wpt/web-platform-tests/css/css-transitions/transitioncancel-001.html index 45768947673..6546195259f 100644 --- a/tests/wpt/web-platform-tests/css/css-transitions/transitioncancel-001.html +++ b/tests/wpt/web-platform-tests/css/css-transitions/transitioncancel-001.html @@ -5,7 +5,7 @@ <title>CSS Transitions Test: display:none causes transitioncancel</title> <meta name="timeout" content="long"> <link rel="author" title="Chris Rebert" href="http://chrisrebert.com"> - <link rel="help" href="https://drafts.csswg.org/css-transitions-2/##event-dispatch"> + <link rel="help" href="https://drafts.csswg.org/css-transitions-2/#event-dispatch"> <link rel="help" href="https://lists.w3.org/Archives/Public/www-style/2015Apr/0405.html" data-section-title="AnimationEnd events and display: none"> <meta name="flags" content="dom"> <meta name="assert" content="Making an element display:none; while it has a transition in progress should fire a transitioncancel event."> diff --git a/tests/wpt/web-platform-tests/css/css-ui/appearance-button-bevel-001.html b/tests/wpt/web-platform-tests/css/css-ui/appearance-button-bevel-001.html deleted file mode 100644 index 03748528154..00000000000 --- a/tests/wpt/web-platform-tests/css/css-ui/appearance-button-bevel-001.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>CSS Basic User Interface Test: appearance: button-bevel</title> -<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching"> -<meta name="assert" content="button-bevel is an alias to auto."> -<link rel="match" href="appearance-auto-ref.html"> -<style> - #container { width: 500px; } - #container > * { appearance: none; appearance: button-bevel; } -</style> -<div id="container"> - <a>a</a> - <button>button</button> - <input type="text" value="input-text"> - <input type="search" value="input-search"> - <textarea>textarea</textarea> - <input type="button" value="input-button"> - <input type="submit" value="input-submit"> - <input type="reset" value="input-reset"> - <input type="range"> - <input type="checkbox"> - <input type="radio"> - <input type="color"> - <select><option>select</option></select> - <select multiple><option>select-multiple</option></select> - <meter value=0.5></meter> - <progress value=0.5></progress> -</div> diff --git a/tests/wpt/web-platform-tests/css/css-ui/inheritance.html b/tests/wpt/web-platform-tests/css/css-ui/inheritance.html index 6315316d822..c2aab07a23b 100644 --- a/tests/wpt/web-platform-tests/css/css-ui/inheritance.html +++ b/tests/wpt/web-platform-tests/css/css-ui/inheritance.html @@ -33,7 +33,7 @@ const mediumWidth = getComputedStyle(reference).borderTopWidth; // e.g. 3px const currentColor = getComputedStyle(reference).color; -assert_not_inherited('appearance', 'auto', 'none'); +assert_not_inherited('appearance', 'none', 'auto'); assert_inherited('caret-color', currentColor, 'rgba(42, 53, 64, 0.75)'); assert_inherited('caret-shape', 'auto', 'bar'); assert_inherited('cursor', 'auto', 'pointer'); diff --git a/tests/wpt/web-platform-tests/css/css-ui/outline-023.html b/tests/wpt/web-platform-tests/css/css-ui/outline-023.html index 5b50c84d939..a6f35351cec 100644 --- a/tests/wpt/web-platform-tests/css/css-ui/outline-023.html +++ b/tests/wpt/web-platform-tests/css/css-ui/outline-023.html @@ -3,7 +3,7 @@ <title>Tests that a paint clip, clips an outline.</title> <link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> <link rel="help" href="https://drafts.csswg.org/css-ui-3/#outline"> -<link rel="help" href="https://www.w3.org/TR/CSS21/zindex.html#painting-order"> +<link rel="help" href="https://www.w3.org/TR/CSS2/zindex.html#painting-order"> <p>Test passes if there is a filled green square.</p> <div style="overflow: hidden; width: 100px; height: 100px; background: green;"> <div style="display: block; width: 110px; height: 110px; margin: -5px; outline: solid blue 3px;"></div> diff --git a/tests/wpt/web-platform-tests/css/css-ui/parsing/outline-offset-computed.html b/tests/wpt/web-platform-tests/css/css-ui/parsing/outline-offset-computed.html index feb7732df35..3ba35217ce1 100644 --- a/tests/wpt/web-platform-tests/css/css-ui/parsing/outline-offset-computed.html +++ b/tests/wpt/web-platform-tests/css/css-ui/parsing/outline-offset-computed.html @@ -13,8 +13,6 @@ <style> #target { font-size: 40px; - outline-width: 100px; - outline-style: dotted; /* Avoid outline-width computed style 0 */ } </style> <div id="target"></div> diff --git a/tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-button-bevel-001.html b/tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-button-bevel-001.html deleted file mode 100644 index 3c860f23ae1..00000000000 --- a/tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-button-bevel-001.html +++ /dev/null @@ -1,32 +0,0 @@ -<!-- DO NOT EDIT THIS FILE. -Edit the appearance-* file instead and then run: - ./tools/appearance-build-webkit-reftests.py ---> -<!DOCTYPE html> -<meta charset="utf-8"> -<title>CSS Basic User Interface Test: -webkit-appearance: button-bevel</title> -<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching"> -<meta name="assert" content="button-bevel is an alias to auto."> -<link rel="match" href="appearance-auto-ref.html"> -<style> - #container { width: 500px; } - #container > * { -webkit-appearance: none; -webkit-appearance: button-bevel; } -</style> -<div id="container"> - <a>a</a> - <button>button</button> - <input type="text" value="input-text"> - <input type="search" value="input-search"> - <textarea>textarea</textarea> - <input type="button" value="input-button"> - <input type="submit" value="input-submit"> - <input type="reset" value="input-reset"> - <input type="range"> - <input type="checkbox"> - <input type="radio"> - <input type="color"> - <select><option>select</option></select> - <select multiple><option>select-multiple</option></select> - <meter value=0.5></meter> - <progress value=0.5></progress> -</div> diff --git a/tests/wpt/web-platform-tests/css/geometry/DOMPoint-001.html b/tests/wpt/web-platform-tests/css/geometry/DOMPoint-001.html index e3d8d1d3ba5..945f4674dea 100644 --- a/tests/wpt/web-platform-tests/css/geometry/DOMPoint-001.html +++ b/tests/wpt/web-platform-tests/css/geometry/DOMPoint-001.html @@ -3,9 +3,8 @@ <head> <title>Geometry Interfaces: DOMPoint and DOMPointReadOnly interface tests</title> <link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com" /> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#DOMPoint"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dictdef-dompointinit"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dom-dompoint-dompoint"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dictdef-dompointinit"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-dompoint-dompoint"> <link rel="help" href="https://www.w3.org/TR/geometry-1/#DOMPoint"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/css/geometry/DOMQuad-001.html b/tests/wpt/web-platform-tests/css/geometry/DOMQuad-001.html index 42cb29fa95a..6fa765bbabc 100644 --- a/tests/wpt/web-platform-tests/css/geometry/DOMQuad-001.html +++ b/tests/wpt/web-platform-tests/css/geometry/DOMQuad-001.html @@ -3,12 +3,11 @@ <head> <title>Geometry Interfaces: DOMQuad interface tests</title> <link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com" /> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#DOMQuad"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dom-domquad-domquad"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dom-domquad-p1"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dom-domquad-p2"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dom-domquad-p3"> - <link rel="help" href="http://www.w3.org/TR/geometry-1/#dom-domquad-p4"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-domquad"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p1"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p2"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p3"> + <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p4"> <link rel="help" href="https://www.w3.org/TR/geometry-1/#DOMQuad"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html index b4584fb7200..893f57f0770 100644 --- a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html +++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html @@ -104,7 +104,7 @@ async function testMouseUpAndClickEvent() { await waitForLoad; let bounds = buttonElement.getBoundingClientRect(); - test(() => { assert_true(true); }, `Synthesizing click on button... (button width / height: ${bounds.width} / ${bounds.height})`); + test(() => { assert_true(true); }, `Synthesizing click on button...`); new test_driver.Actions() .pointerMove(Math.floor(bounds.width / 5), Math.floor(bounds.height / 2), diff --git a/tests/wpt/web-platform-tests/fetch/origin/assorted.window.js b/tests/wpt/web-platform-tests/fetch/origin/assorted.window.js index cc37dbd8ed9..fc6dd1a0287 100644 --- a/tests/wpt/web-platform-tests/fetch/origin/assorted.window.js +++ b/tests/wpt/web-platform-tests/fetch/origin/assorted.window.js @@ -115,7 +115,7 @@ function navigationReferrerPolicy(referrerPolicy, destination, expectedOrigin) { }; } -function fetchReferrerPolicy(referrerPolicy, destination, fetchMode, expectedOrigin) { +function fetchReferrerPolicy(referrerPolicy, destination, fetchMode, expectedOrigin, httpMethod) { return async function () { const stash = token(); const redirectPath = "/fetch/origin/resources/redirect-and-stash.py"; @@ -125,7 +125,7 @@ function fetchReferrerPolicy(referrerPolicy, destination, fetchMode, expectedOri : origins.HTTP_REMOTE_ORIGIN) + redirectPath + "?stash=" + stash; - await fetch(fetchUrl, { mode: fetchMode, method: "POST" , "referrerPolicy": referrerPolicy}); + await fetch(fetchUrl, { mode: fetchMode, method: httpMethod , "referrerPolicy": referrerPolicy}); const json = await (await fetch(redirectPath + "?dump&stash=" + stash)).json(); @@ -133,8 +133,8 @@ function fetchReferrerPolicy(referrerPolicy, destination, fetchMode, expectedOri }; } -function referrerPolicyTestString(referrerPolicy, destination) { - return "Origin header and POST " + destination + " with Referrer-Policy " + +function referrerPolicyTestString(referrerPolicy, method, destination) { + return "Origin header and " + method + " " + destination + " with Referrer-Policy " + referrerPolicy; } @@ -179,23 +179,33 @@ function referrerPolicyTestString(referrerPolicy, destination) { promise_test(navigationReferrerPolicy(testObj.policy, destination.name, destination.expectedOrigin), - referrerPolicyTestString(testObj.policy, + referrerPolicyTestString(testObj.policy, "POST", destination.name + " navigation")); // Test fetch promise_test(fetchReferrerPolicy(testObj.policy, destination.name, "no-cors", - destination.expectedOrigin), - referrerPolicyTestString(testObj.policy, + destination.expectedOrigin, + "POST"), + referrerPolicyTestString(testObj.policy, "POST", destination.name + " fetch no-cors mode")); - // When we're dealing with CORS (mode is "cors"), we shouldn't take the - // Referrer-Policy into account + // Test cors mode POST promise_test(fetchReferrerPolicy(testObj.policy, destination.name, "cors", - origins.HTTP_ORIGIN), - referrerPolicyTestString(testObj.policy, + (destination.name == "same-origin") ? destination.expectedOrigin : origins.HTTP_ORIGIN, + "POST"), + referrerPolicyTestString(testObj.policy, "POST", + destination.name + " fetch cors mode")); + + // Test cors mode GET + promise_test(fetchReferrerPolicy(testObj.policy, + destination.name, + "cors", + (destination.name == "same-origin") ? "no Origin header" : origins.HTTP_ORIGIN, + "GET"), + referrerPolicyTestString(testObj.policy, "GET", destination.name + " fetch cors mode")); }); }); diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/cache-storage-reporting-dedicated-worker.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/cache-storage-reporting-dedicated-worker.https.html index 9493a64b39c..c9c2a9ac715 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/cache-storage-reporting-dedicated-worker.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/cache-storage-reporting-dedicated-worker.https.html @@ -16,7 +16,7 @@ <script> promise_test(async (t) => { - const worker_url = local(encode(worker_path)); + const worker_url = local(encode(worker_path + header_coep)); const iframe_url = local(encode(iframe_path + header_coep + header_report_to)); dedicated_worker_script = ` @@ -35,7 +35,7 @@ promise_test(async (t) => { }, "COEP support on DedicatedWorker.") promise_test(async (t) => { - const worker_url = local(encode(worker_path)); + const worker_url = local(encode(worker_path + header_coep_report_only)); const iframe_url = local(encode(iframe_path + header_coep_report_only + header_report_to)); dedicated_worker_script = ` diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/dedicated-worker-cache-storage.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/dedicated-worker-cache-storage.https.html index dced705206f..2c97e6f8754 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/dedicated-worker-cache-storage.https.html +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/dedicated-worker-cache-storage.https.html @@ -39,14 +39,13 @@ const corp_header = { // - |response_corp| the CORP header of the response. // // Test expectations: -// |loaded| is true whenever the worker is able to fetch the response from -// the CacheStorage. According to the specification: +// |result| +// - "success" when the worker is able to fetch the response from the +// CacheStorage, +// - "failure" when the worker is not able to fetch the response from the +// CacheStorage, and +// - "error" when it is unable to create a worker. // https://mikewest.github.io/corpp/#initialize-embedder-policy-for-global -// it must be false when: -// - |iframe_coep| is 'coep-require-corp' and -// - |response-corp| is 'corp-undefined'. -// -// |worker_coep| must be ignored. function check( // Test parameters: iframe_coep, @@ -54,7 +53,7 @@ function check( response_corp, // Test expectations: - loaded) { + result) { promise_test(async (t) => { // 1) Fetch a response from a document with COEP:none. Store it in the @@ -79,7 +78,7 @@ function check( const response = await cache.match(request); postMessage('success'); } catch(error) { - postMessage('error'); + postMessage('failure'); } })() `; @@ -89,6 +88,7 @@ function check( (async function() { const w = new Worker('${worker_url}'); const worker_response = new Promise(resolve => w.onmessage = resolve); + w.onerror = () => parent.postMessage('error'); w.postMessage(\`${worker_eval}\`); const response = await worker_response; parent.postMessage(response.data); @@ -108,21 +108,21 @@ function check( iframe.contentWindow.postMessage(iframe_eval); const {data} = await iframe_response; - assert_equals(data === "success", loaded); + assert_equals(data, result); }, `${iframe_coep} ${worker_coep} ${response_corp}`) } // ----------------------------------------------------------------------------- // iframe_coep , worker_coep , response_corp , loaded // ----------------------------------------------------------------------------- -check("coep-none" , "coep-none" , "corp-cross-origin" , true); -check("coep-none" , "coep-none" , "corp-undefined" , true); -check("coep-none" , "coep-require-corp" , "corp-cross-origin" , true); -check("coep-none" , "coep-require-corp" , "corp-undefined" , true); -check("coep-require-corp" , "coep-none" , "corp-cross-origin" , true); -check("coep-require-corp" , "coep-none" , "corp-undefined" , false); -check("coep-require-corp" , "coep-require-corp" , "corp-cross-origin" , true); -check("coep-require-corp" , "coep-require-corp" , "corp-undefined" , false); +check("coep-none" , "coep-none" , "corp-cross-origin" , "success"); +check("coep-none" , "coep-none" , "corp-undefined" , "success"); +check("coep-none" , "coep-require-corp" , "corp-cross-origin" , "success"); +check("coep-none" , "coep-require-corp" , "corp-undefined" , "failure"); +check("coep-require-corp" , "coep-none" , "corp-cross-origin" , "error"); +check("coep-require-corp" , "coep-none" , "corp-undefined" , "error"); +check("coep-require-corp" , "coep-require-corp" , "corp-cross-origin" , "success"); +check("coep-require-corp" , "coep-require-corp" , "corp-undefined" , "failure"); </script> </html> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py index 1f628ca878d..dd1a047c72a 100644 --- a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py @@ -2,13 +2,15 @@ import json def main(request, response): + response.headers.set('Access-Control-Allow-Origin', '*') + response.headers.set('Access-Control-Allow-Methods', 'OPTIONS, GET, POST') + response.headers.set('Access-Control-Allow-Headers', 'Content-Type') + response.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate'); + + # CORS preflight if request.method == 'OPTIONS': - # CORS preflight - response.headers.set('Access-Control-Allow-Origin', '*') - response.headers.set('Access-Control-Allow-Methods', 'POST') - response.headers.set('Access-Control-Allow-Headers', 'content-type') return '' - response.headers.set('Access-Control-Allow-Origin', '*') + uuidMap = { 'endpoint': '01234567-0123-0123-0123-0123456789AB', 'report-only-endpoint': '01234567-0123-0123-0123-0123456789CD' @@ -33,6 +35,7 @@ def main(request, response): return 'done' if request.method == 'GET': + response.headers.set('Content-Type', 'application/json') return json.dumps(request.server.stash.take(key, path) or []) response.status = 400 diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl index dc9b78fda61..f102510db47 100644 --- a/tests/wpt/web-platform-tests/interfaces/cssom.idl +++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl @@ -73,7 +73,7 @@ interface CSSRule { readonly attribute CSSRule? parentRule; readonly attribute CSSStyleSheet? parentStyleSheet; - // the following attribute and constants are historial + // the following attribute and constants are historical readonly attribute unsigned short type; const unsigned short STYLE_RULE = 1; const unsigned short CHARSET_RULE = 2; diff --git a/tests/wpt/web-platform-tests/interfaces/intersection-observer.idl b/tests/wpt/web-platform-tests/interfaces/intersection-observer.idl index 133622e508c..46fad3522ed 100644 --- a/tests/wpt/web-platform-tests/interfaces/intersection-observer.idl +++ b/tests/wpt/web-platform-tests/interfaces/intersection-observer.idl @@ -5,9 +5,9 @@ callback IntersectionObserverCallback = void (sequence<IntersectionObserverEntry> entries, IntersectionObserver observer); -[Constructor(IntersectionObserverCallback callback, optional IntersectionObserverInit options), - Exposed=Window] +[Exposed=Window] interface IntersectionObserver { + constructor(IntersectionObserverCallback callback, optional IntersectionObserverInit options = {}); readonly attribute Node? root; readonly attribute DOMString rootMargin; readonly attribute FrozenArray<double> thresholds; @@ -17,8 +17,9 @@ interface IntersectionObserver { sequence<IntersectionObserverEntry> takeRecords(); }; -[Constructor(IntersectionObserverEntryInit intersectionObserverEntryInit)] +[Exposed=Window] interface IntersectionObserverEntry { + constructor(IntersectionObserverEntryInit intersectionObserverEntryInit); readonly attribute DOMHighResTimeStamp time; readonly attribute DOMRectReadOnly? rootBounds; readonly attribute DOMRectReadOnly boundingClientRect; diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html index 9b2e5eaeed3..8c3606be19d 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js index de9370c7d5f..4b4d859dc30 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.html index aa26e529d8b..2c35113c47f 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.worker.js index 85fcd380895..bc111e2c321 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.html index a09e9508a7c..2d27995407f 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.worker.js index 8dbaa3b01c9..902e9d69549 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.html index cadbce72bae..aadf53d7aee 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.worker.js index db217e190af..86a79b5fd27 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html index b1075b015a1..c5d50acfe52 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js index de97ef641f1..e3d8d88892f 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.html index c7edb163d31..678a059e372 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.worker.js index 11b36c082b1..3e1454fc87e 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; _assertSame(ctx.measureText('A').width, 50, "ctx.measureText('A').width", "50"); _assertSame(ctx.measureText('AA').width, 100, "ctx.measureText('AA').width", "100"); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.html index b1044623b24..304d6b2248e 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); }).then(t_pass, t_fail); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.worker.js index 124353c5afc..7dd1677b964 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; _assertSame(ctx.measureText("").width, 0, "ctx.measureText(\"\").width", "0"); }).then(t_pass, t_fail); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.html b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.html index b3cb2fc4420..b452fc98b6b 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.html +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.html @@ -20,12 +20,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.worker.js b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.worker.js index a1232dd4f79..3d78110f7e6 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.worker.js +++ b/tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.worker.js @@ -16,12 +16,11 @@ t.step(function() { var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); +var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); +f.load(); fonts.add(f); -fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); -}).then(function() { +fonts.ready.then(function() { ctx.font = '50px CanvasTest'; _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); _assertSame(ctx.measureText('A B').width, 150, "ctx.measureText('A B').width", "150"); diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml b/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml index 1d2e1210ed1..846dc8b3eed 100644 --- a/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml +++ b/tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml @@ -10811,12 +10811,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; @assert ctx.measureText('A').width === 50; @assert ctx.measureText('AA').width === 100; @@ -10833,12 +10832,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; @assert ctx.measureText("").width === 0; }).then(t_pass, t_fail); @@ -10850,12 +10848,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; @assert ctx.measureText('A B').width === 150; @assert ctx.measureText('A B').width === 150; @moz-todo @@ -10873,12 +10870,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' @@ -10905,12 +10901,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' @@ -10935,12 +10930,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' @@ -10950,7 +10944,6 @@ @assert ctx.measureText('ABCD').fontBoundingBoxAscent === 85; @assert ctx.measureText('ABCD').fontBoundingBoxDescent === 39; }).then(t_pass, t_fail); - - name: 2d.text.measure.emHeights desc: Testing emHeights for OffscreenCanvas testing: @@ -10958,12 +10951,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' @@ -10975,7 +10967,6 @@ @assert ctx.measureText('ABCD').emHeightDescent === 12.5; @assert ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent === 50; }).then(t_pass, t_fail); - - name: 2d.text.measure.baselines desc: Testing baselines for OffscreenCanvas testing: @@ -10983,12 +10974,11 @@ fonts: - CanvasTest code: | - var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); + var f = new FontFace("CanvasTest", "url('/fonts/CanvasTest.ttf')"); let fonts = (self.fonts ? self.fonts : document.fonts); + f.load(); fonts.add(f); - fonts.ready.then(() => { - return new Promise(function(resolve) { step_timeout(resolve, 500); }); - }).then(function() { + fonts.ready.then(function() { ctx.font = '50px CanvasTest'; ctx.direction = 'ltr'; ctx.align = 'left' @@ -11000,5 +10990,4 @@ @assert ctx.measureText('ABCD').getBaselines().ideographic === -39; @assert ctx.measureText('ABCD').getBaselines().hanging === 68; }).then(t_pass, t_fail); - # TODO: shadows, alpha, composite, clip diff --git a/tests/wpt/web-platform-tests/scroll-animations/constructor.html b/tests/wpt/web-platform-tests/scroll-animations/constructor.html index 5d13035f6a1..7cb7013c006 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/constructor.html +++ b/tests/wpt/web-platform-tests/scroll-animations/constructor.html @@ -197,6 +197,52 @@ for (const suffix of gInvalidScrollOffsetSuffixes) { }, '\'' + suffix + '\' is an invalid scroll offset unit'); } + +const offset_target = document.createElement('div'); + +const gValidElementBasedScrollOffsetValues = [ + {target: offset_target}, + {target: offset_target, threshold: 0}, + {target: offset_target, threshold: 0.5}, + {target: offset_target, threshold: 1}, +]; + +for (let offset of gValidElementBasedScrollOffsetValues) { + test(function() { + const scrollTimeline = new ScrollTimeline( + {timeRange: 100, startScrollOffset: offset, endScrollOffset: offset}); + + // Special case unspecified threshold since it gets initialized to 0. + if (!offset.hasOwnProperty('threshold')) + offset.threshold = 0; + + assert_equals(scrollTimeline.startScrollOffset.target, offset.target); + assert_equals(scrollTimeline.startScrollOffset.threshold, offset.threshold); + assert_equals(scrollTimeline.endScrollOffset.target, offset.target); + assert_equals(scrollTimeline.endScrollOffset.threshold, offset.threshold); + }, '\'' + JSON.stringify(offset) + '\' is a valid scroll offset value'); +} + + +const gInvalidElementBasedScrollOffsetValues = [ + {}, // empty + {target: offset_target, threshold: "test"}, + {target: offset_target, threshold: 2}, + {target: offset_target, threshold: -0.2}, +]; + +for (let offset of gInvalidElementBasedScrollOffsetValues) { + test(function() { + const constructorFunc = function() { + new ScrollTimeline( + {timeRange: 100, startScrollOffset: offset, endScrollOffset: offset}) + }; + assert_throws_js(TypeError, constructorFunc); + }, '\'' + JSON.stringify(offset) + '\' is an invalid scroll offset value'); +} + + + // timeRange test(function() { diff --git a/tests/wpt/web-platform-tests/scroll-animations/current-time-root-scroller.html b/tests/wpt/web-platform-tests/scroll-animations/current-time-root-scroller.html index 8e600e6ef05..e0c42f010d9 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/current-time-root-scroller.html +++ b/tests/wpt/web-platform-tests/scroll-animations/current-time-root-scroller.html @@ -4,6 +4,7 @@ <link rel="help" href="https://wicg.github.io/scroll-animations/#current-time-algorithm"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> <style> html { @@ -16,7 +17,7 @@ html { </style> <script> -test(function() { +promise_test(async t => { const scroller = document.scrollingElement; // Set the timeRange(s) such that currentTime maps directly to the value // scrolled. This makes it easier to assert on the currentTime in the test. @@ -35,6 +36,9 @@ test(function() { // Now do some scrolling and make sure that the ScrollTimelines update. scroller.scrollTop = 50; scroller.scrollLeft = 75; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); // As noted above, the timeRange(s) are mapped such that currentTime should be // the scroll offset. diff --git a/tests/wpt/web-platform-tests/scroll-animations/current-time-writing-modes.html b/tests/wpt/web-platform-tests/scroll-animations/current-time-writing-modes.html index 243f152ec71..5a53d43f037 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/current-time-writing-modes.html +++ b/tests/wpt/web-platform-tests/scroll-animations/current-time-writing-modes.html @@ -12,7 +12,7 @@ <script> 'use strict'; -test(function() { +promise_test(async t => { const scrollerOverrides = new Map([['direction', 'rtl']]); const scroller = setupScrollTimelineTest(scrollerOverrides); @@ -52,6 +52,9 @@ test(function() { // block/vertical direction should be unaffected. scroller.scrollTop = 50; scroller.scrollLeft = 75 - scrollerSize; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals(blockScrollTimeline.currentTime, 50, 'Scrolled block timeline'); assert_equals( @@ -64,7 +67,7 @@ test(function() { verticalScrollTimeline.currentTime, 50, 'Scrolled vertical timeline'); }, 'currentTime handles direction: rtl correctly'); -test(function() { +promise_test(async t => { const scrollerOverrides = new Map([['writing-mode', 'vertical-rl']]); const scroller = setupScrollTimelineTest(scrollerOverrides); @@ -106,6 +109,9 @@ test(function() { // vertical is normal. scroller.scrollTop = 50; scroller.scrollLeft = 75 - scrollerSize; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( blockScrollTimeline.currentTime, scrollerSize - 75, @@ -119,7 +125,7 @@ test(function() { verticalScrollTimeline.currentTime, 50, 'Scrolled vertical timeline'); }, 'currentTime handles writing-mode: vertical-rl correctly'); -test(function() { +promise_test(async t => { const scrollerOverrides = new Map([['writing-mode', 'vertical-lr']]); const scroller = setupScrollTimelineTest(scrollerOverrides); @@ -159,6 +165,9 @@ test(function() { // not affect horizontal/vertical. scroller.scrollTop = 50; scroller.scrollLeft = 75; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals(blockScrollTimeline.currentTime, 75, 'Scrolled block timeline'); assert_equals( @@ -169,7 +178,7 @@ test(function() { verticalScrollTimeline.currentTime, 50, 'Scrolled vertical timeline'); }, 'currentTime handles writing-mode: vertical-lr correctly'); -test(function() { +promise_test(async t => { const scrollerOverrides = new Map([['direction', 'rtl']]); const scroller = setupScrollTimelineTest(scrollerOverrides); // Set the timeRange such that currentTime maps directly to the value @@ -214,14 +223,19 @@ test(function() { // Check the length-based ScrollTimeline. scroller.scrollLeft = 0; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, 0, 'Length-based timeline before the startScrollOffset point'); scroller.scrollLeft = -20; + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, 0, 'Length-based timeline at the startScrollOffset point'); scroller.scrollLeft = -50; + await waitForNextFrame(); assert_times_equal( lengthScrollTimeline.currentTime, calculateCurrentTime(50, 20, scrollerSize, scrollerSize), @@ -229,14 +243,17 @@ test(function() { // Check the percentage-based ScrollTimeline. scroller.scrollLeft = -(0.19 * scrollerSize); + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, 0, 'Percentage-based timeline before the startScrollOffset point'); scroller.scrollLeft = -(0.20 * scrollerSize); + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, 0, 'Percentage-based timeline at the startScrollOffset point'); scroller.scrollLeft = -(0.4 * scrollerSize); + await waitForNextFrame(); assert_times_equal( percentageScrollTimeline.currentTime, calculateCurrentTime( @@ -245,14 +262,17 @@ test(function() { // Check the calc-based ScrollTimeline. scroller.scrollLeft = -(0.2 * scrollerSize - 10); + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, 0, 'Calc-based timeline before the startScrollOffset point'); scroller.scrollLeft = -(0.2 * scrollerSize - 5); + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, 0, 'Calc-based timeline at the startScrollOffset point'); scroller.scrollLeft = -(0.2 * scrollerSize); + await waitForNextFrame(); assert_times_equal( calcScrollTimeline.currentTime, calculateCurrentTime( @@ -261,7 +281,7 @@ test(function() { 'Calc-based timeline after the startScrollOffset point'); }, 'currentTime handles startScrollOffset with direction: rtl correctly'); -test(function() { +promise_test(async t => { const scrollerOverrides = new Map([['direction', 'rtl']]); const scroller = setupScrollTimelineTest(scrollerOverrides); // Set the timeRange such that currentTime maps directly to the value @@ -295,14 +315,19 @@ test(function() { // Check the length-based ScrollTimeline. scroller.scrollLeft = -scrollerSize; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, lengthScrollTimeline.timeRange, 'Length-based timeline after the endScrollOffset point'); scroller.scrollLeft = 20 - scrollerSize; + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, lengthScrollTimeline.timeRange, 'Length-based timeline at the endScrollOffset point'); scroller.scrollLeft = 50 - scrollerSize; + await waitForNextFrame(); assert_times_equal( lengthScrollTimeline.currentTime, calculateCurrentTime( @@ -311,14 +336,17 @@ test(function() { // Check the percentage-based ScrollTimeline. scroller.scrollLeft = 0.19 * scrollerSize - scrollerSize; + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, percentageScrollTimeline.timeRange, 'Percentage-based timeline after the endScrollOffset point'); scroller.scrollLeft = 0.20 * scrollerSize - scrollerSize; + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, percentageScrollTimeline.timeRange, 'Percentage-based timeline at the endScrollOffset point'); scroller.scrollLeft = 0.4 * scrollerSize - scrollerSize; + await waitForNextFrame(); assert_times_equal( percentageScrollTimeline.currentTime, calculateCurrentTime( @@ -327,14 +355,17 @@ test(function() { // Check the calc-based ScrollTimeline. 80% + 5px scroller.scrollLeft = -0.8 * scrollerSize - 10; + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, calcScrollTimeline.timeRange, 'Calc-based timeline after the endScrollOffset point'); scroller.scrollLeft = -0.8 * scrollerSize - 5; + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, calcScrollTimeline.timeRange, 'Calc-based timeline at the endScrollOffset point'); scroller.scrollLeft = -0.8 * scrollerSize; + await waitForNextFrame(); assert_times_equal( calcScrollTimeline.currentTime, calculateCurrentTime( @@ -342,7 +373,7 @@ test(function() { 'Calc-based timeline before the endScrollOffset point'); }, 'currentTime handles endScrollOffset with direction: rtl correctly'); -test(function() { +promise_test(async t => { const scrollerOverrides = new Map([['direction', 'rtl']]); const scroller = setupScrollTimelineTest(scrollerOverrides); // Set the timeRange such that currentTime maps directly to the value @@ -385,6 +416,9 @@ test(function() { scroller.scrollLeft = 0; let expectedCurrentTime = calculateCurrentTime( scroller.scrollLeft, 0, scrollerSize, scrollerSize); + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal( inclusiveAutoScrollTimeline.currentTime, expectedCurrentTime, diff --git a/tests/wpt/web-platform-tests/scroll-animations/current-time.html b/tests/wpt/web-platform-tests/scroll-animations/current-time.html index cb710aa0890..18913bb9b04 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/current-time.html +++ b/tests/wpt/web-platform-tests/scroll-animations/current-time.html @@ -12,7 +12,7 @@ <script> 'use strict'; -test(function() { +promise_test(async t => { const scroller = setupScrollTimelineTest(); // Set the timeRange such that currentTime maps directly to the value // scrolled. The contents and scroller are square, so it suffices to compute @@ -48,6 +48,9 @@ test(function() { // Do some scrolling and make sure that the ScrollTimelines update. scroller.scrollTop = 50; scroller.scrollLeft = 75; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); // As noted above timeRange is mapped such that currentTime should be the // scroll offset. @@ -60,7 +63,7 @@ test(function() { verticalScrollTimeline.currentTime, 50, 'Scrolled vertical timeline'); }, 'currentTime calculates the correct time based on scrolled amount'); -test(function() { +promise_test(async t => { // It is difficult to calculate the scroll offset which results in an exact // currentTime. Scrolling is calculated in integers which allows for the // possibility of rounding, and scrollbar widths differ between platforms @@ -76,11 +79,14 @@ test(function() { // calculate where the 50% scroll mark would be. const halfwayY = (scroller.scrollHeight - scroller.clientHeight) / 2; scroller.scrollTop = halfwayY; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_approx_equals(scrollTimeline.currentTime, 50, 0.5); }, 'currentTime adjusts correctly for the timeRange'); -test(function() { +promise_test(async t => { const scroller = setupScrollTimelineTest(); // Set the timeRange such that currentTime maps directly to the value // scrolled. The contents and scroller are square, so it suffices to compute @@ -129,6 +135,9 @@ test(function() { // Check the length-based ScrollTimeline. scroller.scrollTop = 19; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, 0, 'Length-based timeline current time before the startScrollOffset' @@ -137,6 +146,7 @@ test(function() { lengthScrollTimeline.phase, "before", 'Length-based timeline phase before the startScrollOffset point'); scroller.scrollTop = 20; + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, 0, 'Length-based timeline current time at the startScrollOffset point'); @@ -144,6 +154,7 @@ test(function() { lengthScrollTimeline.phase, "active", 'Length-based timeline phase at the startScrollOffset point'); scroller.scrollTop = 50; + await waitForNextFrame(); assert_times_equal( lengthScrollTimeline.currentTime, calculateCurrentTime(50, 20, scrollerSize, scrollerSize), @@ -154,6 +165,7 @@ test(function() { // Check the percentage-based ScrollTimeline. scroller.scrollTop = 0.19 * scrollerSize; + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, 0, 'Percentage-based timeline current time before the startScrollOffset' @@ -162,6 +174,7 @@ test(function() { percentageScrollTimeline.phase, "before", 'Percentage-based timeline phase before the startScrollOffset point'); scroller.scrollTop = 0.20 * scrollerSize; + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, 0, 'Percentage-based timeline current time at the startScrollOffset point'); @@ -169,6 +182,7 @@ test(function() { percentageScrollTimeline.phase, "active", 'Percentage-based timeline phase at the startScrollOffset point'); scroller.scrollTop = 0.50 * scrollerSize; + await waitForNextFrame(); assert_times_equal( percentageScrollTimeline.currentTime, calculateCurrentTime( @@ -181,6 +195,7 @@ test(function() { // Check the calc-based ScrollTimeline. scroller.scrollTop = 0.2 * scrollerSize - 10; + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, 0, 'Calc-based timeline current time before the startScrollOffset point'); @@ -188,6 +203,7 @@ test(function() { calcScrollTimeline.phase, "before", 'Calc-based timeline phase at the startScrollOffset point'); scroller.scrollTop = 0.2 * scrollerSize - 5; + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, 0, 'Calc-based timeline current time at the startScrollOffset point'); @@ -195,6 +211,7 @@ test(function() { calcScrollTimeline.phase, "active", 'Calc-based timeline phase at the startScrollOffset point'); scroller.scrollTop = 0.2 * scrollerSize; + await waitForNextFrame(); assert_times_equal( calcScrollTimeline.currentTime, calculateCurrentTime( @@ -206,7 +223,7 @@ test(function() { 'Calc-based timeline phase at the startScrollOffset point'); }, 'currentTime handles startScrollOffset correctly'); -test(function() { +promise_test(async t => { const scroller = setupScrollTimelineTest(); // Set the timeRange such that currentTime maps directly to the value // scrolled. The contents and scroller are square, so it suffices to compute @@ -234,6 +251,9 @@ test(function() { // Check the length-based ScrollTimeline. scroller.scrollTop = scrollerSize; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, lengthScrollTimeline.timeRange, 'Length-based timeline current time after the endScrollOffset point'); @@ -241,6 +261,7 @@ test(function() { lengthScrollTimeline.phase, "after", 'Length-based timeline phase after the endScrollOffset point'); scroller.scrollTop = scrollerSize - 20; + await waitForNextFrame(); assert_equals( lengthScrollTimeline.currentTime, lengthScrollTimeline.timeRange, 'Length-based timeline current time at the endScrollOffset point'); @@ -248,6 +269,7 @@ test(function() { lengthScrollTimeline.phase, "after", 'Length-based timeline phase at the endScrollOffset point'); scroller.scrollTop = scrollerSize - 50; + await waitForNextFrame(); assert_times_equal( lengthScrollTimeline.currentTime, calculateCurrentTime( @@ -259,6 +281,7 @@ test(function() { // Check the percentage-based ScrollTimeline. scroller.scrollTop = 0.81 * scrollerSize; + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, percentageScrollTimeline.timeRange, 'Percentage-based timeline current time after the endScrollOffset point'); @@ -266,6 +289,7 @@ test(function() { percentageScrollTimeline.phase, "after", 'Percentage-based timeline phase after the endScrollOffset point'); scroller.scrollTop = 0.80 * scrollerSize; + await waitForNextFrame(); assert_equals( percentageScrollTimeline.currentTime, percentageScrollTimeline.timeRange, 'Percentage-based timeline current time at the endScrollOffset point'); @@ -273,6 +297,7 @@ test(function() { percentageScrollTimeline.phase, "after", 'Percentage-based timeline phase at the endScrollOffset point'); scroller.scrollTop = 0.50 * scrollerSize; + await waitForNextFrame(); assert_times_equal( percentageScrollTimeline.currentTime, calculateCurrentTime( @@ -284,6 +309,7 @@ test(function() { // Check the calc-based ScrollTimeline. scroller.scrollTop = 0.8 * scrollerSize + 6; + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, calcScrollTimeline.timeRange, 'Calc-based timeline current time after the endScrollOffset point'); @@ -291,6 +317,7 @@ test(function() { calcScrollTimeline.phase, "after", 'Calc-based timeline phase after the endScrollOffset point'); scroller.scrollTop = 0.8 * scrollerSize + 5; + await waitForNextFrame(); assert_equals( calcScrollTimeline.currentTime, calcScrollTimeline.timeRange, 'Calc-based timeline current time at the endScrollOffset point'); @@ -298,6 +325,7 @@ test(function() { calcScrollTimeline.phase, "after", 'Calc-based timeline phase at the endScrollOffset point'); scroller.scrollTop = 0.5 * scrollerSize; + await waitForNextFrame(); assert_times_equal( calcScrollTimeline.currentTime, calculateCurrentTime( @@ -308,7 +336,7 @@ test(function() { 'Calc-based timeline phase before the endScrollOffset point'); }, 'currentTime handles endScrollOffset correctly'); -test(function() { +promise_test(async t => { const scroller = setupScrollTimelineTest(); // Set the timeRange such that currentTime maps directly to the value // scrolled. The contents and scroller are square, so it suffices to compute @@ -324,12 +352,15 @@ test(function() { }); scroller.scrollTop = 150; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal( scrollTimeline.currentTime, calculateCurrentTime(150, 20, scrollerSize - 50, scrollerSize)); }, 'currentTime handles startScrollOffset and endScrollOffset together correctly'); -test(function() { +promise_test(async t => { const scroller = setupScrollTimelineTest(); // Set the timeRange such that currentTime maps directly to the value // scrolled. The contents and scroller are square, so it suffices to compute @@ -345,10 +376,13 @@ test(function() { }); scroller.scrollTop = 150; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals(scrollTimeline.currentTime, scrollTimeline.timeRange); }, 'currentTime handles startScrollOffset == endScrollOffset correctly'); -test(function() { +promise_test(async t => { const scroller = setupScrollTimelineTest(); // Set the timeRange such that currentTime maps directly to the value // scrolled. The contents and scroller are square, so it suffices to compute @@ -364,8 +398,12 @@ test(function() { }); scroller.scrollTop = 40; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals(scrollTimeline.currentTime, 0); scroller.scrollTop = 60; + await waitForNextFrame(); assert_equals(scrollTimeline.currentTime, scrollTimeline.timeRange); }, 'currentTime handles startScrollOffset > endScrollOffset correctly'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html index 711314789b1..521c64d328d 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html @@ -47,6 +47,9 @@ // Now do some scrolling and make sure that the Animation current time is // correct. scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals(animation.currentTime, animation.timeline.currentTime, "The current time corresponds to the scroll position of the scroller."); assert_times_equal( @@ -62,6 +65,9 @@ promise_test(async t => { const timeRange = animation.timeline.timeRange; // Advance the scroller. scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); // Verify initial start and current times in Idle state. assert_equals(animation.currentTime, null, @@ -93,6 +99,9 @@ promise_test(async t => { const timeRange = timeline.timeRange; // Advance the scroller. scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); // Verify initial start and current times in Idle state. assert_equals(animation1.currentTime, null, diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-invalidation.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-invalidation.html index 143943c4236..7ab59a140be 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-invalidation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-invalidation.html @@ -28,6 +28,9 @@ promise_test(async t => { const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -52,6 +55,9 @@ promise_test(async t => { const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -85,14 +91,15 @@ promise_test(async t => { await animation.ready; await waitForNextFrame(); scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal(timeline.currentTime, 200, - 'Timeline current time is updated after scroller update.'); - + 'Timeline current time is updated after animation frame.'); await waitForNextFrame(); assert_times_equal(timeline.currentTime, 163.636, - 'Timeline current time is updated after animation frame and ' + + 'Timeline current time is updated after two animation frames and ' + 'reflects single layout run.'); - }, 'If scroll animation resizes its scroll timeline scroller, ' + 'layout runs only once to reflect the initial update.'); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html index 48ca749d24d..ec59a12d91a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html @@ -57,12 +57,15 @@ for (const test_case_key in test_cases){ const test_case = test_cases[test_case_key]; - test(t => { + promise_test(async t => { const timeline = createScrollTimelineWithOffsets(t, "20%", "80%"); const scroller = timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = test_case.scroll_percent * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( timeline.phase, @@ -107,12 +110,15 @@ for (const test_case_key in test_cases_start_offset_greater_than_end_offset){ const test_case = test_cases_start_offset_greater_than_end_offset[test_case_key]; - test(t => { + promise_test(async t => { const timeline = createScrollTimelineWithOffsets(t, "80%", "20%"); const scroller = timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = test_case.scroll_percent * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( timeline.phase, @@ -147,12 +153,15 @@ for (const test_case_key in test_cases_start_offset_equal_to_end_offset){ const test_case = test_cases_start_offset_equal_to_end_offset[test_case_key]; - test(t => { + promise_test(async t => { const timeline = createScrollTimelineWithOffsets(t, "50%", "50%"); const scroller = timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = test_case.scroll_percent * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals( timeline.phase, @@ -163,7 +172,7 @@ " offset is " + test_case.name); } - test(t => { + promise_test(async t => { const timeline = createScrollTimeline(t); const scroller = timeline.scrollSource; // Timeline should be inactive since layout hasn't updated yet @@ -171,13 +180,14 @@ // Accessing scroller.scrollHeight forces the scroller to update scroller.scrollHeight; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_equals(timeline.phase, "active"); // Setting the scroller to display none should make the timeline inactive scroller.style.display = "none" - - // Force another layout - scroller.scrollHeight; + await waitForNextFrame(); assert_equals(timeline.phase, "inactive"); }, 'Scroll timeline starts inactive, can transition to active, and then' + diff --git a/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html b/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html index 069a7cc149e..0b7dcc60034 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html +++ b/tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html @@ -26,6 +26,9 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -35,11 +38,14 @@ }); }, 'Setting animation current time to null throws TypeError.'); - test(t => { + promise_test(async t => { const animation = createScrollLinkedAnimation(t); const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.currentTime = 333; @@ -55,6 +61,9 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -73,6 +82,9 @@ const maxScroll = scroller.scrollHeight - scroller.clientHeight; const range = animation.timeline.timeRange; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -95,6 +107,9 @@ const maxScroll = scroller.scrollHeight - scroller.clientHeight; const range = animation.timeline.timeRange; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -108,11 +123,14 @@ ); }, 'Set animation current time to a negative value.'); - test(t => { + promise_test(async t => { const animation = createScrollLinkedAnimation(t); const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); animation.currentTime = 300; @@ -127,6 +145,9 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -158,6 +179,9 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -181,6 +205,9 @@ " to a time within the range of the animation."); scroller.scrollTop = 0.7 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal( animation.startTime, diff --git a/tests/wpt/web-platform-tests/scroll-animations/setting-playback-rate.html b/tests/wpt/web-platform-tests/scroll-animations/setting-playback-rate.html index a5fdf09b01e..0575464337f 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/setting-playback-rate.html +++ b/tests/wpt/web-platform-tests/scroll-animations/setting-playback-rate.html @@ -25,6 +25,9 @@ const scroller = animation.timeline.scrollSource; // this forces a layout which results in an active timeline scroller.scrollTop = 0; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.playbackRate = 0.5; animation.play(); @@ -39,6 +42,9 @@ const scroller = animation.timeline.scrollSource; // this forces a layout which results in an active timeline scroller.scrollTop = 0; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); animation.playbackRate = 0.5; @@ -54,6 +60,9 @@ const maxScroll = scroller.scrollHeight - scroller.clientHeight; const timeRange = animation.timeline.timeRange; scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.playbackRate = 0.5; animation.play(); @@ -71,6 +80,9 @@ const playbackRate = 2; scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -92,6 +104,9 @@ animation.play(); await animation.ready; scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal(animation.currentTime, 0.2 * timeRange * 2, 'The current time should increase two times faster than timeline time.'); @@ -108,6 +123,9 @@ animation.playbackRate = 2; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); assert_times_equal( animation.currentTime, @@ -117,11 +135,14 @@ }, 'The playback rate affects the rate of progress of the current time' + ' when scrolling'); - test(t => { + promise_test(async t => { const animation = createScrollLinkedAnimation(t); const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); animation.playbackRate = 2; @@ -149,6 +170,9 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.25 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -181,6 +205,9 @@ const range = animation.timeline.timeRange; animation.playbackRate = -1; scroller.scrollTop = 0.3 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -194,6 +221,9 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.5 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -204,6 +234,7 @@ animation.playbackRate = -1; scroller.scrollTop = 0.8 * maxScroll; + await waitForNextFrame(); // -300 = 500 - 800 let timelineDiff = startingTimelineTime - animation.timeline.currentTime; // 200 = 500 + (-300) @@ -211,6 +242,7 @@ assert_times_equal(animation.currentTime, expected); scroller.scrollTop = 0.2 * maxScroll; + await waitForNextFrame(); // 300 = 500 - 200 timelineDiff = startingTimelineTime - animation.timeline.currentTime; // 800 = 500 + 300 @@ -226,6 +258,9 @@ const range = animation.timeline.timeRange; animation.playbackRate = 0; scroller.scrollTop = 0.3 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; @@ -238,12 +273,16 @@ const scroller = animation.timeline.scrollSource; const maxScroll = scroller.scrollHeight - scroller.clientHeight; scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); animation.play(); await animation.ready; assert_times_equal(animation.currentTime, 200); animation.playbackRate = 0; scroller.scrollTop = 0.5 * maxScroll; + await waitForNextFrame(); // Ensure that current time does not change. assert_time_equals_literal(animation.timeline.currentTime, 500); diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-handled.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-handled.https.html index 2d6f6c86d87..89f3d79a681 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-handled.https.html +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-handled.https.html @@ -30,14 +30,21 @@ promise_test(async (t) => { await service_worker_unregister_and_register(t, script, scope); worker = registration.installing; await wait_for_state(t, worker, 'activated'); - frame = await with_iframe(scope); }, 'global setup'); promise_test(async (t) => { + frame = await with_iframe(scope); + const message = await wait_for_message_from_worker(); + assert_equals(message, 'RESOLVED'); +}, 'FetchEvent.handled should resolve when respondWith() is not called for a' + + ' navigation request'); + +promise_test(async (t) => { frame.contentWindow.fetch('dummy.txt?respondWith-not-called'); const message = await wait_for_message_from_worker(); assert_equals(message, 'RESOLVED'); -}, 'FetchEvent.handled should resolve when respondWith() is not called'); +}, 'FetchEvent.handled should resolve when respondWith() is not called for a' + + ' sub-resource request'); promise_test(async (t) => { frame.contentWindow.fetch( diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-handled-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-handled-worker.js index 4af58e20d05..0dc6de005db 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-handled-worker.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-handled-worker.js @@ -9,7 +9,9 @@ function send_message_to_client(message, clientId) { } self.addEventListener('fetch', function(event) { - const clientId = event.clientId; + const clientId = (event.request.mode === 'navigate') ? + event.resultingClientId : event.clientId; + try { event.handled.then(() => { send_message_to_client('RESOLVED', clientId); diff --git a/tests/wpt/web-platform-tests/trusted-types/default-policy-callback-arguments.tentative.https.html b/tests/wpt/web-platform-tests/trusted-types/default-policy-callback-arguments.tentative.https.html new file mode 100644 index 00000000000..5944b0e92d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/trusted-types/default-policy-callback-arguments.tentative.https.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <meta http-equiv="Content-Security-Policy" + content="require-trusted-types-for 'script'"> +</head> +<body> + <div id="log"></div> + <div id="div"></div> + <script id="script"></script> + <script> + var current_case = undefined; + function checker(...args) { + assert_equals(args.length, 3); + assert_true(current_case && current_case.length == 4); + assert_equals(args[0], current_case[0], "Expecting the value."); + assert_equals(args[1], current_case[1], "Expecting the type name."); + assert_equals(args[2], current_case[2], "Expecting the sink name."); + return args[0]; + } + + trustedTypes.createPolicy("default", { + createHTML: checker, + createScript: checker, + createScriptURL: checker + }); + + const div = document.getElementById("div"); + const script = document.getElementById("script"); + const cases = [ + [ "abc", "TrustedHTML", "Element innerHTML", + _ => div.innerHTML = "abc" ], + [ "2+2", "TrustedScript", "Node textContent", + _ => script.textContent = "2+2" ], + [ "about:blank", "TrustedScriptURL", "HTMLScriptElement src", + _ => script.src = "about:blank" ], + ]; + for (var tc of cases) { + test(t => { + current_case = tc; + tc[3](); + }, `Test callback arguments, case ${tc[2]}`); + } + </script> +</body> + diff --git a/tests/wpt/web-platform-tests/trusted-types/trusted-types-svg-script.tentative.https.html b/tests/wpt/web-platform-tests/trusted-types/trusted-types-svg-script.tentative.https.html new file mode 100644 index 00000000000..330efc0c0ac --- /dev/null +++ b/tests/wpt/web-platform-tests/trusted-types/trusted-types-svg-script.tentative.https.html @@ -0,0 +1,138 @@ +<!DOCTYPE html> +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <meta http-equiv="Content-Security-Policy" + content="require-trusted-types-for 'script'"> +</head> +<body> + <div id="log"></div> + <svg id="svg"><script id="script">"some script text";</script></svg> + <script> + // Returns a promise that resolves with a Security Policy Violation (spv) + // even when it is received. + function promise_spv() { + return new Promise((resolve, reject) => { + window.addEventListener("securitypolicyviolation", e => { + resolve(e); + }, { once: true }); + }); + } + + const policy = trustedTypes.createPolicy("policy", { + createScript: x => x, createScriptURL: x => x }); + + promise_test(t => { + assert_throws_js(TypeError, _ => { + document.getElementById("script").innerHTML = "'modified via innerHTML';"; + }); + return promise_spv(); + }, "Assign String to SVGScriptElement.innerHTML."); + + promise_test(t => { + document.getElementById("script").innerHTML = policy.createScript("'modified via innerHTML';"); + return Promise.resolve(); + }, "Assign TrustedScript to SVGScriptElement.innerHTML."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + elem.insertBefore(document.createTextNode("modified via DOM"), null); + document.getElementById("svg").appendChild(elem); + return promise_spv(); + }, "Modify SVGScriptElement via DOM manipulation."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + elem.href.baseVal = "about:blank"; + document.getElementById("svg").appendChild(elem); + + // TODO(1066791): This should be rejected and throw an SPV event, but + // doesn't until the issue is fixed. + // return promise_spv(); + return Promise.resolve(); + }, "Assign string to SVGScriptElement.href.baseVal."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + elem.href.baseVal = policy.createScriptURL("about:blank"); + document.getElementById("svg").appendChild(elem); + return Promise.resolve(); + }, "Assign TrustedScriptURL to SVGScriptElement.href.baseVal."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + assert_throws_js(TypeError, _ => { + elem.setAttribute("href", "about:blank"); + }); + document.getElementById("svg").appendChild(elem); + return promise_spv(); + }, "Assign string to non-attached SVGScriptElement.href via setAttribute."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + elem.setAttribute("href", policy.createScriptURL("about:blank")); + document.getElementById("svg").appendChild(elem); + return Promise.resolve(); + }, "Assign TrustedScriptURL to non-attached SVGScriptElement.href via setAttribute."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + document.getElementById("svg").appendChild(elem); + assert_throws_js(TypeError, _ => { + elem.setAttribute("href", "about:blank"); + }); + return promise_spv(); + }, "Assign string to attached SVGScriptElement.href via setAttribute."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + document.getElementById("svg").appendChild(elem); + elem.setAttribute("href", policy.createScriptURL("about:blank")); + return Promise.resolve(); + }, "Assign TrustedScriptURL to attached SVGScriptElement.href via setAttribute."); + + // Default policy test: We repate the string assignment tests above, + // but now expect all of them to pass. + promise_test(t => { + trustedTypes.createPolicy("default", { + createScript: x => x, createScriptURL: x => x }); + return Promise.resolve(); + }, "Setup default policy"); + + promise_test(t => { + document.getElementById("script").innerHTML = "'modified via innerHTML';"; + return Promise.resolve(); + }, "Assign String to SVGScriptElement.innerHTML w/ default policy."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + elem.href.baseVal = "about:blank"; + document.getElementById("svg").appendChild(elem); + return Promise.resolve(); + }, "Assign string to SVGScriptElement.href.baseVal w/ default policy."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + elem.setAttribute("href", "about:blank"); + document.getElementById("svg").appendChild(elem); + return Promise.resolve(); + }, "Assign string to non-attached SVGScriptElement.href via setAttribute w/ default policy."); + + promise_test(t => { + const elem = document.createElementNS( + "http://www.w3.org/2000/svg", "script"); + document.getElementById("svg").appendChild(elem); + elem.setAttribute("href", "about:blank"); + return Promise.resolve(); + }, "Assign string to attached SVGScriptElement.href via setAttribute w/ default policy."); + </script> +</body> diff --git a/tests/wpt/web-platform-tests/webauthn/createcredential-passing.https.html b/tests/wpt/web-platform-tests/webauthn/createcredential-passing.https.html index a94be363da2..30fef13bbdc 100644 --- a/tests/wpt/web-platform-tests/webauthn/createcredential-passing.https.html +++ b/tests/wpt/web-platform-tests/webauthn/createcredential-passing.https.html @@ -46,7 +46,8 @@ standardSetup(function() { new CreateCredentialsTest("options.publicKey.challenge", new ArrayBuffer(8192)).runTest("Absurdly large challenge"); // good pubKeyCredParams values - new CreateCredentialsTest("options.publicKey.pubKeyCredParams", []).runTest("Bad pubKeyCredParams: pubKeyCredParams is empty Array"); + // empty pubKeyCredParams should default to EC256 and RS256 + new CreateCredentialsTest("options.publicKey.pubKeyCredParams", []).runTest("pubKeyCredParams is empty Array"); const pkParamEC256 = { type: "public-key", alg: cose_alg_ECDSA_w_SHA256 @@ -55,14 +56,9 @@ standardSetup(function() { type: "public-key", alg: cose_alg_ECDSA_w_SHA512 }; - // XXX: presumes all mock authenticators support EC256 new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC256]).runTest("EC256 pubKeyCredParams"); new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC512, pkParamEC256]) .runTest("SelectEC256 pubKeyCredParams from a list"); - // TODO: currently most browsers are mocking FIDO U2F, which is EC256 only - // new CreateCredentialsTest("options.publicKey.pubKeyCredParams", [pkParamEC512]).runTest("EC512 pubKeyCredParams"); - - // NOTE: excludeCredentials parameter -- see also: createcredential-excludecredentials.https.html // timeout new CreateCredentialsTest({path: "options.publicKey.timeout", value: undefined}).runTest("passing credentials.create() with no timeout"); diff --git a/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html b/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html index 820f9b529f1..af03086ee04 100644 --- a/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html +++ b/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html @@ -14,46 +14,37 @@ standardSetup(function() { "use strict"; + var credPromise = createCredential(); var dummyExtension = { foo: true, bar: "yup" }; - var credPromise = createCredential(); + var badExtId = {}; + badExtId[createRandomString(65)] = dummyExtension; // bad extension values new GetCredentialsTest("options.publicKey.extensions", "hi mom") .addCredential(credPromise) .runTest("Bad extensions: extensions is string", TypeError); + + // empty extensions new GetCredentialsTest("options.publicKey.extensions", null) .addCredential(credPromise) - .runTest("Bad extensions: extensions is null", TypeError); + .runTest("extensions is null"); new GetCredentialsTest("options.publicKey.extensions", []) .addCredential(credPromise) - .runTest("Bad extensions: extensions is empty Array", TypeError); + .runTest("extensions is empty Array"); new GetCredentialsTest("options.publicKey.extensions", new ArrayBuffer(0)) .addCredential(credPromise) - .runTest("Bad extensions: extensions is empty ArrayBuffer", TypeError); - var badJson = '{"foo": true, "bar: "yup"}'; // missing quote after "bar" - new GetCredentialsTest("options.publicKey.extensions", {foo: badJson}) - .addCredential(credPromise) - .runTest("Bad extensions: malformatted JSON", TypeError); + .runTest("extensions is empty ArrayBuffer"); + + // unknown extensions should be ignored new GetCredentialsTest("options.publicKey.extensions", {foo: dummyExtension}) .addCredential(credPromise) - .runTest("Bad extensions: JavaScript object", TypeError); - var badExtId = {}; - badExtId[createRandomString(65)] = dummyExtension; + .runTest("ignored extension"); new GetCredentialsTest("options.publicKey.extensions", {badExtId: dummyExtension}) .addCredential(credPromise) - .runTest("Bad extensions: extension ID too long", TypeError); - - // phony extensions - // TODO: not sure if this should pass or fail - // should be clarified as part of https://github.com/w3c/webauthn/pull/765 - var randomExtId = {}; - randomExtId[createRandomString(64)] = dummyExtension; - new GetCredentialsTest("options.publicKey.extensions", {foo: JSON.stringify(randomExtId)}) - .addCredential(credPromise) - .runTest("extensions is a nonsensical JSON string"); + .runTest("extension ID too long"); // TODO // defined extensions: diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py index e5e43c4e655..fda74ce835c 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py @@ -1,6 +1,6 @@ import sys -from merge_dictionaries import merge_dictionaries +from .merge_dictionaries import merge_dictionaries platform_name = { "linux2": "linux", diff --git a/tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedAudioFrame-serviceworker-failure.https.html b/tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedAudioFrame-serviceworker-failure.https.html new file mode 100644 index 00000000000..fda89f36dcb --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedAudioFrame-serviceworker-failure.https.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- Based on similar tests in html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/ --> +<title>RTCEncodedVideoFrame cannot cross agent clusters, service worker edition</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../webrtc/RTCPeerConnection-helper.js"></script> +<script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script> + +<script> +"use strict"; +promise_test(async t => { + const caller = new RTCPeerConnection({forceEncodedAudioInsertableStreams:true}); + t.add_cleanup(() => caller.close()); + const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close()); + + const stream = await navigator.mediaDevices.getUserMedia({audio:true}); + const track = stream.getTracks()[0]; + t.add_cleanup(() => track.stop()); + + const sender = caller.addTrack(track) + const streams = sender.createEncodedAudioStreams(); + const reader = streams.readableStream.getReader(); + const writer = streams.writableStream.getWriter(); + + exchangeIceCandidates(caller, callee); + await doSignalingHandshake(caller, callee); + + const result = await reader.read(); + const scope = "resources/blank.html"; + let reg = await service_worker_unregister_and_register(t, "resources/serviceworker-failure.js", scope); + t.add_cleanup(() => service_worker_unregister(t, scope)); + await wait_for_state(t, reg.installing, "activated"); + let iframe = await with_iframe(scope); + t.add_cleanup(() => iframe.remove()); + const sw = iframe.contentWindow.navigator.serviceWorker; + let state = "start in window"; + return new Promise(resolve => { + sw.onmessage = t.step_func(e => { + if (e.data === "start in worker") { + assert_equals(state, "start in window"); + sw.controller.postMessage(result.value); + state = "we are expecting confirmation of an onmessageerror in the worker"; + } else if (e.data === "onmessageerror was received in worker") { + assert_equals(state, "we are expecting confirmation of an onmessageerror in the worker"); + resolve(); + } else { + assert_unreached("Got an unexpected message from the service worker: " + e.data); + } + }); + + sw.controller.postMessage(state); + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedVideoFrame-serviceworker-failure.https.html b/tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedVideoFrame-serviceworker-failure.https.html new file mode 100644 index 00000000000..93b9a6a0f36 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedVideoFrame-serviceworker-failure.https.html @@ -0,0 +1,56 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<!-- Based on similar tests in html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/ --> +<title>RTCEncodedVideoFrame cannot cross agent clusters, service worker edition</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../webrtc/RTCPeerConnection-helper.js"></script> +<script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script> + +<script> +"use strict"; +promise_test(async t => { + const caller = new RTCPeerConnection({forceEncodedVideoInsertableStreams:true}); + t.add_cleanup(() => caller.close()); + const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close()); + + const stream = await navigator.mediaDevices.getUserMedia({video:true}); + const videoTrack = stream.getVideoTracks()[0]; + t.add_cleanup(() => videoTrack.stop()); + + const videoSender = caller.addTrack(videoTrack) + const senderStreams = videoSender.createEncodedVideoStreams(); + const senderReader = senderStreams.readableStream.getReader(); + const senderWriter = senderStreams.writableStream.getWriter(); + + exchangeIceCandidates(caller, callee); + await doSignalingHandshake(caller, callee); + + const result = await senderReader.read(); + const scope = "resources/blank.html"; + const reg = await service_worker_unregister_and_register(t, "resources/serviceworker-failure.js", scope) + t.add_cleanup(() => service_worker_unregister(t, scope)); + await wait_for_state(t, reg.installing, "activated"); + const iframe = await with_iframe(scope); + t.add_cleanup(() => iframe.remove()); + const sw = iframe.contentWindow.navigator.serviceWorker; + let state = "start in window"; + return new Promise(resolve => { + sw.onmessage = t.step_func(e => { + if (e.data === "start in worker") { + assert_equals(state, "start in window"); + sw.controller.postMessage(result.value); + state = "we are expecting confirmation of an onmessageerror in the worker"; + } else if (e.data === "onmessageerror was received in worker") { + assert_equals(state, "we are expecting confirmation of an onmessageerror in the worker"); + resolve(); + } else { + assert_unreached("Got an unexpected message from the service worker: " + e.data); + } + }); + + sw.controller.postMessage(state); + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/blank.html b/tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/blank.html new file mode 100644 index 00000000000..a3c3a4689a6 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/blank.html @@ -0,0 +1,2 @@ +<!DOCTYPE html> +<title>Empty doc</title> diff --git a/tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/serviceworker-failure.js b/tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/serviceworker-failure.js new file mode 100644 index 00000000000..e7aa8e11be3 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/serviceworker-failure.js @@ -0,0 +1,30 @@ +// Based on similar tests in html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/. +"use strict"; +self.importScripts("/resources/testharness.js"); + +let state = "start in worker"; + +self.onmessage = e => { + if (e.data === "start in window") { + assert_equals(state, "start in worker"); + e.source.postMessage(state); + state = "we are expecting a messageerror due to the window sending us an RTCEncodedVideoFrame or RTCEncodedAudioFrame"; + } else { + e.source.postMessage(`worker onmessage was reached when in state "${state}" and data ${e.data}`); + } +}; + +self.onmessageerror = e => { + if (state === "we are expecting a messageerror due to the window sending us an RTCEncodedVideoFrame or RTCEncodedAudioFrame") { + assert_equals(e.constructor.name, "ExtendableMessageEvent", "type"); + assert_equals(e.data, null, "data"); + assert_equals(e.origin, self.origin, "origin"); + assert_not_equals(e.source, null, "source"); + assert_equals(e.ports.length, 0, "ports length"); + + state = "onmessageerror was received in worker"; + e.source.postMessage(state); + } else { + e.source.postMessage(`worker onmessageerror was reached when in state "${state}" and data ${e.data}`); + } +}; diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html index 9e61ef785ed..83095c085a8 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html @@ -305,6 +305,19 @@ assert_equals(sender.track, track); }, "Calling removeTrack on a stopped transceiver should be a no-op"); + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const stream = await getNoiseStream({audio: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + const [track] = stream.getTracks(); + const sender = pc.addTrack(track, stream); + + await sender.replaceTrack(null); + pc.removeTrack(sender); + assert_equals(sender.track, null); +}, "Calling removeTrack on a null track should have no effect"); + /* TODO diff --git a/tests/wpt/web-platform-tests/webrtc/idlharness.https.window.js b/tests/wpt/web-platform-tests/webrtc/idlharness.https.window.js index 93341278ac6..ae18cc63538 100644 --- a/tests/wpt/web-platform-tests/webrtc/idlharness.https.window.js +++ b/tests/wpt/web-platform-tests/webrtc/idlharness.https.window.js @@ -1,6 +1,7 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js // META: script=./RTCPeerConnection-helper.js +// META: timeout=long 'use strict'; diff --git a/tests/wpt/web-platform-tests/webrtc/third_party/README.md b/tests/wpt/web-platform-tests/webrtc/third_party/README.md new file mode 100644 index 00000000000..56a2295dd10 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/third_party/README.md @@ -0,0 +1,5 @@ +## sdp +Third-party SDP module from + https://www.npmjs.com/package/sdp +without tests or dependencies. See the commit message for version +and commit information diff --git a/tests/wpt/web-platform-tests/webrtc/third_party/sdp/LICENSE b/tests/wpt/web-platform-tests/webrtc/third_party/sdp/LICENSE new file mode 100644 index 00000000000..09502ec0a1d --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/third_party/sdp/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 Philipp Hancke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tests/wpt/web-platform-tests/webrtc/third_party/sdp/sdp.js b/tests/wpt/web-platform-tests/webrtc/third_party/sdp/sdp.js new file mode 100644 index 00000000000..d2a28706115 --- /dev/null +++ b/tests/wpt/web-platform-tests/webrtc/third_party/sdp/sdp.js @@ -0,0 +1,825 @@ +/* eslint-env node */ +'use strict'; + +// SDP helpers. +var SDPUtils = {}; + +// Generate an alphanumeric identifier for cname or mids. +// TODO: use UUIDs instead? https://gist.github.com/jed/982883 +SDPUtils.generateIdentifier = function() { + return Math.random().toString(36).substr(2, 10); +}; + +// The RTCP CNAME used by all peerconnections from the same JS. +SDPUtils.localCName = SDPUtils.generateIdentifier(); + +// Splits SDP into lines, dealing with both CRLF and LF. +SDPUtils.splitLines = function(blob) { + return blob.trim().split('\n').map(function(line) { + return line.trim(); + }); +}; +// Splits SDP into sessionpart and mediasections. Ensures CRLF. +SDPUtils.splitSections = function(blob) { + var parts = blob.split('\nm='); + return parts.map(function(part, index) { + return (index > 0 ? 'm=' + part : part).trim() + '\r\n'; + }); +}; + +// returns the session description. +SDPUtils.getDescription = function(blob) { + var sections = SDPUtils.splitSections(blob); + return sections && sections[0]; +}; + +// returns the individual media sections. +SDPUtils.getMediaSections = function(blob) { + var sections = SDPUtils.splitSections(blob); + sections.shift(); + return sections; +}; + +// Returns lines that start with a certain prefix. +SDPUtils.matchPrefix = function(blob, prefix) { + return SDPUtils.splitLines(blob).filter(function(line) { + return line.indexOf(prefix) === 0; + }); +}; + +// Parses an ICE candidate line. Sample input: +// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8 +// rport 55996" +SDPUtils.parseCandidate = function(line) { + var parts; + // Parse both variants. + if (line.indexOf('a=candidate:') === 0) { + parts = line.substring(12).split(' '); + } else { + parts = line.substring(10).split(' '); + } + + var candidate = { + foundation: parts[0], + component: parseInt(parts[1], 10), + protocol: parts[2].toLowerCase(), + priority: parseInt(parts[3], 10), + ip: parts[4], + address: parts[4], // address is an alias for ip. + port: parseInt(parts[5], 10), + // skip parts[6] == 'typ' + type: parts[7] + }; + + for (var i = 8; i < parts.length; i += 2) { + switch (parts[i]) { + case 'raddr': + candidate.relatedAddress = parts[i + 1]; + break; + case 'rport': + candidate.relatedPort = parseInt(parts[i + 1], 10); + break; + case 'tcptype': + candidate.tcpType = parts[i + 1]; + break; + case 'ufrag': + candidate.ufrag = parts[i + 1]; // for backward compability. + candidate.usernameFragment = parts[i + 1]; + break; + default: // extension handling, in particular ufrag + candidate[parts[i]] = parts[i + 1]; + break; + } + } + return candidate; +}; + +// Translates a candidate object into SDP candidate attribute. +SDPUtils.writeCandidate = function(candidate) { + var sdp = []; + sdp.push(candidate.foundation); + sdp.push(candidate.component); + sdp.push(candidate.protocol.toUpperCase()); + sdp.push(candidate.priority); + sdp.push(candidate.address || candidate.ip); + sdp.push(candidate.port); + + var type = candidate.type; + sdp.push('typ'); + sdp.push(type); + if (type !== 'host' && candidate.relatedAddress && + candidate.relatedPort) { + sdp.push('raddr'); + sdp.push(candidate.relatedAddress); + sdp.push('rport'); + sdp.push(candidate.relatedPort); + } + if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') { + sdp.push('tcptype'); + sdp.push(candidate.tcpType); + } + if (candidate.usernameFragment || candidate.ufrag) { + sdp.push('ufrag'); + sdp.push(candidate.usernameFragment || candidate.ufrag); + } + return 'candidate:' + sdp.join(' '); +}; + +// Parses an ice-options line, returns an array of option tags. +// a=ice-options:foo bar +SDPUtils.parseIceOptions = function(line) { + return line.substr(14).split(' '); +}; + +// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input: +// a=rtpmap:111 opus/48000/2 +SDPUtils.parseRtpMap = function(line) { + var parts = line.substr(9).split(' '); + var parsed = { + payloadType: parseInt(parts.shift(), 10) // was: id + }; + + parts = parts[0].split('/'); + + parsed.name = parts[0]; + parsed.clockRate = parseInt(parts[1], 10); // was: clockrate + parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1; + // legacy alias, got renamed back to channels in ORTC. + parsed.numChannels = parsed.channels; + return parsed; +}; + +// Generate an a=rtpmap line from RTCRtpCodecCapability or +// RTCRtpCodecParameters. +SDPUtils.writeRtpMap = function(codec) { + var pt = codec.payloadType; + if (codec.preferredPayloadType !== undefined) { + pt = codec.preferredPayloadType; + } + var channels = codec.channels || codec.numChannels || 1; + return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + + (channels !== 1 ? '/' + channels : '') + '\r\n'; +}; + +// Parses an a=extmap line (headerextension from RFC 5285). Sample input: +// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset +// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset +SDPUtils.parseExtmap = function(line) { + var parts = line.substr(9).split(' '); + return { + id: parseInt(parts[0], 10), + direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv', + uri: parts[1] + }; +}; + +// Generates a=extmap line from RTCRtpHeaderExtensionParameters or +// RTCRtpHeaderExtension. +SDPUtils.writeExtmap = function(headerExtension) { + return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + + (headerExtension.direction && headerExtension.direction !== 'sendrecv' + ? '/' + headerExtension.direction + : '') + + ' ' + headerExtension.uri + '\r\n'; +}; + +// Parses an ftmp line, returns dictionary. Sample input: +// a=fmtp:96 vbr=on;cng=on +// Also deals with vbr=on; cng=on +SDPUtils.parseFmtp = function(line) { + var parsed = {}; + var kv; + var parts = line.substr(line.indexOf(' ') + 1).split(';'); + for (var j = 0; j < parts.length; j++) { + kv = parts[j].trim().split('='); + parsed[kv[0].trim()] = kv[1]; + } + return parsed; +}; + +// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters. +SDPUtils.writeFmtp = function(codec) { + var line = ''; + var pt = codec.payloadType; + if (codec.preferredPayloadType !== undefined) { + pt = codec.preferredPayloadType; + } + if (codec.parameters && Object.keys(codec.parameters).length) { + var params = []; + Object.keys(codec.parameters).forEach(function(param) { + if (codec.parameters[param]) { + params.push(param + '=' + codec.parameters[param]); + } else { + params.push(param); + } + }); + line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n'; + } + return line; +}; + +// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input: +// a=rtcp-fb:98 nack rpsi +SDPUtils.parseRtcpFb = function(line) { + var parts = line.substr(line.indexOf(' ') + 1).split(' '); + return { + type: parts.shift(), + parameter: parts.join(' ') + }; +}; +// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters. +SDPUtils.writeRtcpFb = function(codec) { + var lines = ''; + var pt = codec.payloadType; + if (codec.preferredPayloadType !== undefined) { + pt = codec.preferredPayloadType; + } + if (codec.rtcpFeedback && codec.rtcpFeedback.length) { + // FIXME: special handling for trr-int? + codec.rtcpFeedback.forEach(function(fb) { + lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + + '\r\n'; + }); + } + return lines; +}; + +// Parses an RFC 5576 ssrc media attribute. Sample input: +// a=ssrc:3735928559 cname:something +SDPUtils.parseSsrcMedia = function(line) { + var sp = line.indexOf(' '); + var parts = { + ssrc: parseInt(line.substr(7, sp - 7), 10) + }; + var colon = line.indexOf(':', sp); + if (colon > -1) { + parts.attribute = line.substr(sp + 1, colon - sp - 1); + parts.value = line.substr(colon + 1); + } else { + parts.attribute = line.substr(sp + 1); + } + return parts; +}; + +SDPUtils.parseSsrcGroup = function(line) { + var parts = line.substr(13).split(' '); + return { + semantics: parts.shift(), + ssrcs: parts.map(function(ssrc) { + return parseInt(ssrc, 10); + }) + }; +}; + +// Extracts the MID (RFC 5888) from a media section. +// returns the MID or undefined if no mid line was found. +SDPUtils.getMid = function(mediaSection) { + var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0]; + if (mid) { + return mid.substr(6); + } +}; + +SDPUtils.parseFingerprint = function(line) { + var parts = line.substr(14).split(' '); + return { + algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge. + value: parts[1] + }; +}; + +// Extracts DTLS parameters from SDP media section or sessionpart. +// FIXME: for consistency with other functions this should only +// get the fingerprint line as input. See also getIceParameters. +SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) { + var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=fingerprint:'); + // Note: a=setup line is ignored since we use the 'auto' role. + // Note2: 'algorithm' is not case sensitive except in Edge. + return { + role: 'auto', + fingerprints: lines.map(SDPUtils.parseFingerprint) + }; +}; + +// Serializes DTLS parameters to SDP. +SDPUtils.writeDtlsParameters = function(params, setupType) { + var sdp = 'a=setup:' + setupType + '\r\n'; + params.fingerprints.forEach(function(fp) { + sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n'; + }); + return sdp; +}; + +// Parses a=crypto lines into +// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members +SDPUtils.parseCryptoLine = function(line) { + var parts = line.substr(9).split(' '); + return { + tag: parseInt(parts[0], 10), + cryptoSuite: parts[1], + keyParams: parts[2], + sessionParams: parts.slice(3), + }; +}; + +SDPUtils.writeCryptoLine = function(parameters) { + return 'a=crypto:' + parameters.tag + ' ' + + parameters.cryptoSuite + ' ' + + (typeof parameters.keyParams === 'object' + ? SDPUtils.writeCryptoKeyParams(parameters.keyParams) + : parameters.keyParams) + + (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') + + '\r\n'; +}; + +// Parses the crypto key parameters into +// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam* +SDPUtils.parseCryptoKeyParams = function(keyParams) { + if (keyParams.indexOf('inline:') !== 0) { + return null; + } + var parts = keyParams.substr(7).split('|'); + return { + keyMethod: 'inline', + keySalt: parts[0], + lifeTime: parts[1], + mkiValue: parts[2] ? parts[2].split(':')[0] : undefined, + mkiLength: parts[2] ? parts[2].split(':')[1] : undefined, + }; +}; + +SDPUtils.writeCryptoKeyParams = function(keyParams) { + return keyParams.keyMethod + ':' + + keyParams.keySalt + + (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') + + (keyParams.mkiValue && keyParams.mkiLength + ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength + : ''); +}; + +// Extracts all SDES paramters. +SDPUtils.getCryptoParameters = function(mediaSection, sessionpart) { + var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=crypto:'); + return lines.map(SDPUtils.parseCryptoLine); +}; + +// Parses ICE information from SDP media section or sessionpart. +// FIXME: for consistency with other functions this should only +// get the ice-ufrag and ice-pwd lines as input. +SDPUtils.getIceParameters = function(mediaSection, sessionpart) { + var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=ice-ufrag:')[0]; + var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=ice-pwd:')[0]; + if (!(ufrag && pwd)) { + return null; + } + return { + usernameFragment: ufrag.substr(12), + password: pwd.substr(10), + }; +}; + +// Serializes ICE parameters to SDP. +SDPUtils.writeIceParameters = function(params) { + return 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + + 'a=ice-pwd:' + params.password + '\r\n'; +}; + +// Parses the SDP media section and returns RTCRtpParameters. +SDPUtils.parseRtpParameters = function(mediaSection) { + var description = { + codecs: [], + headerExtensions: [], + fecMechanisms: [], + rtcp: [] + }; + var lines = SDPUtils.splitLines(mediaSection); + var mline = lines[0].split(' '); + for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..] + var pt = mline[i]; + var rtpmapline = SDPUtils.matchPrefix( + mediaSection, 'a=rtpmap:' + pt + ' ')[0]; + if (rtpmapline) { + var codec = SDPUtils.parseRtpMap(rtpmapline); + var fmtps = SDPUtils.matchPrefix( + mediaSection, 'a=fmtp:' + pt + ' '); + // Only the first a=fmtp:<pt> is considered. + codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {}; + codec.rtcpFeedback = SDPUtils.matchPrefix( + mediaSection, 'a=rtcp-fb:' + pt + ' ') + .map(SDPUtils.parseRtcpFb); + description.codecs.push(codec); + // parse FEC mechanisms from rtpmap lines. + switch (codec.name.toUpperCase()) { + case 'RED': + case 'ULPFEC': + description.fecMechanisms.push(codec.name.toUpperCase()); + break; + default: // only RED and ULPFEC are recognized as FEC mechanisms. + break; + } + } + } + SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) { + description.headerExtensions.push(SDPUtils.parseExtmap(line)); + }); + // FIXME: parse rtcp. + return description; +}; + +// Generates parts of the SDP media section describing the capabilities / +// parameters. +SDPUtils.writeRtpDescription = function(kind, caps) { + var sdp = ''; + + // Build the mline. + sdp += 'm=' + kind + ' '; + sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs. + sdp += ' UDP/TLS/RTP/SAVPF '; + sdp += caps.codecs.map(function(codec) { + if (codec.preferredPayloadType !== undefined) { + return codec.preferredPayloadType; + } + return codec.payloadType; + }).join(' ') + '\r\n'; + + sdp += 'c=IN IP4 0.0.0.0\r\n'; + sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n'; + + // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb. + caps.codecs.forEach(function(codec) { + sdp += SDPUtils.writeRtpMap(codec); + sdp += SDPUtils.writeFmtp(codec); + sdp += SDPUtils.writeRtcpFb(codec); + }); + var maxptime = 0; + caps.codecs.forEach(function(codec) { + if (codec.maxptime > maxptime) { + maxptime = codec.maxptime; + } + }); + if (maxptime > 0) { + sdp += 'a=maxptime:' + maxptime + '\r\n'; + } + sdp += 'a=rtcp-mux\r\n'; + + if (caps.headerExtensions) { + caps.headerExtensions.forEach(function(extension) { + sdp += SDPUtils.writeExtmap(extension); + }); + } + // FIXME: write fecMechanisms. + return sdp; +}; + +// Parses the SDP media section and returns an array of +// RTCRtpEncodingParameters. +SDPUtils.parseRtpEncodingParameters = function(mediaSection) { + var encodingParameters = []; + var description = SDPUtils.parseRtpParameters(mediaSection); + var hasRed = description.fecMechanisms.indexOf('RED') !== -1; + var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1; + + // filter a=ssrc:... cname:, ignore PlanB-msid + var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') + .map(function(line) { + return SDPUtils.parseSsrcMedia(line); + }) + .filter(function(parts) { + return parts.attribute === 'cname'; + }); + var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc; + var secondarySsrc; + + var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID') + .map(function(line) { + var parts = line.substr(17).split(' '); + return parts.map(function(part) { + return parseInt(part, 10); + }); + }); + if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) { + secondarySsrc = flows[0][1]; + } + + description.codecs.forEach(function(codec) { + if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) { + var encParam = { + ssrc: primarySsrc, + codecPayloadType: parseInt(codec.parameters.apt, 10) + }; + if (primarySsrc && secondarySsrc) { + encParam.rtx = {ssrc: secondarySsrc}; + } + encodingParameters.push(encParam); + if (hasRed) { + encParam = JSON.parse(JSON.stringify(encParam)); + encParam.fec = { + ssrc: primarySsrc, + mechanism: hasUlpfec ? 'red+ulpfec' : 'red' + }; + encodingParameters.push(encParam); + } + } + }); + if (encodingParameters.length === 0 && primarySsrc) { + encodingParameters.push({ + ssrc: primarySsrc + }); + } + + // we support both b=AS and b=TIAS but interpret AS as TIAS. + var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b='); + if (bandwidth.length) { + if (bandwidth[0].indexOf('b=TIAS:') === 0) { + bandwidth = parseInt(bandwidth[0].substr(7), 10); + } else if (bandwidth[0].indexOf('b=AS:') === 0) { + // use formula from JSEP to convert b=AS to TIAS value. + bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95 + - (50 * 40 * 8); + } else { + bandwidth = undefined; + } + encodingParameters.forEach(function(params) { + params.maxBitrate = bandwidth; + }); + } + return encodingParameters; +}; + +// parses http://draft.ortc.org/#rtcrtcpparameters* +SDPUtils.parseRtcpParameters = function(mediaSection) { + var rtcpParameters = {}; + + // Gets the first SSRC. Note tha with RTX there might be multiple + // SSRCs. + var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') + .map(function(line) { + return SDPUtils.parseSsrcMedia(line); + }) + .filter(function(obj) { + return obj.attribute === 'cname'; + })[0]; + if (remoteSsrc) { + rtcpParameters.cname = remoteSsrc.value; + rtcpParameters.ssrc = remoteSsrc.ssrc; + } + + // Edge uses the compound attribute instead of reducedSize + // compound is !reducedSize + var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize'); + rtcpParameters.reducedSize = rsize.length > 0; + rtcpParameters.compound = rsize.length === 0; + + // parses the rtcp-mux attrіbute. + // Note that Edge does not support unmuxed RTCP. + var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux'); + rtcpParameters.mux = mux.length > 0; + + return rtcpParameters; +}; + +// parses either a=msid: or a=ssrc:... msid lines and returns +// the id of the MediaStream and MediaStreamTrack. +SDPUtils.parseMsid = function(mediaSection) { + var parts; + var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:'); + if (spec.length === 1) { + parts = spec[0].substr(7).split(' '); + return {stream: parts[0], track: parts[1]}; + } + var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') + .map(function(line) { + return SDPUtils.parseSsrcMedia(line); + }) + .filter(function(msidParts) { + return msidParts.attribute === 'msid'; + }); + if (planB.length > 0) { + parts = planB[0].value.split(' '); + return {stream: parts[0], track: parts[1]}; + } +}; + +// SCTP +// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back +// to draft-ietf-mmusic-sctp-sdp-05 +SDPUtils.parseSctpDescription = function(mediaSection) { + var mline = SDPUtils.parseMLine(mediaSection); + var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:'); + var maxMessageSize; + if (maxSizeLine.length > 0) { + maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10); + } + if (isNaN(maxMessageSize)) { + maxMessageSize = 65536; + } + var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:'); + if (sctpPort.length > 0) { + return { + port: parseInt(sctpPort[0].substr(12), 10), + protocol: mline.fmt, + maxMessageSize: maxMessageSize + }; + } + var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:'); + if (sctpMapLines.length > 0) { + var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0] + .substr(10) + .split(' '); + return { + port: parseInt(parts[0], 10), + protocol: parts[1], + maxMessageSize: maxMessageSize + }; + } +}; + +// SCTP +// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers +// support by now receiving in this format, unless we originally parsed +// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line +// protocol of DTLS/SCTP -- without UDP/ or TCP/) +SDPUtils.writeSctpDescription = function(media, sctp) { + var output = []; + if (media.protocol !== 'DTLS/SCTP') { + output = [ + 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\r\n', + 'c=IN IP4 0.0.0.0\r\n', + 'a=sctp-port:' + sctp.port + '\r\n' + ]; + } else { + output = [ + 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\r\n', + 'c=IN IP4 0.0.0.0\r\n', + 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n' + ]; + } + if (sctp.maxMessageSize !== undefined) { + output.push('a=max-message-size:' + sctp.maxMessageSize + '\r\n'); + } + return output.join(''); +}; + +// Generate a session ID for SDP. +// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1 +// recommends using a cryptographically random +ve 64-bit value +// but right now this should be acceptable and within the right range +SDPUtils.generateSessionId = function() { + return Math.random().toString().substr(2, 21); +}; + +// Write boilder plate for start of SDP +// sessId argument is optional - if not supplied it will +// be generated randomly +// sessVersion is optional and defaults to 2 +// sessUser is optional and defaults to 'thisisadapterortc' +SDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) { + var sessionId; + var version = sessVer !== undefined ? sessVer : 2; + if (sessId) { + sessionId = sessId; + } else { + sessionId = SDPUtils.generateSessionId(); + } + var user = sessUser || 'thisisadapterortc'; + // FIXME: sess-id should be an NTP timestamp. + return 'v=0\r\n' + + 'o=' + user + ' ' + sessionId + ' ' + version + + ' IN IP4 127.0.0.1\r\n' + + 's=-\r\n' + + 't=0 0\r\n'; +}; + +SDPUtils.writeMediaSection = function(transceiver, caps, type, stream) { + var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps); + + // Map ICE parameters (ufrag, pwd) to SDP. + sdp += SDPUtils.writeIceParameters( + transceiver.iceGatherer.getLocalParameters()); + + // Map DTLS parameters to SDP. + sdp += SDPUtils.writeDtlsParameters( + transceiver.dtlsTransport.getLocalParameters(), + type === 'offer' ? 'actpass' : 'active'); + + sdp += 'a=mid:' + transceiver.mid + '\r\n'; + + if (transceiver.direction) { + sdp += 'a=' + transceiver.direction + '\r\n'; + } else if (transceiver.rtpSender && transceiver.rtpReceiver) { + sdp += 'a=sendrecv\r\n'; + } else if (transceiver.rtpSender) { + sdp += 'a=sendonly\r\n'; + } else if (transceiver.rtpReceiver) { + sdp += 'a=recvonly\r\n'; + } else { + sdp += 'a=inactive\r\n'; + } + + if (transceiver.rtpSender) { + // spec. + var msid = 'msid:' + stream.id + ' ' + + transceiver.rtpSender.track.id + '\r\n'; + sdp += 'a=' + msid; + + // for Chrome. + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + + ' ' + msid; + if (transceiver.sendEncodingParameters[0].rtx) { + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + + ' ' + msid; + sdp += 'a=ssrc-group:FID ' + + transceiver.sendEncodingParameters[0].ssrc + ' ' + + transceiver.sendEncodingParameters[0].rtx.ssrc + + '\r\n'; + } + } + // FIXME: this should be written by writeRtpDescription. + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + + ' cname:' + SDPUtils.localCName + '\r\n'; + if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) { + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + + ' cname:' + SDPUtils.localCName + '\r\n'; + } + return sdp; +}; + +// Gets the direction from the mediaSection or the sessionpart. +SDPUtils.getDirection = function(mediaSection, sessionpart) { + // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv. + var lines = SDPUtils.splitLines(mediaSection); + for (var i = 0; i < lines.length; i++) { + switch (lines[i]) { + case 'a=sendrecv': + case 'a=sendonly': + case 'a=recvonly': + case 'a=inactive': + return lines[i].substr(2); + default: + // FIXME: What should happen here? + } + } + if (sessionpart) { + return SDPUtils.getDirection(sessionpart); + } + return 'sendrecv'; +}; + +SDPUtils.getKind = function(mediaSection) { + var lines = SDPUtils.splitLines(mediaSection); + var mline = lines[0].split(' '); + return mline[0].substr(2); +}; + +SDPUtils.isRejected = function(mediaSection) { + return mediaSection.split(' ', 2)[1] === '0'; +}; + +SDPUtils.parseMLine = function(mediaSection) { + var lines = SDPUtils.splitLines(mediaSection); + var parts = lines[0].substr(2).split(' '); + return { + kind: parts[0], + port: parseInt(parts[1], 10), + protocol: parts[2], + fmt: parts.slice(3).join(' ') + }; +}; + +SDPUtils.parseOLine = function(mediaSection) { + var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0]; + var parts = line.substr(2).split(' '); + return { + username: parts[0], + sessionId: parts[1], + sessionVersion: parseInt(parts[2], 10), + netType: parts[3], + addressType: parts[4], + address: parts[5] + }; +}; + +// a very naive interpretation of a valid SDP. +SDPUtils.isValidSDP = function(blob) { + if (typeof blob !== 'string' || blob.length === 0) { + return false; + } + var lines = SDPUtils.splitLines(blob); + for (var i = 0; i < lines.length; i++) { + if (lines[i].length < 2 || lines[i].charAt(1) !== '=') { + return false; + } + // TODO: check the modifier a bit more. + } + return true; +}; + +// Expose public methods. +if (typeof module === 'object') { + module.exports = SDPUtils; +} |