aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <servo-ops@mozilla.com>2020-04-03 10:45:09 -0400
committerGitHub <noreply@github.com>2020-04-03 10:45:09 -0400
commite23fbd25e65397a8f53812085edb5538f2d1ff44 (patch)
tree7a1bec5643f9dc01e110151636818a1acf6ecd62
parente66ab111a6fb5ea9fc7684a0ebeddbe6aa2134f1 (diff)
parente1af489ea290c721b30c8a2f8e19107b88e0f5ab (diff)
downloadservo-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
-rw-r--r--tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-content/element-replacement-on-replaced-element.tentative.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-002.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-heights-012.html.ini19
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-margins-001.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/stretch-input-in-column.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-images/image-orientation/svg-image-orientation.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-computed.html.ini6
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text-decor/parsing/text-underline-position-valid.html.ini9
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-001.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini9
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/origin/assorted.window.js.ini128
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini6
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json402
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-flexbox/flex-minimum-size-002.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-flexbox/percentage-heights-012.html.ini19
-rw-r--r--tests/wpt/metadata/css/css-flexbox/percentage-margins-001.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-flexbox/radiobutton-min-size.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-flexbox/stretch-input-in-column.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/svg-image-orientation.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-computed.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-text-decor/parsing/text-underline-position-valid.html.ini9
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini4
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini9
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini2
-rw-r--r--tests/wpt/metadata/fetch/origin/assorted.window.js.ini30
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini3
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini3
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini6
-rw-r--r--tests/wpt/web-platform-tests/animation-worklet/inactive-timeline.https.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-content/element-replacement-image-alt.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-content/element-replacement-on-replaced-element.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/change-column-flex-width.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/flex-minimum-size-002.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/flexbox-flex-direction-column-percentage-ignored.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/flexbox-lines-must-be-stretched-by-default.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/flexbox_width-change-and-relayout-children.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/percentage-heights-012.html82
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/percentage-margins-001.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/radiobutton-min-size.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/reference/flexbox-flex-direction-column-percentage-ignored-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/reference/stretch-input-in-column-ref.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/relayout-align-items.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/stretch-input-in-column.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-aspect-ratio-ref.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/svg-image-orientation-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation-aspect-ratio.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/svg-image-orientation.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/multicol-overflow-clip.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-computed.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-invalid.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/parsing/text-underline-position-valid.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-multiple.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-decor/text-decoration-style-recalc.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-009.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-010.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-011.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/line-breaking/line-breaking-ic-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions/transition-background-position-with-edge-offset.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions/transitioncancel-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/appearance-button-bevel-001.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/inheritance.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/outline-023.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/parsing/outline-offset-computed.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-button-bevel-001.html32
-rw-r--r--tests/wpt/web-platform-tests/css/geometry/DOMPoint-001.html5
-rw-r--r--tests/wpt/web-platform-tests/css/geometry/DOMQuad-001.html11
-rw-r--r--tests/wpt/web-platform-tests/dom/events/Event-dispatch-redispatch.html2
-rw-r--r--tests/wpt/web-platform-tests/fetch/origin/assorted.window.js32
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/cache-storage-reporting-dedicated-worker.https.html4
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/dedicated-worker-cache-storage.https.html36
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py13
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/intersection-observer.idl7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.actualBoundingBox.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.advances.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.baselines.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.emHeights.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.fontBoundingBox.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.basic.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.empty.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.html7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/text/2d.text.measure.width.space.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/tools/tests2d.yaml59
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/constructor.html46
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/current-time-root-scroller.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/current-time-writing-modes.html46
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/current-time.html52
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-animation.html9
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-invalidation.html15
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html24
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/setting-current-time.html31
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/setting-playback-rate.html41
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-handled.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-handled-worker.js4
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/default-policy-callback-arguments.tentative.https.html47
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/trusted-types-svg-script.tentative.https.html138
-rw-r--r--tests/wpt/web-platform-tests/webauthn/createcredential-passing.https.html8
-rw-r--r--tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html33
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py2
-rw-r--r--tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedAudioFrame-serviceworker-failure.https.html56
-rw-r--r--tests/wpt/web-platform-tests/webrtc-insertable-streams/RTCEncodedVideoFrame-serviceworker-failure.https.html56
-rw-r--r--tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/blank.html2
-rw-r--r--tests/wpt/web-platform-tests/webrtc-insertable-streams/resources/serviceworker-failure.js30
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html13
-rw-r--r--tests/wpt/web-platform-tests/webrtc/idlharness.https.window.js1
-rw-r--r--tests/wpt/web-platform-tests/webrtc/third_party/README.md5
-rw-r--r--tests/wpt/web-platform-tests/webrtc/third_party/sdp/LICENSE19
-rw-r--r--tests/wpt/web-platform-tests/webrtc/third_party/sdp/sdp.js825
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;
+}