aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini3
-rw-r--r--tests/wpt/metadata/MANIFEST.json603
-rw-r--r--tests/wpt/metadata/css/css-transitions/properties-value-inherit-001.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini18
-rw-r--r--tests/wpt/metadata/fetch/content-type/script.window.js.ini3
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini19
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini34
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini28
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini34
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini7
-rw-r--r--tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini4
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini4
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini6
-rw-r--r--tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini2
-rw-r--r--tests/wpt/metadata/webxr/xrSession_visibilityState.https.html.ini4
-rw-r--r--tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini4
-rw-r--r--tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/.github/main.workflow32
-rw-r--r--tests/wpt/web-platform-tests/.github/workflows/pull_request.yml14
-rw-r--r--tests/wpt/web-platform-tests/.github/workflows/push-build-publish-documentation-website.yml14
-rw-r--r--tests/wpt/web-platform-tests/.github/workflows/push-build-release-manifest.yml14
-rw-r--r--tests/wpt/web-platform-tests/README.md42
-rw-r--r--tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js25
-rw-r--r--tests/wpt/web-platform-tests/cookies/resources/setSameSite.py3
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/fetch.html42
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/fetch.https.html42
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/form-get-blank-reload.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/form-get-blank-reload.html)8
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.html69
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.https.html69
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/form-post-blank-reload.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/form-post-blank-reload.html)8
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.html58
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.https.html58
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/iframe-reload.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/iframe-reload.html)8
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/iframe.html62
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/iframe.https.html62
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/img.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/img.html)33
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/resources/navigate.html2
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/resources/puppet.html4
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/setcookie-lax.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/setcookie-lax.html)17
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/setcookie-navigation.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/setcookie-navigation.html)18
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/window-open-reload.https.html (renamed from tests/wpt/web-platform-tests/cookies/samesite/window-open-reload.html)8
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/window-open.html56
-rw-r--r--tests/wpt/web-platform-tests/cookies/samesite/window-open.https.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/inheritance.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/parsing/visibility-computed.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/inset-computed.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/inset-invalid.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical/parsing/inset-valid.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-textfield-001.html36
-rw-r--r--tests/wpt/web-platform-tests/docs/reviewing-tests/index.md28
-rw-r--r--tests/wpt/web-platform-tests/docs/test-suite-design.md24
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/github-intro.md3
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md27
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md23
-rw-r--r--tests/wpt/web-platform-tests/element-timing/first-letter-background.html45
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html16
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html18
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-history.html18
-rw-r--r--tests/wpt/web-platform-tests/interfaces/dom.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/fetch.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/geolocation-sensor.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl58
-rw-r--r--tests/wpt/web-platform-tests/interfaces/magnetometer.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/mediasession.idl8
-rw-r--r--tests/wpt/web-platform-tests/interfaces/notifications.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/orientation-sensor.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/service-workers.idl22
-rw-r--r--tests/wpt/web-platform-tests/interfaces/user-timing.idl2
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/unit/format-value.html123
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animVal-basics.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-angle-to-auto.html97
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html97
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-to-angle.html94
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete-keyTimes.html68
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete.html63
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Cc-Ss.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Ll-Vv-Hh.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Mm-Aa-Z.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Qq-Tt.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-cC-sS-inverse.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-lL-vV-hH-inverse.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-mM-aA-Z-inverse.html65
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-animation-qQ-tT-inverse.html68
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animate-path-to-animation.html58
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-freeze.html55
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-remove.html55
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animateMotion-multiple.html66
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animateMotion-still.html61
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/animateTransform-pattern-transform.html99
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/attributeTypes.html121
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-freeze.html64
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-remove.html64
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/change-target-while-animating-SVG-property.html92
-rw-r--r--tests/wpt/web-platform-tests/svg/animations/cyclic-syncbase.html50
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition.html29
-rw-r--r--tests/wpt/web-platform-tests/websockets/cookies/support/websocket-cookies-helper.sub.js57
-rw-r--r--tests/wpt/web-platform-tests/websockets/cookies/third-party-cookie-accepted.https.html25
-rw-r--r--tests/wpt/web-platform-tests/websockets/handlers/set-cookies-samesite_wsh.py25
-rw-r--r--tests/wpt/web-platform-tests/webxr/events_input_source_recreation.https.html43
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrSession_visibilityState.https.html81
117 files changed, 3664 insertions, 843 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
index 947e223fb28..3b874fc1748 100644
--- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini
@@ -34,3 +34,6 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
+ [Revoke blob URL after calling fetch, fetch should succeed]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 934e7b0de01..e6d7c8291ce 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -165279,6 +165279,18 @@
{}
]
],
+ "css/css-ui/appearance-textfield-001.html": [
+ [
+ "css/css-ui/appearance-textfield-001.html",
+ [
+ [
+ "/css/css-ui/appearance-textfield-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-ui/box-sizing-001.html": [
[
"css/css-ui/box-sizing-001.html",
@@ -166395,6 +166407,18 @@
{}
]
],
+ "css/css-ui/webkit-appearance-textfield-001.html": [
+ [
+ "css/css-ui/webkit-appearance-textfield-001.html",
+ [
+ [
+ "/css/css-ui/appearance-textfield-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-values/angle-units-001.html": [
[
"css/css-values/angle-units-001.html",
@@ -211138,7 +211162,13 @@
".gitattributes": [
[]
],
- ".github/main.workflow": [
+ ".github/workflows/pull_request.yml": [
+ []
+ ],
+ ".github/workflows/push-build-publish-documentation-website.yml": [
+ []
+ ],
+ ".github/workflows/push-build-release-manifest.yml": [
[]
],
".gitignore": [
@@ -257329,6 +257359,9 @@
"css/css-ui/appearance-auto-ref.html": [
[]
],
+ "css/css-ui/appearance-textfield-001-ref.html": [
+ []
+ ],
"css/css-ui/reference/box-sizing-001-ref.html": [
[]
],
@@ -272062,6 +272095,9 @@
"html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html": [
[]
],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-history.html": [
+ []
+ ],
"html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html": [
[]
],
@@ -278713,6 +278749,9 @@
"resources/test/tests/unit/exceptional-cases.html": [
[]
],
+ "resources/test/tests/unit/format-value.html": [
+ []
+ ],
"resources/test/tests/unit/late-test.html": [
[]
],
@@ -286963,6 +287002,9 @@
"websockets/cookies/support/set-cookie.py": [
[]
],
+ "websockets/cookies/support/websocket-cookies-helper.sub.js": [
+ []
+ ],
"websockets/handlers/basic_auth_wsh.py": [
[]
],
@@ -287023,6 +287065,9 @@
"websockets/handlers/set-cookie_wsh.py": [
[]
],
+ "websockets/handlers/set-cookies-samesite_wsh.py": [
+ []
+ ],
"websockets/handlers/simple_handshake_wsh.py": [
[]
],
@@ -310279,153 +310324,153 @@
}
]
],
- "cookies/samesite/fetch.html": [
+ "cookies/samesite/fetch.https.html": [
[
- "cookies/samesite/fetch.html",
+ "cookies/samesite/fetch.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/fetch.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/fetch.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/form-get-blank-reload.html": [
+ "cookies/samesite/form-get-blank-reload.https.html": [
[
- "cookies/samesite/form-get-blank-reload.html",
+ "cookies/samesite/form-get-blank-reload.https.html",
{}
],
[
- "cookies/samesite/form-get-blank-reload.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/form-get-blank-reload.https.html?legacy-samesite",
{}
]
],
- "cookies/samesite/form-get-blank.html": [
+ "cookies/samesite/form-get-blank.https.html": [
[
- "cookies/samesite/form-get-blank.html",
+ "cookies/samesite/form-get-blank.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/form-get-blank.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/form-get-blank.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/form-post-blank-reload.html": [
+ "cookies/samesite/form-post-blank-reload.https.html": [
[
- "cookies/samesite/form-post-blank-reload.html",
+ "cookies/samesite/form-post-blank-reload.https.html",
{}
],
[
- "cookies/samesite/form-post-blank-reload.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/form-post-blank-reload.https.html?legacy-samesite",
{}
]
],
- "cookies/samesite/form-post-blank.html": [
+ "cookies/samesite/form-post-blank.https.html": [
[
- "cookies/samesite/form-post-blank.html",
+ "cookies/samesite/form-post-blank.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/form-post-blank.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/form-post-blank.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/iframe-reload.html": [
+ "cookies/samesite/iframe-reload.https.html": [
[
- "cookies/samesite/iframe-reload.html",
+ "cookies/samesite/iframe-reload.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/iframe-reload.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/iframe-reload.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/iframe.html": [
+ "cookies/samesite/iframe.https.html": [
[
- "cookies/samesite/iframe.html",
+ "cookies/samesite/iframe.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/iframe.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/iframe.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/img.html": [
+ "cookies/samesite/img.https.html": [
[
- "cookies/samesite/img.html",
+ "cookies/samesite/img.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/img.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/img.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/setcookie-lax.html": [
+ "cookies/samesite/setcookie-lax.https.html": [
[
- "cookies/samesite/setcookie-lax.html",
+ "cookies/samesite/setcookie-lax.https.html",
{}
],
[
- "cookies/samesite/setcookie-lax.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/setcookie-lax.https.html?legacy-samesite",
{}
]
],
- "cookies/samesite/setcookie-navigation.html": [
+ "cookies/samesite/setcookie-navigation.https.html": [
[
- "cookies/samesite/setcookie-navigation.html",
+ "cookies/samesite/setcookie-navigation.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/setcookie-navigation.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/setcookie-navigation.https.html?legacy-samesite",
{
"timeout": "long"
}
]
],
- "cookies/samesite/window-open-reload.html": [
+ "cookies/samesite/window-open-reload.https.html": [
[
- "cookies/samesite/window-open-reload.html",
+ "cookies/samesite/window-open-reload.https.html",
{}
],
[
- "cookies/samesite/window-open-reload.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/window-open-reload.https.html?legacy-samesite",
{}
]
],
- "cookies/samesite/window-open.html": [
+ "cookies/samesite/window-open.https.html": [
[
- "cookies/samesite/window-open.html",
+ "cookies/samesite/window-open.https.html",
{
"timeout": "long"
}
],
[
- "cookies/samesite/window-open.html?samesite-by-default-cookies.tentative",
+ "cookies/samesite/window-open.https.html?legacy-samesite",
{
"timeout": "long"
}
@@ -312504,6 +312549,12 @@
{}
]
],
+ "css/css-box/parsing/visibility-computed.html": [
+ [
+ "css/css-box/parsing/visibility-computed.html",
+ {}
+ ]
+ ],
"css/css-box/parsing/visibility-invalid.html": [
[
"css/css-box/parsing/visibility-invalid.html",
@@ -316902,6 +316953,24 @@
{}
]
],
+ "css/css-logical/parsing/inset-computed.html": [
+ [
+ "css/css-logical/parsing/inset-computed.html",
+ {}
+ ]
+ ],
+ "css/css-logical/parsing/inset-invalid.html": [
+ [
+ "css/css-logical/parsing/inset-invalid.html",
+ {}
+ ]
+ ],
+ "css/css-logical/parsing/inset-valid.html": [
+ [
+ "css/css-logical/parsing/inset-valid.html",
+ {}
+ ]
+ ],
"css/css-logical/parsing/margin-block-inline-invalid.html": [
[
"css/css-logical/parsing/margin-block-inline-invalid.html",
@@ -332219,6 +332288,12 @@
{}
]
],
+ "element-timing/first-letter-background.html": [
+ [
+ "element-timing/first-letter-background.html",
+ {}
+ ]
+ ],
"element-timing/fixed-id-identifier.html": [
[
"element-timing/fixed-id-identifier.html",
@@ -353649,6 +353724,24 @@
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html": [
+ [
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html": [
+ [
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html": [
+ [
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html": [
[
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html",
@@ -399352,6 +399445,156 @@
{}
]
],
+ "svg/animations/animVal-basics.html": [
+ [
+ "svg/animations/animVal-basics.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-marker-orient-from-angle-to-auto.html": [
+ [
+ "svg/animations/animate-marker-orient-from-angle-to-auto.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html": [
+ [
+ "svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-marker-orient-to-angle.html": [
+ [
+ "svg/animations/animate-marker-orient-to-angle.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-number-calcMode-discrete-keyTimes.html": [
+ [
+ "svg/animations/animate-number-calcMode-discrete-keyTimes.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-number-calcMode-discrete.html": [
+ [
+ "svg/animations/animate-number-calcMode-discrete.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-Cc-Ss.html": [
+ [
+ "svg/animations/animate-path-animation-Cc-Ss.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-Ll-Vv-Hh.html": [
+ [
+ "svg/animations/animate-path-animation-Ll-Vv-Hh.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-Mm-Aa-Z.html": [
+ [
+ "svg/animations/animate-path-animation-Mm-Aa-Z.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-Qq-Tt.html": [
+ [
+ "svg/animations/animate-path-animation-Qq-Tt.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-cC-sS-inverse.html": [
+ [
+ "svg/animations/animate-path-animation-cC-sS-inverse.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-lL-vV-hH-inverse.html": [
+ [
+ "svg/animations/animate-path-animation-lL-vV-hH-inverse.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-mM-aA-Z-inverse.html": [
+ [
+ "svg/animations/animate-path-animation-mM-aA-Z-inverse.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-animation-qQ-tT-inverse.html": [
+ [
+ "svg/animations/animate-path-animation-qQ-tT-inverse.html",
+ {}
+ ]
+ ],
+ "svg/animations/animate-path-to-animation.html": [
+ [
+ "svg/animations/animate-path-to-animation.html",
+ {}
+ ]
+ ],
+ "svg/animations/animateMotion-fill-freeze.html": [
+ [
+ "svg/animations/animateMotion-fill-freeze.html",
+ {}
+ ]
+ ],
+ "svg/animations/animateMotion-fill-remove.html": [
+ [
+ "svg/animations/animateMotion-fill-remove.html",
+ {}
+ ]
+ ],
+ "svg/animations/animateMotion-multiple.html": [
+ [
+ "svg/animations/animateMotion-multiple.html",
+ {}
+ ]
+ ],
+ "svg/animations/animateMotion-still.html": [
+ [
+ "svg/animations/animateMotion-still.html",
+ {}
+ ]
+ ],
+ "svg/animations/animateTransform-pattern-transform.html": [
+ [
+ "svg/animations/animateTransform-pattern-transform.html",
+ {}
+ ]
+ ],
+ "svg/animations/attributeTypes.html": [
+ [
+ "svg/animations/attributeTypes.html",
+ {}
+ ]
+ ],
+ "svg/animations/change-css-property-while-animating-fill-freeze.html": [
+ [
+ "svg/animations/change-css-property-while-animating-fill-freeze.html",
+ {}
+ ]
+ ],
+ "svg/animations/change-css-property-while-animating-fill-remove.html": [
+ [
+ "svg/animations/change-css-property-while-animating-fill-remove.html",
+ {}
+ ]
+ ],
+ "svg/animations/change-target-while-animating-SVG-property.html": [
+ [
+ "svg/animations/change-target-while-animating-SVG-property.html",
+ {}
+ ]
+ ],
+ "svg/animations/cyclic-syncbase.html": [
+ [
+ "svg/animations/cyclic-syncbase.html",
+ {}
+ ]
+ ],
"svg/animations/discard-on-discard.html": [
[
"svg/animations/discard-on-discard.html",
@@ -411752,6 +411995,12 @@
}
]
],
+ "websockets/cookies/third-party-cookie-accepted.https.html": [
+ [
+ "websockets/cookies/third-party-cookie-accepted.https.html",
+ {}
+ ]
+ ],
"websockets/eventhandlers.any.js": [
[
"websockets/eventhandlers.any.html",
@@ -414272,6 +414521,12 @@
{}
]
],
+ "webxr/xrSession_visibilityState.https.html": [
+ [
+ "webxr/xrSession_visibilityState.https.html",
+ {}
+ ]
+ ],
"webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html": [
[
"webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html",
@@ -439895,8 +440150,16 @@
"5c11e4e33a723cc9023fbc314c966294236c3ca4",
"support"
],
- ".github/main.workflow": [
- "20a0f33256d791dcb59a057b319fadd2b58bd663",
+ ".github/workflows/pull_request.yml": [
+ "0bedfe3d42ceadc2ffd32d8c66b9c38c120ab9ca",
+ "support"
+ ],
+ ".github/workflows/push-build-publish-documentation-website.yml": [
+ "de226d173fb300dd07e4ff5855b3fa2b7325434b",
+ "support"
+ ],
+ ".github/workflows/push-build-release-manifest.yml": [
+ "6c97a2f7b9f952a41df100a9982e31617498347b",
"support"
],
".gitignore": [
@@ -446116,7 +446379,7 @@
"support"
],
"README.md": [
- "919676ee21356e5c6b0efb3c88957a7baa3289bb",
+ "3abdf15ca2bea2db47cb958f05f586e238a42ee0",
"support"
],
"WebCryptoAPI/META.yml": [
@@ -474384,7 +474647,7 @@
"testharness"
],
"cookies/resources/cookie-helper.sub.js": [
- "f0ca5d6d245489f1bd01d9e917e922685dc0c51e",
+ "668d0afdba47f2e03257498cc391fc80277ad5f5",
"support"
],
"cookies/resources/drop.py": [
@@ -474440,7 +474703,7 @@
"support"
],
"cookies/resources/setSameSite.py": [
- "fdf7e7193b4847a7f9af264bccf66fc1e2d28a04",
+ "c2045f7dce1de44d75b52909b1c5572a6cf3a99f",
"support"
],
"cookies/resources/setSameSiteNone.py": [
@@ -474459,36 +474722,36 @@
"18cf0516e64ec2c416b013b232d4247b5647b22c",
"testharness"
],
- "cookies/samesite/fetch.html": [
- "6f1d92a6f548b51a38c804a7d3d0da8e8f0c7132",
+ "cookies/samesite/fetch.https.html": [
+ "4daf357004a71cea5b0e58a44bf8919d96ad7ce8",
"testharness"
],
- "cookies/samesite/form-get-blank-reload.html": [
- "5fa8ab975debf22b75abc8220685907690653159",
+ "cookies/samesite/form-get-blank-reload.https.html": [
+ "026254549729cd4b5acc1f0c59833c55aa4e56e2",
"testharness"
],
- "cookies/samesite/form-get-blank.html": [
- "47fc9fa34f72544e131a376e7b0a1a6cc02c060d",
+ "cookies/samesite/form-get-blank.https.html": [
+ "61af99967292abe8249f81d9fcd098c1f51273d7",
"testharness"
],
- "cookies/samesite/form-post-blank-reload.html": [
- "5098dfb4b03f5407faa36a95f4ffe9a5c351a264",
+ "cookies/samesite/form-post-blank-reload.https.html": [
+ "69f720efc5bb129b08beaafeb9bdae2c00239cd2",
"testharness"
],
- "cookies/samesite/form-post-blank.html": [
- "75d6024c75cda60a0d8f7cd28e39e9e3cc3a86fa",
+ "cookies/samesite/form-post-blank.https.html": [
+ "4ffd522b322e158baf7d1877aa5485dc010159b1",
"testharness"
],
- "cookies/samesite/iframe-reload.html": [
- "11d34bb9fcc179f6a745666d4f9d8677168bcdbf",
+ "cookies/samesite/iframe-reload.https.html": [
+ "9bfbdfd64186848df1b7b7165b5799d54c7dc8f7",
"testharness"
],
- "cookies/samesite/iframe.html": [
- "4cce83081e6b571d5ecfeb03220baff0b9da4327",
+ "cookies/samesite/iframe.https.html": [
+ "446b8c50c004a5c6599b73052ba870dac4aa70a9",
"testharness"
],
- "cookies/samesite/img.html": [
- "071c24fb30ef2666651bb9f00f2504db8a709090",
+ "cookies/samesite/img.https.html": [
+ "bf76216e804a36a063308f691e6e48093ae3186f",
"testharness"
],
"cookies/samesite/resources/echo-cookies.html": [
@@ -474496,27 +474759,27 @@
"support"
],
"cookies/samesite/resources/navigate.html": [
- "ef40642a5d467ff66c64792e16191e499c7d5c8c",
+ "7d0f87d49439088dc78883e85cfc5c6bcc291d4e",
"support"
],
"cookies/samesite/resources/puppet.html": [
- "9f4f8e2242c71f8e79ed3424dcbca0c76426b095",
+ "6d36132d3a89abea2f707e520e83a41590dac67a",
"support"
],
- "cookies/samesite/setcookie-lax.html": [
- "04b2ce264c846b5952c038d9db744c2a341563fa",
+ "cookies/samesite/setcookie-lax.https.html": [
+ "0c09577373fd9c7ace1218577209d6d8dd9e1e09",
"testharness"
],
- "cookies/samesite/setcookie-navigation.html": [
- "3663aa28a209f2ff4221b5d89e055a6e09bfe1bf",
+ "cookies/samesite/setcookie-navigation.https.html": [
+ "0c6140c403252771ec2a86ed53dad0d799c54635",
"testharness"
],
- "cookies/samesite/window-open-reload.html": [
- "d8bc112344cff5198b39c1e57986ba746f4e4d64",
+ "cookies/samesite/window-open-reload.https.html": [
+ "9c30bd5ca6760c23803fcf951cd772d8a8b39a1d",
"testharness"
],
- "cookies/samesite/window-open.html": [
- "b7dc8361ec2f4d5b54ec1ba9a9e228a8e721c108",
+ "cookies/samesite/window-open.https.html": [
+ "fe2318acc43d857e0a7890d77b95a80f5b060863",
"testharness"
],
"cookies/secure/set-from-dom.https.sub.html": [
@@ -539516,7 +539779,7 @@
"testharness"
],
"css/css-box/inheritance.html": [
- "22443bf9a94e169a8fce1bd6cfeeead4a12b0ba3",
+ "d18106faf6926c229c6470a90a6f17355bc99474",
"testharness"
],
"css/css-box/parsing/clear-computed.html": [
@@ -539611,6 +539874,10 @@
"ba3c3a7fd4aabdf998fbc39bbd9aee429d9ac564",
"testharness"
],
+ "css/css-box/parsing/visibility-computed.html": [
+ "f6d4c3f8e55f879e132435e267f824d33bf8f8d8",
+ "testharness"
+ ],
"css/css-box/parsing/visibility-invalid.html": [
"73e611b2b80bc8645fd057d8922663573daf6978",
"testharness"
@@ -560083,6 +560350,18 @@
"b08975251d841bda035d1490a32be0543b6d984e",
"testharness"
],
+ "css/css-logical/parsing/inset-computed.html": [
+ "8a08830bd4514d657ddcfbeafb1c6916d3612dc3",
+ "testharness"
+ ],
+ "css/css-logical/parsing/inset-invalid.html": [
+ "604b801c76040a5058612fd19c75ee66107081ed",
+ "testharness"
+ ],
+ "css/css-logical/parsing/inset-valid.html": [
+ "2d8f937f075b0d0fbde677e15266f47af5fec3f8",
+ "testharness"
+ ],
"css/css-logical/parsing/margin-block-inline-invalid.html": [
"a1e0cbf3885b6518266eba0ef23d40f53a0c5c20",
"testharness"
@@ -586579,6 +586858,14 @@
"5c55ff9fbf6fd993aaf51114c175414a9ec8fe0b",
"reftest"
],
+ "css/css-ui/appearance-textfield-001-ref.html": [
+ "5304352e6bafd1d25436babfc2afc0ba1aa26fa3",
+ "support"
+ ],
+ "css/css-ui/appearance-textfield-001.html": [
+ "f2ca6fc6ac752085ef9bbf3593b94097a8c47c81",
+ "reftest"
+ ],
"css/css-ui/box-sizing-001.html": [
"545403f535d2f33993558bde9086e8798c04c11f",
"reftest"
@@ -589179,6 +589466,10 @@
"cf3a15f4db6c9745de687cb38f593132d5ddf2f8",
"reftest"
],
+ "css/css-ui/webkit-appearance-textfield-001.html": [
+ "058e1be83bbf924d949f6b9665e456dbb932d388",
+ "reftest"
+ ],
"css/css-values/META.yml": [
"a22882a9996b14afa942d3403fa1a873f526073a",
"support"
@@ -612352,7 +612643,7 @@
"support"
],
"docs/reviewing-tests/index.md": [
- "47deed0d6197ab5925b5f69b9fa028bd0f13cb12",
+ "2f6ee822fcc480e2c1e519c6d236ac58082f9e2e",
"support"
],
"docs/reviewing-tests/reverting.md": [
@@ -612392,7 +612683,7 @@
"support"
],
"docs/test-suite-design.md": [
- "b0c1f1f7e15c58bf322ffa986643630bb7e0817a",
+ "adc6810f38f3fa5cea562e5c1f39c3da2e6c7aef",
"support"
],
"docs/writing-tests/ahem.md": [
@@ -612420,7 +612711,7 @@
"support"
],
"docs/writing-tests/github-intro.md": [
- "95d9884a29091347e19349698534f1d8de86d7cc",
+ "44b6828ad3c83f1510c92ffab3d5b561e47469ce",
"support"
],
"docs/writing-tests/h2tests.md": [
@@ -612468,7 +612759,7 @@
"support"
],
"docs/writing-tests/submission-process.md": [
- "dfc73ffadef64e7da6f69443566b8e737ffe4441",
+ "4ff99b8c16afbc2c8d083a9194f9281cff13577d",
"support"
],
"docs/writing-tests/test-templates.md": [
@@ -612484,7 +612775,7 @@
"support"
],
"docs/writing-tests/testharness-api.md": [
- "329359caad6bb8f1764206d902f86380f1cc5780",
+ "3c1e80dc83b1c616f362d92b9cbd7a52ab58141d",
"support"
],
"docs/writing-tests/testharness.md": [
@@ -614915,6 +615206,10 @@
"5608685a34219d831dd6c57743e829967d3ed247",
"testharness"
],
+ "element-timing/first-letter-background.html": [
+ "51e82d473e160ec3e6e133e0fcf67e8a371079a1",
+ "testharness"
+ ],
"element-timing/fixed-id-identifier.html": [
"00d6d4dd94c466939dbbabb93bbe5ef9f29b86e1",
"testharness"
@@ -633935,6 +634230,18 @@
"0934adfa82ac83ae4c7bed1fd490ab7f3c290230",
"testharness"
],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html": [
+ "7a94f1ce4a867ce98ddb2429b87d12c18c98d31a",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html": [
+ "7026edf8f92b680105abd850a453bd9b24a526ac",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html": [
+ "e9d1def099e3a37a61dcbf45f829fc6843fd6852",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html": [
"12c4e0ca50236caacae89c76da3b81effd7b44be",
"testharness"
@@ -634183,6 +634490,10 @@
"4b8930de42ff5455a17185afc9d7923025a066a7",
"support"
],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-history.html": [
+ "c4ba8011f9d288b488dcbd97d8499bcd0d37c152",
+ "support"
+ ],
"html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html": [
"50edc878adbbc362fb1a02e2a5facbfd1522259a",
"support"
@@ -642044,7 +642355,7 @@
"support"
],
"interfaces/dom.idl": [
- "9da68c4b7f82c5fc1cea6076884cfd00c4e36e6c",
+ "285e5f00b87e4033374024f705ccc78cd56364c7",
"support"
],
"interfaces/element-timing.idl": [
@@ -642072,7 +642383,7 @@
"support"
],
"interfaces/fetch.idl": [
- "5f876e7a4ac439828ac54d11d71554beca40ef6e",
+ "f529c4501bf484f57858ab2eb616a9d42aea766f",
"support"
],
"interfaces/filter-effects.idl": [
@@ -642100,7 +642411,7 @@
"support"
],
"interfaces/geolocation-sensor.idl": [
- "074d7bb9731524b5fd79f689fe748b4b2a135336",
+ "0083cdac19828f31de79d140d50e60d330417661",
"support"
],
"interfaces/geometry.idl": [
@@ -642120,7 +642431,7 @@
"support"
],
"interfaces/html.idl": [
- "47abcda810a1f94f5704623db63fdec9805cc9c9",
+ "6dfb39215d0fec30d56027b16cc1c5b620eba0bc",
"support"
],
"interfaces/image-capture.idl": [
@@ -642156,7 +642467,7 @@
"support"
],
"interfaces/magnetometer.idl": [
- "fd29af847679dcca3c4d2d3eedf56d1cf9af89ff",
+ "be6cbc9d47a8da6a16613c8d88bbc824e7372de3",
"support"
],
"interfaces/media-capabilities.idl": [
@@ -642184,7 +642495,7 @@
"support"
],
"interfaces/mediasession.idl": [
- "5466300b6b48829493518fd4dd9f995509d7d337",
+ "237cea53adf296d8e626e6828847df80c8cda41a",
"support"
],
"interfaces/mediastream-recording.idl": [
@@ -642204,7 +642515,7 @@
"support"
],
"interfaces/notifications.idl": [
- "459d96bd30fc8f3386be43660540eaedfea61a6f",
+ "1a55c31bb04c0ab11946a90f374fdf07e268ad05",
"support"
],
"interfaces/orientation-event.idl": [
@@ -642212,7 +642523,7 @@
"support"
],
"interfaces/orientation-sensor.idl": [
- "a9aec968e0a072df3bf1eb1452045958f693bc96",
+ "9ee099881b0a59ca69da02e9aa3d1886e4bc05bc",
"support"
],
"interfaces/page-visibility.idl": [
@@ -642320,7 +642631,7 @@
"support"
],
"interfaces/service-workers.idl": [
- "8e37060a180328d937d26623aaa030ad434eacc6",
+ "0feabd389cf556a6ff6d3978fd23e2e288624054",
"support"
],
"interfaces/shape-detection-api.idl": [
@@ -642352,7 +642663,7 @@
"support"
],
"interfaces/user-timing.idl": [
- "8b0f813ba8e6efc34b979ac7323afcbcac41e72b",
+ "20fb2db9caac7ae112144f76e232da4836aa0e94",
"support"
],
"interfaces/vibration.idl": [
@@ -667147,6 +667458,10 @@
"ef8f91bc61fac62f311e55cbd5c4d184af0c64ad",
"support"
],
+ "resources/test/tests/unit/format-value.html": [
+ "13d01b81f351801e4d7dbb2d03ca68d1b594bff2",
+ "support"
+ ],
"resources/test/tests/unit/late-test.html": [
"693d7e3c818ed7fbc5503d09c91b9da7f7139bac",
"support"
@@ -672835,6 +673150,106 @@
"ee86b537ae987483687cc8ba6181db82f99ab162",
"support"
],
+ "svg/animations/animVal-basics.html": [
+ "7eb968af01e0b23fa270a71f8788415ea3eed049",
+ "testharness"
+ ],
+ "svg/animations/animate-marker-orient-from-angle-to-auto.html": [
+ "40fc57b4f3c9bdc2c9a68e59c1d15495cc445124",
+ "testharness"
+ ],
+ "svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html": [
+ "fedfe4a8c2818a335fe26ff5a7e6cce52abef02a",
+ "testharness"
+ ],
+ "svg/animations/animate-marker-orient-to-angle.html": [
+ "6b4ba2bfef2fd6bbd15d05b47a97f8b2d4adf5c2",
+ "testharness"
+ ],
+ "svg/animations/animate-number-calcMode-discrete-keyTimes.html": [
+ "0e80e03f887ba2de095e8f65bd6e952767350248",
+ "testharness"
+ ],
+ "svg/animations/animate-number-calcMode-discrete.html": [
+ "11563233b4f228325efb15ce9f9ba8d9ef71eece",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-Cc-Ss.html": [
+ "63c450a6c70cacae1688a5bf4862190c178eb770",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-Ll-Vv-Hh.html": [
+ "4f6d85421a64863c604de1b43d0f638cc0c29fcc",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-Mm-Aa-Z.html": [
+ "777ca30137576f04fa300a35896b2e325bff0d80",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-Qq-Tt.html": [
+ "d964303fa2ded2efcece490376c08063b255b7f2",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-cC-sS-inverse.html": [
+ "709372706d87679c36d717ad48d27c9f01c4e43e",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-lL-vV-hH-inverse.html": [
+ "a5c6e88a1b9154822678c7c5c2aeb1d48445dbcd",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-mM-aA-Z-inverse.html": [
+ "3e7e6e3199a19f5c30cff0a11d42e1457e087146",
+ "testharness"
+ ],
+ "svg/animations/animate-path-animation-qQ-tT-inverse.html": [
+ "85b98d4d5fee9dd03f71194e72479c9b43cf4a8d",
+ "testharness"
+ ],
+ "svg/animations/animate-path-to-animation.html": [
+ "769113ce4907aeee04146014927aec1a8c385784",
+ "testharness"
+ ],
+ "svg/animations/animateMotion-fill-freeze.html": [
+ "4e768efb0046972fdb62f9af6545134d97a9495c",
+ "testharness"
+ ],
+ "svg/animations/animateMotion-fill-remove.html": [
+ "aeb74b4b0f22f14dca63e0c82a08da28bc88d1b8",
+ "testharness"
+ ],
+ "svg/animations/animateMotion-multiple.html": [
+ "494d75a78550b40b7618f951b3cb81ec8c92fe55",
+ "testharness"
+ ],
+ "svg/animations/animateMotion-still.html": [
+ "bf9007ac2f38fe9dbe85a9f56de28358ecb82b91",
+ "testharness"
+ ],
+ "svg/animations/animateTransform-pattern-transform.html": [
+ "614444bf71c63bdef13226a3c8208625ec364517",
+ "testharness"
+ ],
+ "svg/animations/attributeTypes.html": [
+ "7a9ad43dd98e00f7e2af4957365441a29aedf8e6",
+ "testharness"
+ ],
+ "svg/animations/change-css-property-while-animating-fill-freeze.html": [
+ "6774c3475a681f9fc91e8280ded739e9e65f4606",
+ "testharness"
+ ],
+ "svg/animations/change-css-property-while-animating-fill-remove.html": [
+ "a4e8a3ac40724c46fbf69b4038a279318a9067f6",
+ "testharness"
+ ],
+ "svg/animations/change-target-while-animating-SVG-property.html": [
+ "68aa63a39d3acf927de8f2fae47c7b2ceac9e4a9",
+ "testharness"
+ ],
+ "svg/animations/cyclic-syncbase.html": [
+ "c0351156e310a8a6f0fca3ebee506b80983a53bb",
+ "testharness"
+ ],
"svg/animations/discard-on-discard.html": [
"4a6b9f9368dcb020120f502e4528860beb5f14c6",
"testharness"
@@ -685804,7 +686219,7 @@
"testharness"
],
"web-animations/animation-model/combining-effects/effect-composition.html": [
- "78f46c9e4684b4d7a7144ca071451069101c8a55",
+ "02c2fe1b3b8c8b13158ab942f0d15143a6571a58",
"testharness"
],
"web-animations/animation-model/keyframe-effects/computed-keyframes-shorthands.html": [
@@ -690139,6 +690554,14 @@
"8a47d7cdd8ea0542d68f1cf5a2a76e609efb5727",
"support"
],
+ "websockets/cookies/support/websocket-cookies-helper.sub.js": [
+ "a7fae2551e48a5d1ec35274e5e3c3a29632f7cfb",
+ "support"
+ ],
+ "websockets/cookies/third-party-cookie-accepted.https.html": [
+ "208d297016fffca84a22d8b8b06b3c6dc64f088d",
+ "testharness"
+ ],
"websockets/eventhandlers.any.js": [
"b30b0b693f49a8bfecfa52db1c32c45b8fc25fed",
"testharness"
@@ -690227,6 +690650,10 @@
"3cec1c041cf11ebfa72503d93ecd557d12459526",
"support"
],
+ "websockets/handlers/set-cookies-samesite_wsh.py": [
+ "6f4a1b46c2cc7c9c05f73431c5e0b2513be690b2",
+ "support"
+ ],
"websockets/handlers/simple_handshake_wsh.py": [
"a1aa2498a88f336c4f4b319c3f755013c81e60de",
"support"
@@ -694100,7 +694527,7 @@
"support"
],
"webxr/events_input_source_recreation.https.html": [
- "ab78d9d8fda41b821e26976351a2a77a123b524b",
+ "ecb4b022bf09410cae44b4f5a3c71bc5c054181e",
"testharness"
],
"webxr/events_input_sources_change.https.html": [
@@ -694327,6 +694754,10 @@
"fd6082bc3468f094953152d220fceafa083baf76",
"testharness"
],
+ "webxr/xrSession_visibilityState.https.html": [
+ "ebad10095e665cceee34d28004ebf25e06687eeb",
+ "testharness"
+ ],
"webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html": [
"aa3c1b85c5d8ef550b9a835d384c67f602e290e9",
"testharness"
diff --git a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-001.html.ini b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-001.html.ini
index 40dc50bd5e7..5d20389c8e9 100644
--- a/tests/wpt/metadata/css/css-transitions/properties-value-inherit-001.html.ini
+++ b/tests/wpt/metadata/css/css-transitions/properties-value-inherit-001.html.ini
@@ -56,9 +56,3 @@
[background-position length(px) / events]
expected: FAIL
- [font-size length(em) / values]
- expected: FAIL
-
- [font-size length(em) / events]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini
index 2178309df75..8850ec200da 100644
--- a/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini
+++ b/tests/wpt/metadata/css/css-transitions/transitions-animatable-properties-01.html.ini
@@ -71,3 +71,6 @@
[text-indent intermediate]
expected: FAIL
+ [opacity end]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini b/tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini
new file mode 100644
index 00000000000..e6e1f29e274
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini
@@ -0,0 +1,2 @@
+[matchMedia-display-none-iframe.html]
+ expected: ERROR
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 c5e7dd9675d..032451b7dfa 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -312,3 +312,21 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
+ [<iframe>: combined response Content-Type: text/html;" text/plain]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: */* text/html]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/html */*]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html;x=" text/plain]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/content-type/script.window.js.ini b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
index 5c001592859..c7413d589dc 100644
--- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
@@ -59,3 +59,6 @@
[separate text/javascript;charset=windows-1252 error text/javascript]
expected: FAIL
+ [separate text/javascript;charset=windows-1252 text/javascript]
+ 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 a639f15230c..87c807a49ff 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,6 +11,3 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
- [Content-Type-Options%3A%20nosniff]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
new file mode 100644
index 00000000000..385376c7321
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_4.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini
index e02f179ec25..bf50d59df41 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-innerwidth-innerheight.html.ini
@@ -1,24 +1,5 @@
[open-features-negative-innerwidth-innerheight.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `innerwidth`, `innerheight`]
expected: FAIL
- [features "innerheight=-404.5" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "innerwidth=-404.5" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "innerwidth=-404" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "innerheight=-404e1" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "innerheight=-404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "innerwidth=-404e1" should NOT set "width=404"]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
index 23eefb8eaf9..e150c9d848f 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini
@@ -1,24 +1,5 @@
[open-features-negative-screenx-screeny.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `screenx`, `screeny`]
expected: FAIL
- [features "screenx=-204" should NOT set "left=204"]
- expected: TIMEOUT
-
- [features "screeny=-204" should NOT set "top=204"]
- expected: TIMEOUT
-
- [features "screeny=-204.5" should NOT set "top=204"]
- expected: TIMEOUT
-
- [features "screeny=-0" should NOT set "top=204"]
- expected: TIMEOUT
-
- [features "screenx=-0" should NOT set "left=204"]
- expected: TIMEOUT
-
- [features "screenx=-204.5" should NOT set "left=204"]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
index 940516ddd33..ad8840fbb68 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini
@@ -1,24 +1,5 @@
[open-features-negative-top-left.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: negative values for `top`, `left`]
expected: FAIL
- [features "top=-204" should NOT set "top=204"]
- expected: TIMEOUT
-
- [features "top=-204.5" should NOT set "top=204"]
- expected: TIMEOUT
-
- [features "left=-204" should NOT set "left=204"]
- expected: TIMEOUT
-
- [features "top=-0" should NOT set "top=204"]
- expected: TIMEOUT
-
- [features "left=-204.5" should NOT set "left=204"]
- expected: TIMEOUT
-
- [features "left=-0" should NOT set "left=204"]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
index 9027336b453..d1ed9088b2b 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini
@@ -1,24 +1,5 @@
[open-features-negative-width-height.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: negative values for `width`, `height`]
expected: FAIL
- [features "height=-404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "height=-404e1" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "height=-404.5" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "width=-404" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "width=-404e1" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "width=-404.5" should NOT set "width=404"]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
index 4e44584b123..a70e9dbad4d 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini
@@ -1,48 +1,32 @@
[open-features-non-integer-height.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `height`]
expected: FAIL
[features "height=405*3" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405.32" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405e1" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405/5" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405^4" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405.5" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405e-1" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405 " should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "height=405LLl" should set "height=405"]
- expected: TIMEOUT
-
- [features "height=/404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [top=0,left=0,width=401,: absence of feature "height" should be treated same as "height=0"]
- expected: TIMEOUT
-
- [top=0,left=0: absence of feature "height" should be treated same as "height=0"]
- expected: TIMEOUT
-
- [features "height=_404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "height=L404" should NOT set "height=404"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
index fcaeae5336d..779531b4a98 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini
@@ -1,42 +1,32 @@
[open-features-non-integer-innerheight.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerheight`]
expected: FAIL
[features "innerheight=405e-1" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405LLl" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405^4" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405e1" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405 " should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405/5" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405.32" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405.5" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerheight=405*3" should set "height=405"]
- expected: TIMEOUT
-
- [features "innerheight=_404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "innerheight=L404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "innerheight=/404" should NOT set "height=404"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
index 42327fedd27..7a1b258d52e 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini
@@ -1,42 +1,32 @@
[open-features-non-integer-innerwidth.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerwidth`]
expected: FAIL
[features "innerwidth=405e-1" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405*3" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405.5" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405e1" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405.32" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405 " should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405LLl" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405/5" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "innerwidth=405^4" should set "width=405"]
- expected: TIMEOUT
-
- [features "innerwidth=/404" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "innerwidth=_404" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "innerwidth=L404" should NOT set "width=404"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini
index a8e4fe06618..caba4124f0b 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-left.html.ini
@@ -1,42 +1,32 @@
[open-features-non-integer-left.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `left`]
expected: FAIL
[features "left=105e1" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105 " should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105/5" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105e-1" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105^4" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105LLl" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105.32" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105*3" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "left=105.5" should set "left=105"]
- expected: TIMEOUT
-
- [features "left=L104" should NOT set "left=104"]
- expected: TIMEOUT
-
- [features "left=/104" should NOT set "left=104"]
- expected: TIMEOUT
-
- [features "left=_104" should NOT set "left=104"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
index 64a08faf0e6..9ace8a4cbdb 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini
@@ -1,42 +1,32 @@
[open-features-non-integer-screenx.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screenx`]
expected: FAIL
[features "screenx=105.5" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105e1" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105 " should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105*3" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105e-1" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105^4" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105LLl" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105/5" should set "left=105"]
- expected: TIMEOUT
+ expected: FAIL
[features "screenx=105.32" should set "left=105"]
- expected: TIMEOUT
-
- [features "screenx=_104" should NOT set "left=104"]
- expected: TIMEOUT
-
- [features "screenx=L104" should NOT set "left=104"]
- expected: TIMEOUT
-
- [features "screenx=/104" should NOT set "left=104"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
index 4f22ef4ef29..a82bd0f981a 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini
@@ -1,42 +1,32 @@
[open-features-non-integer-screeny.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screeny`]
expected: FAIL
[features "screeny=405^4" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405e-1" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405LLl" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405e1" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405 " should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405/5" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405*3" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405.32" should set "height=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "screeny=405.5" should set "height=405"]
- expected: TIMEOUT
-
- [features "screeny=_404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "screeny=L404" should NOT set "height=404"]
- expected: TIMEOUT
-
- [features "screeny=/404" should NOT set "height=404"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
index 9d841e61bc0..28f93ee71b5 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini
@@ -1,48 +1,32 @@
[open-features-non-integer-width.html]
type: testharness
- expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `width`]
expected: FAIL
[features "width=405^4" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405.5" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405e1" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405 " should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405.32" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405LLl" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405*3" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405e-1" should set "width=405"]
- expected: TIMEOUT
+ expected: FAIL
[features "width=405/5" should set "width=405"]
- expected: TIMEOUT
-
- [top=0,left=0: absence of feature "width" should be treated same as "width=0"]
- expected: TIMEOUT
-
- [features "width=_404" should NOT set "width=404"]
- expected: TIMEOUT
-
- [top=0,left=0,height=401,: absence of feature "width" should be treated same as "width=0"]
- expected: TIMEOUT
-
- [features "width=/404" should NOT set "width=404"]
- expected: TIMEOUT
-
- [features "width=L404" should NOT set "width=404"]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html.ini
new file mode 100644
index 00000000000..fb938b5617b
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html.ini
@@ -0,0 +1,4 @@
+[iframe_sandbox_navigate_history_go_back.html]
+ [Check that sandboxed iframe can not navigate their ancestors]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini
new file mode 100644
index 00000000000..0ec596f3856
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini
@@ -0,0 +1,4 @@
+[iframe_sandbox_navigate_history_go_forward.html]
+ [Check that sandboxed iframe can not navigate their ancestors]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
new file mode 100644
index 00000000000..9e522297c94
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini
@@ -0,0 +1,7 @@
+[toggleEvent.html]
+ [Calling open twice on 'details' fires only one toggle event]
+ expected: FAIL
+
+ [Setting open=true to opened 'details' element should not fire a toggle event at the 'details' element]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini b/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini
deleted file mode 100644
index a9677391662..00000000000
--- a/tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[DOMContentLoaded-defer.html]
- [The end: DOMContentLoaded and defer scripts]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
index 496bad988c6..034d9baebfa 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini
@@ -1,4 +1,5 @@
[promise-rejection-events.html]
+ expected: TIMEOUT
[delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire]
expected: FAIL
@@ -8,3 +9,6 @@
[no unhandledrejection/rejectionhandled: rejection handler attached synchronously to a promise created from createImageBitmap]
expected: FAIL
+ [rejectionhandled is dispatched from a queued task, and not immediately]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
index a56bad443a2..66bd350083b 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
@@ -1,5 +1,4 @@
[realtimeanalyser-fft-scaling.html]
- expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
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 db4b28e9619..6395762198b 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
@@ -191,3 +191,9 @@
[X Stitched sine-wave buffers at sample rate 43800 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.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t9.4836157560348511e-1\t9.5236867666244507e-1\t4.0071010589599609e-3\t4.2075103446311962e-3\t3.8985999999999999e-3\n\t[31\]\t9.2646563053131104e-1\t9.3139332532882690e-1\t4.9276947975158691e-3\t5.2906700783754857e-3\t3.8985999999999999e-3\n\t[32\]\t9.0087991952896118e-1\t9.0675884485244751e-1\t5.8789253234863281e-3\t6.4834496590358351e-3\t3.8985999999999999e-3\n\t[33\]\t8.7170630693435669e-1\t8.7856203317642212e-1\t6.8557262420654297e-3\t7.8033490899654511e-3\t3.8985999999999999e-3\n\t[34\]\t8.3906102180480957e-1\t8.4691369533538818e-1\t7.8526735305786133e-3\t9.2721059699818163e-3\t3.8985999999999999e-3\n\t...and 31037 more errors.\n\tMax AbsError of 9.8276454210281372e-1 at index of 39267.\n\t[39267\]\t-2.1306337878227066e-23\t-9.8276454210281372e-1\t9.8276454210281372e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\tMax RelError of 3.3137802965303198e+0 at index of 1253.\n\t[1253\]\t-4.3022233992815018e-2\t-9.9732093513011932e-3\t3.3049024641513824e-2\t3.3137802965303198e+0\t3.8985999999999999e-3\n]
expected: FAIL
+ [X Stitched sine-wave buffers at sample rate 43800 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.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t9.4836157560348511e-1\t9.5236867666244507e-1\t4.0071010589599609e-3\t4.2075103446311962e-3\t3.8985999999999999e-3\n\t[31\]\t9.2646563053131104e-1\t9.3139332532882690e-1\t4.9276947975158691e-3\t5.2906700783754857e-3\t3.8985999999999999e-3\n\t[32\]\t9.0087991952896118e-1\t9.0675884485244751e-1\t5.8789253234863281e-3\t6.4834496590358351e-3\t3.8985999999999999e-3\n\t[33\]\t8.7170630693435669e-1\t8.7856203317642212e-1\t6.8557262420654297e-3\t7.8033490899654511e-3\t3.8985999999999999e-3\n\t[34\]\t8.3906102180480957e-1\t8.4691369533538818e-1\t7.8526735305786133e-3\t9.2721059699818163e-3\t3.8985999999999999e-3\n\t...and 31037 more errors.\n\tMax AbsError of 9.8016768693923950e-1 at index of 39267.\n\t[39267\]\t-2.5968551635742188e-3\t-9.8276454210281372e-1\t9.8016768693923950e-1\t9.9735760189514189e-1\t3.8985999999999999e-3\n\tMax RelError of 3.3137802965303198e+0 at index of 1253.\n\t[1253\]\t-4.3022233992815018e-2\t-9.9732093513011932e-3\t3.3049024641513824e-2\t3.3137802965303198e+0\t3.8985999999999999e-3\n]
+ expected: FAIL
+
+ [X SNR (21.44080528729615 dB) is not greater than or equal to 65.737. Got 21.44080528729615.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
index 27f6c5ed7a2..6ff00c31bef 100644
--- a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
@@ -1,5 +1,5 @@
[xrBoundedReferenceSpace_updates.https.html]
- expected: ERROR
+ expected: TIMEOUT
['XRBoundedReferenceSpace updates properly when the changes are applied]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/webxr/xrSession_visibilityState.https.html.ini b/tests/wpt/metadata/webxr/xrSession_visibilityState.https.html.ini
new file mode 100644
index 00000000000..ad979f41d3a
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_visibilityState.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_visibilityState.https.html]
+ [Ensures that the XRSession's visibilityState is correctly reported and that the associated visibilitychange event fires.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini
new file mode 100644
index 00000000000..fe8654e447c
--- /dev/null
+++ b/tests/wpt/metadata/workers/WorkerGlobalScope-close.html.ini
@@ -0,0 +1,4 @@
+[WorkerGlobalScope-close.html]
+ [Test sending a message after closing.]
+ expected: FAIL
+
diff --git a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini
deleted file mode 100644
index dbea4f293ad..00000000000
--- a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[transition_calc_implicit.html]
- expected: TIMEOUT
diff --git a/tests/wpt/web-platform-tests/.github/main.workflow b/tests/wpt/web-platform-tests/.github/main.workflow
deleted file mode 100644
index 20a0f33256d..00000000000
--- a/tests/wpt/web-platform-tests/.github/main.workflow
+++ /dev/null
@@ -1,32 +0,0 @@
-workflow "Build & Release Manifest" {
- on = "push"
- resolves = ["manifest-build-and-tag"]
-}
-
-action "manifest-build-and-tag" {
- uses = "./tools/docker/github"
- runs = ["python", "tools/ci/manifest_build.py"]
- secrets = ["GITHUB_TOKEN"]
-}
-
-workflow "Build & Publish Documentation Website" {
- on = "push"
- resolves = ["website-build-and-publish"]
-}
-
-action "website-build-and-publish" {
- uses = "./tools/docker/documentation"
- runs = ["/bin/bash", "tools/ci/website_build.sh"]
- secrets = ["DEPLOY_TOKEN"]
-}
-
-workflow "Synchronize the Pull Request Preview" {
- on = "pull_request"
- resolves = "update-pr-preview"
-}
-
-action "update-pr-preview" {
- uses = "./tools/docker/github"
- runs = ["python", "tools/ci/update_pr_preview.py", "https://api.github.com"]
- secrets = ["GITHUB_TOKEN"]
-}
diff --git a/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml b/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml
new file mode 100644
index 00000000000..0bedfe3d42c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml
@@ -0,0 +1,14 @@
+on: pull_request
+name: Synchronize the Pull Request Preview
+jobs:
+ update-pr-preview:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@master
+ - name: update-pr-preview
+ uses: ./tools/docker/github
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ entrypoint: python
+ args: tools/ci/update_pr_preview.py https://api.github.com
diff --git a/tests/wpt/web-platform-tests/.github/workflows/push-build-publish-documentation-website.yml b/tests/wpt/web-platform-tests/.github/workflows/push-build-publish-documentation-website.yml
new file mode 100644
index 00000000000..de226d173fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/.github/workflows/push-build-publish-documentation-website.yml
@@ -0,0 +1,14 @@
+on: push
+name: Build & Publish Documentation Website
+jobs:
+ website-build-and-publish:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@master
+ - name: website-build-and-publish
+ uses: ./tools/docker/documentation
+ env:
+ DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
+ with:
+ entrypoint: /bin/bash
+ args: tools/ci/website_build.sh
diff --git a/tests/wpt/web-platform-tests/.github/workflows/push-build-release-manifest.yml b/tests/wpt/web-platform-tests/.github/workflows/push-build-release-manifest.yml
new file mode 100644
index 00000000000..6c97a2f7b9f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/.github/workflows/push-build-release-manifest.yml
@@ -0,0 +1,14 @@
+on: push
+name: Build & Release Manifest
+jobs:
+ manifest-build-and-tag:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@master
+ - name: manifest-build-and-tag
+ uses: ./tools/docker/github
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ entrypoint: python
+ args: tools/ci/manifest_build.py
diff --git a/tests/wpt/web-platform-tests/README.md b/tests/wpt/web-platform-tests/README.md
index 919676ee213..3abdf15ca2b 100644
--- a/tests/wpt/web-platform-tests/README.md
+++ b/tests/wpt/web-platform-tests/README.md
@@ -191,23 +191,6 @@ that modify sensitive resources (such as `.py`). The latter require
someone with merge access to comment with "LGTM" or "w3c-test:mirror" to
indicate the pull request has been checked.
-Finding Things
-==============
-
-Each top-level directory matches the shortname used by a standard, with
-some exceptions. (Typically the shortname is from the standard's
-corresponding GitHub repository.)
-
-For some of the specifications, the tree under the top-level directory
-represents the sections of the respective documents, using the section
-IDs for directory names, with a maximum of three levels deep.
-
-So if you're looking for tests in HTML for "The History interface",
-they will be under `html/browsers/history/the-history-interface/`.
-
-Various resources that tests depend on are in `common`, `images`, and
-`fonts`.
-
Branches
========
@@ -269,31 +252,6 @@ For more details, see the [lint-tool documentation][lint-tool].
[lint-tool]: https://web-platform-tests.org/writing-tests/lint-tool.html
-Test Review
-===========
-
-We can sometimes take a little while to go through pull requests
-because we have to go through all the tests and ensure that they match
-the specification correctly. But we look at all of them, and take
-everything that we can.
-
-META.yml files are used only to indicate who should be notified of pull
-requests. If you are interested in receiving notifications of proposed
-changes to tests in a given directory, feel free to add yourself to the
-META.yml file. Anyone with expertise in the specification under test can
-approve a pull request. In particular, if a test change has already
-been adequately reviewed "upstream" in another repository, it can be
-pushed here without any further review by supplying a link to the
-upstream review.
-
-Search filters to find things to review:
-
-* [Open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
-* [Reviewed but still open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3Amozilla%3Agecko-sync+-label%3Achromium-export+-label%3Awebkit-export+-label%3Aservo-export+-label%3Avendor-imports+review%3Aapproved+-label%3A%22do+not+merge+yet%22+-label%3A%22status%3Aneeds-spec-decision%22) (Merge? Something left to fix? Ping other reviewer?)
-* [Open PRs without reviewers](https://github.com/web-platform-tests/wpt/pulls?q=is%3Apr+is%3Aopen+label%3Astatus%3Aneeds-reviewers)
-* [Open PRs with label `infra` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Ainfra+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
-* [Open PRs with label `docs` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Adocs+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
-
Getting Involved
================
diff --git a/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js b/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js
index f0ca5d6d245..668d0afdba4 100644
--- a/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js
+++ b/tests/wpt/web-platform-tests/cookies/resources/cookie-helper.sub.js
@@ -2,21 +2,15 @@
(_ => {
var HOST = "{{host}}";
var SECURE_PORT = ":{{ports[https][0]}}";
- var PORT = ":{{ports[http][0]}}";
var CROSS_ORIGIN_HOST = "{{hosts[alt][]}}";
- var SECURE_CROSS_ORIGIN_HOST = "{{hosts[alt][]}}";
//For secure cookie verification
window.SECURE_ORIGIN = "https://" + HOST + SECURE_PORT;
- window.INSECURE_ORIGIN = "http://" + HOST + PORT;
//standard references
- window.ORIGIN = "http://" + HOST + PORT;
- window.WWW_ORIGIN = "http://{{domains[www]}}" + PORT;
- window.SUBDOMAIN_ORIGIN = "http://{{domains[www1]}}" + PORT;
- window.CROSS_SITE_ORIGIN = "http://" + CROSS_ORIGIN_HOST + PORT;
- window.SECURE_CROSS_SITE_ORIGIN = "https://" + SECURE_CROSS_ORIGIN_HOST + SECURE_PORT;
- window.CROSS_SITE_HOST = SECURE_CROSS_ORIGIN_HOST;
+ window.SECURE_SUBDOMAIN_ORIGIN = "https://{{domains[www1]}}" + SECURE_PORT;
+ window.SECURE_CROSS_SITE_ORIGIN = "https://" + CROSS_ORIGIN_HOST + SECURE_PORT;
+ window.CROSS_SITE_HOST = CROSS_ORIGIN_HOST;
// Set the global cookie name.
window.HTTP_COOKIE = "cookie_via_http";
@@ -159,8 +153,9 @@ async function resetSameSiteCookies(origin, value) {
}
// Given an |expectedStatus| and |expectedValue|, assert the |cookies| contains the
-// proper set of cookie names and values.
-function verifySameSiteCookieState(expectedStatus, expectedValue, cookies) {
+// proper set of cookie names and values, according to the legacy behavior where
+// unspecified SameSite attribute defaults to SameSite=None behavior.
+function verifySameSiteCookieStateLegacy(expectedStatus, expectedValue, cookies) {
assert_equals(cookies["samesite_none"], expectedValue, "SameSite=None cookies are always sent.");
assert_equals(cookies["samesite_unspecified"], expectedValue, "Unspecified-SameSite cookies are always sent.");
if (expectedStatus == SameSiteStatus.CROSS_SITE) {
@@ -195,10 +190,14 @@ function verifySameSiteCookieStateWithSameSiteByDefault(expectedStatus, expected
}
}
+function isLegacySameSite() {
+ return location.search === "?legacy-samesite";
+}
+
// Get the proper verifier based on the test's variant type.
function getSameSiteVerifier() {
- return (location.search && location.search === "?samesite-by-default-cookies.tentative") ?
- verifySameSiteCookieStateWithSameSiteByDefault : verifySameSiteCookieState;
+ return isLegacySameSite() ?
+ verifySameSiteCookieStateLegacy : verifySameSiteCookieStateWithSameSiteByDefault;
}
//
diff --git a/tests/wpt/web-platform-tests/cookies/resources/setSameSite.py b/tests/wpt/web-platform-tests/cookies/resources/setSameSite.py
index fdf7e7193b4..c2045f7dce1 100644
--- a/tests/wpt/web-platform-tests/cookies/resources/setSameSite.py
+++ b/tests/wpt/web-platform-tests/cookies/resources/setSameSite.py
@@ -13,7 +13,8 @@ def main(request, response):
headers.append(("Content-Type", "text/html; charset=utf-8"))
headers.append(makeCookieHeader("samesite_strict", value, {"SameSite":"Strict","path":"/"}))
headers.append(makeCookieHeader("samesite_lax", value, {"SameSite":"Lax","path":"/"}))
- headers.append(makeCookieHeader("samesite_none", value, {"SameSite":"None", "path":"/"}))
+ # SameSite=None cookies must be Secure.
+ headers.append(makeCookieHeader("samesite_none", value, {"SameSite":"None", "path":"/", "Secure": ""}))
headers.append(makeCookieHeader("samesite_unspecified", value, {"path":"/"}))
document = """
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/fetch.html b/tests/wpt/web-platform-tests/cookies/samesite/fetch.html
deleted file mode 100644
index 6f1d92a6f54..00000000000
--- a/tests/wpt/web-platform-tests/cookies/samesite/fetch.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8"/>
-<meta name="timeout" content="long">
-<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/cookies/resources/cookie-helper.sub.js"></script>
-<script>
- function create_test(origin, target, expectedStatus, title) {
- promise_test(t => {
- var value = "" + Math.random();
- return resetSameSiteCookies(origin, value)
- .then(_ => {
- return credFetch(target + "/cookies/resources/list.py")
-
- .then(r => r.json())
- .then(cookies => getSameSiteVerifier()(expectedStatus, value, cookies));
- });
- }, title);
- }
-
- // No redirect:
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Same-host fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain fetches are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site fetches are cross-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(ORIGIN, redirectTo(ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host fetches are strictly same-site");
- create_test(ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host fetches are strictly same-site");
- create_test(ORIGIN, redirectTo(CROSS_SITE_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host fetches are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(SUBDOMAIN_ORIGIN, redirectTo(ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain fetches are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to cross-site:
- create_test(CROSS_SITE_ORIGIN, redirectTo(ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site fetches are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site fetches are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site fetches are cross-site");
-</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/fetch.https.html b/tests/wpt/web-platform-tests/cookies/samesite/fetch.https.html
new file mode 100644
index 00000000000..4daf357004a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/samesite/fetch.https.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<meta name="variant" content="">
+<meta name="variant" content="?legacy-samesite">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/cookies/resources/cookie-helper.sub.js"></script>
+<script>
+ function create_test(origin, target, expectedStatus, title) {
+ promise_test(t => {
+ var value = "" + Math.random();
+ return resetSameSiteCookies(origin, value)
+ .then(_ => {
+ return credFetch(target + "/cookies/resources/list.py")
+
+ .then(r => r.json())
+ .then(cookies => getSameSiteVerifier()(expectedStatus, value, cookies));
+ });
+ }, title);
+ }
+
+ // No redirect:
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Same-host fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain fetches are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site fetches are cross-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host fetches are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host fetches are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host fetches are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain fetches are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to cross-site:
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site fetches are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site fetches are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site fetches are cross-site");
+</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank-reload.html b/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank-reload.https.html
index 5fa8ab975de..02625454972 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank-reload.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank-reload.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@@ -53,7 +53,7 @@
}, title);
}
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host top-level form GETs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain top-level form GETs are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Reloaded cross-site top-level form GETs are laxly same-site");
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host top-level form GETs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain top-level form GETs are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Reloaded cross-site top-level form GETs are laxly same-site");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.html b/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.html
deleted file mode 100644
index 47fc9fa34f7..00000000000
--- a/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8"/>
-<meta name="timeout" content="long">
-<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/cookies/resources/cookie-helper.sub.js"></script>
-<script>
- function create_test(origin, target, expectedStatus, title) {
- promise_test(t => {
- var value = "" + Math.random();
- return resetSameSiteCookies(origin, value)
- .then(_ => {
- return new Promise((resolve, reject) => {
- var f = document.createElement('form');
- f.action = target + "/cookies/resources/postToParent.py";
- f.target = "_blank";
- f.method = "GET";
-
- // If |target| contains a `redir` parameter, extract it, and add it
- // to the form so it doesn't get dropped in the submission.
- var url = new URL(f.action);
- if (url.pathname == "/cookies/resources/redirectWithCORSHeaders.py") {
- var i = document.createElement("input");
- i.name = "location";
- i.type="hidden";
- i.value = url.searchParams.get("location");
- f.appendChild(i);
- }
-
- var msgHandler = e => {
- window.removeEventListener("message", msgHandler);
- e.source.close();
- try {
- getSameSiteVerifier()(expectedStatus, value, e.data);
- resolve("Popup received the cookie.");
- } catch (e) {
- reject(e);
- }
- };
- window.addEventListener("message", msgHandler);
- document.body.appendChild(f);
- f.submit();
- });
- });
- }, title);
- }
-
- // No redirect:
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Same-host top-level form GETs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain top-level form GETs are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Cross-site top-level form GETs are laxly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(ORIGIN, redirectTo(ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host top-level form GETs are strictly same-site");
- create_test(ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host top-level form GETs are strictly same-site");
- create_test(ORIGIN, redirectTo(CROSS_SITE_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host top-level form GETs are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(SUBDOMAIN_ORIGIN, redirectTo(ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain top-level form GETs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain top-level form GETs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain top-level form GETs are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to cross-site:
- create_test(CROSS_SITE_ORIGIN, redirectTo(ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Same-host redirecting to cross-site top-level form GETs are laxly same-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Subdomain redirecting to cross-site top-level form GETs are laxly same-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Cross-site redirecting to cross-site top-level form GETs are laxly same-site");
-</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.https.html b/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.https.html
new file mode 100644
index 00000000000..61af9996729
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/samesite/form-get-blank.https.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<meta name="variant" content="">
+<meta name="variant" content="?legacy-samesite">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/cookies/resources/cookie-helper.sub.js"></script>
+<script>
+ function create_test(origin, target, expectedStatus, title) {
+ promise_test(t => {
+ var value = "" + Math.random();
+ return resetSameSiteCookies(origin, value)
+ .then(_ => {
+ return new Promise((resolve, reject) => {
+ var f = document.createElement('form');
+ f.action = target + "/cookies/resources/postToParent.py";
+ f.target = "_blank";
+ f.method = "GET";
+
+ // If |target| contains a `redir` parameter, extract it, and add it
+ // to the form so it doesn't get dropped in the submission.
+ var url = new URL(f.action);
+ if (url.pathname == "/cookies/resources/redirectWithCORSHeaders.py") {
+ var i = document.createElement("input");
+ i.name = "location";
+ i.type="hidden";
+ i.value = url.searchParams.get("location");
+ f.appendChild(i);
+ }
+
+ var msgHandler = e => {
+ window.removeEventListener("message", msgHandler);
+ e.source.close();
+ try {
+ getSameSiteVerifier()(expectedStatus, value, e.data);
+ resolve("Popup received the cookie.");
+ } catch (e) {
+ reject(e);
+ }
+ };
+ window.addEventListener("message", msgHandler);
+ document.body.appendChild(f);
+ f.submit();
+ });
+ });
+ }, title);
+ }
+
+ // No redirect:
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Same-host top-level form GETs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain top-level form GETs are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Cross-site top-level form GETs are laxly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host top-level form GETs are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host top-level form GETs are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host top-level form GETs are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain top-level form GETs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain top-level form GETs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain top-level form GETs are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to cross-site:
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Same-host redirecting to cross-site top-level form GETs are laxly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Subdomain redirecting to cross-site top-level form GETs are laxly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Cross-site redirecting to cross-site top-level form GETs are laxly same-site");
+</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank-reload.html b/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank-reload.https.html
index 5098dfb4b03..69f720efc5b 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank-reload.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank-reload.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@@ -43,7 +43,7 @@
}, title);
}
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host top-level form POSTs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain top-level form POSTs are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Reloaded cross-site top-level form POSTs are not same-site");
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host top-level form POSTs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain top-level form POSTs are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Reloaded cross-site top-level form POSTs are not same-site");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.html b/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.html
deleted file mode 100644
index 75d6024c75c..00000000000
--- a/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8"/>
-<meta name="timeout" content="long">
-<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/cookies/resources/cookie-helper.sub.js"></script>
-<script>
- function create_test(origin, target, expectedStatus, title) {
- promise_test(t => {
- var value = "" + Math.random();
- return resetSameSiteCookies(origin, value)
- .then(_ => {
- return new Promise((resolve, reject) => {
- var f = document.createElement('form');
- f.action = target + "/cookies/resources/postToParent.py";
- f.target = "_blank";
- f.method = "POST";
-
- var msgHandler = e => {
- window.removeEventListener("message", msgHandler);
- e.source.close();
- try {
- getSameSiteVerifier()(expectedStatus, value, e.data);
- resolve("Popup received the cookie.");
- } catch (e) {
- reject(e);
- }
- };
- window.addEventListener("message", msgHandler);
- document.body.appendChild(f);
- f.submit();
- });
- });
- }, title);
- }
-
- // No redirect:
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Same-host top-level form POSTs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain top-level form POSTs are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site top-level form POSTs are cross-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(ORIGIN, redirectTo(ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host top-level form POSTs are strictly same-site");
- create_test(ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host top-level form POSTs are strictly same-site");
- create_test(ORIGIN, redirectTo(CROSS_SITE_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host top-level form POSTs are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(SUBDOMAIN_ORIGIN, redirectTo(ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain top-level form POSTs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain top-level form POSTs are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain top-level form POSTs are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to cross-site:
- create_test(CROSS_SITE_ORIGIN, redirectTo(ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site top-level form POSTs are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site top-level form POSTs are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site top-level form POSTs are cross-site");
-</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.https.html b/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.https.html
new file mode 100644
index 00000000000..4ffd522b322
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/samesite/form-post-blank.https.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<meta name="variant" content="">
+<meta name="variant" content="?legacy-samesite">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/cookies/resources/cookie-helper.sub.js"></script>
+<script>
+ function create_test(origin, target, expectedStatus, title) {
+ promise_test(t => {
+ var value = "" + Math.random();
+ return resetSameSiteCookies(origin, value)
+ .then(_ => {
+ return new Promise((resolve, reject) => {
+ var f = document.createElement('form');
+ f.action = target + "/cookies/resources/postToParent.py";
+ f.target = "_blank";
+ f.method = "POST";
+
+ var msgHandler = e => {
+ window.removeEventListener("message", msgHandler);
+ e.source.close();
+ try {
+ getSameSiteVerifier()(expectedStatus, value, e.data);
+ resolve("Popup received the cookie.");
+ } catch (e) {
+ reject(e);
+ }
+ };
+ window.addEventListener("message", msgHandler);
+ document.body.appendChild(f);
+ f.submit();
+ });
+ });
+ }, title);
+ }
+
+ // No redirect:
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Same-host top-level form POSTs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain top-level form POSTs are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site top-level form POSTs are cross-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host top-level form POSTs are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host top-level form POSTs are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host top-level form POSTs are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain top-level form POSTs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain top-level form POSTs are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain top-level form POSTs are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to cross-site:
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site top-level form POSTs are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site top-level form POSTs are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site top-level form POSTs are cross-site");
+</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/iframe-reload.html b/tests/wpt/web-platform-tests/cookies/samesite/iframe-reload.https.html
index 11d34bb9fcc..9bfbdfd6418 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/iframe-reload.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/iframe-reload.https.html
@@ -2,7 +2,7 @@
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@@ -44,7 +44,7 @@
}, title);
}
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain fetches are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Reloaded cross-site fetches are cross-site");
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain fetches are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Reloaded cross-site fetches are cross-site");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/iframe.html b/tests/wpt/web-platform-tests/cookies/samesite/iframe.html
deleted file mode 100644
index 4cce83081e6..00000000000
--- a/tests/wpt/web-platform-tests/cookies/samesite/iframe.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8"/>
-<meta name="timeout" content="long">
-<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/cookies/resources/cookie-helper.sub.js"></script>
-<!-- We're appending an <iframe> to the document's body, so execute tests after we have a body -->
-<body>
-<script>
- function create_test(origin, target, expectedStatus, title) {
- promise_test(t => {
- var value = "" + Math.random();
- return resetSameSiteCookies(origin, value)
- .then(_ => {
- return new Promise((resolve, reject) => {
- var iframe = document.createElement("iframe");
- iframe.onerror = _ => reject("IFrame could not be loaded.");
-
- var msgHandler = e => {
- if (e.source == iframe.contentWindow) {
- // Cleanup, then verify cookie state:
- document.body.removeChild(iframe);
- window.removeEventListener("message", msgHandler);
- try {
- getSameSiteVerifier()(expectedStatus, value, e.data);
- resolve();
- } catch(e) {
- reject(e);
- }
- }
- };
- window.addEventListener("message", msgHandler);
-
- iframe.src = target + "/cookies/resources/postToParent.py";
- document.body.appendChild(iframe);
- });
- });
- }, title);
- }
-
- // No redirect:
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Same-host fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain fetches are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site fetches are cross-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(ORIGIN, redirectTo(ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host fetches are strictly same-site");
- create_test(ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host fetches are strictly same-site");
- create_test(ORIGIN, redirectTo(CROSS_SITE_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host fetches are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(SUBDOMAIN_ORIGIN, redirectTo(ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain fetches are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain fetches are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to cross-site:
- create_test(CROSS_SITE_ORIGIN, redirectTo(ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site fetches are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site fetches are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site fetches are cross-site");
-</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/iframe.https.html b/tests/wpt/web-platform-tests/cookies/samesite/iframe.https.html
new file mode 100644
index 00000000000..446b8c50c00
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/samesite/iframe.https.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<meta name="variant" content="">
+<meta name="variant" content="?legacy-samesite">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/cookies/resources/cookie-helper.sub.js"></script>
+<!-- We're appending an <iframe> to the document's body, so execute tests after we have a body -->
+<body>
+<script>
+ function create_test(origin, target, expectedStatus, title) {
+ promise_test(t => {
+ var value = "" + Math.random();
+ return resetSameSiteCookies(origin, value)
+ .then(_ => {
+ return new Promise((resolve, reject) => {
+ var iframe = document.createElement("iframe");
+ iframe.onerror = _ => reject("IFrame could not be loaded.");
+
+ var msgHandler = e => {
+ if (e.source == iframe.contentWindow) {
+ // Cleanup, then verify cookie state:
+ document.body.removeChild(iframe);
+ window.removeEventListener("message", msgHandler);
+ try {
+ getSameSiteVerifier()(expectedStatus, value, e.data);
+ resolve();
+ } catch(e) {
+ reject(e);
+ }
+ }
+ };
+ window.addEventListener("message", msgHandler);
+
+ iframe.src = target + "/cookies/resources/postToParent.py";
+ document.body.appendChild(iframe);
+ });
+ });
+ }, title);
+ }
+
+ // No redirect:
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Same-host fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain fetches are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site fetches are cross-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host fetches are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host fetches are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host fetches are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain fetches are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain fetches are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to cross-site:
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site fetches are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site fetches are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site fetches are cross-site");
+</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/img.html b/tests/wpt/web-platform-tests/cookies/samesite/img.https.html
index 071c24fb30e..bf76216e804 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/img.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/img.https.html
@@ -2,7 +2,7 @@
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@@ -47,12 +47,13 @@
expectedStatus == SameSiteStatus.CROSS_SITE ?
assert_cookie_absent(target, "samesite_lax", value) :
assert_cookie_present(target, "samesite_lax", value)];
- if (location.search && location.search === "?samesite-by-default-cookies.tentative") {
+ if (isLegacySameSite()) {
+ // Legacy behavior: unspecified SameSite acts like SameSite=None.
+ asserts.push(assert_cookie_present(target, "samesite_unspecified", value));
+ } else {
asserts.push(expectedStatus == SameSiteStatus.CROSS_SITE ?
assert_cookie_absent(target, "samesite_unspecified", value) :
assert_cookie_present(target, "samesite_unspecified", value));
- } else {
- asserts.push(assert_cookie_present(target, "samesite_unspecified", value));
}
return Promise.all(asserts);
});
@@ -60,22 +61,22 @@
}
// No redirect:
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Same-host images are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain images are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site images are cross-site");
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Same-host images are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain images are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.CROSS_SITE, "Cross-site images are cross-site");
// Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(ORIGIN, redirectTo(ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host images are strictly same-site");
- create_test(ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host images are strictly same-site");
- create_test(ORIGIN, redirectTo(CROSS_SITE_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host images are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host images are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host images are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host images are strictly same-site");
// Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(SUBDOMAIN_ORIGIN, redirectTo(ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain images are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain images are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain images are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain images are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain images are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain images are strictly same-site");
// Redirect from {same-host,subdomain,cross-site} to cross-site:
- create_test(CROSS_SITE_ORIGIN, redirectTo(ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site images are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site images are cross-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site images are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Same-host redirecting to cross-site images are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Subdomain redirecting to cross-site images are cross-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.CROSS_SITE, "Cross-site redirecting to cross-site images are cross-site");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/resources/navigate.html b/tests/wpt/web-platform-tests/cookies/samesite/resources/navigate.html
index ef40642a5d4..7d0f87d4943 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/resources/navigate.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/resources/navigate.html
@@ -7,7 +7,7 @@
});
window.addEventListener('message', function(e) {
- if (ORIGIN !== window.location.origin)
+ if (SECURE_ORIGIN !== window.location.origin)
return;
if (window.location.origin !== e.origin)
return;
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/resources/puppet.html b/tests/wpt/web-platform-tests/cookies/samesite/resources/puppet.html
index 9f4f8e2242c..6d36132d3a8 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/resources/puppet.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/resources/puppet.html
@@ -2,9 +2,9 @@
<script src="/cookies/resources/cookie-helper.sub.js"></script>
<script>
// Helper to either set or clear some cookies on its own origin, or
- // (potentially) cross-site on ORIGIN.
+ // (potentially) cross-site on SECURE_ORIGIN.
window.onmessage = e => {
- var originToUse = ORIGIN;
+ var originToUse = SECURE_ORIGIN;
if (e.data.useOwnOrigin)
originToUse = self.origin;
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/setcookie-lax.html b/tests/wpt/web-platform-tests/cookies/samesite/setcookie-lax.https.html
index 04b2ce264c8..0c09577373f 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/setcookie-lax.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/setcookie-lax.https.html
@@ -1,17 +1,17 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
<script>
promise_test(async function(t) {
- let w = window.open(ORIGIN + "/cookies/samesite/resources/puppet.html");
- await wait_for_message("READY", ORIGIN);
+ let w = window.open(SECURE_ORIGIN + "/cookies/samesite/resources/puppet.html");
+ await wait_for_message("READY", SECURE_ORIGIN);
let random = "" + Math.random();
w.postMessage({type: "set", value: random}, "*");
- let e = await wait_for_message("set-complete", ORIGIN)
+ let e = await wait_for_message("set-complete", SECURE_ORIGIN)
assert_dom_cookie("samesite_strict", e.data.value, true);
assert_dom_cookie("samesite_lax", e.data.value, true);
assert_dom_cookie("samesite_none", e.data.value, true);
@@ -20,16 +20,15 @@
}, "Same-site window should be able to set `SameSite=Lax` or `SameSite=Strict` cookies.");
promise_test(async function(t) {
- let w = window.open(CROSS_SITE_ORIGIN + "/cookies/samesite/resources/puppet.html");
- await wait_for_message("READY", CROSS_SITE_ORIGIN);
+ let w = window.open(SECURE_CROSS_SITE_ORIGIN + "/cookies/samesite/resources/puppet.html");
+ await wait_for_message("READY", SECURE_CROSS_SITE_ORIGIN);
let random = "" + Math.random();
w.postMessage({type: "set", value: random}, "*");
- let e = await wait_for_message("set-complete", CROSS_SITE_ORIGIN);
+ let e = await wait_for_message("set-complete", SECURE_CROSS_SITE_ORIGIN);
assert_dom_cookie("samesite_strict", e.data.value, false);
assert_dom_cookie("samesite_lax", e.data.value, false);
assert_dom_cookie("samesite_none", e.data.value, true);
- assert_dom_cookie("samesite_unspecified", e.data.value,
- location.search !== "?samesite-by-default-cookies.tentative");
+ assert_dom_cookie("samesite_unspecified", e.data.value, isLegacySameSite());
w.close();
}, "Cross-site window shouldn't be able to set `SameSite=Lax` or `SameSite=Strict` cookies.");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/setcookie-navigation.html b/tests/wpt/web-platform-tests/cookies/samesite/setcookie-navigation.https.html
index 3663aa28a20..0c6140c4032 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/setcookie-navigation.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/setcookie-navigation.https.html
@@ -2,7 +2,7 @@
<meta charset="utf-8">
<meta name="timeout" content="long">
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@@ -23,12 +23,12 @@
// a new random value on each run, so on each run we are overwriting and
// checking for a cookie with a different random value.
let value = "" + Math.random();
- let url_from = ORIGIN + "/cookies/samesite/resources/navigate.html";
+ let url_from = SECURE_ORIGIN + "/cookies/samesite/resources/navigate.html";
let url_to = origin_to + "/cookies/resources/setSameSite.py?" + value;
var w = window.open(url_from);
- await wait_for_message('READY', ORIGIN);
- assert_equals(ORIGIN, window.origin);
- assert_equals(ORIGIN, w.origin);
+ await wait_for_message('READY', SECURE_ORIGIN);
+ assert_equals(SECURE_ORIGIN, window.origin);
+ assert_equals(SECURE_ORIGIN, w.origin);
let command = (method === "POST") ? "post-form" : "navigate";
w.postMessage({ type: command, url: url_to }, "*");
let message = await wait_for_message('COOKIES_SET', origin_to);
@@ -37,8 +37,8 @@
}, title);
}
- navigate_test("GET", ORIGIN, "Same-site top-level navigation should be able to set SameSite=* cookies.");
- navigate_test("GET", CROSS_SITE_ORIGIN, "Cross-site top-level navigation should be able to set SameSite=* cookies.");
- navigate_test("POST", ORIGIN, "Same-site top-level POST should be able to set SameSite=* cookies.");
- navigate_test("POST", CROSS_SITE_ORIGIN, "Cross-site top-level POST should be able to set SameSite=* cookies.");
+ navigate_test("GET", SECURE_ORIGIN, "Same-site top-level navigation should be able to set SameSite=* cookies.");
+ navigate_test("GET", SECURE_CROSS_SITE_ORIGIN, "Cross-site top-level navigation should be able to set SameSite=* cookies.");
+ navigate_test("POST", SECURE_ORIGIN, "Same-site top-level POST should be able to set SameSite=* cookies.");
+ navigate_test("POST", SECURE_CROSS_SITE_ORIGIN, "Cross-site top-level POST should be able to set SameSite=* cookies.");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/window-open-reload.html b/tests/wpt/web-platform-tests/cookies/samesite/window-open-reload.https.html
index d8bc112344c..9c30bd5ca67 100644
--- a/tests/wpt/web-platform-tests/cookies/samesite/window-open-reload.html
+++ b/tests/wpt/web-platform-tests/cookies/samesite/window-open-reload.https.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
+<meta name="variant" content="?legacy-samesite">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@@ -40,7 +40,7 @@
}, title);
}
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host auxiliary navigations are strictly same-site.");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain auxiliary navigations are strictly same-site.");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Reloaded cross-site auxiliary navigations are laxly same-site");
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Reloaded same-host auxiliary navigations are strictly same-site.");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Reloaded subdomain auxiliary navigations are strictly same-site.");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Reloaded cross-site auxiliary navigations are laxly same-site");
</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/window-open.html b/tests/wpt/web-platform-tests/cookies/samesite/window-open.html
deleted file mode 100644
index b7dc8361ec2..00000000000
--- a/tests/wpt/web-platform-tests/cookies/samesite/window-open.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8"/>
-<meta name="timeout" content="long">
-<meta name="variant" content="">
-<meta name="variant" content="?samesite-by-default-cookies.tentative">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/cookies/resources/cookie-helper.sub.js"></script>
-<script>
- function create_test(origin, target, expectedStatus, title) {
- promise_test(t => {
- var value = "" + Math.random();
- return resetSameSiteCookies(origin, value)
- .then(_ => {
- return new Promise((resolve, reject) => {
- var w = window.open(origin + "/cookies/resources/postToParent.py");
-
- var msgHandler = e => {
- window.removeEventListener("message", msgHandler);
- w.close();
- try {
- getSameSiteVerifier()(expectedStatus, value, e.data);
- resolve("Popup received the cookie.");
- } catch (e) {
- reject(e);
- }
- };
- window.addEventListener("message", msgHandler);
-
- if (!w)
- reject("Popup could not be opened (did you whitelist the test site in your popup blocker?).");
- });
- });
- }, title);
- }
-
- // No redirect:
- create_test(ORIGIN, ORIGIN, SameSiteStatus.STRICT, "Same-host auxiliary navigations are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain auxiliary navigations are strictly same-site");
- create_test(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Cross-site auxiliary navigations are laxly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(ORIGIN, redirectTo(ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host auxiliary navigations are strictly same-site");
- create_test(ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host auxiliary navigations are strictly same-site");
- create_test(ORIGIN, redirectTo(CROSS_SITE_ORIGIN, ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host auxiliary navigations are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to same-host:
- create_test(SUBDOMAIN_ORIGIN, redirectTo(ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain auxiliary navigations are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain auxiliary navigations are strictly same-site");
- create_test(SUBDOMAIN_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain auxiliary navigations are strictly same-site");
-
- // Redirect from {same-host,subdomain,cross-site} to cross-site:
- create_test(CROSS_SITE_ORIGIN, redirectTo(ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Same-host redirecting to cross-site auxiliary navigations are laxly same-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(SUBDOMAIN_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Subdomain redirecting to cross-site auxiliary navigations are laxly same-site");
- create_test(CROSS_SITE_ORIGIN, redirectTo(CROSS_SITE_ORIGIN, CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Cross-site redirecting to cross-site auxiliary navigations are laxly same-site");
-</script>
diff --git a/tests/wpt/web-platform-tests/cookies/samesite/window-open.https.html b/tests/wpt/web-platform-tests/cookies/samesite/window-open.https.html
new file mode 100644
index 00000000000..fe2318acc43
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/samesite/window-open.https.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<meta name="timeout" content="long">
+<meta name="variant" content="">
+<meta name="variant" content="?legacy-samesite">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/cookies/resources/cookie-helper.sub.js"></script>
+<script>
+ function create_test(origin, target, expectedStatus, title) {
+ promise_test(t => {
+ var value = "" + Math.random();
+ return resetSameSiteCookies(origin, value)
+ .then(_ => {
+ return new Promise((resolve, reject) => {
+ var w = window.open(origin + "/cookies/resources/postToParent.py");
+
+ var msgHandler = e => {
+ window.removeEventListener("message", msgHandler);
+ w.close();
+ try {
+ getSameSiteVerifier()(expectedStatus, value, e.data);
+ resolve("Popup received the cookie.");
+ } catch (e) {
+ reject(e);
+ }
+ };
+ window.addEventListener("message", msgHandler);
+
+ if (!w)
+ reject("Popup could not be opened (did you whitelist the test site in your popup blocker?).");
+ });
+ });
+ }, title);
+ }
+
+ // No redirect:
+ create_test(SECURE_ORIGIN, SECURE_ORIGIN, SameSiteStatus.STRICT, "Same-host auxiliary navigations are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN, SameSiteStatus.STRICT, "Subdomain auxiliary navigations are strictly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN, SameSiteStatus.LAX, "Cross-site auxiliary navigations are laxly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to same-host auxiliary navigations are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to same-host auxiliary navigations are strictly same-site");
+ create_test(SECURE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to same-host auxiliary navigations are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to same-host:
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Same-host redirecting to subdomain auxiliary navigations are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Subdomain redirecting to subdomain auxiliary navigations are strictly same-site");
+ create_test(SECURE_SUBDOMAIN_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_SUBDOMAIN_ORIGIN), SameSiteStatus.STRICT, "Cross-site redirecting to subdomain auxiliary navigations are strictly same-site");
+
+ // Redirect from {same-host,subdomain,cross-site} to cross-site:
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Same-host redirecting to cross-site auxiliary navigations are laxly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_SUBDOMAIN_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Subdomain redirecting to cross-site auxiliary navigations are laxly same-site");
+ create_test(SECURE_CROSS_SITE_ORIGIN, redirectTo(SECURE_CROSS_SITE_ORIGIN, SECURE_CROSS_SITE_ORIGIN), SameSiteStatus.LAX, "Cross-site redirecting to cross-site auxiliary navigations are laxly same-site");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-box/inheritance.html b/tests/wpt/web-platform-tests/css/css-box/inheritance.html
index 22443bf9a94..d18106faf69 100644
--- a/tests/wpt/web-platform-tests/css/css-box/inheritance.html
+++ b/tests/wpt/web-platform-tests/css/css-box/inheritance.html
@@ -28,6 +28,8 @@ assert_not_inherited('padding-bottom', '0px', '10px');
assert_not_inherited('padding-left', '0px', '10px');
assert_not_inherited('padding-right', '0px', '10px');
assert_not_inherited('padding-top', '0px', '10px');
+
+assert_inherited('visibility', 'visible', 'collapse');
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-box/parsing/visibility-computed.html b/tests/wpt/web-platform-tests/css/css-box/parsing/visibility-computed.html
new file mode 100644
index 00000000000..f6d4c3f8e55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/parsing/visibility-computed.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS basic box model: getComputedStyle().visibility</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/visufx.html#visibility">
+<meta name="assert" content="visibility computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("visibility", "visible");
+test_computed_value("visibility", "hidden");
+test_computed_value("visibility", "collapse");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-computed.html
new file mode 100644
index 00000000000..8a08830bd45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-computed.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: getComputedStyle().inset</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset">
+<meta name="assert" content="Computed value is as specified, with lengths made absolute.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ font-size: 40px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("inset", "auto");
+test_computed_value("inset", "-10px");
+
+test_computed_value("inset", "calc(10px - 0.5em) -20%", "-10px -20%");
+test_computed_value("inset", "auto auto", "auto");
+
+test_computed_value("inset", "10px calc(10px - 0.5em) -30px", "10px -10px -30px");
+test_computed_value("inset", "auto auto auto", "auto");
+
+test_computed_value("inset", "10px 20px auto -30px");
+test_computed_value("inset", "auto auto auto auto", "auto");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-invalid.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-invalid.html
new file mode 100644
index 00000000000..604b801c760
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-invalid.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: parsing inset with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset">
+<meta name="assert" content="inset supports only the grammar '<'top'>{1,4}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("inset", "none");
+test_invalid_value("inset", "20%, calc(10px - 0.5em)");
+test_invalid_value("inset", "10px auto 20px auto 30px");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-valid.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-valid.html
new file mode 100644
index 00000000000..2d8f937f075
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/inset-valid.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: parsing inset with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset">
+<meta name="assert" content="inset supports the full grammar '<'top'>{1,4}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("inset", "auto");
+test_valid_value("inset", "-10px");
+
+test_valid_value("inset", "calc(-0.5em + 10px) -20%");
+test_valid_value("inset", "auto auto", "auto");
+
+test_valid_value("inset", "10px calc(-0.5em + 10px) -30px");
+test_valid_value("inset", "auto auto auto", "auto");
+
+test_valid_value("inset", "10px calc(-0.5em + 10px) auto -30px");
+test_valid_value("inset", "auto auto auto auto", "auto");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001-ref.html b/tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001-ref.html
new file mode 100644
index 00000000000..5304352e6ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Reference for CSS Basic User Interface Test: appearance: textfield</title>
+<style>
+ #container { width: 500px; }
+</style>
+<div id="container">
+ <a>a</a>
+ <button>button</button>
+ <input type="text" value="input-text">
+ <input type="text" value="input-search"><!-- intentionally type="text" -->
+ <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/appearance-textfield-001.html b/tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001.html
new file mode 100644
index 00000000000..f2ca6fc6ac7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui/appearance-textfield-001.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: appearance: textfield</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
+<meta name="assert" content="textfield is an alias to auto except on input type=search.">
+<link rel="match" href="appearance-textfield-001-ref.html">
+<style>
+ #container { width: 500px; }
+ /*
+ * If the value being tested is not supported, then 'none' is used instead,
+ * which is intended to fail the test.
+ */
+ #container > * { appearance: none; appearance: textfield; }
+</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/webkit-appearance-textfield-001.html b/tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-textfield-001.html
new file mode 100644
index 00000000000..058e1be83bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui/webkit-appearance-textfield-001.html
@@ -0,0 +1,36 @@
+<!-- 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: textfield</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
+<meta name="assert" content="textfield is an alias to auto except on input type=search.">
+<link rel="match" href="appearance-textfield-001-ref.html">
+<style>
+ #container { width: 500px; }
+ /*
+ * If the value being tested is not supported, then 'none' is used instead,
+ * which is intended to fail the test.
+ */
+ #container > * { -webkit-appearance: none; -webkit-appearance: textfield; }
+</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/docs/reviewing-tests/index.md b/tests/wpt/web-platform-tests/docs/reviewing-tests/index.md
index 47deed0d619..2f6ee822fcc 100644
--- a/tests/wpt/web-platform-tests/docs/reviewing-tests/index.md
+++ b/tests/wpt/web-platform-tests/docs/reviewing-tests/index.md
@@ -22,9 +22,8 @@ the [general test guidelines](../writing-tests/general-guidelines).
The review must happen in public, but there is no requirement for it
to happen in any specific location. In particular if a vendor is
submitting tests that have already been publicly reviewed in their own
-review system, that review may be carried forward. For other tests, we
-strongly recommend using either Reviewable or GitHub's built-in review
-tools.
+review system, that review may be carried forward. For other submissions, we
+recommend using GitHub's built-in review tools.
Regardless of what review tool is used, the review must be clearly
linked in the pull request.
@@ -38,3 +37,26 @@ working on other things as tests frequently only get pushed upstream
once the code lands in their implementation.
To assist with test reviews, a [review checklist](checklist) is available.
+
+[GitHub.com allows reviewers to formally signal their approval of a pull
+request through a dedicated user
+interface.](https://help.github.com/en/articles/about-pull-request-reviews)
+Every pull request submitted to WPT must be approved by at least one project
+collaborator before it can be merged.
+
+## Notifications
+
+META.yml files are used only to indicate who should be notified of pull
+requests. If you are interested in receiving notifications of proposed
+changes to tests in a given directory, feel free to add yourself to the
+META.yml file.
+
+## Finding contributions to review
+
+Here are a few search filters to find things to review:
+
+* [Open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
+* [Reviewed but still open PRs (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+-label%3Amozilla%3Agecko-sync+-label%3Achromium-export+-label%3Awebkit-export+-label%3Aservo-export+-label%3Avendor-imports+review%3Aapproved+-label%3A%22do+not+merge+yet%22+-label%3A%22status%3Aneeds-spec-decision%22) (Merge? Something left to fix? Ping other reviewer?)
+* [Open PRs without reviewers](https://github.com/web-platform-tests/wpt/pulls?q=is%3Apr+is%3Aopen+label%3Astatus%3Aneeds-reviewers)
+* [Open PRs with label `infra` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Ainfra+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
+* [Open PRs with label `docs` (excluding vendor exports)](https://github.com/web-platform-tests/wpt/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+label%3Adocs+-label%3A%22mozilla%3Agecko-sync%22+-label%3A%22chromium-export%22+-label%3A%22webkit-export%22+-label%3A%22servo-export%22+-label%3Avendor-imports)
diff --git a/tests/wpt/web-platform-tests/docs/test-suite-design.md b/tests/wpt/web-platform-tests/docs/test-suite-design.md
index b0c1f1f7e15..adc6810f38f 100644
--- a/tests/wpt/web-platform-tests/docs/test-suite-design.md
+++ b/tests/wpt/web-platform-tests/docs/test-suite-design.md
@@ -10,15 +10,15 @@ and should be easy to run in any browser.
## Test Layout
-Each top level directory in the repository corresponds to tests for a
-single specification, with the exception of `css/` which contains
-test suites for CSS WG specifications. For W3C specs, these directories
-are typically named after the shortname of the spec (i.e. the name
-used for snapshot publications under `/TR/`); for WHATWG specs, they
-are typically named after the subdomain of the spec (i.e. trimming
-`.spec.whatwg.org` from the URL); for other specs, something deemed
-sensible is used. In any case, there are occasional exceptions for
-historic reasons.
+Most of the repository's top-level directories hold tests for specific web
+standards. For [W3C specs](https://www.w3.org/standards/), these directories
+are typically named after the shortname of the spec (i.e. the name used for
+snapshot publications under `/TR/`); for [WHATWG
+specs](https://spec.whatwg.org/), they are typically named after the subdomain
+of the spec (i.e. trimming `.spec.whatwg.org` from the URL); for other specs,
+something deemed sensible is used. The `css/` directory contains test suites
+for [the CSS Working Group
+specifications](https://www.w3.org/Style/CSS/current-work).
Within the specification-specific directory there are two common ways
of laying out tests: the first is a flat structure which is sometimes
@@ -28,6 +28,12 @@ in the specification. The latter provides some implicit metadata about
the part of a specification being tested according to its location in
the filesystem, and is preferred for larger specifications.
+For example, tests in HTML for ["The History
+interface"](https://html.spec.whatwg.org/multipage/history.html#the-history-interface)
+are located in `html/browsers/history/the-history-interface/`.
+
+Various resources that tests depend on are in `common`, `images`, `fonts`,
+`media`, and `resources`.
## Test Types
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/github-intro.md b/tests/wpt/web-platform-tests/docs/writing-tests/github-intro.md
index 95d9884a290..44b6828ad3c 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/github-intro.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/github-intro.md
@@ -249,7 +249,8 @@ GitHub UI. Below is one method and others can be found on
4. Wait for feedback on your pull request and once your pull request is
accepted, delete your branch (see '[When Pull Request is Accepted](#cleanup)').
-That's it! Your pull request will go into a queue and will be reviewed soon.
+[This page on the submissions process](submission-process) has more detail
+about what to expect when contributing code to WPT.
## Refine
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md b/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md
index dfc73ffadef..4ff99b8c16a 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/submission-process.md
@@ -1,28 +1,24 @@
# Submitting Tests
-Test submission is via the typical [GitHub workflow][github flow]:
+Test submission is via the typical [GitHub workflow][github flow]. For detailed
+guidelines on setup and each of these steps, please refer to the [Github Test
+Submission](github-intro) documentation.
-* Fork the [GitHub repository][repo] (and make sure you're still relatively in
-sync with it if you forked a while ago)
+* Fork the [GitHub repository][repo].
-* Create a branch for your changes. Being a key of effective Git flow, it is
-strongly recommended that the **topic branch** tradition be followed here,
-i.e. the branch naming convention is based on the "topic" you will be working
-on, e.g. `git checkout -b topic-name`
+* Create a feature branch for your changes.
-* Make your changes
+* Make your changes.
* Run the `lint` script in the root of your checkout to detect common
- mistakes in test submissions. This will also be run after submission
- and any errors will prevent your PR being accepted. If it detects an
- error that forms an essential part of your test, edit the list of
- exceptions stored in `tools/lint/lint.whitelist`.
+ mistakes in test submissions. There is [detailed documentation for the lint
+ tool](lint-tool).
* Commit your changes.
* Push your local branch to your GitHub repository.
-* Using the GitHub UI create a Pull Request for your branch.
+* Using the GitHub UI, create a Pull Request for your branch.
* When you get review comments, make more commits to your branch to
address the comments.
@@ -30,8 +26,9 @@ on, e.g. `git checkout -b topic-name`
* Once everything is reviewed and all issues are addressed, your pull
request will be automatically merged.
-For detailed guidelines on setup and each of these steps, please refer to the
-[Github Test Submission](../writing-tests/github-intro) documentation.
+We can sometimes take a little while to go through pull requests because we
+have to go through all the tests and ensure that they match the specification
+correctly. But we look at all of them, and take everything that we can.
Hop on to the [mailing list][public-test-infra] or [IRC][]
([webclient][web irc], join channel `#testing`) if you have an issue. There is
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md b/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
index 329359caad6..3c1e80dc83b 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
@@ -297,6 +297,11 @@ only takes `actual` and `description` as arguments.
The description parameter is used to present more useful error messages when
a test fails.
+When assertions are violated, they throw a runtime exception. This interrupts
+test execution, so subsequent statements are not evaluated. A given test can
+only fail due to one such violation, so if you would like to assert multiple
+behaviors independently, you should use multiple tests.
+
NOTE: All asserts must be located in a `test()` or a step of an
`async_test()`, unless the test is a single page test. Asserts outside
these places won't be detected correctly by the harness and may cause
@@ -802,6 +807,24 @@ asserts that one `assert_func(actual, expected_array_N, extra_arg1, ..., extra_a
allows multiple behaviours. Test authors should not use this method simply to hide
UA bugs.
+## Formatting ##
+
+When many JavaScript Object values are coerced to a String, the resulting value
+will be `"[object Object]"`. This obscures helpful information, making the
+coerced value unsuitable for use in assertion messages, test names, and
+debugging statements.
+
+testharness.js provides a global function named `format_value` which produces
+more distinctive string representations of many kinds of objects, including
+arrays and the more important DOM Node types. It also translates String values
+containing control characters to include human-readable representations.
+
+```js
+format_value(document); // "Document node with 2 children"
+format_value("foo\uffffbar"); // "\"foo\\uffffbar\""
+format_value([-0, Infinity]); // "[-0, Infinity]"
+```
+
## Metadata ##
It is possible to add optional metadata to tests; this can be done in
diff --git a/tests/wpt/web-platform-tests/element-timing/first-letter-background.html b/tests/wpt/web-platform-tests/element-timing/first-letter-background.html
new file mode 100644
index 00000000000..51e82d473e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/element-timing/first-letter-background.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Element Timing: observe element with background image in its first letter</title>
+<body>
+<style>
+#target::first-letter {
+ background-image: url('/images/black-rectangle.png');
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender = performance.now();
+ async_test(function (t) {
+ if (!window.PerformanceElementTiming) {
+ assert_unreached("PerformanceElementTiming is not implemented");
+ }
+ const div = document.getElementById('target');
+ let textObserved = false;
+ let imageObserved = false;
+ const observer = new PerformanceObserver(
+ t.step_func(function(entryList) {
+ entryList.getEntries().forEach(entry => {
+ if (entry.name === 'text-paint') {
+ checkTextElement(entry, 'my_div', 'target', beforeRender, div);
+ textObserved = true;
+ }
+ else {
+ assert_equals(entry.name, 'image-paint');
+ const pathname = window.location.origin + '/images/black-rectangle.png';
+ checkElement(entry, pathname, 'my_div', 'target', beforeRender, div);
+ checkNaturalSize(entry, 100, 50);
+ imageObserved = true;
+ }
+ });
+ if (textObserved && imageObserved)
+ t.done();
+ })
+ );
+ observer.observe({entryTypes: ['element']});
+ }, 'Element with elementtiming attribute and background image in first-letter is observable.');
+</script>
+<div id='target' elementtiming='my_div'>A</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html
new file mode 100644
index 00000000000..7a94f1ce4a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back-2.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that sandboxed iframe can navigate their self</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ var t = async_test();
+ onmessage = t.step_func((e) => {
+ if (e.data == 'pushstatebackdone') t.done();
+ });
+
+ function doNavigation() {
+ frames[0].postMessage('pushstateback', '*');
+ }
+</script>
+<iframe id="child_frame" sandbox="allow-scripts" src="support/iframe-tried-to-be-navigated-by-history.html" onload="doNavigation();"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html
new file mode 100644
index 00000000000..7026edf8f92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that sandboxed iframe can not navigate their ancestors</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ var t = async_test();
+ onpopstate = t.unreached_func('no pop state');
+
+ function doNavigation() {
+ history.pushState( {state: "one past"}, 'page 2', '');
+ frames[0].postMessage('back', '*');
+ t.step_timeout(() => {
+ t.done();
+ }, 1000);
+ }
+</script>
+<iframe id="child_frame" sandbox="allow-scripts" src="support/iframe-tried-to-be-navigated-by-history.html" onload="doNavigation();"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html
new file mode 100644
index 00000000000..e9d1def099e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that sandboxed iframe can not navigate their ancestors</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ var t = async_test();
+ var pop_state_count = 0;
+ onpopstate = t.step_func((e) => {
+ pop_state_count++;
+ if (pop_state_count == 1) {
+ // Should not generate a pop state
+ frames[0].postMessage('forward', '*');
+ t.step_timeout(() => {
+ t.done();
+ }, 1000);
+ } else if (pop_state_count > 1) {
+ assert_unreached('no pop state');
+ }
+ });
+
+ function doNavigation() {
+ history.pushState( {state: "one past"}, 'page 2', '');
+ // Should generate a pop state
+ history.back();
+ }
+</script>
+<iframe id="child_frame" sandbox="allow-scripts" src="support/iframe-tried-to-be-navigated-by-history.html" onload="doNavigation();"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-history.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-history.html
new file mode 100644
index 00000000000..c4ba8011f9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-history.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<p>This is a frame that tries to navigate via history API.</p>
+<script>
+window.onmessage = (e) => {
+ if (e.data == 'back') {
+ history.back();
+ } else if (e.data == 'forward') {
+ history.forward();
+ } else if (e.data = 'pushstateback') {
+ onpopstate = (e) => {
+ parent.postMessage('pushstatebackdone', '*');
+ };
+
+ history.pushState({someState: 'blah'}, '');
+ history.back();
+ }
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/interfaces/dom.idl b/tests/wpt/web-platform-tests/interfaces/dom.idl
index 9da68c4b7f8..285e5f00b87 100644
--- a/tests/wpt/web-platform-tests/interfaces/dom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/dom.idl
@@ -359,7 +359,7 @@ interface Element : Node {
[CEReactions] Attr? setAttributeNodeNS(Attr attr);
[CEReactions] Attr removeAttributeNode(Attr attr);
- ShadowRoot attachShadow(optional ShadowRootInit init = {});
+ ShadowRoot attachShadow(ShadowRootInit init);
readonly attribute ShadowRoot? shadowRoot;
Element? closest(DOMString selectors);
diff --git a/tests/wpt/web-platform-tests/interfaces/fetch.idl b/tests/wpt/web-platform-tests/interfaces/fetch.idl
index 5f876e7a4ac..f529c4501bf 100644
--- a/tests/wpt/web-platform-tests/interfaces/fetch.idl
+++ b/tests/wpt/web-platform-tests/interfaces/fetch.idl
@@ -27,7 +27,7 @@ interface mixin Body {
};
typedef (Request or USVString) RequestInfo;
-[Constructor(RequestInfo input, optional RequestInit init),
+[Constructor(RequestInfo input, optional RequestInit init = {}),
Exposed=(Window,Worker)]
interface Request {
readonly attribute ByteString method;
@@ -72,7 +72,7 @@ enum RequestMode { "navigate", "same-origin", "no-cors", "cors" };
enum RequestCredentials { "omit", "same-origin", "include" };
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
enum RequestRedirect { "follow", "error", "manual" };
-[Constructor(optional BodyInit? body = null, optional ResponseInit init), Exposed=(Window,Worker)]
+[Constructor(optional BodyInit? body = null, optional ResponseInit init = {}), Exposed=(Window,Worker)]
interface Response {
[NewObject] static Response error();
[NewObject] static Response redirect(USVString url, optional unsigned short status = 302);
diff --git a/tests/wpt/web-platform-tests/interfaces/geolocation-sensor.idl b/tests/wpt/web-platform-tests/interfaces/geolocation-sensor.idl
index 074d7bb9731..0083cdac198 100644
--- a/tests/wpt/web-platform-tests/interfaces/geolocation-sensor.idl
+++ b/tests/wpt/web-platform-tests/interfaces/geolocation-sensor.idl
@@ -3,11 +3,11 @@
// (https://github.com/tidoust/reffy-reports)
// Source: Geolocation Sensor (https://wicg.github.io/geolocation-sensor/)
-[Constructor(optional GeolocationSensorOptions options),
+[Constructor(optional GeolocationSensorOptions options = {}),
SecureContext,
Exposed=(DedicatedWorker, Window)]
interface GeolocationSensor : Sensor {
- static Promise<GeolocationSensorReading> read(optional ReadOptions readOptions);
+ static Promise<GeolocationSensorReading> read(optional ReadOptions readOptions = {});
readonly attribute unrestricted double? latitude;
readonly attribute unrestricted double? longitude;
readonly attribute unrestricted double? altitude;
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index 47abcda810a..6dfb39215d0 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -134,7 +134,7 @@ interface mixin HTMLOrSVGElement {
attribute DOMString nonce; // intentionally no [CEReactions]
[CEReactions] attribute long tabIndex;
- void focus(optional FocusOptions options);
+ void focus(optional FocusOptions options = {});
void blur();
};
@@ -666,7 +666,7 @@ interface TimeRanges {
};
[Exposed=Window,
- Constructor(DOMString type, optional TrackEventInit eventInitDict)]
+ Constructor(DOMString type, optional TrackEventInit eventInitDict = {})]
interface TrackEvent : Event {
readonly attribute (VideoTrack or AudioTrack or TextTrack)? track;
};
@@ -1098,7 +1098,7 @@ interface ValidityState {
};
[Exposed=Window,
- Constructor(DOMString type, optional FormDataEventInit eventInitDict)]
+ Constructor(DOMString type, optional FormDataEventInit eventInitDict = {})]
interface FormDataEvent : Event {
readonly attribute FormData formData;
};
@@ -1149,8 +1149,8 @@ interface HTMLTemplateElement : HTMLElement {
HTMLConstructor]
interface HTMLSlotElement : HTMLElement {
[CEReactions] attribute DOMString name;
- sequence<Node> assignedNodes(optional AssignedNodesOptions options);
- sequence<Element> assignedElements(optional AssignedNodesOptions options);
+ sequence<Node> assignedNodes(optional AssignedNodesOptions options = {});
+ sequence<Element> assignedElements(optional AssignedNodesOptions options = {});
};
dictionary AssignedNodesOptions {
@@ -1231,7 +1231,7 @@ interface mixin CanvasTransform {
[NewObject] DOMMatrix getTransform();
void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
- void setTransform(optional DOMMatrix2DInit transform);
+ void setTransform(optional DOMMatrix2DInit transform = {});
void resetTransform();
};
@@ -1373,7 +1373,7 @@ interface CanvasGradient {
[Exposed=(Window,Worker)]
interface CanvasPattern {
// opaque object
- void setTransform(optional DOMMatrix2DInit transform);
+ void setTransform(optional DOMMatrix2DInit transform = {});
};
[Exposed=(Window,Worker)]
@@ -1408,7 +1408,7 @@ interface ImageData {
[Constructor(optional (Path2D or DOMString) path),
Exposed=(Window,Worker)]
interface Path2D {
- void addPath(Path2D path, optional DOMMatrix2DInit transform);
+ void addPath(Path2D path, optional DOMMatrix2DInit transform = {});
};
Path2D includes CanvasPath;
@@ -1438,7 +1438,7 @@ interface OffscreenCanvas : EventTarget {
OffscreenRenderingContext? getContext(OffscreenRenderingContextId contextId, optional any options = null);
ImageBitmap transferToImageBitmap();
- Promise<Blob> convertToBlob(optional ImageEncodeOptions options);
+ Promise<Blob> convertToBlob(optional ImageEncodeOptions options = {});
};
[Exposed=(Window,Worker)]
@@ -1465,7 +1465,7 @@ OffscreenCanvasRenderingContext2D includes CanvasPath;
[Exposed=Window]
interface CustomElementRegistry {
- [CEReactions] void define(DOMString name, CustomElementConstructor constructor, optional ElementDefinitionOptions options);
+ [CEReactions] void define(DOMString name, CustomElementConstructor constructor, optional ElementDefinitionOptions options = {});
any get(DOMString name);
Promise<void> whenDefined(DOMString name);
[CEReactions] void upgrade(Node root);
@@ -1561,7 +1561,7 @@ interface DataTransferItem {
callback FunctionStringCallback = void (DOMString data);
[Exposed=Window,
- Constructor(DOMString type, optional DragEventInit eventInitDict)]
+ Constructor(DOMString type, optional DragEventInit eventInitDict = {})]
interface DragEvent : MouseEvent {
readonly attribute DataTransfer? dataTransfer;
};
@@ -1620,7 +1620,7 @@ interface Window : EventTarget {
void print();
void postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []);
- void postMessage(any message, optional WindowPostMessageOptions options);
+ void postMessage(any message, optional WindowPostMessageOptions options = {});
};
Window includes GlobalEventHandlers;
Window includes WindowEventHandlers;
@@ -1668,7 +1668,7 @@ interface Location { // but see also additional creation steps and overridden in
};
[Exposed=Window,
- Constructor(DOMString type, optional PopStateEventInit eventInitDict)]
+ Constructor(DOMString type, optional PopStateEventInit eventInitDict = {})]
interface PopStateEvent : Event {
readonly attribute any state;
};
@@ -1678,7 +1678,7 @@ dictionary PopStateEventInit : EventInit {
};
[Exposed=Window,
- Constructor(DOMString type, optional HashChangeEventInit eventInitDict)]
+ Constructor(DOMString type, optional HashChangeEventInit eventInitDict = {})]
interface HashChangeEvent : Event {
readonly attribute USVString oldURL;
readonly attribute USVString newURL;
@@ -1690,7 +1690,7 @@ dictionary HashChangeEventInit : EventInit {
};
[Exposed=Window,
- Constructor(DOMString type, optional PageTransitionEventInit eventInitDict)]
+ Constructor(DOMString type, optional PageTransitionEventInit eventInitDict = {})]
interface PageTransitionEvent : Event {
readonly attribute boolean persisted;
};
@@ -1737,7 +1737,8 @@ interface mixin NavigatorOnLine {
readonly attribute boolean onLine;
};
-[Constructor(DOMString type, optional ErrorEventInit eventInitDict), Exposed=(Window,Worker)]
+[Constructor(DOMString type, optional ErrorEventInit eventInitDict = {}),
+ Exposed=(Window,Worker)]
interface ErrorEvent : Event {
readonly attribute DOMString message;
readonly attribute USVString filename;
@@ -1887,8 +1888,8 @@ interface mixin WindowOrWorkerGlobalScope {
void queueMicrotask(VoidFunction callback);
// ImageBitmap
- Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options);
- Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options);
+ Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options = {});
+ Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options = {});
};
Window includes WindowOrWorkerGlobalScope;
WorkerGlobalScope includes WindowOrWorkerGlobalScope;
@@ -2012,7 +2013,8 @@ interface mixin AnimationFrameProvider {
Window includes AnimationFrameProvider;
DedicatedWorkerGlobalScope includes AnimationFrameProvider;
-[Constructor(DOMString type, optional MessageEventInit eventInitDict), Exposed=(Window,Worker,AudioWorklet)]
+[Constructor(DOMString type, optional MessageEventInit eventInitDict = {}),
+ Exposed=(Window,Worker,AudioWorklet)]
interface MessageEvent : Event {
readonly attribute any data;
readonly attribute USVString origin;
@@ -2033,7 +2035,7 @@ dictionary MessageEventInit : EventInit {
typedef (WindowProxy or MessagePort or ServiceWorker) MessageEventSource;
-[Constructor(USVString url, optional EventSourceInit eventSourceInitDict), Exposed=(Window,Worker)]
+[Constructor(USVString url, optional EventSourceInit eventSourceInitDict = {}), Exposed=(Window,Worker)]
interface EventSource : EventTarget {
readonly attribute USVString url;
readonly attribute boolean withCredentials;
@@ -2085,7 +2087,8 @@ interface WebSocket : EventTarget {
void send(ArrayBufferView data);
};
-[Constructor(DOMString type, optional CloseEventInit eventInitDict), Exposed=(Window,Worker)]
+[Constructor(DOMString type, optional CloseEventInit eventInitDict = {}),
+ Exposed=(Window,Worker)]
interface CloseEvent : Event {
readonly attribute boolean wasClean;
readonly attribute unsigned short code;
@@ -2107,7 +2110,7 @@ interface MessageChannel {
[Exposed=(Window,Worker,AudioWorklet), Transferable]
interface MessagePort : EventTarget {
void postMessage(any message, sequence<object> transfer);
- void postMessage(any message, optional PostMessageOptions options);
+ void postMessage(any message, optional PostMessageOptions options = {});
void start();
void close();
@@ -2149,7 +2152,7 @@ interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
[Replaceable] readonly attribute DOMString name;
void postMessage(any message, sequence<object> transfer);
- void postMessage(any message, optional PostMessageOptions options);
+ void postMessage(any message, optional PostMessageOptions options = {});
void close();
@@ -2170,12 +2173,13 @@ interface mixin AbstractWorker {
attribute EventHandler onerror;
};
-[Constructor(USVString scriptURL, optional WorkerOptions options), Exposed=(Window,Worker)]
+[Constructor(USVString scriptURL, optional WorkerOptions options = {}),
+ Exposed=(Window,Worker)]
interface Worker : EventTarget {
void terminate();
void postMessage(any message, sequence<object> transfer);
- void postMessage(any message, optional PostMessageOptions options);
+ void postMessage(any message, optional PostMessageOptions options = {});
attribute EventHandler onmessage;
attribute EventHandler onmessageerror;
};
@@ -2190,7 +2194,7 @@ enum WorkerType { "classic", "module" };
Worker includes AbstractWorker;
-[Constructor(USVString scriptURL, optional (DOMString or WorkerOptions) options),
+[Constructor(USVString scriptURL, optional (DOMString or WorkerOptions) options = {}),
Exposed=(Window,Worker)]
interface SharedWorker : EventTarget {
readonly attribute MessagePort port;
@@ -2242,7 +2246,7 @@ interface mixin WindowLocalStorage {
Window includes WindowLocalStorage;
[Exposed=Window,
- Constructor(DOMString type, optional StorageEventInit eventInitDict)]
+ Constructor(DOMString type, optional StorageEventInit eventInitDict = {})]
interface StorageEvent : Event {
readonly attribute DOMString? key;
readonly attribute DOMString? oldValue;
diff --git a/tests/wpt/web-platform-tests/interfaces/magnetometer.idl b/tests/wpt/web-platform-tests/interfaces/magnetometer.idl
index fd29af84767..be6cbc9d47a 100644
--- a/tests/wpt/web-platform-tests/interfaces/magnetometer.idl
+++ b/tests/wpt/web-platform-tests/interfaces/magnetometer.idl
@@ -3,7 +3,7 @@
// (https://github.com/tidoust/reffy-reports)
// Source: Magnetometer (https://w3c.github.io/magnetometer/)
-[Constructor(optional MagnetometerSensorOptions sensorOptions), SecureContext,
+[Constructor(optional MagnetometerSensorOptions sensorOptions = {}), SecureContext,
Exposed=Window]
interface Magnetometer : Sensor {
readonly attribute double? x;
@@ -17,7 +17,7 @@ dictionary MagnetometerSensorOptions : SensorOptions {
MagnetometerLocalCoordinateSystem referenceFrame = "device";
};
-[Constructor(optional MagnetometerSensorOptions sensorOptions), SecureContext,
+[Constructor(optional MagnetometerSensorOptions sensorOptions = {}), SecureContext,
Exposed=Window]
interface UncalibratedMagnetometer : Sensor {
readonly attribute double? x;
diff --git a/tests/wpt/web-platform-tests/interfaces/mediasession.idl b/tests/wpt/web-platform-tests/interfaces/mediasession.idl
index 5466300b6b4..237cea53adf 100644
--- a/tests/wpt/web-platform-tests/interfaces/mediasession.idl
+++ b/tests/wpt/web-platform-tests/interfaces/mediasession.idl
@@ -36,7 +36,7 @@ interface MediaSession {
void setActionHandler(MediaSessionAction action, MediaSessionActionHandler? handler);
- void setPositionState(MediaPositionState? state);
+ void setPositionState(optional MediaPositionState? state);
};
[Constructor(optional MediaMetadataInit init), Exposed=Window]
@@ -61,9 +61,9 @@ dictionary MediaImage {
};
dictionary MediaPositionState {
- required double duration;
- double playbackRate = 1.0;
- double position = 0.0;
+ double duration;
+ double playbackRate;
+ double position;
};
dictionary MediaSessionActionDetails {
diff --git a/tests/wpt/web-platform-tests/interfaces/notifications.idl b/tests/wpt/web-platform-tests/interfaces/notifications.idl
index 459d96bd30f..1a55c31bb04 100644
--- a/tests/wpt/web-platform-tests/interfaces/notifications.idl
+++ b/tests/wpt/web-platform-tests/interfaces/notifications.idl
@@ -3,7 +3,7 @@
// (https://github.com/tidoust/reffy-reports)
// Source: Notifications API Standard (https://notifications.spec.whatwg.org/)
-[Constructor(DOMString title, optional NotificationOptions options),
+[Constructor(DOMString title, optional NotificationOptions options = {}),
Exposed=(Window,Worker)]
interface Notification : EventTarget {
static readonly attribute NotificationPermission permission;
@@ -77,8 +77,8 @@ dictionary GetNotificationOptions {
};
partial interface ServiceWorkerRegistration {
- Promise<void> showNotification(DOMString title, optional NotificationOptions options);
- Promise<sequence<Notification>> getNotifications(optional GetNotificationOptions filter);
+ Promise<void> showNotification(DOMString title, optional NotificationOptions options = {});
+ Promise<sequence<Notification>> getNotifications(optional GetNotificationOptions filter = {});
};
[Constructor(DOMString type, NotificationEventInit eventInitDict),
diff --git a/tests/wpt/web-platform-tests/interfaces/orientation-sensor.idl b/tests/wpt/web-platform-tests/interfaces/orientation-sensor.idl
index a9aec968e0a..9ee099881b0 100644
--- a/tests/wpt/web-platform-tests/interfaces/orientation-sensor.idl
+++ b/tests/wpt/web-platform-tests/interfaces/orientation-sensor.idl
@@ -17,11 +17,11 @@ dictionary OrientationSensorOptions : SensorOptions {
OrientationSensorLocalCoordinateSystem referenceFrame = "device";
};
-[Constructor(optional OrientationSensorOptions sensorOptions), SecureContext, Exposed=Window]
+[Constructor(optional OrientationSensorOptions sensorOptions = {}), SecureContext, Exposed=Window]
interface AbsoluteOrientationSensor : OrientationSensor {
};
-[Constructor(optional OrientationSensorOptions sensorOptions), SecureContext, Exposed=Window]
+[Constructor(optional OrientationSensorOptions sensorOptions = {}), SecureContext, Exposed=Window]
interface RelativeOrientationSensor : OrientationSensor {
};
diff --git a/tests/wpt/web-platform-tests/interfaces/service-workers.idl b/tests/wpt/web-platform-tests/interfaces/service-workers.idl
index 8e37060a180..0feabd389cf 100644
--- a/tests/wpt/web-platform-tests/interfaces/service-workers.idl
+++ b/tests/wpt/web-platform-tests/interfaces/service-workers.idl
@@ -8,7 +8,7 @@ interface ServiceWorker : EventTarget {
readonly attribute USVString scriptURL;
readonly attribute ServiceWorkerState state;
void postMessage(any message, sequence<object> transfer);
- void postMessage(any message, optional PostMessageOptions options);
+ void postMessage(any message, optional PostMessageOptions options = {});
// event
attribute EventHandler onstatechange;
@@ -60,7 +60,7 @@ interface ServiceWorkerContainer : EventTarget {
readonly attribute ServiceWorker? controller;
readonly attribute Promise<ServiceWorkerRegistration> ready;
- [NewObject] Promise<ServiceWorkerRegistration> register(USVString scriptURL, optional RegistrationOptions options);
+ [NewObject] Promise<ServiceWorkerRegistration> register(USVString scriptURL, optional RegistrationOptions options = {});
[NewObject] Promise<any> getRegistration(optional USVString clientURL = "");
[NewObject] Promise<FrozenArray<ServiceWorkerRegistration>> getRegistrations();
@@ -115,7 +115,7 @@ interface Client {
readonly attribute DOMString id;
readonly attribute ClientType type;
void postMessage(any message, sequence<object> transfer);
- void postMessage(any message, optional PostMessageOptions options);
+ void postMessage(any message, optional PostMessageOptions options = {});
};
[Exposed=ServiceWorker]
@@ -138,7 +138,7 @@ enum FrameType {
interface Clients {
// The objects returned will be new instances every time
[NewObject] Promise<any> get(DOMString id);
- [NewObject] Promise<FrozenArray<Client>> matchAll(optional ClientQueryOptions options);
+ [NewObject] Promise<FrozenArray<Client>> matchAll(optional ClientQueryOptions options = {});
[NewObject] Promise<WindowClient?> openWindow(USVString url);
[NewObject] Promise<void> claim();
};
@@ -155,7 +155,7 @@ enum ClientType {
"all"
};
-[Constructor(DOMString type, optional ExtendableEventInit eventInitDict), Exposed=ServiceWorker]
+[Constructor(DOMString type, optional ExtendableEventInit eventInitDict = {}), Exposed=ServiceWorker]
interface ExtendableEvent : Event {
void waitUntil(Promise<any> f);
};
@@ -183,7 +183,7 @@ dictionary FetchEventInit : ExtendableEventInit {
DOMString replacesClientId = "";
};
-[Constructor(DOMString type, optional ExtendableMessageEventInit eventInitDict), Exposed=ServiceWorker]
+[Constructor(DOMString type, optional ExtendableMessageEventInit eventInitDict = {}), Exposed=ServiceWorker]
interface ExtendableMessageEvent : ExtendableEvent {
readonly attribute any data;
readonly attribute USVString origin;
@@ -206,13 +206,13 @@ partial interface mixin WindowOrWorkerGlobalScope {
[SecureContext, Exposed=(Window,Worker)]
interface Cache {
- [NewObject] Promise<any> match(RequestInfo request, optional CacheQueryOptions options);
- [NewObject] Promise<FrozenArray<Response>> matchAll(optional RequestInfo request, optional CacheQueryOptions options);
+ [NewObject] Promise<any> match(RequestInfo request, optional CacheQueryOptions options = {});
+ [NewObject] Promise<FrozenArray<Response>> matchAll(optional RequestInfo request, optional CacheQueryOptions options = {});
[NewObject] Promise<void> add(RequestInfo request);
[NewObject] Promise<void> addAll(sequence<RequestInfo> requests);
[NewObject] Promise<void> put(RequestInfo request, Response response);
- [NewObject] Promise<boolean> delete(RequestInfo request, optional CacheQueryOptions options);
- [NewObject] Promise<FrozenArray<Request>> keys(optional RequestInfo request, optional CacheQueryOptions options);
+ [NewObject] Promise<boolean> delete(RequestInfo request, optional CacheQueryOptions options = {});
+ [NewObject] Promise<FrozenArray<Request>> keys(optional RequestInfo request, optional CacheQueryOptions options = {});
};
dictionary CacheQueryOptions {
@@ -223,7 +223,7 @@ dictionary CacheQueryOptions {
[SecureContext, Exposed=(Window,Worker)]
interface CacheStorage {
- [NewObject] Promise<any> match(RequestInfo request, optional MultiCacheQueryOptions options);
+ [NewObject] Promise<any> match(RequestInfo request, optional MultiCacheQueryOptions options = {});
[NewObject] Promise<boolean> has(DOMString cacheName);
[NewObject] Promise<Cache> open(DOMString cacheName);
[NewObject] Promise<boolean> delete(DOMString cacheName);
diff --git a/tests/wpt/web-platform-tests/interfaces/user-timing.idl b/tests/wpt/web-platform-tests/interfaces/user-timing.idl
index 8b0f813ba8e..20fb2db9caa 100644
--- a/tests/wpt/web-platform-tests/interfaces/user-timing.idl
+++ b/tests/wpt/web-platform-tests/interfaces/user-timing.idl
@@ -23,7 +23,7 @@ partial interface Performance {
};
[Exposed=(Window,Worker),
- Constructor(DOMString markName, optional PerformanceMarkOptions markOptions)]
+ Constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {})]
interface PerformanceMark : PerformanceEntry {
readonly attribute any detail;
};
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/unit/format-value.html b/tests/wpt/web-platform-tests/resources/test/tests/unit/format-value.html
new file mode 100644
index 00000000000..13d01b81f35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/unit/format-value.html
@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>format_value utility function</title>
+ <meta charset="utf-8">
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+"use strict";
+
+test(function() {
+ assert_equals(format_value(null), "null");
+}, "null");
+
+test(function() {
+ assert_equals(format_value(undefined), "undefined");
+}, "undefined");
+
+test(function() {
+ assert_equals(format_value(true), "true");
+ assert_equals(format_value(false), "false");
+}, "boolean values");
+
+test(function() {
+ assert_equals(format_value(0.4), "0.4");
+ assert_equals(format_value(0), "0");
+ assert_equals(format_value(-0), "-0");
+}, "number values");
+
+test(function() {
+ assert_equals(format_value("a string"), "\"a string\"");
+ assert_equals(format_value("new\nline"), "\"new\\nline\"");
+}, "string values");
+
+test(function() {
+ var node = document.createElement("span");
+ node.setAttribute("data-foo", "bar");
+ assert_true(
+ /<span\b/i.test(format_value(node)), "element includes tag name"
+ );
+ assert_true(
+ /data-foo=["']?bar["']?/i.test(format_value(node)),
+ "element includes attributes"
+ );
+}, "node value: element node");
+
+test(function() {
+ var text = document.createTextNode("wpt");
+ assert_equals(format_value(text), "Text node \"wpt\"");
+}, "node value: text node");
+
+test(function() {
+ var node = document.createProcessingInstruction("wpt1", "wpt2");
+ assert_equals(
+ format_value(node),
+ "ProcessingInstruction node with target \"wpt1\" and data \"wpt2\""
+ );
+}, "node value: ProcessingInstruction node");
+
+test(function() {
+ var node = document.createComment("wpt");
+ assert_equals(format_value(node), "Comment node <!--wpt-->");
+}, "node value: comment node");
+
+test(function() {
+ var node = document.implementation.createDocument(
+ "application/xhtml+xml", "", null
+ );
+
+ assert_equals(format_value(node), "Document node with 0 children");
+
+ node.appendChild(document.createElement('html'));
+
+ assert_equals(format_value(node), "Document node with 1 child");
+}, "node value: document node");
+
+test(function() {
+ var node = document.implementation.createDocumentType("foo", "baz", "baz");
+
+ assert_equals(format_value(node), "DocumentType node");
+}, "node value: DocumentType node");
+
+test(function() {
+ var node = document.createDocumentFragment();
+
+ assert_equals(format_value(node), "DocumentFragment node with 0 children");
+
+ node.appendChild(document.createElement("span"));
+
+ assert_equals(format_value(node), "DocumentFragment node with 1 child");
+
+ node.appendChild(document.createElement("span"));
+
+ assert_equals(format_value(node), "DocumentFragment node with 2 children");
+}, "node value: DocumentFragment node");
+
+test(function() {
+ assert_equals(format_value(Symbol("wpt")), "symbol \"Symbol(wpt)\"");
+}, "symbol value");
+
+test(function() {
+ assert_equals(format_value([]), "[]");
+ assert_equals(format_value(["one"]), "[\"one\"]");
+ assert_equals(format_value(["one", "two"]), "[\"one\", \"two\"]");
+}, "array values");
+
+test(function() {
+ var obj = {
+ toString: function() {
+ throw "wpt";
+ }
+ };
+
+ assert_equals(
+ format_value(obj), "[stringifying object threw wpt with type string]"
+ );
+}, "object value with faulty `toString`");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/svg/animations/animVal-basics.html b/tests/wpt/web-platform-tests/svg/animations/animVal-basics.html
new file mode 100644
index 00000000000..7eb968af01e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animVal-basics.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Trivial animVal testcase, to see wheter we support it at all. Should result in a 200x200 rect and only PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "200");
+rect.setAttribute("height", "200");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "width");
+animate.setAttribute("from", "200");
+animate.setAttribute("to", "100");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_approx_equals(rect.width.animVal.value, 200, epsilon);
+ assert_equals(rect.width.baseVal.value, 200);
+}
+
+function sample2() {
+ // Check half-time conditions
+ assert_approx_equals(rect.width.animVal.value, 150, epsilon);
+ assert_equals(rect.width.baseVal.value, 200);
+}
+
+function sample3() {
+ // Check just before-end conditions
+ assert_approx_equals(rect.width.animVal.value, 100, epsilon);
+ assert_equals(rect.width.baseVal.value, 200);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-angle-to-auto.html b/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-angle-to-auto.html
new file mode 100644
index 00000000000..40fc57b4f3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-angle-to-auto.html
@@ -0,0 +1,97 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Animate SVGMarkerElement orientAttr from an angle to auto</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+
+var marker = createSVGElement("marker");
+marker.setAttribute("id", "marker");
+marker.setAttribute("viewBox", "0 0 10 10");
+marker.setAttribute("markerWidth", "2");
+marker.setAttribute("markerHeight", "2");
+marker.setAttribute("refX", "5");
+marker.setAttribute("refY", "5");
+marker.setAttribute("markerUnits", "strokeWidth");
+
+var markerPath = createSVGElement("path");
+markerPath.setAttribute("fill", "blue");
+markerPath.setAttribute("d", "M 5 0 L 10 10 L 0 10 Z");
+marker.appendChild(markerPath);
+
+var defsElement = createSVGElement("defs");
+defsElement.appendChild(marker);
+rootSVGElement.appendChild(defsElement);
+
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("fill", "none");
+path.setAttribute("stroke", "green");
+path.setAttribute("stroke-width", "10");
+path.setAttribute("marker-start", "url(#marker)");
+path.setAttribute("marker-end", "url(#marker)");
+path.setAttribute("d", "M 130 135 L 180 135 L 180 185");
+path.setAttribute("transform", "translate(-130, -120)");
+rootSVGElement.appendChild(path);
+
+var animate1 = createSVGElement("animate");
+animate1.setAttribute("id", "animation");
+animate1.setAttribute("attributeName", "orient");
+animate1.setAttribute("begin", "0s");
+animate1.setAttribute("dur", "4s");
+animate1.setAttribute("from", "90deg");
+animate1.setAttribute("to", "auto");
+animate1.setAttribute("fill", "freeze");
+marker.appendChild(animate1);
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+function sample2() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 90, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+function sample3() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_AUTO);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 0.001, sample2],
+ ["animation", 1.999, sample2],
+ ["animation", 2.001, sample3],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample3]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html b/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html
new file mode 100644
index 00000000000..fedfe4a8c28
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html
@@ -0,0 +1,97 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Animate SVGMarkerElement orientAttr from auto to auto-start-reverse</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+
+var marker = createSVGElement("marker");
+marker.setAttribute("id", "marker");
+marker.setAttribute("viewBox", "0 0 10 10");
+marker.setAttribute("markerWidth", "2");
+marker.setAttribute("markerHeight", "2");
+marker.setAttribute("refX", "5");
+marker.setAttribute("refY", "5");
+marker.setAttribute("markerUnits", "strokeWidth");
+
+var markerPath = createSVGElement("path");
+markerPath.setAttribute("fill", "blue");
+markerPath.setAttribute("d", "M 5 0 L 10 10 L 0 10 Z");
+marker.appendChild(markerPath);
+
+var defsElement = createSVGElement("defs");
+defsElement.appendChild(marker);
+rootSVGElement.appendChild(defsElement);
+
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("fill", "none");
+path.setAttribute("stroke", "green");
+path.setAttribute("stroke-width", "10");
+path.setAttribute("marker-start", "url(#marker)");
+path.setAttribute("marker-end", "url(#marker)");
+path.setAttribute("d", "M 130 135 L 180 135 L 180 185");
+path.setAttribute("transform", "translate(-130, -120)");
+rootSVGElement.appendChild(path);
+
+var animate1 = createSVGElement("animate");
+animate1.setAttribute("id", "animation");
+animate1.setAttribute("attributeName", "orient");
+animate1.setAttribute("begin", "0s");
+animate1.setAttribute("dur", "4s");
+animate1.setAttribute("from", "auto");
+animate1.setAttribute("to", "auto-start-reverse");
+animate1.setAttribute("fill", "freeze");
+marker.appendChild(animate1);
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+function sample2() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_AUTO);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+function sample3() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_UNKNOWN);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 0.001, sample2],
+ ["animation", 1.999, sample2],
+ ["animation", 2.001, sample3],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample3]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-to-angle.html b/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-to-angle.html
new file mode 100644
index 00000000000..6b4ba2bfef2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-marker-orient-to-angle.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Animate SVGMarkerElement orientAttr to an angle</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+
+var marker = createSVGElement("marker");
+marker.setAttribute("id", "marker");
+marker.setAttribute("viewBox", "0 0 10 10");
+marker.setAttribute("markerWidth", "2");
+marker.setAttribute("markerHeight", "2");
+marker.setAttribute("refX", "5");
+marker.setAttribute("refY", "5");
+marker.setAttribute("markerUnits", "strokeWidth");
+
+var markerPath = createSVGElement("path");
+markerPath.setAttribute("fill", "blue");
+markerPath.setAttribute("d", "M 5 0 L 10 10 L 0 10 Z");
+marker.appendChild(markerPath);
+
+var defsElement = createSVGElement("defs");
+defsElement.appendChild(marker);
+rootSVGElement.appendChild(defsElement);
+
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("fill", "none");
+path.setAttribute("stroke", "green");
+path.setAttribute("stroke-width", "10");
+path.setAttribute("marker-start", "url(#marker)");
+path.setAttribute("marker-end", "url(#marker)");
+path.setAttribute("d", "M 130 135 L 180 135 L 180 185");
+path.setAttribute("transform", "translate(-130, -120)");
+rootSVGElement.appendChild(path);
+
+var animate1 = createSVGElement("animate");
+animate1.setAttribute("id", "animation");
+animate1.setAttribute("attributeName", "orient");
+animate1.setAttribute("begin", "0s");
+animate1.setAttribute("dur", "4s");
+animate1.setAttribute("to", "180deg");
+animate1.setAttribute("fill", "freeze");
+marker.appendChild(animate1);
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+function sample2() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 90, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+function sample3() {
+ assert_approx_equals(marker.orientAngle.animVal.value, 180, epsilon);
+ assert_equals(marker.orientAngle.baseVal.value, 0);
+
+ assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+ assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample3]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete-keyTimes.html b/tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete-keyTimes.html
new file mode 100644
index 00000000000..0e80e03f887
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete-keyTimes.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test calcMode discrete with from-to animation on numbers. You should see a green 100x100 rect and only PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("x", "100");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "x");
+animate.setAttribute("values", "100;200;300");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "3s");
+animate.setAttribute("keyTimes", "0;0.5;1");
+animate.setAttribute("calcMode", "discrete");
+animate.setAttribute("fill", "freeze");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ assert_equals(rect.x.animVal.value, 100);
+ assert_equals(rect.x.baseVal.value, 100);
+}
+
+function sample2() {
+ assert_equals(rect.x.animVal.value, 200);
+ assert_equals(rect.x.baseVal.value, 100);
+}
+
+function sample3() {
+ assert_equals(rect.x.animVal.value, 300);
+ assert_equals(rect.x.baseVal.value, 100);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.499, sample1],
+ ["animation", 1.501, sample2],
+ ["animation", 2.999, sample2],
+ ["animation", 3.001, sample3]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.clickX = 150;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete.html b/tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete.html
new file mode 100644
index 00000000000..11563233b4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-number-calcMode-discrete.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test calcMode discrete with from-to animation on numbers. You should see a green 100x100 rect and only PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("x", "100");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "x");
+animate.setAttribute("from", "100");
+animate.setAttribute("to", "0");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+animate.setAttribute("calcMode", "discrete");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(rect.x.animVal.value, 100);
+ assert_equals(rect.x.baseVal.value, 100);
+}
+
+function sample2() {
+ assert_equals(rect.x.animVal.value, 0);
+ assert_equals(rect.x.baseVal.value, 100);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.999, sample1],
+ ["animation", 2.001, sample2],
+ ["animation", 3.999, sample2],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.clickX = 150;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Cc-Ss.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Cc-Ss.html
new file mode 100644
index 00000000000..63c450a6c70
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Cc-Ss.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M -20 -20 C 20 -20 20 -20 20 20 S 20 40 -20 20 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M -20 -20 C 20 -20 20 -20 20 20 S 20 40 -20 20 Z");
+animate.setAttribute("to", "M -20 -20 c 0 40 0 40 40 40 s 40 0 0 -40 z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M -20 -20 C 20 -20 20 -20 20 20 S 20 40 -20 20 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M -20 -20 C 10 -10 10 -10 20 20 S 30 35 -10 10 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M -20 -20 c 10 30 10 30 40 40 s 30 5 -10 -30 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M -20 -20 c 0.00999832 39.99 0.00999832 39.99 40 40 s 39.99 0.00499916 -0.00999832 -39.99 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Ll-Vv-Hh.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Ll-Vv-Hh.html
new file mode 100644
index 00000000000..4f6d85421a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Ll-Vv-Hh.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M -30 -30 L 30 0 V 30 H 0 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M -30 -30 L 30 0 V 30 H 0 Z");
+animate.setAttribute("to", "M 30 30 l -60 -30 v -30 h 30 Z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M -30 -30 L 30 0 V 30 H 0 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M -15 -15 L 15 0 V 15 H 0 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M 15 15 l -30 -15 v -15 h 15 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M 29.985 29.985 l -59.97 -29.985 v -29.985 h 29.985 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Mm-Aa-Z.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Mm-Aa-Z.html
new file mode 100644
index 00000000000..777ca301375
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Mm-Aa-Z.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", 'M -80 40 A 150 160 30 1 1 0 100 M 40 60 A 170 180 90 1 1 300 200 Z M 300 100');
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", 'M -80 40 A 150 160 30 1 1 0 100 M 40 60 A 170 180 90 1 1 300 200 Z M 300 100');
+animate.setAttribute("to", 'm -70 30 a 160 170 60 1 1 60 40 m 120 70 a 180 190 120 1 1 100 150 Z m 120 -60');
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M -80 40 A 150 160 30 1 1 0 100 M 40 60 A 170 180 90 1 1 300 200 Z M 300 100");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M -77.5 37.5 A 152.5 162.5 37.5 1 1 -2.5 92.5 M 57.5 80 A 172.5 182.5 97.5 1 1 277.5 222.5 Z M 282.5 95");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "m -72.5 32.5 a 157.5 167.5 52.5 1 1 65 45 m 100 42.5 a 177.5 187.5 112.5 1 1 140 147.5 Z m 155 -35");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "m -70.0025 30.0025 a 159.997 169.997 59.9925 1 1 60.005 40.005 m 119.98 69.9725 a 179.997 189.997 119.993 1 1 100.04 149.998 Z m 120.035 -59.975");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Qq-Tt.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Qq-Tt.html
new file mode 100644
index 00000000000..d964303fa2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-Qq-Tt.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M -30 -30 Q 30 -30 30 0 T -30 30 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M -30 -30 Q 30 -30 30 0 T -30 30 Z");
+animate.setAttribute("to", "M -30 -30 q 30 0 30 30 t -30 30 z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M -30 -30 Q 30 -30 30 0 T -30 30 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M -30 -30 Q 22.5 -30 22.5 0 T -30 30 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M -30 -30 q 37.5 0 37.5 30 t -37.5 30 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M -30 -30 q 30.0075 0 30.0075 30 t -30.0075 30 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-cC-sS-inverse.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-cC-sS-inverse.html
new file mode 100644
index 00000000000..709372706d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-cC-sS-inverse.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M -20 -20 c 0 40 0 40 40 40 s 40 0 0 -40 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M -20 -20 c 0 40 0 40 40 40 s 40 0 0 -40 Z");
+animate.setAttribute("to", "M -20 -20 C 20 -20 20 -20 20 20 S 20 40 -20 20 Z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M -20 -20 c 0 40 0 40 40 40 s 40 0 0 -40 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M -20 -20 c 10 30 10 30 40 40 s 30 5 -10 -30 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M -20 -20 C 10 -10 10 -10 20 20 S 30 35 -10 10 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M -20 -20 C 19.99 -19.99 19.99 -19.99 20 20 S 20.01 39.995 -19.99 19.99 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-lL-vV-hH-inverse.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-lL-vV-hH-inverse.html
new file mode 100644
index 00000000000..a5c6e88a1b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-lL-vV-hH-inverse.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M 30 30 l -60 -30 v -30 h 30 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M 30 30 l -60 -30 v -30 h 30 Z");
+animate.setAttribute("to", "M -30 -30 L 30 0 V 30 H 0 Z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M 30 30 l -60 -30 v -30 h 30 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M 15 15 l -30 -15 v -15 h 15 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M -15 -15 L 15 0 V 15 H 0 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M -29.985 -29.985 L 29.985 0 V 29.985 H 0 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-mM-aA-Z-inverse.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-mM-aA-Z-inverse.html
new file mode 100644
index 00000000000..3e7e6e3199a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-mM-aA-Z-inverse.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", 'm -70 30 a 160 170 60 1 1 60 40 m 120 70 a 180 190 120 1 1 100 150 Z m 120 -60');
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", 'm -70 30 a 160 170 60 1 1 60 40 m 120 70 a 180 190 120 1 1 100 150 Z m 120 -60');
+animate.setAttribute("to", 'M -80 40 A 150 160 30 1 1 0 100 M 40 60 A 170 180 90 1 1 300 200 Z M 300 100');
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "m -70 30 a 160 170 60 1 1 60 40 m 120 70 a 180 190 120 1 1 100 150 Z m 120 -60");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "m -72.5 32.5 a 157.5 167.5 52.5 1 1 65 45 m 100 42.5 a 177.5 187.5 112.5 1 1 140 147.5 Z m 155 -35");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M -77.5 37.5 A 152.5 162.5 37.5 1 1 -2.5 92.5 M 57.5 80 A 172.5 182.5 97.5 1 1 277.5 222.5 Z M 282.5 95");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M -79.9975 39.9975 A 150.003 160.003 30.0075 1 1 -0.00249481 99.9925 M 40.0175 60.02 A 170.003 180.003 90.0075 1 1 299.977 200.022 Z M 299.982 99.995");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-qQ-tT-inverse.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-qQ-tT-inverse.html
new file mode 100644
index 00000000000..85b98d4d5fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-animation-qQ-tT-inverse.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test path animation where coordinate modes of start and end differ. You should see PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M -30 -30 q 30 0 30 30 t -30 30 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+path.setAttribute("transform", "translate(50, 50)");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("from", "M -30 -30 q 30 0 30 30 t -30 30 Z");
+animate.setAttribute("to", "M -30 -30 Q 30 -30 30 0 T -30 30 Z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M -30 -30 q 30 0 30 30 t -30 30 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M -30 -30 q 37.5 0 37.5 30 t -37.5 30 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M -30 -30 Q 22.5 -30 22.5 0 T -30 30 Z");
+}
+
+function sample4() {
+ assert_equals(path.getAttribute('d'), "M -30 -30 Q 29.9925 -30 29.9925 0 T -30 30 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 1.0, sample2],
+ ["animation", 3.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.clickX = 40;
+window.clickY = 70;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animate-path-to-animation.html b/tests/wpt/web-platform-tests/svg/animations/animate-path-to-animation.html
new file mode 100644
index 00000000000..769113ce490
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animate-path-to-animation.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test calcMode spline with to animation. You should see a green 100x100 path and only PASS messages</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+var path = createSVGElement("path");
+path.setAttribute("id", "path");
+path.setAttribute("d", "M 40 40 L 60 40 L 60 60 L 40 60 Z");
+path.setAttribute("fill", "green");
+path.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animate");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "d");
+animate.setAttribute("to", "M 0 0 L 100 0 L 100 100 L 0 100 z");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+path.appendChild(animate);
+rootSVGElement.appendChild(path);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(path.getAttribute('d'), "M 40 40 L 60 40 L 60 60 L 40 60 Z");
+}
+
+function sample2() {
+ assert_equals(path.getAttribute('d'), "M 20 20 L 80 20 L 80 80 L 20 80 Z");
+}
+
+function sample3() {
+ assert_equals(path.getAttribute('d'), "M 0.00999928 0.00999928 L 99.99 0.00999928 L 99.99 99.99 L 0.00999928 99.99 Z");
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 2.0, sample2],
+ ["animation", 3.999, sample3],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-freeze.html b/tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-freeze.html
new file mode 100644
index 00000000000..4e768efb004
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-freeze.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test for animation freeze when repeatDur is not a multiple of dur</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect width="50" height="50" x="0" y="0" fill="green">
+ <animateMotion id="anim" to="100,0" begin="0s" dur="4s" fill="freeze" />
+ </rect>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 50, epsilon);
+}
+
+function sample3() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 100, epsilon);
+}
+
+function sample4() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 100, epsilon);
+}
+
+smil_async_test((t) => {
+ var rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
+ rect1 = rects[0];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["anim", 0.0, sample1],
+ ["anim", 2.0, sample2],
+ ["anim", 4.0, sample3],
+ ["anim", 6.0, sample4]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-remove.html b/tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-remove.html
new file mode 100644
index 00000000000..aeb74b4b0f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animateMotion-fill-remove.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test for animation freeze when repeatDur is not a multiple of dur</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect width="50" height="50" x="0" y="0" fill="green">
+ <animateMotion id="anim" to="100,0" begin="0s" dur="4s" fill="remove" />
+ </rect>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 50, epsilon);
+}
+
+function sample3() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+}
+
+function sample4() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+}
+
+smil_async_test((t) => {
+ var rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
+ rect1 = rects[0];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["anim", 0.0, sample1],
+ ["anim", 2.0, sample2],
+ ["anim", 4.0, sample3],
+ ["anim", 6.0, sample4]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animateMotion-multiple.html b/tests/wpt/web-platform-tests/svg/animations/animateMotion-multiple.html
new file mode 100644
index 00000000000..494d75a7855
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animateMotion-multiple.html
@@ -0,0 +1,66 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test for checking position of the svg element when multiple animateMotion are acting on it</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect width="50" height="50" x="0" y="0" fill="green">
+ <animateMotion id="anim" values="20,0" begin="0s"/>
+ <animateMotion values="40,0;80,0" begin="2s" dur="4s"/>
+ </rect>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 20, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 20, epsilon);
+}
+
+function sample3() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 40, epsilon);
+}
+
+function sample4() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 60, epsilon);
+}
+
+function sample5() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 20, epsilon);
+}
+
+function sample6() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 20, epsilon);
+}
+
+smil_async_test((t) => {
+ var rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
+ rect1 = rects[0];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["anim", 0.0, sample1],
+ ["anim", 1.0, sample2],
+ ["anim", 2.0, sample3],
+ ["anim", 4.0, sample4],
+ ["anim", 6.0, sample5],
+ ["anim", 7.0, sample6]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animateMotion-still.html b/tests/wpt/web-platform-tests/svg/animations/animateMotion-still.html
new file mode 100644
index 00000000000..bf9007ac2f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animateMotion-still.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test animations that only express an offset</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect width="50" height="50" x="0" y="0" fill="green">
+ <animateMotion id="anim" path="M 100 100 L 100 100"
+ begin="0s" dur="2s" repeatCount="2" accumulate="sum" fill="remove" />
+ </rect>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 100, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 200, epsilon);
+}
+
+function sample3() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 200, epsilon);
+}
+
+function sample4() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+}
+
+function sample5() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+}
+
+smil_async_test((t) => {
+ var rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
+ rect1 = rects[0];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["anim", 1.0, sample1],
+ ["anim", 2.0, sample2],
+ ["anim", 3.0, sample3],
+ ["anim", 4.0, sample4],
+ ["anim", 5.0, sample5]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/animateTransform-pattern-transform.html b/tests/wpt/web-platform-tests/svg/animations/animateTransform-pattern-transform.html
new file mode 100644
index 00000000000..614444bf71c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/animateTransform-pattern-transform.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Tests animation of 'patternTransform'. Should result in a 100x100 rect and only PASS messages.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<svg>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup test document
+
+var defs = createSVGElement("defs");
+rootSVGElement.appendChild(defs);
+
+var pattern = createSVGElement("pattern");
+pattern.setAttribute("id", "pattern");
+pattern.setAttribute("width", "200");
+pattern.setAttribute("height", "200");
+
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "200");
+rect.setAttribute("height", "200");
+rect.setAttribute("fill", "url(#pattern)");
+rect.setAttribute("onclick", "executeTest()");
+
+var patternRect = createSVGElement("rect");
+patternRect.setAttribute("id", "patternRect");
+patternRect.setAttribute("width", "100");
+patternRect.setAttribute("height", "100");
+patternRect.setAttribute("fill", "green");
+pattern.appendChild(patternRect);
+
+var animate = createSVGElement("animateTransform");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "patternTransform");
+animate.setAttribute("type", "scale");
+animate.setAttribute("from", "1");
+animate.setAttribute("to", "2");
+animate.setAttribute("begin", "0s");
+animate.setAttribute("dur", "4s");
+pattern.appendChild(animate);
+defs.appendChild(pattern);
+
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+function sample1() {
+ // Check initial/end conditions
+ assert_equals(pattern.patternTransform.animVal.numberOfItems, 0);
+ assert_equals(pattern.patternTransform.baseVal.numberOfItems, 0);
+}
+
+function sample2() {
+ assert_equals(pattern.patternTransform.animVal.numberOfItems, 1);
+ assert_equals(pattern.patternTransform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(pattern.patternTransform.animVal.getItem(0).matrix.a, 1, epsilon);
+
+ assert_equals(pattern.patternTransform.baseVal.numberOfItems, 0);
+}
+
+function sample3() {
+ // Check half-time conditions
+ assert_equals(pattern.patternTransform.animVal.numberOfItems, 1);
+ assert_equals(pattern.patternTransform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(pattern.patternTransform.animVal.getItem(0).matrix.a, 1.5, epsilon);
+
+ assert_equals(pattern.patternTransform.baseVal.numberOfItems, 0);
+}
+
+function sample4() {
+ // Check half-time conditions
+ assert_equals(pattern.patternTransform.animVal.numberOfItems, 1);
+ assert_equals(pattern.patternTransform.animVal.getItem(0).type, SVGTransform.SVG_TRANSFORM_SCALE);
+ assert_approx_equals(pattern.patternTransform.animVal.getItem(0).matrix.a, 2, epsilon);
+
+ assert_equals(pattern.patternTransform.baseVal.numberOfItems, 0);
+}
+
+smil_async_test((t) => {
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["animation", 0.0, sample1],
+ ["animation", 0.001, sample2],
+ ["animation", 2.0, sample3],
+ ["animation", 3.999, sample4],
+ ["animation", 4.001, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/attributeTypes.html b/tests/wpt/web-platform-tests/svg/animations/attributeTypes.html
new file mode 100644
index 00000000000..7a9ad43dd98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/attributeTypes.html
@@ -0,0 +1,121 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>This verifies several attributeTypes combiniations</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<!-- 'width' is a XML attribute, attributeType is set to "auto": this animation runs. -->
+<rect width="10" height="100" fill="green">
+ <animate id="an1" attributeType="auto" attributeName="width" fill="freeze" from="10" to="100" begin="0s" dur="4s"/>
+</rect>
+
+<!-- 'width' is a XML attribute, attributeType is set to "CSS". 'width' is not a presentation attribute, so this animation won't run. -->
+<rect x="150" width="10" height="100" fill="green">
+ <animate id="an2" attributeType="CSS" attributeName="width" fill="freeze" from="10" to="100" begin="0s" dur="4s"/>
+</rect>
+
+<!-- 'fill' is a presentation attribute, mapped to CSS, attributeType is set to "auto": this animation runs. -->
+<rect y="150" width="100" height="100" fill="red">
+ <animate id="an3" attributeType="auto" attributeName="fill" fill="freeze" from="red" to="green" begin="0s" dur="4s"/>
+</rect>
+
+<!-- 'fill' is a presentation attribute, mapped to CSS, attributeType is set to "XML": this animation runs. -->
+<rect x="150" y="150" width="100" height="100" fill="red">
+ <animate id="an4" attributeType="XML" attributeName="fill" fill="freeze" from="red" to="green" begin="0s" dur="4s"/>
+</rect>
+
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rect1.width.animVal.value, 10, epsilon);
+ assert_equals(rect1.width.baseVal.value, 10);
+ expectFillColor(rect1, 0, 128, 0);
+
+ assert_equals(rect2.width.animVal.value, 10);
+ assert_equals(rect2.width.baseVal.value, 10);
+ expectFillColor(rect2, 0, 128, 0);
+
+ assert_equals(rect3.width.animVal.value, 100);
+ assert_equals(rect3.width.baseVal.value, 100);
+ expectFillColor(rect3, 255, 0, 0);
+ assert_equals(rect3.getAttribute('fill'), "red");
+
+ assert_equals(rect4.width.animVal.value, 100);
+ assert_equals(rect4.width.baseVal.value, 100);
+ expectFillColor(rect4, 255, 0, 0);
+ assert_equals(rect4.getAttribute('fill'), "red");
+}
+
+function sample2() {
+ assert_approx_equals(rect1.width.animVal.value, 55, epsilon);
+ assert_equals(rect1.width.baseVal.value, 10);
+ expectFillColor(rect1, 0, 128, 0);
+
+ assert_equals(rect2.width.animVal.value, 55);
+ assert_equals(rect2.width.baseVal.value, 10);
+ expectFillColor(rect2, 0, 128, 0);
+
+ assert_equals(rect3.width.animVal.value, 100);
+ assert_equals(rect3.width.baseVal.value, 100);
+ expectFillColor(rect3, 128, 64, 0);
+ assert_equals(rect3.getAttribute('fill'), "red");
+
+ assert_equals(rect4.width.animVal.value, 100);
+ assert_equals(rect4.width.baseVal.value, 100);
+ expectFillColor(rect4, 128, 64, 0);
+ assert_equals(rect4.getAttribute('fill'), "red");
+}
+
+function sample3() {
+ assert_approx_equals(rect1.width.animVal.value, 100, epsilon);
+ assert_equals(rect1.width.baseVal.value, 10);
+ expectFillColor(rect1, 0, 128, 0);
+
+ assert_equals(rect2.width.animVal.value, 100);
+ assert_equals(rect2.width.baseVal.value, 10);
+ expectFillColor(rect2, 0, 128, 0);
+
+ assert_equals(rect3.width.animVal.value, 100);
+ assert_equals(rect3.width.baseVal.value, 100);
+ expectFillColor(rect3, 0, 128, 0);
+ assert_equals(rect3.getAttribute('fill'), "red");
+
+ assert_equals(rect4.width.animVal.value, 100);
+ assert_equals(rect4.width.baseVal.value, 100);
+ expectFillColor(rect4, 0, 128, 0);
+ assert_equals(rect4.getAttribute('fill'), "red");
+}
+
+smil_async_test((t) => {
+ rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
+ rect1 = rects[0];
+ rect2 = rects[1];
+ rect3 = rects[2];
+ rect4 = rects[3];
+
+ // All animations in the test file use the same duration, so it's not needed to list all sample points individually for an5/an6/an7/an8.
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["an1", 0.0, sample1],
+ ["an1", 2.0, sample2],
+ ["an1", 4.0, sample3],
+ ["an1", 60.0, sample3],
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-freeze.html b/tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-freeze.html
new file mode 100644
index 00000000000..6774c3475a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-freeze.html
@@ -0,0 +1,64 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>This tests scripting a CSS property while animation is running</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<!-- an1: Change opacity from 0 to 0.5 in 4s, a script at 2s will set the opacity CSS property to 1, fill is freeze so this won't have any visible effect, nor any effect to the computed style -->
+<rect opacity="0" width="100" height="100" fill="green">
+ <animate id="an1" attributeType="CSS" attributeName="opacity" fill="freeze" from="0" to="0.5" begin="0s" dur="4s"/>
+</rect>
+
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.25, epsilon);
+ rect.setAttribute("opacity", "1");
+}
+
+function sample3() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.25, epsilon);
+}
+
+function sample4() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.5, epsilon);
+}
+
+function sample5() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.5, epsilon);
+}
+
+smil_async_test((t) => {
+ rect = rootSVGElement.ownerDocument.getElementsByTagName("rect")[0];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["an1", 0.0, sample1],
+ ["an1", 2.0, sample2],
+ ["an1", 2.001, sample3],
+ ["an1", 3.999, sample4],
+ ["an1", 4.001, sample5],
+ ["an1", 60.0, sample5]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-remove.html b/tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-remove.html
new file mode 100644
index 00000000000..a4e8a3ac407
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/change-css-property-while-animating-fill-remove.html
@@ -0,0 +1,64 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>This tests scripting a CSS property while animation is running</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<!-- an1: Change opacity from 0 to 0.5 in 4s, a script at 2s will set the opacity CSS property to 1, fill is not freeze, so after the animation ends the opacity should be 1, not 0 -->
+<rect opacity="0" width="100" height="100" fill="green">
+ <animate id="an1" attributeType="CSS" attributeName="opacity" fill="remove" from="0" to="0.5" begin="0s" dur="4s"/>
+</rect>
+
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.25, epsilon);
+ rect.setAttribute("opacity", "1");
+}
+
+function sample3() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.25, epsilon);
+}
+
+function sample4() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 0.5, epsilon);
+}
+
+function sample5() {
+ assert_approx_equals(parseFloat(getComputedStyle(rect).opacity), 1, epsilon);
+}
+
+smil_async_test((t) => {
+ rect = rootSVGElement.ownerDocument.getElementsByTagName("rect")[0];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["an1", 0.0, sample1],
+ ["an1", 2.0, sample2],
+ ["an1", 2.001, sample3],
+ ["an1", 3.999, sample4],
+ ["an1", 4.001, sample5],
+ ["an1", 60.0, sample5]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/change-target-while-animating-SVG-property.html b/tests/wpt/web-platform-tests/svg/animations/change-target-while-animating-SVG-property.html
new file mode 100644
index 00000000000..68aa63a39d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/change-target-while-animating-SVG-property.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>This changes the target of an animation while its running</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+<rect id="target1" width="150" height="100" fill="green"/>
+<rect id="target2" y="150" width="150" height="100" fill="green"/>
+
+<!-- an1: Change width by -100 in 4s on target1. The embedder script will change the target to 'target2' at 2s. -->
+<!-- target1 should be 100px at 2s and remain this way. target2 should be 50px and remain this way. -->
+<animate id="an1" xlink:href="#target1" attributeType="XML" attributeName="width" fill="freeze" by="-100" begin="0s" dur="4s"/>
+
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rect1.width.animVal.value, 150, epsilon);
+ assert_equals(rect1.width.baseVal.value, 150);
+
+ assert_approx_equals(rect2.width.animVal.value, 150, epsilon);
+ assert_equals(rect2.width.baseVal.value, 150);
+}
+
+function sample2() {
+ assert_approx_equals(rect1.width.animVal.value, 100, epsilon);
+ assert_equals(rect1.width.baseVal.value, 150);
+
+ assert_approx_equals(rect2.width.animVal.value, 150, epsilon);
+ assert_equals(rect2.width.baseVal.value, 150);
+
+ // Switch to new target while animation is running.
+ // The effect is that rect1 is now reset to the initial state, before any animation was applied to it.
+ // Compatible with FF. In Opera it only works when not driving the timeline using setCurrentTime.
+ rootSVGElement.ownerDocument.getElementById("an1").setAttributeNS(xlinkNS, "xlink:href", "#target2");
+}
+
+function sample3() {
+ assert_approx_equals(rect1.width.animVal.value, 150, epsilon);
+ assert_equals(rect1.width.baseVal.value, 150);
+
+ assert_approx_equals(rect2.width.animVal.value, 100, epsilon);
+ assert_equals(rect2.width.baseVal.value, 150);
+}
+
+function sample4() {
+ assert_approx_equals(rect1.width.animVal.value, 150, epsilon);
+ assert_equals(rect1.width.baseVal.value, 150);
+
+ assert_approx_equals(rect2.width.animVal.value, 50, epsilon);
+ assert_equals(rect2.width.baseVal.value, 150);
+}
+
+function sample5() {
+ assert_equals(rect1.width.animVal.value, 150);
+ assert_equals(rect1.width.baseVal.value, 150);
+
+ assert_equals(rect2.width.animVal.value, 50);
+ assert_equals(rect2.width.baseVal.value, 150);
+}
+
+smil_async_test((t) => {
+ var rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
+ rect1 = rects[0];
+ rect2 = rects[1];
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["an1", 0.0, sample1],
+ ["an1", 2.0, sample2],
+ ["an1", 2.001, sample3],
+ ["an1", 3.999, sample4],
+ ["an1", 4.001, sample5],
+ ["an1", 60.0, sample5]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/animations/cyclic-syncbase.html b/tests/wpt/web-platform-tests/svg/animations/cyclic-syncbase.html
new file mode 100644
index 00000000000..c0351156e31
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/animations/cyclic-syncbase.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>Test cyclic for svg animations for syncbases</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/SVGAnimationTestCase-testharness.js"></script>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <animate id="anim" attributeName="visibility" to="visible" begin="0s" end="5s"/>
+ <rect x="0" y="0" width="50" height="50" fill="green">
+ <set attributeName="x" to="100" id="anim1" begin="0; anim2.end" dur="1s"/>
+ <set attributeName="y" to="100" id="anim2" begin="anim1.end" dur="1s"/>
+ </rect>
+</svg>
+
+<script>
+var rootSVGElement = document.querySelector("svg");
+var epsilon = 1.0;
+
+// Setup animation test
+function sample1() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 100, epsilon);
+ assert_approx_equals(rootSVGElement.getBBox().y, 0, epsilon);
+}
+
+function sample2() {
+ assert_approx_equals(rootSVGElement.getBBox().x, 0, epsilon);
+ assert_approx_equals(rootSVGElement.getBBox().y, 100, epsilon);
+}
+
+smil_async_test((t) => {
+
+ const expectedValues = [
+ // [animationId, time, sampleCallback]
+ ["anim", 0.01, sample1],
+ ["anim", 1.01, sample2],
+ ["anim", 2.01, sample1],
+ ["anim", 3.01, sample2],
+ ["anim", 4.01, sample1]
+ ];
+
+ runAnimationTest(t, expectedValues);
+});
+
+window.animationStartsImmediately = true;
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition.html b/tests/wpt/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition.html
index 78f46c9e468..02c2fe1b3b8 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition.html
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition.html
@@ -82,4 +82,33 @@ for (const composite of ['accumulate', 'add']) {
+ ` ${composite} of the effect`);
}
+test(t => {
+ const div = createDiv(t);
+ const anims = [];
+ anims.push(div.animate({ marginLeft: ['10px', '20px'],
+ composite: 'replace' },
+ 100));
+ anims.push(div.animate({ marginLeft: ['0px', '10px'],
+ composite: 'add' },
+ 100));
+ // This should fully replace the previous effects.
+ anims.push(div.animate({ marginLeft: ['20px', '30px'],
+ composite: 'replace' },
+ 100));
+ anims.push(div.animate({ marginLeft: ['30px', '40px'],
+ composite: 'add' },
+ 100));
+
+ for (const anim of anims) {
+ anim.currentTime = 50;
+ }
+
+ // The result of applying the above effect stack is:
+ // underlying = 0.5 * 20 + 0.5 * 30 = 25
+ // result = 0.5 * (underlying + 30px) + 0.5 * (underlying + 40px)
+ // = 60
+ assert_equals(getComputedStyle(div).marginLeft, '60px',
+ 'Animated style at 50%');
+}, 'Composite replace fully replaces the underlying animation value');
+
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/cookies/support/websocket-cookies-helper.sub.js b/tests/wpt/web-platform-tests/websockets/cookies/support/websocket-cookies-helper.sub.js
new file mode 100644
index 00000000000..a7fae2551e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/cookies/support/websocket-cookies-helper.sub.js
@@ -0,0 +1,57 @@
+// Set up global variables.
+(_ => {
+ var HOST = '{{host}}';
+ var CROSS_ORIGIN_HOST = '{{hosts[alt][]}}';
+ var WSS_PORT = ':{{ports[wss][0]}}';
+ var HTTPS_PORT = ':{{ports[https][0]}}';
+
+ window.WSS_ORIGIN = 'wss://' + HOST + WSS_PORT;
+ window.WSS_CROSS_SITE_ORIGIN = 'wss://' + CROSS_ORIGIN_HOST + WSS_PORT;
+ window.HTTPS_ORIGIN = 'https://' + HOST + HTTPS_PORT;
+ window.HTTPS_CROSS_SITE_ORIGIN = 'https://' + CROSS_ORIGIN_HOST + HTTPS_PORT;
+})();
+
+// Sets a cookie with each SameSite option.
+function setSameSiteCookies(origin, value) {
+ return new Promise(resolve => {
+ const ws = new WebSocket(origin + '/set-cookies-samesite?value=' + value);
+ ws.onopen = () => {
+ ws.close();
+ };
+ ws.onclose = resolve;
+ });
+}
+
+// Clears cookies set by setSameSiteCookies().
+function clearSameSiteCookies(origin) {
+ return new Promise(resolve => {
+ const ws = new WebSocket(origin + '/set-cookies-samesite?clear');
+ ws.onopen = () => ws.close();
+ ws.onclose = resolve;
+ });
+}
+
+// Gets value of Cookie header sent in request.
+function connectAndGetRequestCookiesFrom(origin) {
+ return new Promise((resolve, reject) => {
+ var ws = new WebSocket(origin + '/echo-cookie');
+ ws.onmessage = evt => {
+ var cookies = evt.data
+ resolve(cookies);
+ ws.onerror = undefined;
+ ws.onclose = undefined;
+ };
+ ws.onerror = () => reject('Unexpected error event');
+ ws.onclose = evt => reject('Unexpected close event: ' + JSON.stringify(evt));
+ });
+}
+
+// Assert that a given cookie is or is not present in the string |cookies|.
+function assertCookie(cookies, name, value, present) {
+ var assertion = present ? assert_true : assert_false;
+ var description = name + '=' + value + ' cookie is' +
+ (present ? ' ' : ' not ') + 'present.';
+ var re = new RegExp('(?:^|; )' + name + '=' + value + '(?:$|;)');
+ assertion(re.test(cookies), description);
+}
+
diff --git a/tests/wpt/web-platform-tests/websockets/cookies/third-party-cookie-accepted.https.html b/tests/wpt/web-platform-tests/websockets/cookies/third-party-cookie-accepted.https.html
new file mode 100644
index 00000000000..208d297016f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/cookies/third-party-cookie-accepted.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/websocket-cookies-helper.sub.js"></script>
+<script>
+promise_test(() => {
+ var value = '' + Math.random();
+ var origin = WSS_CROSS_SITE_ORIGIN;
+ return setSameSiteCookies(origin, value).then(
+ () => { return connectAndGetRequestCookiesFrom(origin); }
+ ).then(
+ cookies => {
+ assert_not_equals(cookies, '(none)', 'request should contain cookies.');
+ // SameSite cookies are blocked.
+ assertCookie(cookies, 'samesite-unspecified', value, false /* present */);
+ assertCookie(cookies, 'samesite-lax', value, false /* present */);
+ assertCookie(cookies, 'samesite-strict', value, false /* present */);
+ // SameSite=None third-party cookie is not blocked.
+ assertCookie(cookies, 'samesite-none', value, true /* present */);
+ return clearSameSiteCookies(origin);
+ }
+ );
+}, 'Test that third-party cookies are accepted for WebSockets.');
+</script>
diff --git a/tests/wpt/web-platform-tests/websockets/handlers/set-cookies-samesite_wsh.py b/tests/wpt/web-platform-tests/websockets/handlers/set-cookies-samesite_wsh.py
new file mode 100644
index 00000000000..6f4a1b46c2c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/handlers/set-cookies-samesite_wsh.py
@@ -0,0 +1,25 @@
+from six.moves import urllib
+
+
+def web_socket_do_extra_handshake(request):
+ url_parts = urllib.parse.urlsplit(request.uri)
+ max_age = ""
+ if "clear" in url_parts.query:
+ max_age = "; Max-Age=0"
+ value = "1"
+ if "value" in url_parts.query:
+ value = urllib.parse.parse_qs(url_parts.query)["value"][0]
+ cookies = [
+ "samesite-unspecified={}; Path=/".format(value) + max_age,
+ "samesite-lax={}; Path=/; SameSite=Lax".format(value) + max_age,
+ "samesite-strict={}; Path=/; SameSite=Strict".format(value) + max_age,
+ # SameSite=None cookies must be Secure.
+ "samesite-none={}; Path=/; SameSite=None; Secure".format(value) + max_age
+ ]
+ for cookie in cookies:
+ request.extra_headers.append(("Set-Cookie", cookie))
+
+
+def web_socket_transfer_data(request):
+ # Expect close() from user agent.
+ request.ws_stream.receive_message()
diff --git a/tests/wpt/web-platform-tests/webxr/events_input_source_recreation.https.html b/tests/wpt/web-platform-tests/webxr/events_input_source_recreation.https.html
index ab78d9d8fda..ecb4b022bf0 100644
--- a/tests/wpt/web-platform-tests/webxr/events_input_source_recreation.https.html
+++ b/tests/wpt/web-platform-tests/webxr/events_input_source_recreation.https.html
@@ -31,21 +31,40 @@ let testFunction = function(session, fakeDeviceController, t) {
assert_not_equals(cached_input_source, null);
assert_equals(cached_input_source.handedness, "none");
assert_equals(cached_input_source.targetRayMode, "gaze");
+ assertProfilesEqual(cached_input_source.profiles, ["a", "b"]);
} else if (inputChangeEvents == 2) {
// The second event should be replacing the controller with one that has
// the updated target ray mode.
- validateInputSourceChange(event, "none", "tracked-pointer");
+ validateInputSourceChange(event, "none", "tracked-pointer", ["a", "b"]);
cached_input_source = getInputSources()[0];
} else if (inputChangeEvents == 3) {
// The third event should be replacing the controller with one that has
// the updated handedness.
- validateInputSourceChange(event, "left", "tracked-pointer");
+ validateInputSourceChange(event, "left", "tracked-pointer", ["a", "b"]);
+ cached_input_source = getInputSources()[0];
+ } else if (inputChangeEvents == 4) {
+ // The fourth event should be updating the second value in the profiles
+ // array.
+ validateInputSourceChange(event, "left", "tracked-pointer", ["a", "c"]);
+ cached_input_source = getInputSources()[0];
+ } else if (inputChangeEvents == 5) {
+ // The fifth event should be removing the second value from the profiles
+ // array.
+ validateInputSourceChange(event, "left", "tracked-pointer", ["a"]);
session.dispatchEvent(watcherDone);
}
});
}
- function validateInputSourceChange(event, expected_hand, expected_mode) {
+ function assertProfilesEqual(profiles, expected_profiles) {
+ assert_equals(profiles.length, expected_profiles.length);
+ for (let i = 0; i < profiles.length; ++i) {
+ assert_equals(profiles[i], expected_profiles[i]);
+ }
+ }
+
+ function validateInputSourceChange(
+ event, expected_hand, expected_mode, expected_profiles) {
validateAdded(event.added, 1);
validateRemoved(event.removed, 1);
assert_true(event.removed.includes(cached_input_source));
@@ -53,6 +72,7 @@ let testFunction = function(session, fakeDeviceController, t) {
let source = event.added[0];
assert_equals(source.handedness, expected_hand);
assert_equals(source.targetRayMode, expected_mode);
+ assertProfilesEqual(source.profiles, expected_profiles);
}
function validateAdded(added, length) {
@@ -95,17 +115,24 @@ let testFunction = function(session, fakeDeviceController, t) {
handedness: "none",
targetRayMode: "gaze",
pointerOrigin: VALID_POINTER_TRANSFORM,
- profiles: []
+ profiles: ["a", "b"]
});
- // Make our input source change after one frame, and wait an additional
- // frame for that change to propogate.
- // Two changes made in total.
+ // Make our first input source change after one frame, and wait an additional
+ // frame for that change to propogate. Then make additional changes, waiting
+ // one frame after each one to verify that they fired an inputsourceschanged
+ // event.
session.requestAnimationFrame((time, xrFrame) => {
input_source.setTargetRayMode("tracked-pointer");
session.requestAnimationFrame((time, xrFrame) => {
input_source.setHandedness("left");
- session.requestAnimationFrame((time, xrFrame) => {});
+ session.requestAnimationFrame((time, xrFrame) => {
+ input_source.setProfiles(["a", "c"]);
+ session.requestAnimationFrame((time, xrFrame) => {
+ input_source.setProfiles(["a"]);
+ session.requestAnimationFrame((time, xrFrame) => {});
+ });
+ });
});
});
diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_visibilityState.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_visibilityState.https.html
new file mode 100644
index 00000000000..ebad10095e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/xrSession_visibilityState.https.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+<canvas id="webgl-canvas"></canvas>
+
+<script>
+let testName = "Ensures that the XRSession's visibilityState is correctly "
+ + "reported and that the associated visibilitychange event fires.";
+
+let watcherDone = new Event("watcherdone");
+let frameFired = new Event("framefired");
+
+let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
+
+let testFunction = function(session, fakeDeviceController, t) {
+ let eventWatcher = new EventWatcher(
+ t, session, ["visibilitychange", "visibilitychange", "framefired", "watcherdone"]);
+ let eventPromise = eventWatcher.wait_for(
+ ["visibilitychange", "visibilitychange", "framefired", "watcherdone"]);
+
+ function onFrame(t, frame) {
+ t.step( () => {
+ // The session should not fire any animation frames while the visibility
+ // state is hidden.
+ assert_not_equals(session.visibilityState, "hidden");
+ });
+
+ // Make sure the frame does fire when the visibility is changed back to "visible"
+ session.dispatchEvent(frameFired);
+ }
+
+ function onSessionVisibilityChangeHidden(event) {
+ t.step( () => {
+ assert_equals(session.visibilityState, "hidden");
+ });
+
+ session.removeEventListener("visibilitychange", onSessionVisibilityChangeHidden, false);
+ session.addEventListener("visibilitychange", onSessionVisibilityChangeVisible, false);
+
+ session.requestAnimationFrame()
+
+ t.step_timeout(() => {
+ fakeDeviceController.simulateVisibilityChange("visible");
+ }, 300);
+ }
+
+ function onSessionVisibilityChangeVisible(event) {
+ t.step( () => {
+ assert_equals(session.visibilityState, "visible");
+ });
+
+ session.removeEventListener("visibilitychange", onSessionVisibilityChangeVisible, false);
+ session.addEventListener("visibilitychange", onSessionVisibilityChangeInvalid, false);
+ fakeDeviceController.simulateVisibilityChange("visible");
+
+ t.step_timeout(() => {
+ session.dispatchEvent(watcherDone);
+ }, 300);
+ }
+
+ function onSessionVisibilityChangeInvalid(event) {
+ t.step( () => {
+ assert_not_reached("Should not fire visibilitychange events for the same state");
+ });
+ }
+
+ t.step( () => {
+ // Session visibility should start out as "visible"
+ assert_equals(session.visibilityState, "visible");
+ });
+
+ session.addEventListener("visibilitychange", onSessionVisibilityChangeHidden, false);
+ fakeDeviceController.simulateVisibilityChange("hidden");
+};
+
+xr_session_promise_test(
+ testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
+
+</script>