aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/wpt/meta/MANIFEST.json8309
-rw-r--r--tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html.ini26
-rw-r--r--tests/wpt/meta/css/css-color-hdr/computed.html.ini57
-rw-r--r--tests/wpt/meta/css/css-color-hdr/inheritance.html.ini3
-rw-r--r--tests/wpt/meta/css/css-color-hdr/interpolation.html.ini192
-rw-r--r--tests/wpt/meta/css/css-color-hdr/parsing.html.ini33
-rw-r--r--tests/wpt/meta/css/css-mixins/at-function-cssom.tentative.html.ini102
-rw-r--r--tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini2
-rw-r--r--tests/wpt/meta/css/css-transforms/preserve3d-and-flattening-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-values/attr-all-types.html.ini42
-rw-r--r--tests/wpt/meta/css/css-values/calc-sibling-function-in-shadow-dom.html.ini6
-rw-r--r--tests/wpt/meta/css/css-values/calc-sibling-function-parsing.html.ini18
-rw-r--r--tests/wpt/meta/css/css-values/calc-sibling-function.html.ini12
-rw-r--r--tests/wpt/meta/css/css-values/sibling-function-invalidation.html.ini12
-rw-r--r--tests/wpt/meta/dom/idlharness.window.js.ini36
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-serializable.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini2
-rw-r--r--tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini1
-rw-r--r--tests/wpt/meta/resize-observer/change-layout-in-error.html.ini3
-rw-r--r--tests/wpt/meta/url/a-element-xhtml.xhtml.ini15
-rw-r--r--tests/wpt/meta/url/a-element.html.ini15
-rw-r--r--tests/wpt/meta/url/url-constructor.any.js.ini30
-rw-r--r--tests/wpt/meta/url/url-setters-a-area.window.js.ini48
-rw-r--r--tests/wpt/meta/url/url-setters.any.js.ini48
-rw-r--r--tests/wpt/tests/.github/workflows/docker.yml4
-rw-r--r--tests/wpt/tests/IndexedDB/request-event-ordering-large-mixed-with-small-values.any.js43
-rw-r--r--tests/wpt/tests/IndexedDB/request-event-ordering-large-then-small-values.any.js28
-rw-r--r--tests/wpt/tests/IndexedDB/request-event-ordering-large-values.any.js19
-rw-r--r--tests/wpt/tests/IndexedDB/request-event-ordering-small-values.any.js20
-rw-r--r--tests/wpt/tests/IndexedDB/resources/request-event-ordering-common.js (renamed from tests/wpt/tests/IndexedDB/request-event-ordering.any.js)79
-rw-r--r--tests/wpt/tests/accname/name/comp_name_from_content.html103
-rw-r--r--tests/wpt/tests/accname/name/comp_name_from_content.tentative.html52
-rw-r--r--tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html (renamed from tests/wpt/tests/ai/language_detection/capabilities-detached-crash.tentative.https.html)7
-rw-r--r--tests/wpt/tests/ai/language_detection/capabilities.tentative.https.any.js11
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js10
-rw-r--r--tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js14
-rw-r--r--tests/wpt/tests/common/redirect.py10
-rw-r--r--tests/wpt/tests/compute-pressure/compute_pressure_detached_iframe.https.window.js2
-rw-r--r--tests/wpt/tests/compute-pressure/compute_pressure_duplicate_updates.https.window.js28
-rw-r--r--tests/wpt/tests/compute-pressure/resources/common.js6
-rw-r--r--tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html103
-rw-r--r--tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html.headers6
-rw-r--r--tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html88
-rw-r--r--tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html.headers5
-rw-r--r--tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html101
-rw-r--r--tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html.headers5
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-fallback-to-self-crash.html11
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-order-inset-modified-containing-block.html66
-rw-r--r--tests/wpt/tests/css/css-backgrounds/background-gradient-interpolation-003.html2
-rw-r--r--tests/wpt/tests/css/css-backgrounds/border-image-space-001.html2
-rw-r--r--tests/wpt/tests/css/css-backgrounds/css3-border-image-repeat-repeat.html2
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html23
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html32
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html48
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html31
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-math.js51
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js166
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js126
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js65
-rw-r--r--tests/wpt/tests/css/css-cascade/layer-namespace-sandwich-crash.html8
-rw-r--r--tests/wpt/tests/css/css-color-hdr/computed.html64
-rw-r--r--tests/wpt/tests/css/css-color-hdr/inheritance.html2
-rw-r--r--tests/wpt/tests/css/css-color-hdr/interpolation.html40
-rw-r--r--tests/wpt/tests/css/css-color-hdr/parsing.html42
-rw-r--r--tests/wpt/tests/css/css-color/currentcolor-005-ref.html31
-rw-r--r--tests/wpt/tests/css/css-color/currentcolor-005.html43
-rw-r--r--tests/wpt/tests/css/css-color/system-color-consistency.html100
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html26
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001.html43
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html38
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002.html40
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html24
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003.html35
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-increasing-hue-lch.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-longer-hue-lch-004.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation-ref.html6
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation.html8
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-single-stop-001.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-single-stop-002.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-single-stop-003.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-single-stop-004.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-single-stop-005.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html2
-rw-r--r--tests/wpt/tests/css/css-images/gradient/linear-gradient-relative-currentcolor-stop.html1
-rw-r--r--tests/wpt/tests/css/css-images/parsing/gradient-interpolation-method-invalid.html14
-rw-r--r--tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-001.html16
-rw-r--r--tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-002.html16
-rw-r--r--tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-003.html16
-rw-r--r--tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-004.html16
-rw-r--r--tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-ref.html10
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/clip-path-borderBox-1c.html2
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/clip-path-strokeBox-1a.html2
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1c.html2
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/svg-clip-path-fixed-values.html2
-rw-r--r--tests/wpt/tests/css/css-mixins/at-function-cssom.html (renamed from tests/wpt/tests/css/css-mixins/at-function-cssom.tentative.html)0
-rw-r--r--tests/wpt/tests/css/css-mixins/dashed-function-named-arg.tentative.html34
-rw-r--r--tests/wpt/tests/css/css-mixins/dashed-function-standard-property.html46
-rw-r--r--tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-001.html198
-rw-r--r--tests/wpt/tests/css/css-overflow/inline-with-scroll-marker-group-crash.html14
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-014-crash.html20
-rw-r--r--tests/wpt/tests/css/css-properties-values-api/var-reference-registered-properties.html4
-rw-r--r--tests/wpt/tests/css/css-scoping/host-has-001.tentative.html (renamed from tests/wpt/tests/css/css-scoping/host-has-001.html)0
-rw-r--r--tests/wpt/tests/css/css-scoping/host-has-002.tentative.html (renamed from tests/wpt/tests/css/css-scoping/host-has-002.html)0
-rw-r--r--tests/wpt/tests/css/css-scoping/host-has-003.tentative.html (renamed from tests/wpt/tests/css/css-scoping/host-has-003.html)0
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/scroll-initial-target/scroll-initial-target-with-text-fragment-navigation-target.html3
-rw-r--r--tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-003.html13
-rw-r--r--tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-004.html14
-rw-r--r--tests/wpt/tests/css/css-transforms/animation/rotate-transform-equivalent.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/group/svg-transform-group-009.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/group/svg-transform-nested-009.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/group/svg-transform-nested-014.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/preserve3d-and-flattening-001.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/skewX/svg-skewxy-001.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/skewY/svg-skewy-001.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/skewY/svg-skewy-006.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/skewY/svg-skewy-011.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/skewY/svg-skewy-016.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/skewY/svg-skewy-021.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/transform-input-005.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/transform-percent-008.html2
-rw-r--r--tests/wpt/tests/css/css-transforms/transform3d-sorting-006.html2
-rw-r--r--tests/wpt/tests/css/css-values/attr-all-types.html3
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function-in-shadow-dom.html (renamed from tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html)0
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function-parsing.html (renamed from tests/wpt/tests/css/css-values/calc-sibling-function-parsing.html)0
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function.html (renamed from tests/wpt/tests/css/css-values/calc-sibling-function.html)0
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-function-container-query.html67
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html45
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-function-invalidation.html (renamed from tests/wpt/tests/css/css-values/sibling-function-invalidation.html)52
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/sibling-function-media-query.tentative.html32
-rw-r--r--tests/wpt/tests/css/css-values/tree-counting/tree-scoped-sibling-function.html50
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed-with-sign-expression.html38
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed.html12
-rw-r--r--tests/wpt/tests/css/css-writing-modes/available-size-020.html86
-rw-r--r--tests/wpt/tests/css/css-writing-modes/available-size-021.html94
-rw-r--r--tests/wpt/tests/css/css-writing-modes/available-size-022.html98
-rw-r--r--tests/wpt/tests/css/css-writing-modes/available-size-023.html98
-rw-r--r--tests/wpt/tests/css/css-writing-modes/reference/available-size-020-ref.html72
-rw-r--r--tests/wpt/tests/css/css-writing-modes/reference/available-size-022-ref.html76
-rw-r--r--tests/wpt/tests/css/cssom/insertRule-import-no-sheet-crash.html10
-rw-r--r--tests/wpt/tests/css/motion/offset-path-url-003.html2
-rw-r--r--tests/wpt/tests/css/motion/offset-path-url-004.html2
-rw-r--r--tests/wpt/tests/css/motion/offset-rotate-001.html1
-rw-r--r--tests/wpt/tests/css/motion/offset-rotate-002.html1
-rw-r--r--tests/wpt/tests/css/motion/offset-rotate-003.html1
-rw-r--r--tests/wpt/tests/css/motion/offset-rotate-004.html1
-rw-r--r--tests/wpt/tests/css/motion/offset-rotate-005.html1
-rw-r--r--tests/wpt/tests/css/motion/offset-rotate-ref.html1
-rw-r--r--tests/wpt/tests/custom-elements/form-associated/form-reset-callback.html40
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/clear-site-data.https.html8
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/create-session.https.html4
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html91
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/excludeInScopeSpecification/excluded_verify_authenticated.py5
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/helper.js24
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/include-site.https.html31
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/includeInScopeSpecification/included_verify_authenticated.py5
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/login.py28
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html57
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/not-secure-connection.html5
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/pull_server_state.py6
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html37
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html5
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html4
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/refresh_session.py21
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html4
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/request_early_challenge.py22
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html56
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html6
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/session_manager.py89
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html5
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html76
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html8
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html67
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/set_cookie.py8
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/verify_authenticated.py13
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/verify_authenticated_alternate.py5
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/verify_authenticated_util.py16
-rw-r--r--tests/wpt/tests/digital-credentials/META.yml1
-rw-r--r--tests/wpt/tests/digital-credentials/default-permissions-policy.https.sub.html12
-rw-r--r--tests/wpt/tests/digital-credentials/disabled-by-permissions-policy.https.sub.html4
-rw-r--r--tests/wpt/tests/digital-credentials/enabled-on-self-origin-by-permissions-policy.https.sub.html10
-rw-r--r--tests/wpt/tests/dom/xslt/document-function.window.js43
-rw-r--r--tests/wpt/tests/editing/crashtests/delete-selection-with-null-range.html (renamed from tests/wpt/tests/editing/other/delete-selection-with-null-range-crash.html)0
-rw-r--r--tests/wpt/tests/editing/crashtests/design-mode-textarea.html (renamed from tests/wpt/tests/editing/other/design-mode-textarea-crash.html)0
-rw-r--r--tests/wpt/tests/editing/crashtests/empty-editable.html (renamed from tests/wpt/tests/editing/run/empty-editable-crash.html)0
-rw-r--r--tests/wpt/tests/editing/crashtests/first-letter-crossing-engine-boundary.html (renamed from tests/wpt/tests/editing/run/first-letter-crossing-engine-boundary-crash.html)3
-rw-r--r--tests/wpt/tests/editing/plaintext-only/styling-commands.html3
-rw-r--r--tests/wpt/tests/fledge/tentative/server-response.https.window.js31
-rw-r--r--tests/wpt/tests/generic-sensor/generic-sensor-iframe-tests.sub.js5
-rw-r--r--tests/wpt/tests/generic-sensor/generic-sensor-tests.js10
-rw-r--r--tests/wpt/tests/hsts/only-top-level-navigation-hsts-upgrade.tentative.sub.html76
-rw-r--r--tests/wpt/tests/hsts/resources/hsts.html4
-rw-r--r--tests/wpt/tests/hsts/resources/hsts.html.headers2
-rw-r--r--tests/wpt/tests/hsts/resources/post-origin-to-opener.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang-ref.html25
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic-ref.html49
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic.html31
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty-ref.html21
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty.canvas.html23
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.html25
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.html23
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html (renamed from tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.document.disconnected.canvas.html)35
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.html43
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.unknown.lang-ref.html47
-rw-r--r--tests/wpt/tests/html/canvas/element/text/2d.text.measure.text-clusters-split.tentative.html12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang-ref.html25
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html26
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html29
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html26
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html31
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html25
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang-ref.html25
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.html50
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.inherit.html54
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-en.js21
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-inherit.js19
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-ja.js12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-tr.js21
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-zh-CN.js12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.html12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.worker.js12
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml/text.yaml12
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-idl.html20
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/load-removes-queued-error-event.html21
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html17
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-img-element/naturalWidth-naturalHeight.html42
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css4
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled-ref.html6
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled.tentative.html13
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-events.tentative.html133
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-picker-starting-style.tentative.html11
-rw-r--r--tests/wpt/tests/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/interfaces/css-mixins.idl12
-rw-r--r--tests/wpt/tests/interfaces/dom.idl2
-rw-r--r--tests/wpt/tests/interfaces/webnn.idl145
-rw-r--r--tests/wpt/tests/interfaces/webtransport.idl15
-rw-r--r--tests/wpt/tests/interfaces/xhr.idl8
-rw-r--r--tests/wpt/tests/intersection-observer/clip-path-animation.html100
-rw-r--r--tests/wpt/tests/lint.ignore1
-rw-r--r--tests/wpt/tests/mediacapture-insertable-streams/VideoTrackGenerator-with-window-tracks.https.html3
-rw-r--r--tests/wpt/tests/permissions-policy/resources/digital-credentials-get.html13
-rw-r--r--tests/wpt/tests/sanitizer-api/sanitizer-removeUnsafe.tentative.html103
-rw-r--r--tests/wpt/tests/sanitizer-api/sethtml-tree-construction.sub.dat24
-rw-r--r--tests/wpt/tests/screen-orientation/onchange-event-subframe.html23
-rw-r--r--tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center-ref.html8
-rw-r--r--tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center.html34
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https.html54
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/redirect-to-prefetch-url.https.html39
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/redirect-url.https.html35
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/redirect-url.sub.https.html54
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/resources/redirect-helper.sub.js71
-rw-r--r--tests/wpt/tests/storage-access-api/requestStorageAccess-cross-site-fetch.sub.https.window.js52
-rw-r--r--tests/wpt/tests/storage-access-api/resources/echo-cookie-header.py13
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/accept-signature-script.py34
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.parser-inserted.html85
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js44
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/authority.https.window.js88
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js46
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/status.window.js2
-rw-r--r--tests/wpt/tests/svg/animations/reftests/discard-check-remove2.html41
-rw-r--r--tests/wpt/tests/svg/pservers/reftests/gradient-color-interpolation.svg2
-rw-r--r--tests/wpt/tests/svg/shapes/reftests/pathlength-005-ref.html4
-rw-r--r--tests/wpt/tests/svg/shapes/reftests/pathlength-005.html9
-rw-r--r--tests/wpt/tests/url/resources/setters_tests.json104
-rw-r--r--tests/wpt/tests/url/resources/toascii.json12
-rw-r--r--tests/wpt/tests/url/resources/urltestdata.json120
-rw-r--r--tests/wpt/tests/url/url-setters-a-area.window.js53
-rw-r--r--tests/wpt/tests/url/url-setters.any.js33
-rw-r--r--tests/wpt/tests/url/url-statics-canparse.any.js5
-rw-r--r--tests/wpt/tests/url/urlsearchparams-delete.any.js12
-rw-r--r--tests/wpt/tests/urlpattern/META.yml5
-rw-r--r--tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json21
-rw-r--r--tests/wpt/tests/wai-aria/scripts/aria-utils.js6
-rw-r--r--tests/wpt/tests/webauthn/conditional-mediation.https.html19
-rw-r--r--tests/wpt/tests/webcodecs/videoFrame-copyTo.any.js55
-rw-r--r--tests/wpt/tests/webcodecs/videoFrame-utils.js28
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/__init__.py18
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/__init__.py10
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/file_dialog_opened.py109
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/__init__.py0
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/show_open_file_picker.py32
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/accept.py25
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/conftest.py60
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/dismiss.py25
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/ignore.py24
-rw-r--r--tests/wpt/tests/webnn/resources/utils_validation.js5
-rw-r--r--tests/wpt/tests/webnn/validation_tests/elementwise-binary.https.any.js100
-rw-r--r--tests/wpt/tests/webnn/validation_tests/elementwise-logical.https.any.js59
-rw-r--r--tests/wpt/tests/workers/WorkerGlobalScope_ErrorEvent_message.htm1
-rw-r--r--tests/wpt/tests/xhr/progressevent-constructor.html30
-rw-r--r--tests/wpt/tests/xhr/progressevent-interface.html4
-rw-r--r--tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini3
293 files changed, 14550 insertions, 1831 deletions
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 12e7d538c2b..f5cfe21a213 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -410,8 +410,8 @@
},
"ai": {
"language_detection": {
- "capabilities-detached-crash.tentative.https.html": [
- "705fff6ceec378b32d7ec6efe4cdece49bf6f107",
+ "availability-detached-crash.tentative.https.html": [
+ "8dd685d990ad0c2e2524ab134da7284dbe79d010",
[
null,
{}
@@ -612,6 +612,13 @@
{}
]
],
+ "anchor-fallback-to-self-crash.html": [
+ "c5a8165d11322901546f30f948041ca96cf43639",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-scroll-composited-scrolling-001-crash.html": [
"e8ecde3a3e36702d8833c6caa0c94782243edba4",
[
@@ -1640,6 +1647,13 @@
]
},
"css-cascade": {
+ "layer-namespace-sandwich-crash.html": [
+ "c0a754e902fbd0b26ef784614dfe6fe71a29391f",
+ [
+ null,
+ {}
+ ]
+ ],
"layer-statement-copy-crash.html": [
"f183ab30ab72f2364dd71c37ff3b545bfaf556f1",
[
@@ -4126,6 +4140,13 @@
{}
]
],
+ "inline-with-scroll-marker-group-crash.html": [
+ "c32c63ca050af1e9466ab077d4cf718d9a8dca69",
+ [
+ null,
+ {}
+ ]
+ ],
"line-clamp": {
"line-clamp-auto-001-crash.html": [
"9185f9802de563fa9b838709b648342d45d72fc8",
@@ -4198,6 +4219,13 @@
{}
]
],
+ "scroll-marker-014-crash.html": [
+ "dd27d66fa5a01e69e69ae54b85dc814d57a05901",
+ [
+ null,
+ {}
+ ]
+ ],
"scroll-marker-dynamic-crash.html": [
"22c5b7d2299b8ebef349b393da82a88e224fbff9",
[
@@ -5850,6 +5878,13 @@
{}
]
],
+ "insertRule-import-no-sheet-crash.html": [
+ "43e82e817f640789bb084b2e35d96db9c2781dd5",
+ [
+ null,
+ {}
+ ]
+ ],
"insertRule-import-trailing-garbage-crash.html": [
"3acd607ca3c245dd47f4a4ddc225d8cb4e7af7b9",
[
@@ -6466,6 +6501,13 @@
{}
]
],
+ "delete-selection-with-null-range.html": [
+ "4d814eab807facfa13a11084b2d5f1ecda712c18",
+ [
+ null,
+ {}
+ ]
+ ],
"delete-to-join-inline-blocks.html": [
"a299c519cb5d4999118c349d79518cffbb891177",
[
@@ -6473,6 +6515,13 @@
{}
]
],
+ "design-mode-textarea.html": [
+ "d9f01e41653bc07d3e939a968485f0c9c60417d9",
+ [
+ null,
+ {}
+ ]
+ ],
"designMode-caret-change.html": [
"be80afd4ab8a474572d1732baecdcb1f052c57fb",
[
@@ -6508,6 +6557,13 @@
{}
]
],
+ "empty-editable.html": [
+ "eda75a13cd5b4be66f42f43154ed6ed2ff177297",
+ [
+ null,
+ {}
+ ]
+ ],
"enableInlineTableEditing-after-updating-selection-range-cross-shadow-dom-boundary.html": [
"b248e03ea05fb85b89ab50e782d37ffec9075ea9",
[
@@ -6543,6 +6599,13 @@
{}
]
],
+ "first-letter-crossing-engine-boundary.html": [
+ "ccea4365a69aa98c6c61657c20980ff1a6746300",
+ [
+ null,
+ {}
+ ]
+ ],
"format-block-selection-containing-non-editable-list.html": [
"2f8f8ea5ab2a795f945d00edbbe275aa716ddb96",
[
@@ -7180,38 +7243,6 @@
{}
]
]
- },
- "other": {
- "delete-selection-with-null-range-crash.html": [
- "4d814eab807facfa13a11084b2d5f1ecda712c18",
- [
- null,
- {}
- ]
- ],
- "design-mode-textarea-crash.html": [
- "d9f01e41653bc07d3e939a968485f0c9c60417d9",
- [
- null,
- {}
- ]
- ]
- },
- "run": {
- "empty-editable-crash.html": [
- "eda75a13cd5b4be66f42f43154ed6ed2ff177297",
- [
- null,
- {}
- ]
- ],
- "first-letter-crossing-engine-boundary-crash.html": [
- "be6325fce4894f22f7fa43a488810464f3ebdaee",
- [
- null,
- {}
- ]
- ]
}
},
"encoding": {
@@ -127524,7 +127555,7 @@
]
],
"background-gradient-interpolation-003.html": [
- "0b60549355471f1aca4caa540c292dc28e1628f9",
+ "32446b5e4e85554482b04718a1f1733d387f9a85",
[
null,
[
@@ -127544,7 +127575,7 @@
],
[
0,
- 6500
+ 7100
]
]
]
@@ -133986,7 +134017,7 @@
]
],
"border-image-space-001.html": [
- "720f0df188d962c9d3797d18df2517da46f203aa",
+ "133b0c2b41a4c57873f22d95e32c4e3d21340ae8",
[
null,
[
@@ -134006,7 +134037,7 @@
],
[
0,
- 1728
+ 3850
]
]
]
@@ -135526,7 +135557,7 @@
]
],
"css3-border-image-repeat-repeat.html": [
- "b6db467a668856eac84475dc2b86e03fc4342095",
+ "f3dc09008a9165c4e249a7033527a0226adc412f",
[
null,
[
@@ -135546,7 +135577,7 @@
],
[
0,
- 412
+ 5300
]
]
]
@@ -135958,13 +135989,13 @@
]
},
"corner-shape": {
- "corner-shape-bevel-overflow-composite.html": [
- "985b5efdc9b9c868465d658e5486cd1e7eae5fd5",
+ "corner-shape-any.html": [
+ "9c256eb89778f8060906b7d943d08a01a3cfe300",
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-composite-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
"=="
]
],
@@ -135975,25 +136006,22 @@
[
[
0,
- 100
+ 180
],
[
0,
- 255
+ 520
]
]
]
]
}
- ]
- ],
- "corner-shape-bevel-overflow.html": [
- "df604db8d13888a2c59488e374ee27ebe6878001",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%",
"=="
]
],
@@ -136004,25 +136032,22 @@
[
[
0,
- 32
+ 180
],
[
0,
- 32
+ 520
]
]
]
]
}
- ]
- ],
- "corner-shape-fill-any.html": [
- "eb3a9830837b98f8797eebfc2b621e6627c85175",
+ ],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-bottom-left-shape=scoop&border-radius=10%",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-radius=50%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-bottom-left-shape=scoop&border-radius=10%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-radius=50%",
"=="
]
],
@@ -136033,11 +136058,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136045,10 +136070,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-bottom-right-shape=scoop&border-radius=50%",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-top-left-radius=30%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-bottom-right-shape=scoop&border-radius=50%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-left-radius=30%",
"=="
]
],
@@ -136059,11 +136084,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136071,10 +136096,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-shape=squircle&border-radius=10%",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-top-right-radius=30px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-shape=squircle&border-radius=10%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-right-radius=30px",
"=="
]
],
@@ -136085,11 +136110,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136097,10 +136122,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-shape=squircle&border-radius=30px",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=straight&border-bottom-leftradius=5px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-shape=squircle&border-radius=30px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=straight&border-bottom-leftradius=5px",
"=="
]
],
@@ -136111,11 +136136,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136123,10 +136148,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-shape=squircle&border-radius=50%",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=superellipse(5.2)&border-radius=40%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-shape=squircle&border-radius=50%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(5.2)&border-radius=40%",
"=="
]
],
@@ -136137,11 +136162,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136149,10 +136174,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-shape=straight&border-radius=5px",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=superellipse(8)&border-top-right-radius=33px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-shape=straight&border-radius=5px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(8)&border-top-right-radius=33px",
"=="
]
],
@@ -136163,11 +136188,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136175,10 +136200,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-shape=superellipse(5.2)&border-radius=33px",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-shape=superellipse(5.2)&border-radius=33px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
"=="
]
],
@@ -136189,11 +136214,11 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
@@ -136201,10 +136226,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-shape=superellipse(5.2)&border-radius=50%",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-shape=superellipse(5.2)&border-radius=50%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px",
"=="
]
],
@@ -136215,22 +136240,25 @@
[
[
0,
- 128
+ 180
],
[
0,
- 500
+ 520
]
]
]
]
}
- ],
+ ]
+ ],
+ "corner-shape-bevel-overflow-composite.html": [
+ "985b5efdc9b9c868465d658e5486cd1e7eae5fd5",
[
- "css/css-borders/tentative/corner-shape/corner-shape-fill-any.html?corner-top-right-shape=scoop&border-radius=50px",
+ null,
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html?corner-top-right-shape=scoop&border-radius=50px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-composite-ref.html",
"=="
]
],
@@ -136241,11 +136269,40 @@
[
[
0,
- 128
+ 100
],
[
0,
- 500
+ 255
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-bevel-overflow.html": [
+ "df604db8d13888a2c59488e374ee27ebe6878001",
+ [
+ null,
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 32
+ ],
+ [
+ 0,
+ 32
]
]
]
@@ -149909,6 +149966,19 @@
{}
]
],
+ "currentcolor-005.html": [
+ "67a9dc2bb1f8b68980a96e9e395ffc4fe4b5b529",
+ [
+ null,
+ [
+ [
+ "/css/css-color/currentcolor-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"currentcolor-visited-fallback.html": [
"a83506b5e581ac28a4864b47426e30d796f6d3d8",
[
@@ -196584,6 +196654,45 @@
}
]
],
+ "gradient-analogous-missing-components-001.html": [
+ "0bfd7bb615f7f8d2e5b8b1b1ce11deb3643121d9",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gradient-analogous-missing-components-002.html": [
+ "96038650136fb48d49c3951c2c4433d5fe205650",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gradient-analogous-missing-components-003.html": [
+ "c4c8995c1ef840f7f42424743643d2aedfd62270",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"gradient-decreasing-hue-hsl.html": [
"973974417ea306380adc4f3fc3e75b6daa0b9af9",
[
@@ -196975,7 +197084,7 @@
]
],
"gradient-increasing-hue-lch.html": [
- "603c023e5ca2c00b1b6f1cef55ebca9b101bcdcc",
+ "f6de5c43dbe98fced8de503515f37a5be187ce97",
[
null,
[
@@ -196995,7 +197104,7 @@
],
[
0,
- 23900
+ 24900
]
]
]
@@ -197324,7 +197433,7 @@
]
],
"gradient-longer-hue-lch-004.html": [
- "6975e26957da1b3ce85341b167ae717d4006251d",
+ "e32d86d70ee8b2e87bb7e719213a60c7dee4ae56",
[
null,
[
@@ -197344,7 +197453,7 @@
],
[
0,
- 1240
+ 1540
]
]
]
@@ -197505,7 +197614,7 @@
]
],
"gradient-none-interpolation.html": [
- "06d7be6e66b6a08132fa9474cd51ea3817300de0",
+ "11bac74b9b5fc901045978d7c37b2892ee20676d",
[
null,
[
@@ -197525,7 +197634,7 @@
],
[
0,
- 5000
+ 15000
]
]
]
@@ -197534,7 +197643,7 @@
]
],
"gradient-single-stop-001.html": [
- "af43fd7e9fcb5d51921e1e2b1e48bb3bae5da5d5",
+ "1e89b3ffc67766552529f7dd09c8590b2c55c27c",
[
null,
[
@@ -197554,7 +197663,7 @@
],
[
0,
- 4500
+ 6000
]
]
]
@@ -197563,7 +197672,7 @@
]
],
"gradient-single-stop-002.html": [
- "8721f8d6dd6b43ca002e3bc645bb5c0219484fbd",
+ "912ca2016bc90d4eeaf9d2286897d65c7df38f06",
[
null,
[
@@ -197583,7 +197692,7 @@
],
[
0,
- 4500
+ 6000
]
]
]
@@ -197592,7 +197701,7 @@
]
],
"gradient-single-stop-003.html": [
- "39d9761e48ba8da307122444a96a42fedaf4284a",
+ "6430cdc4296c051e75c24226d2566567ca6f3f9d",
[
null,
[
@@ -197612,7 +197721,7 @@
],
[
0,
- 4500
+ 6000
]
]
]
@@ -197621,7 +197730,7 @@
]
],
"gradient-single-stop-004.html": [
- "191e906f0e637b83c38ab465fad2cee05ed7cf42",
+ "7e4f675c912db0a8b4012313398b4bee9dfd4786",
[
null,
[
@@ -197641,7 +197750,7 @@
],
[
0,
- 4500
+ 6000
]
]
]
@@ -197650,7 +197759,7 @@
]
],
"gradient-single-stop-005.html": [
- "c3072c75146da4c35db62fb0ee1179efbb13e230",
+ "a94e0ce53d638a14a5597a9bfea7ae8cb19bfb9b",
[
null,
[
@@ -197670,7 +197779,7 @@
],
[
0,
- 4500
+ 6000
]
]
]
@@ -197766,7 +197875,7 @@
]
],
"gradient-single-stop-longer-hue-hsl-002.html": [
- "5b1dd25113a43a1a26a1f8e261c6bed1431086de",
+ "218eec044d3de20334b852d2638aab5596f117cf",
[
null,
[
@@ -197786,7 +197895,7 @@
],
[
0,
- 9050
+ 18000
]
]
]
@@ -197908,7 +198017,7 @@
]
],
"linear-gradient-relative-currentcolor-stop.html": [
- "901b0894e158c503a46b172345eb3106336336ac",
+ "3ddabe7b100ef5217aec3b22532c1f027788de78",
[
null,
[
@@ -197917,7 +198026,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 5000
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"oklab-gradient.html": [
@@ -202878,6 +203003,58 @@
}
]
],
+ "radial-gradient-container-relative-units-001.html": [
+ "9663bf5133f343bb99e76913bfa5f6e057000c28",
+ [
+ null,
+ [
+ [
+ "/css/css-images/radial-gradient-container-relative-units-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "radial-gradient-container-relative-units-002.html": [
+ "73083b095d6fe0df2f14bae37b06228f7bad3faa",
+ [
+ null,
+ [
+ [
+ "/css/css-images/radial-gradient-container-relative-units-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "radial-gradient-container-relative-units-003.html": [
+ "f41e23c01fa19fce6edb1e03c01c115937712593",
+ [
+ null,
+ [
+ [
+ "/css/css-images/radial-gradient-container-relative-units-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "radial-gradient-container-relative-units-004.html": [
+ "c99059561a344af542828e1e1e2c91cbe9301c5f",
+ [
+ null,
+ [
+ [
+ "/css/css-images/radial-gradient-container-relative-units-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"repeating-conic-gradient.html": [
"9a9587f29f6b491461d9df96d76072cbe13efe9a",
[
@@ -209717,7 +209894,7 @@
]
],
"clip-path-borderBox-1c.html": [
- "99f6bb0fc978c8c27023c695b355ced6e83ea618",
+ "0783cfe0039c7cbcae55f1fbe392a525e39f70f6",
[
null,
[
@@ -209737,7 +209914,7 @@
],
[
0,
- 368
+ 750
]
]
]
@@ -211800,7 +211977,7 @@
]
],
"clip-path-strokeBox-1a.html": [
- "487f5363b694304923538d0314d3c6d2a685da6b",
+ "37cec39ff808bc51e837ecc9d03725a22c20a989",
[
null,
[
@@ -211820,7 +211997,7 @@
],
[
0,
- 368
+ 750
]
]
]
@@ -212136,7 +212313,7 @@
]
],
"clip-path-viewBox-1c.html": [
- "d46c6d2f03ea8fc93bb3f47d15d36d8a66202573",
+ "720b3b587549bc8ec9cd2fe1aa7f87db566dc74b",
[
null,
[
@@ -212156,7 +212333,7 @@
],
[
0,
- 368
+ 750
]
]
]
@@ -212346,7 +212523,7 @@
]
],
"svg-clip-path-fixed-values.html": [
- "eb2c44fbb23bd18456b97416cb4c55ba701b6105",
+ "3366e88fa23d201174bb1c9d31fb2366de777b9e",
[
null,
[
@@ -212366,7 +212543,7 @@
],
[
0,
- 608
+ 990
]
]
]
@@ -236258,7 +236435,7 @@
{}
]
],
- "host-has-001.html": [
+ "host-has-001.tentative.html": [
"79c89874c63af3b2fa14ed64e0711b006a8032dc",
[
null,
@@ -236271,7 +236448,7 @@
{}
]
],
- "host-has-002.html": [
+ "host-has-002.tentative.html": [
"33a705672aeb07fdaae71eb7fac583396f20d450",
[
null,
@@ -236284,7 +236461,7 @@
{}
]
],
- "host-has-003.html": [
+ "host-has-003.tentative.html": [
"58f1482564b0b29afd2a1c5dea7a7640d6b74a72",
[
null,
@@ -248990,6 +249167,32 @@
{}
]
],
+ "percent-height-replaced-in-percent-cell-003.html": [
+ "f0720cd9640c213bdc98ad97b80f50b2b2bf6d9d",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "percent-height-replaced-in-percent-cell-004.html": [
+ "3ef8b1b16a9c6a0e220d9d045751605223723f9c",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"percent-height-replaced-in-percent-cell.tentative.html": [
"ed5effa8a755d9533054e0b6005900305735b3d6",
[
@@ -272915,7 +273118,7 @@
]
],
"rotate-transform-equivalent.html": [
- "5748d86608d07e31f7ae7aae487217cf4867f7cc",
+ "64c3007fd918b3e36d72f8fb6cf9adab43c70c41",
[
null,
[
@@ -272935,7 +273138,7 @@
],
[
0,
- 277
+ 450
]
]
]
@@ -274464,7 +274667,7 @@
]
],
"svg-transform-group-009.html": [
- "58f4beeda9c2e207ac259f4567fef171ef0f3056",
+ "36ecf88da8515a85c90574a4577351131135da84",
[
null,
[
@@ -274480,11 +274683,11 @@
[
[
0,
- 1
+ 47
],
[
0,
- 2
+ 490
]
]
]
@@ -274639,7 +274842,7 @@
]
],
"svg-transform-nested-009.html": [
- "fe3b06ac2c564126e9bcc10203ea798655086563",
+ "286325c03eaa0cf9ec2dc896448cf8ca5a551bb9",
[
null,
[
@@ -274655,11 +274858,11 @@
[
[
0,
- 1
+ 2
],
[
0,
- 1
+ 600
]
]
]
@@ -274720,7 +274923,7 @@
]
],
"svg-transform-nested-014.html": [
- "9da7a80c1011c3481bd6d6bed3441d8a5e63997c",
+ "d8084b63ddef69caa7424163b18da709779dca77",
[
null,
[
@@ -274736,11 +274939,11 @@
[
[
0,
- 1
+ 2
],
[
0,
- 2
+ 216
]
]
]
@@ -276654,7 +276857,7 @@
]
],
"preserve3d-and-flattening-001.html": [
- "411b945e10ed9bd7e87b4011f1e1c5e6c4ae58fd",
+ "f7dc8b296c621fe27488662f358f7d94ad6009d4",
[
null,
[
@@ -276674,7 +276877,7 @@
],
[
0,
- 101
+ 500
]
]
]
@@ -277658,7 +277861,7 @@
]
],
"svg-skewxy-001.html": [
- "0eee25c5dfe36d919a1a116de15ae2780f7428c4",
+ "b15dff571df3e02740977c2ac82b7b4560cf9845",
[
null,
[
@@ -277678,7 +277881,7 @@
],
[
0,
- 1
+ 270
]
]
]
@@ -277689,7 +277892,7 @@
},
"skewY": {
"svg-skewy-001.html": [
- "a5678f30fb42bae41e660ae56fffdb99f708546a",
+ "d530dfad762d8e115cf784891fe0ca3f4c804a20",
[
null,
[
@@ -277709,7 +277912,7 @@
],
[
0,
- 2
+ 104
]
]
]
@@ -277718,7 +277921,7 @@
]
],
"svg-skewy-006.html": [
- "51d7b768973909f81726017bf522b4317999f3de",
+ "9fe8d42c08359a3c610d27ac3ce9296263b46443",
[
null,
[
@@ -277738,7 +277941,7 @@
],
[
0,
- 2
+ 104
]
]
]
@@ -277747,7 +277950,7 @@
]
],
"svg-skewy-011.html": [
- "89f0aa9e62ca59d3c71adddff5d04edd943ec591",
+ "7929bf092b7c1d9eec3a3dfc271b8afd1d6832f0",
[
null,
[
@@ -277767,7 +277970,7 @@
],
[
0,
- 2
+ 104
]
]
]
@@ -277776,7 +277979,7 @@
]
],
"svg-skewy-016.html": [
- "fee2331f96e38f5d159f10e34c76831d7189b031",
+ "8bad647f98e651f0a8bac5d63196d72b5a3ba73e",
[
null,
[
@@ -277796,7 +277999,7 @@
],
[
0,
- 2
+ 104
]
]
]
@@ -277805,7 +278008,7 @@
]
],
"svg-skewy-021.html": [
- "5905e79c0d0f11faf38466b705bf229316bdb1d4",
+ "269c289c842ac5ff76d304395b95936bc9e83a9a",
[
null,
[
@@ -277825,7 +278028,7 @@
],
[
0,
- 2
+ 104
]
]
]
@@ -279442,7 +279645,7 @@
]
],
"transform-input-005.html": [
- "efa053e9c80dab15af05cb118fef68817be81de7",
+ "16232c89a271b248b3183b449eefe984aeeb37b2",
[
null,
[
@@ -279458,7 +279661,7 @@
[
[
0,
- 128
+ 180
],
[
0,
@@ -281636,7 +281839,7 @@
]
],
"transform-percent-008.html": [
- "e4b333216333c320dafb7697a7cf47acfc20e3f5",
+ "1ba4ad9b913fe059ddd35d0bff71b3fc4f0e0ccf",
[
null,
[
@@ -281660,7 +281863,7 @@
],
[
0,
- 416
+ 560
]
]
]
@@ -283859,7 +284062,7 @@
]
],
"transform3d-sorting-006.html": [
- "acc478079e713044958958d5f02bf92bd00aa35f",
+ "d7d08a1b8c37e2b32f32d53329f5ed3b19c5e37f",
[
null,
[
@@ -283879,7 +284082,7 @@
],
[
0,
- 544
+ 920
]
]
]
@@ -311509,6 +311712,58 @@
{}
]
],
+ "available-size-020.html": [
+ "bf09886f30a0762e8a56d0ad01a335b263280b39",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/available-size-020-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "available-size-021.html": [
+ "4547ba1934f8ec3432f1f09dfda0c06f84494026",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/available-size-020-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "available-size-022.html": [
+ "5e6e684adae62960c3abb8b8d4e3a14bc7d72c78",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/available-size-022-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "available-size-023.html": [
+ "a1be62a27e2395a243410fe89a0d662db5e4a535",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/available-size-022-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"background-position-vrl-018.xht": [
"d4e76334b7647340282d732692f08b6691437930",
[
@@ -328976,7 +329231,7 @@
]
],
"offset-path-url-003.html": [
- "4485b52d071f15b9b9f812af0fe5f56a30cd0494",
+ "7e0c2fe0b507f157a354fa9771f4ea6f0f34e177",
[
null,
[
@@ -328996,7 +329251,7 @@
],
[
0,
- 76
+ 85
]
]
]
@@ -329005,7 +329260,7 @@
]
],
"offset-path-url-004.html": [
- "05aea375a18018eac9e0797f2cbdc1c3dae8963d",
+ "d1e4135a263f992207d83f5cb7a319fb59bc519a",
[
null,
[
@@ -329025,7 +329280,7 @@
],
[
0,
- 65
+ 70
]
]
]
@@ -329125,7 +329380,7 @@
]
],
"offset-rotate-001.html": [
- "e5b13fe8a9ab5a4db3acf1c6428c951d1a146da6",
+ "56173cf4e4f1918097ca4b2d2a532e421a4e04bf",
[
null,
[
@@ -329138,7 +329393,7 @@
]
],
"offset-rotate-002.html": [
- "1edf38d546dff30e855c6d38342107ae10875903",
+ "29888029b7bd041f6b3c2f790542c6cb9ed65f9b",
[
null,
[
@@ -329151,7 +329406,7 @@
]
],
"offset-rotate-003.html": [
- "522ff35b051ba969b6d10b7c951e0868158aaff8",
+ "7a8ddbe8142d6cc4b168af1b1d77be4d78a0ec37",
[
null,
[
@@ -329180,7 +329435,7 @@
]
],
"offset-rotate-004.html": [
- "33783d423b50585c3da0cd37f13df4763774bd38",
+ "c55887d4f61a4e4e3c5d3e31d3d0a554da2a3b60",
[
null,
[
@@ -329193,7 +329448,7 @@
]
],
"offset-rotate-005.html": [
- "9b1c40ed112c9f95bacfa70810d18de97fd3bcd7",
+ "42070b5bef47ac1f135fa501c7c256a70c2a732a",
[
null,
[
@@ -337452,7 +337707,7 @@
]
],
"canvas.2d.lang.dynamic.html": [
- "ad23b2c23386892a844aa71382f7c96a91bfbd37",
+ "b6bf559c1f985b3352f50739745b12037473227d",
[
null,
[
@@ -337465,7 +337720,7 @@
]
],
"canvas.2d.lang.empty.canvas.html": [
- "d1b6e52f7968adda7fd8f3125c6955ad71d35a88",
+ "d4495194397f809d46771b888fda22b33fbd7fa1",
[
null,
[
@@ -337478,7 +337733,7 @@
]
],
"canvas.2d.lang.html": [
- "372cf8c04cd149f44621ca50e340114cf4289a82",
+ "41e146cf75bb8a212f6ba19a9393096e5ff57d04",
[
null,
[
@@ -337491,7 +337746,7 @@
]
],
"canvas.2d.lang.inherit.disconnected.canvas.html": [
- "7b28b1fb9506565d1b38c02147ba63678e71e134",
+ "dee7326d2449b275981d2cc02a9af6f8874f55d5",
[
null,
[
@@ -337503,13 +337758,13 @@
{}
]
],
- "canvas.2d.lang.inherit.document.disconnected.canvas.html": [
- "e6a463ae37530351f6fc48c1defc7b73af433d5c",
+ "canvas.2d.lang.inherit.disconnected.canvas.no.lang.html": [
+ "e16b5c50307b5809b09299ec7be964d2df0e6728",
[
null,
[
[
- "/html/canvas/element/manual/text/canvas.2d.lang-ref.html",
+ "/html/canvas/element/manual/text/canvas.2d.unknown.lang-ref.html",
"=="
]
],
@@ -337517,7 +337772,7 @@
]
],
"canvas.2d.lang.inherit.html": [
- "bb2e655e15ab63e6099abc907574387bcbbd0eca",
+ "41da3d5c442539a4f771790f9bf8fe362dd1d412",
[
null,
[
@@ -341117,7 +341372,7 @@
]
],
"canvas.2d.offscreen.lang.html": [
- "0179dad8fea809594f524e0bebb4cca7ecea1141",
+ "1d34794f75d8e69e80694b6645e75fc07a523cef",
[
null,
[
@@ -341130,7 +341385,7 @@
]
],
"canvas.2d.offscreen.lang.inherit.html": [
- "5b027f6dae05f52aeeaec411034fb0daec1cf580",
+ "8916c5910825147ecf6afc6e4f53b603934d58cb",
[
null,
[
@@ -341169,7 +341424,7 @@
]
],
"canvas.2d.offscreen.transferred.lang.html": [
- "049f5484058cf9461b964816a066aae463414823",
+ "051d21ca7f5e7fb04db1c95a5d6672f22eea6aec",
[
null,
[
@@ -341182,7 +341437,7 @@
]
],
"canvas.2d.offscreen.transferred.lang.inherit.document.html": [
- "732496c93b05f2a93233b4b736365d661e7acd53",
+ "243392874a2e9cdb2f27f104265a4d18f9125b5a",
[
null,
[
@@ -341195,7 +341450,7 @@
]
],
"canvas.2d.offscreen.transferred.lang.inherit.html": [
- "9ffb6a493061fbfa2ffeb21cf3a24191624b334b",
+ "ffd0ae4aae57d2397c57cf04ea855d21c1b9d848",
[
null,
[
@@ -341234,7 +341489,7 @@
]
],
"canvas.2d.offscreen.worker.lang.html": [
- "ed438c68f91c5be020f61e1e6c499edab1ba826a",
+ "8ed884a177539048d8670383c8d586ea4b34173f",
[
null,
[
@@ -341247,7 +341502,7 @@
]
],
"canvas.2d.offscreen.worker.lang.inherit.html": [
- "ca0d0ffeee656bab162d3ef84fbd781d5dc7c081",
+ "43157d54d2b8403011ccb668536439f33453f1d7",
[
null,
[
@@ -348848,6 +349103,35 @@
}
]
],
+ "select-appearance-disabled.tentative.html": [
+ "a20fb4e0904d7dac72b4266978306bd7a5147eb0",
+ [
+ null,
+ [
+ [
+ "/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 41
+ ],
+ [
+ 0,
+ 1
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"select-appearance-fallback-bottom-left-scroller.tentative.html": [
"77f97efab212c0ae76ec33f39e5d508c1abd6b27",
[
@@ -357616,6 +357900,21 @@
]
}
},
+ "scroll-to-text-fragment": {
+ "scroll-to-text-diretive-center.html": [
+ "a3739f0b5ff93861baa631c24b827f9b3daa0f73",
+ [
+ null,
+ [
+ [
+ "/scroll-to-text-fragment/scroll-to-text-diretive-center-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"selection": {
"caret": {
"after-designMode-off.html": [
@@ -358215,6 +358514,19 @@
{}
]
],
+ "discard-check-remove2.html": [
+ "92ecaec9d2137f9c70c1160af24536800f50ec53",
+ [
+ null,
+ [
+ [
+ "/svg/animations/reftests/reference/green-100x100.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"discard-rect-as-child.svg": [
"93e14c0d73e6ea14d910507047a3ba00c637cf74",
[
@@ -360901,7 +361213,7 @@
]
],
"gradient-color-interpolation.svg": [
- "f7959437734230d394197d1837be2ba6ffaa7d3c",
+ "91dad7dcf0e57c103a0174c76c4f341d5f2dfdf8",
[
null,
[
@@ -360921,7 +361233,7 @@
],
[
0,
- 29200
+ 29400
]
]
]
@@ -361684,6 +361996,19 @@
{}
]
],
+ "pathlength-005.html": [
+ "59d4ae5fa6443bd971856c6c2e385026d9002c9f",
+ [
+ null,
+ [
+ [
+ "/svg/shapes/reftests/pathlength-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"polygon-with-filtered-marker.html": [
"def8adc6852efd36e91060e120c4f127be10b7bc",
[
@@ -366511,7 +366836,7 @@
[]
],
"docker.yml": [
- "96f4629d8b54b9e6ad0cb8f7df4f3dccad0b81f3",
+ "6d5c7c79a05faeaeb5e18040ceedaf99240020c4",
[]
],
"documentation.yml": [
@@ -366846,6 +367171,10 @@
"45c8ffef923870909cb9b0e2af128081e5bce41a",
[]
],
+ "request-event-ordering-common.js": [
+ "f754ba5f3ab98bac6a15072a23f8ce4b761a6a4b",
+ []
+ ],
"support-get-all.js": [
"3b70b828b1375d4946b45941de0b3a115deaec5b",
[]
@@ -370752,7 +371081,7 @@
[]
],
"redirect.py": [
- "f2fd1ebd51d4ad5f4ef0582510600eb3731fd2c7",
+ "1ddde9a579b7094dd7aebd0935fb32ec087fd5aa",
[]
],
"refresh.py": [
@@ -371169,7 +371498,7 @@
},
"resources": {
"common.js": [
- "4f666f1557e42dd290de2d23c997bb2fb33b57db",
+ "b5a2ca2b27f720841ce40af01db5d1ff82e729a9",
[]
],
"compute-pressure-allowed-by-permissions-policy-worker.js": [
@@ -390958,6 +391287,18 @@
"b7918c93323eff9db66ad26a73b78798d35e5f7b",
[]
],
+ "script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html.headers": [
+ "ae1e09e31ea4ba841d96458be2803871448e09ec",
+ []
+ ],
+ "script-src-trusted_types_eval_with_require_trusted_types_eval.html.headers": [
+ "3e51fcd47410a11cbb6e16cd5ea426c40e9e1dab",
+ []
+ ],
+ "script-src-trusted_types_eval_without_require_trusted_types_eval.html.headers": [
+ "5658b5ab2de0b836c0ebde7395247cfb11bdb2b1",
+ []
+ ],
"scriptnonce-specified-source.sub.html.sub.headers": [
"d23494ca83705ba3cc7c244443eef42856fbca96",
[]
@@ -411998,6 +412339,10 @@
},
"tentative": {
"corner-shape": {
+ "corner-shape-any-ref.html": [
+ "688f01c8668554efce1ccde22ebf2b12a2ff61c8",
+ []
+ ],
"corner-shape-bevel-overflow-composite-ref.html": [
"f67be0cc6388ee35801bc1eab83f857902ea2be8",
[]
@@ -412006,10 +412351,6 @@
"374302671907cfc89740026e76f671df6418f40a",
[]
],
- "corner-shape-fill-any-ref.html": [
- "7bdb829f02205d436e5c1afd802182dc11c538e0",
- []
- ],
"corner-shape-fill-ref.html": [
"4000833c31d1cad31076f52f33f0f4f95922bbd1",
[]
@@ -412027,12 +412368,16 @@
[]
],
"resources": {
- "corner-math.js": [
- "0a2ddf0889d7c767b61ffc6fa143812b828b9ba0",
+ "corner-shape.js": [
+ "2aaaf5ed28987608fba8f4f8b756cd3062e82498",
+ []
+ ],
+ "corner-utils.js": [
+ "39203aefc67d57e9e0128112e60ac5b01e147d95",
[]
],
"resolve-corner-style.js": [
- "bb6fc7dca63da2945c007b3a8b811a00cab6319b",
+ "ea065f577e09c30b56cf1171685375b7aefeebc7",
[]
]
}
@@ -413026,6 +413371,10 @@
"835e4b81e62f9b0c95c81e87f4e9eac311dc8edd",
[]
],
+ "currentcolor-005-ref.html": [
+ "67c72813aff211670b0043b09974c2bdc91f3346",
+ []
+ ],
"currentcolor-visited-fallback-ref.html": [
"8e6bf0d336145f13a42a9e60e43024339e487ac5",
[]
@@ -428213,6 +428562,18 @@
"28d57bc19c779250d792eafc2d5e4461baece0d5",
[]
],
+ "gradient-analogous-missing-components-001-ref.html": [
+ "5e89048bf00d924bc63fce23301c59c0a4a3c417",
+ []
+ ],
+ "gradient-analogous-missing-components-002-ref.html": [
+ "ecdbc4c114801aeadbd7e5ea47b54f31dd2abcc9",
+ []
+ ],
+ "gradient-analogous-missing-components-003-ref.html": [
+ "134388315a03691bdd20e77cf7d54ba959e9b7fb",
+ []
+ ],
"gradient-decreasing-hue-hsl-ref.html": [
"df6dc90ac033e4d00fca3e8f5f6e7ad998aa4c6c",
[]
@@ -428378,7 +428739,7 @@
[]
],
"gradient-none-interpolation-ref.html": [
- "89a1929e275bac96c2a2e845124e0bd9cecd3cfa",
+ "154112fe612979103ad5f7c3c8fa528c1d434a5b",
[]
],
"gradient-single-stop-longer-hue-hsl-002-ref.html": [
@@ -429060,6 +429421,10 @@
[]
]
},
+ "radial-gradient-container-relative-units-ref.html": [
+ "503058910ddc951c1f47ce536145ae6d9908ac17",
+ []
+ ],
"reference": {
"100x100-blue-green.html": [
"e4f35c3e430cc2994709f6805576d1fe2c1f9cf3",
@@ -436566,7 +436931,7 @@
[]
],
"scroll-initial-target-with-text-fragment-navigation-target.html": [
- "61a3db00c66d059e629c4e3280d64743bf6fcbf3",
+ "aea8e120c15af61717f79b52ddd2f5c957393725",
[]
],
"stash.py": [
@@ -449039,6 +449404,14 @@
"ef66b4e0d6248a8bc5b49c2654bfc77a2ac2e298",
[]
],
+ "available-size-020-ref.html": [
+ "ecd3ac273a2be4c198abba2730ef8355f4b52111",
+ []
+ ],
+ "available-size-022-ref.html": [
+ "c1e492ef24d2c9bae39611d26f4b8ca0db7d426b",
+ []
+ ],
"baseline-with-orthogonal-flow-001-ref.html": [
"dda75ca1ef495507c75c27f4a1de638bbf5506f8",
[]
@@ -452705,7 +453078,7 @@
[]
],
"offset-rotate-ref.html": [
- "ec22768e96a1cd1efab206781b985cec8f006686",
+ "4b2d36529af2af91bd9316985bb365053b949a1c",
[]
]
},
@@ -453977,28 +454350,48 @@
"29636973a589fb3d97dddbd3e35b60b7f5655c5c",
[]
],
+ "excludeInScopeSpecification": {
+ "excluded_verify_authenticated.py": [
+ "d4a7dce24b0b90ad4b8c3bb2a7c2aa6fb830edaa",
+ []
+ ]
+ },
"helper.js": [
- "c4cfcfc1f7540a12e105bdd7d3c2ab97727dbeb1",
+ "1cea6711c8aeb3adef49091ffcb3f11df3eb3f98",
[]
],
+ "includeInScopeSpecification": {
+ "included_verify_authenticated.py": [
+ "d4a7dce24b0b90ad4b8c3bb2a7c2aa6fb830edaa",
+ []
+ ]
+ },
"jwt_helper.py": [
"315fb362ff6288462e0cefee967709474f60c3ae",
[]
],
"login.py": [
- "2e2d93a8e47e627a4e4fe56c7d9bc200ad3a8edc",
+ "722c4b7afeeaa9da0221d73f3dffbdc0e11ca264",
+ []
+ ],
+ "pull_server_state.py": [
+ "6870ed5291f043c35a85669c2d69dace00f9ceaa",
[]
],
"refresh_session.py": [
- "9b39118ce714ab25363e8e6e4584d18189c1a083",
+ "c31c5192d7cd404a32d92a0cb858b5e3c8a691f9",
[]
],
"request_early_challenge.py": [
- "e3e429ee76fb6c14d22d8aff91b578f58553890b",
+ "b63b87c27f648776522850d99af3c4b8e8ed8cd5",
[]
],
"session_manager.py": [
- "98eb120ed7cc054acc1d3b999689299da5d6fdc0",
+ "7058bdbb2f2941dfaf7a3c1b290b14626fd1e5d1",
+ []
+ ],
+ "set_cookie.py": [
+ "73fde3ca523167bdf2883de7a488a39458fc3a12",
[]
],
"setup_sharded_server_state.py": [
@@ -454010,7 +454403,15 @@
[]
],
"verify_authenticated.py": [
- "fa81f0f0d2091581aa0a4a9dd1093c0cf3b9814e",
+ "ea4b5a2162a366fe8fd04d069f992a909236be66",
+ []
+ ],
+ "verify_authenticated_alternate.py": [
+ "d4a7dce24b0b90ad4b8c3bb2a7c2aa6fb830edaa",
+ []
+ ],
+ "verify_authenticated_util.py": [
+ "e9bbb74793ee07c54b8d0dee2835cf78a36f1db5",
[]
]
},
@@ -454036,7 +454437,7 @@
},
"digital-credentials": {
"META.yml": [
- "7273f019d78464df10e4ee48f9babd1ccbc1a112",
+ "d062affc1848e3f315ef4f7e1d30319545bc7992",
[]
],
"dc-types.ts": [
@@ -461704,11 +462105,11 @@
[]
],
"generic-sensor-iframe-tests.sub.js": [
- "277d5d0ea9b290b554a7746567dde65b826a165d",
+ "a63729ec2e62ed5ca6aab02278b6d0f7d38fd437",
[]
],
"generic-sensor-tests.js": [
- "b4ed22554a0ebf62bde1d13175f2681b1fa631db",
+ "970dc3314c3cb5005e0222ef8e74f0dd794cf857",
[]
],
"resources": {
@@ -461862,6 +462263,22 @@
]
}
},
+ "hsts": {
+ "resources": {
+ "hsts.html": [
+ "aad90f8b193d39fcb46abcf7b0156c349584f022",
+ []
+ ],
+ "hsts.html.headers": [
+ "1e3f57846f9dd490029c32e5d0e2a9a2863eb80d",
+ []
+ ],
+ "post-origin-to-opener.html": [
+ "8d0ac71c29cec210558ab25ca3898a6857f66b56",
+ []
+ ]
+ }
+ },
"html": {
"META.yml": [
"7eecf519f1b69eda044e17fdfafda34561b95a18",
@@ -465318,15 +465735,19 @@
[]
],
"canvas.2d.lang-ref.html": [
- "19e283985ccbfadf3ba65193f101b9ddc0c1f143",
+ "0822e6dce16c9c350be4683a0660399c3d06bc47",
[]
],
"canvas.2d.lang.dynamic-ref.html": [
- "18027189f393223d01a26a1deed2c13bc6988e42",
+ "380162b35660a8c98de294d40abf1325f1d7f3ad",
[]
],
"canvas.2d.lang.empty-ref.html": [
- "fda8b02a3445a209ea0e490359878717618886c2",
+ "580d9dac442a9c3ae80a773b698c03df8d8c7217",
+ []
+ ],
+ "canvas.2d.unknown.lang-ref.html": [
+ "89a2c92af0945b1b23395e59da15bd96e060d673",
[]
],
"canvas_text_font_001-ref.htm": [
@@ -466354,7 +466775,7 @@
[]
],
"canvas.2d.offscreen.lang-ref.html": [
- "aa13564fbba4ec4c1f4024ba07cd19c935f7f4e9",
+ "0e54d6a8e2bce7df8f8b8dca1c1c606f7623123a",
[]
],
"canvas.2d.offscreen.worker.direction-ref.html": [
@@ -466362,7 +466783,7 @@
[]
],
"canvas.2d.offscreen.worker.lang-ref.html": [
- "82b6e7316392d849932dbeb2844cbb45fca1db0c",
+ "551a092b234c3af14ca246434d8a40c111b56fbb",
[]
],
"text-direction-worker-inherit.js": [
@@ -466373,16 +466794,16 @@
"d85504f524e66fce864ab284da961624e2e3c3a5",
[]
],
- "text-lang-worker-inherit.js": [
- "20d96d94c93b8ddd192c87cd82b38e1e909a3d59",
+ "text-lang-worker-en.js": [
+ "08958811348cde24e0a7052e6b0a78317815b82e",
[]
],
- "text-lang-worker-ja.js": [
- "585fc066ac34629dcbb22c409a7db74449a90423",
+ "text-lang-worker-inherit.js": [
+ "6bc3371faf27022dbaaa6e99988e6590e112b19f",
[]
],
- "text-lang-worker-zh-CN.js": [
- "cbededf338477311973654016f5db2feb42abcc4",
+ "text-lang-worker-tr.js": [
+ "5cf708a4a022e29107d65d02a0fe680f77e59db8",
[]
]
},
@@ -466693,7 +467114,7 @@
[]
],
"text.yaml": [
- "c572f00cb0c2af8cb8b64b8f0091d940a06c75b1",
+ "48a0429f267d281927fad8d59dd6a791e6f029ac",
[]
],
"the-canvas-state.yaml": [
@@ -474693,7 +475114,7 @@
[]
],
"customizable-select-styles.css": [
- "9cac1c5899cc6fffc01e2a2c7344d366a2496780",
+ "13a500a6197955a4bceebf0382ddc41feaf09b46",
[]
],
"customizable-select-utils.js": [
@@ -474737,6 +475158,10 @@
"0b59f2839b5cd2983a7279827b93788c50527cae",
[]
],
+ "select-appearance-disabled-ref.html": [
+ "cee0175b715b6c6d72976b9217eac1ef429d4694",
+ []
+ ],
"select-appearance-fallback-bottom-left-ref.html": [
"fbc1b25e72bbf6034b6fdfdf34f7cea8012c5eb8",
[]
@@ -478454,6 +478879,10 @@
]
},
"html-unsafe-methods": {
+ "WEB_FEATURES.yml": [
+ "fb5c8374b7afe9166592f06009f69face0ab2da5",
+ []
+ ],
"resources": {
"parseHTMLUnsafe-iframe-base-pushstate.html": [
"53b855968c866e842e8eb28090f676327757ce5b",
@@ -480472,7 +480901,7 @@
[]
],
"css-mixins.idl": [
- "6629b3861f6a3fc02885081f02abbd548f00a3d2",
+ "86015e7dd0e48ebec4a251a43285126b25bf9737",
[]
],
"css-nav.idl": [
@@ -480576,7 +481005,7 @@
[]
],
"dom.idl": [
- "814040a2c401c6aa30906806c2ead963508558cd",
+ "7b4fcb920e2ec67570580b538c13bbaa86985b74",
[]
],
"edit-context.idl": [
@@ -481292,7 +481721,7 @@
[]
],
"webnn.idl": [
- "7c026d4c0a475c2b5cf1880e8339ce98841fd0b2",
+ "8dc3a0ebc14e42a993e3cc3c5c4e494a334be712",
[]
],
"webrtc-encoded-transform.idl": [
@@ -481328,7 +481757,7 @@
[]
],
"webtransport.idl": [
- "24fe5b7e61b91d850e1278d8577117c6d2f3954a",
+ "eb456336081972b4989a6c549006708a293ec6b6",
[]
],
"webusb.idl": [
@@ -481392,7 +481821,7 @@
[]
],
"xhr.idl": [
- "b4c27c8aca9ab3b44abbf39002fba9c687519257",
+ "6ff75fd27741369f9671509998a21aeb9de3761a",
[]
]
},
@@ -481785,7 +482214,7 @@
]
},
"lint.ignore": [
- "1d552f3468a236414c6c34bca22cb88ef11f09e8",
+ "65e22dccbc1d9cce01a6c570fe739e68d112df3e",
[]
],
"loading": {
@@ -485819,7 +486248,7 @@
[]
],
"digital-credentials-get.html": [
- "12a450a1ae41c806c6023d0ef17e3ae55236e931",
+ "543417f230a59b3d09705b20775a38cbabaf7a22",
[]
],
"nested-sandbox.html": [
@@ -489648,7 +490077,7 @@
[]
],
"sethtml-tree-construction.sub.dat": [
- "d39447345f9fd3839c0737518743d1016e301e34",
+ "47cc159df1fbf8066da5392311ce36a481ef1c83",
[]
],
"sethtml-unsafety.sub.dat": [
@@ -489977,6 +490406,10 @@
"6531c8aec194dad6505bf7cc988be3299a1f1807",
[]
],
+ "scroll-to-text-diretive-center-ref.html": [
+ "b9a3a74ef36b2dfe12bf1e6b99da5d39a9f410e6",
+ []
+ ],
"scroll-to-text-fragment-after-DOMContentLoaded-target.html": [
"b7d517a7f6b2781f882d0f4804225354d8dd0ac8",
[]
@@ -493877,6 +494310,10 @@
"595096e0cace1237badd1137bbcee414c01e9c15",
[]
],
+ "redirect-helper.sub.js": [
+ "a17eaabe2430090ce0554fec480480a261ae41aa",
+ []
+ ],
"ruleset.py": [
"0a6cfde79ac28d5252fcb4d5711ce9c5ca8f0a49",
[]
@@ -494451,7 +494888,7 @@
[]
],
"echo-cookie-header.py": [
- "f1599e3a89919adfe0a0de60515ef1d44a898190",
+ "0d84b0edd183c8bd0850c917010f3362fd8b69f6",
[]
],
"embedded_forwarder.js": [
@@ -494698,6 +495135,10 @@
[]
],
"signatures": {
+ "accept-signature-script.py": [
+ "a1c61f396d50332831d1af1d3749e2c790454a7a",
+ []
+ ],
"query-resource.py": [
"dea586937454298f137e9c34d8ecee2262b70c98",
[]
@@ -494708,7 +495149,7 @@
],
"tentative": {
"helper.js": [
- "1258f3bef72a347c00f60999243813042809ffce",
+ "e5e00ec7b5318d5bbe5c8542458e61b4105c5c93",
[]
]
}
@@ -495671,6 +496112,10 @@
"4b166e0cae0729babc69732c33fa7d5baaf19b20",
[]
],
+ "pathlength-005-ref.html": [
+ "b99474aa4667f94beace3d59465fa187a4f3a490",
+ []
+ ],
"reference": {
"empty.svg": [
"0c7be4e2da4480937124138e7dee3e26bd018abe",
@@ -509333,11 +509778,11 @@
[]
],
"setters_tests.json": [
- "efd548b6c88c57ccec02e244fac2b98e94d8cba5",
+ "cf8a420caab8cf2872600997dd788ca0a03cd3e9",
[]
],
"toascii.json": [
- "02291962ebce4f0bdc7d5e6bf3d01e6c144e5acc",
+ "588ef150f9ce6a6f50630f08ccb46a6306cb3a71",
[]
],
"urltestdata-javascript-only.json": [
@@ -509345,7 +509790,7 @@
[]
],
"urltestdata.json": [
- "214ed0852aa31236a6b7a975e31763de82911f9c",
+ "d1a06f6319d1bca3275d75d5433de3dc846d3322",
[]
]
},
@@ -509361,6 +509806,10 @@
}
},
"urlpattern": {
+ "META.yml": [
+ "ad348f6dfd778f953d8f55405b2ea3198dbff0d3",
+ []
+ ],
"WEB_FEATURES.yml": [
"cb82ba5cda2918be080e10ab8bbd4c145e05b790",
[]
@@ -509379,7 +509828,7 @@
[]
],
"urlpatterntestdata.json": [
- "3d5ddce1eab21ee8eca63666cfe2e096903c397f",
+ "f92ab76b71df5ab42b729ebe366e381bd9e939af",
[]
],
"urlpatterntests.js": [
@@ -509493,7 +509942,7 @@
[]
],
"aria-utils.js": [
- "5ed73b06e455265801f272bed4247671e909ef3c",
+ "ec53464c18fda38a1e26281a226d7ed8bd653d48",
[]
],
"manual.css": [
@@ -511966,7 +512415,7 @@
[]
],
"videoFrame-utils.js": [
- "a4c761306c05d58880e408b30ef2b28f6d6f0cb6",
+ "f03d8f381475ea3e53f0a90adb7a6122021ceaeb",
[]
],
"vp8.webm": [
@@ -512002,7 +512451,7 @@
[]
],
"__init__.py": [
- "ba982d1dc64ef5287d0e2e0c9a5d71a1b5cbc040",
+ "8e45c0f72651ed7b825458682fc04bc2e1a7be5a",
[]
],
"browser": {
@@ -512264,6 +512713,18 @@
"4cb61f8820175e7c8208f448bc5c35d81a85b21f",
[]
],
+ "file_dialog_opened": {
+ "__init__.py": [
+ "27f5918b4c83a0d6cd0db4870b93a5d107b7a3ce",
+ []
+ ],
+ "tentative": {
+ "__init__.py": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ []
+ ]
+ }
+ },
"perform_actions": {
"__init__.py": [
"26fbd423ea4154ee68dd10fb67d1a396f7ddfd2b",
@@ -512544,6 +513005,16 @@
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
],
+ "capabilities": {
+ "unhandled_prompt_behavior": {
+ "file": {
+ "conftest.py": [
+ "397b5a610eff8d9d15e69e8ea5b1b85c513f8d38",
+ []
+ ]
+ }
+ }
+ },
"new": {
"__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
@@ -513501,7 +513972,7 @@
[]
],
"utils_validation.js": [
- "4ee0a9fd25701881920273238642b89664080e49",
+ "77a6d79205b5365d9a92af7d1a2d39df144a0f3f",
[]
]
},
@@ -532503,10 +532974,403 @@
}
]
],
- "request-event-ordering.any.js": [
- "89c45091f1d766ed2961d8dbe0f8d0318df7e406",
+ "request-event-ordering-large-mixed-with-small-values.any.js": [
+ "46079437b549b886ae642f46b17d72e4ffcdd92b",
+ [
+ "IndexedDB/request-event-ordering-large-mixed-with-small-values.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-mixed-with-small-values.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-mixed-with-small-values.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-mixed-with-small-values.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "request-event-ordering-large-then-small-values.any.js": [
+ "d7386b384128d699a7a852743bcfb9d9f15935df",
+ [
+ "IndexedDB/request-event-ordering-large-then-small-values.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-then-small-values.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-then-small-values.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-then-small-values.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "request-event-ordering-large-values.any.js": [
+ "095ab82df015b1efcbf782f0ddc5c5aa9fcb8624",
+ [
+ "IndexedDB/request-event-ordering-large-values.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-values.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-values.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "IndexedDB/request-event-ordering-large-values.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "IndexedDB: request result events are delivered in order"
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "resources/support-promises.js"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ],
+ [
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "request-event-ordering-small-values.any.js": [
+ "05b0ce66c02762a1f8fb3f3b8fee376fa76d435a",
[
- "IndexedDB/request-event-ordering.any.html",
+ "IndexedDB/request-event-ordering-small-values.any.html",
{
"script_metadata": [
[
@@ -532526,6 +533390,10 @@
"resources/support.js"
],
[
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
"timeout",
"long"
]
@@ -532534,7 +533402,7 @@
}
],
[
- "IndexedDB/request-event-ordering.any.serviceworker.html",
+ "IndexedDB/request-event-ordering-small-values.any.serviceworker.html",
{
"script_metadata": [
[
@@ -532554,6 +533422,10 @@
"resources/support.js"
],
[
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
"timeout",
"long"
]
@@ -532562,7 +533434,7 @@
}
],
[
- "IndexedDB/request-event-ordering.any.sharedworker.html",
+ "IndexedDB/request-event-ordering-small-values.any.sharedworker.html",
{
"script_metadata": [
[
@@ -532582,6 +533454,10 @@
"resources/support.js"
],
[
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
"timeout",
"long"
]
@@ -532590,7 +533466,7 @@
}
],
[
- "IndexedDB/request-event-ordering.any.worker.html",
+ "IndexedDB/request-event-ordering-small-values.any.worker.html",
{
"script_metadata": [
[
@@ -532610,6 +533486,10 @@
"resources/support.js"
],
[
+ "script",
+ "resources/request-event-ordering-common.js"
+ ],
+ [
"timeout",
"long"
]
@@ -543970,16 +544850,7 @@
]
],
"comp_name_from_content.html": [
- "32a9a7b3c43b0f25fc09045c1a630a71c784b265",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
- "comp_name_from_content.tentative.html": [
- "3239a1dcf3106ff49c4ebb569140dd6445dbbda3",
+ "6626eecb0ddd8f6e5709350a93cfd384994efff4",
[
null,
{
@@ -544060,71 +544931,8 @@
},
"ai": {
"language_detection": {
- "capabilities.tentative.https.any.js": [
- "3eca5119a378741fc48adb44f4bd83ba7a7e06bd",
- [
- "ai/language_detection/capabilities.tentative.https.any.html",
- {
- "script_metadata": [
- [
- "title",
- "capabilities test"
- ],
- [
- "global",
- "window,worker"
- ]
- ]
- }
- ],
- [
- "ai/language_detection/capabilities.tentative.https.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "title",
- "capabilities test"
- ],
- [
- "global",
- "window,worker"
- ]
- ]
- }
- ],
- [
- "ai/language_detection/capabilities.tentative.https.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "title",
- "capabilities test"
- ],
- [
- "global",
- "window,worker"
- ]
- ]
- }
- ],
- [
- "ai/language_detection/capabilities.tentative.https.any.worker.html",
- {
- "script_metadata": [
- [
- "title",
- "capabilities test"
- ],
- [
- "global",
- "window,worker"
- ]
- ]
- }
- ]
- ],
"detector.https.tentative.any.js": [
- "2fd91c245bbe16889250abc874540be2f3ef972f",
+ "5af45e0cbf044ebbf0f2ba07f072a2408386e91f",
[
"ai/language_detection/detector.https.tentative.any.html",
{
@@ -544272,7 +545080,7 @@
]
],
"ai_translator_translate.tentative.https.any.js": [
- "4dfbf874a00c19695cac2c9395671d2eb7a3ce18",
+ "729cb04fb76e94d9bf8eb40e463b840931b0e3a7",
[
"ai/translator/ai_translator_translate.tentative.https.any.html",
{
@@ -556784,7 +557592,7 @@
]
],
"compute_pressure_detached_iframe.https.window.js": [
- "78654626fe1b775aa074850b2e7daf0beacec326",
+ "120e754cb6f1a552df8c0037931092b543414cd7",
[
"compute-pressure/compute_pressure_detached_iframe.https.window.html?globalScope=window",
{
@@ -557042,7 +557850,7 @@
]
],
"compute_pressure_duplicate_updates.https.window.js": [
- "e6f4ed10454a28bc276e839dd6a54f75769d565c",
+ "fb34e57e996bef5c34439fc5ab0dfdd368a2857e",
[
"compute-pressure/compute_pressure_duplicate_updates.https.window.html?globalScope=dedicated_worker",
{
@@ -563786,6 +564594,27 @@
{}
]
],
+ "script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html": [
+ "192dadee77025bf5fcea11317997a6cc061c1eed",
+ [
+ null,
+ {}
+ ]
+ ],
+ "script-src-trusted_types_eval_with_require_trusted_types_eval.html": [
+ "06fae6d623baa223828417fad725304862ba11f3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "script-src-trusted_types_eval_without_require_trusted_types_eval.html": [
+ "f8481194f9e363a6532f258b6eb2d283199b55ec",
+ [
+ null,
+ {}
+ ]
+ ],
"script-src-wildcards-disallowed.html": [
"7bf3d89b6726dbec7ed98e8176be3f11da9e1b86",
[
@@ -570967,6 +571796,13 @@
{}
]
],
+ "position-try-order-inset-modified-containing-block.html": [
+ "9a859c96bb4c311e61f1ef3d1b6af109b803ad89",
+ [
+ null,
+ {}
+ ]
+ ],
"position-try-order-position-area.html": [
"4ffbbd0b71ded8991b89b8ae69ac68383560da15",
[
@@ -575096,7 +575932,7 @@
]
],
"system-color-consistency.html": [
- "a3849c5781b1c37f8a5ce9277b6eba7937070798",
+ "fd73d1ab2f28984b3a229d0fb6b60718f9146f23",
[
null,
{}
@@ -575206,28 +576042,28 @@
},
"css-color-hdr": {
"computed.html": [
- "48076da6b6a9f7eece37c6e701ef1a7c5ed96e91",
+ "47021144087d8fe6976ee7a06a187e85665b8fdf",
[
null,
{}
]
],
"inheritance.html": [
- "4f7a44a77290736703b170425f5b15e0ca445039",
+ "6f893b6b68a8cd450871b18143a6f59b4345d402",
[
null,
{}
]
],
"interpolation.html": [
- "62e079f6366d7979e130e72dfec8d7f9fede07b7",
+ "41ee84210196946b222f74c6ac964d20e724382e",
[
null,
{}
]
],
"parsing.html": [
- "caf3e86a27c00862902e107b3219338633c795d6",
+ "e165a60d7edb9f7599608f6d4749ca640bfa9635",
[
null,
{}
@@ -585404,7 +586240,7 @@
]
],
"gradient-interpolation-method-invalid.html": [
- "336a387e3c212bea459e8a3834ca54537b6d2c9d",
+ "a53d5a1b770ab344f6f04b331e8435f616de8eb5",
[
null,
{}
@@ -587374,7 +588210,7 @@
}
},
"css-mixins": {
- "at-function-cssom.tentative.html": [
+ "at-function-cssom.html": [
"dbf157b3c2f40e191a6410787189eed2f42af92d",
[
null,
@@ -587402,6 +588238,13 @@
{}
]
],
+ "dashed-function-named-arg.tentative.html": [
+ "b404c6887fa33879c23c8d2d90821390cd5c87c5",
+ [
+ null,
+ {}
+ ]
+ ],
"dashed-function-parsing.html": [
"f67102b0f4448c07f781e7cafb8e50a002ad628f",
[
@@ -587409,6 +588252,13 @@
{}
]
],
+ "dashed-function-standard-property.html": [
+ "359377b75297e0c6e016a123a85dfac9549c5c4b",
+ [
+ null,
+ {}
+ ]
+ ],
"function-attr.html": [
"69cb69723ff41bcfe6fcd745f0c3d6b74a1ebd81",
[
@@ -588267,6 +589117,15 @@
}
]
],
+ "column-scroll-marker-focus-001.html": [
+ "2b566efc53c3287e76b07b8574b375e2f6356b3e",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"column-updates-computed-style.html": [
"d741b8cf915a189e13a7f7c2738bb2880aa4e852",
[
@@ -590757,7 +591616,7 @@
]
],
"var-reference-registered-properties.html": [
- "f8f094c9bc24eadd56e152b4c6d1fd0fe32a00bc",
+ "5b49c912ec530788f92647d968e791d6bd2037a7",
[
null,
{}
@@ -604501,7 +605360,7 @@
]
],
"attr-all-types.html": [
- "8dce4feb5f4f32e69d19b25c203689f8667c0e62",
+ "5ea11a68f8e26eaf13b0dd7b6b7fec841aca2c2b",
[
null,
{}
@@ -604724,27 +605583,6 @@
{}
]
],
- "calc-sibling-function-in-shadow-dom.html": [
- "92fb6ce3351b9c37b3616445b4f83969a5f30b63",
- [
- null,
- {}
- ]
- ],
- "calc-sibling-function-parsing.html": [
- "dfddf84a061556d3c7c08ac9eaae134922314439",
- [
- null,
- {}
- ]
- ],
- "calc-sibling-function.html": [
- "5fe6e00a10b1eedecb86e85898b0784a570e1e74",
- [
- null,
- {}
- ]
- ],
"calc-size": {
"animation": {
"calc-size-height-interpolation.html": [
@@ -605516,13 +606354,6 @@
{}
]
],
- "sibling-function-invalidation.html": [
- "74f4995f5f72413330e577a3a4c72ce095479225",
- [
- null,
- {}
- ]
- ],
"signed-zero.html": [
"6ede4bbb0ecb67ea40ec26e1f41c516d2e9d3a88",
[
@@ -605572,6 +606403,64 @@
{}
]
],
+ "tree-counting": {
+ "calc-sibling-function-in-shadow-dom.html": [
+ "92fb6ce3351b9c37b3616445b4f83969a5f30b63",
+ [
+ null,
+ {}
+ ]
+ ],
+ "calc-sibling-function-parsing.html": [
+ "dfddf84a061556d3c7c08ac9eaae134922314439",
+ [
+ null,
+ {}
+ ]
+ ],
+ "calc-sibling-function.html": [
+ "5fe6e00a10b1eedecb86e85898b0784a570e1e74",
+ [
+ null,
+ {}
+ ]
+ ],
+ "sibling-function-container-query.html": [
+ "addcf0b2d48f5c444a9f93264a2136342c4b48d6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "sibling-function-descriptors.tentative.html": [
+ "d31d4acf499fb62f777817f24186e394626d507e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "sibling-function-invalidation.html": [
+ "3c75c78530dca4cfb30dfc0c17c0ad2049cfb087",
+ [
+ null,
+ {}
+ ]
+ ],
+ "sibling-function-media-query.tentative.html": [
+ "c76ac449e48493c396d9aea0ab8f04dde27092c5",
+ [
+ null,
+ {}
+ ]
+ ],
+ "tree-scoped-sibling-function.html": [
+ "979466bb7cf3d5e5c4e9a2681f02f969858953e6",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"update-subpixel-rem-unit.html": [
"98d4f00f92ae90165dd9b0c82cf0496523bc9c2a",
[
@@ -606701,8 +607590,15 @@
],
"zoom": {
"parsing": {
+ "zoom-computed-with-sign-expression.html": [
+ "8029fd3a65e542749792a48100161f18fd25fee9",
+ [
+ null,
+ {}
+ ]
+ ],
"zoom-computed.html": [
- "b7484169f74b8be8afb7cb8469b51d3acc5c48a5",
+ "c6b4afc92a364bf52be9ba3b38e8292bc397d4e8",
[
null,
{}
@@ -612972,7 +613868,7 @@
]
],
"form-reset-callback.html": [
- "8b8497f8b6c4268a0fcd10baeb39bda15a09ac0e",
+ "5bfd93b951341698bc8942db6802e78af3b1b88e",
[
null,
{}
@@ -613968,70 +614864,112 @@
},
"device-bound-session-credentials": {
"clear-site-data.https.html": [
- "2d6e42977d1b98091136a5511d349e9754728d5b",
+ "6c16d31d551c934121c6c268d85c7afe98d61ea8",
[
null,
{}
]
],
"create-session.https.html": [
- "cddfd1797978d80f5344740b0224a671acf550b8",
+ "95c39608a615e06b932aa4037ba91eee92fc8412",
+ [
+ null,
+ {}
+ ]
+ ],
+ "credentials-matching.https.html": [
+ "8f516d6995c81fd2a405c82d75bd7856e79997fb",
+ [
+ null,
+ {}
+ ]
+ ],
+ "include-site.https.html": [
+ "aa0112840732d5dea40c9fb3d08e91456bef010e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "multiple-registrations.https.html": [
+ "1a2bcf5a95a29773e9671f4135d43d73b6f96705",
[
null,
{}
]
],
"not-secure-connection.html": [
- "93736c0b5966ea627f0df45c4bf59dec724c4c7e",
+ "3ff834dc7c0ac5083a1bc193e177e4c9cb95b14c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "refresh-does-not-send-challenge.https.html": [
+ "4e48d1d9ecea3672db69346eda1a3bfbb80f4795",
[
null,
{}
]
],
"refresh-replaces-config.https.html": [
- "1ac8096b5de1d4784cb43711357ade8ff97f5889",
+ "406658595dcb84f3912bf4a965ee8c377be2171e",
[
null,
{}
]
],
"refresh-with-continue-false.https.html": [
- "9ebec2209775511a3b34c47aa1c1760a6d0e2d5c",
+ "bf066cb9a6bd0f90487761dd5b95d85b8fc72c5e",
[
null,
{}
]
],
"registration-sends-challenge.https.html": [
- "36aeb631fcd40ae76db6cbb4c380162bd5354d91",
+ "f7069332b2a1430be4d468faa2e9f77655a8ae01",
+ [
+ null,
+ {}
+ ]
+ ],
+ "resolving-urls.https.html": [
+ "1010f7c43d61b26407ac395033c8f3a98670463d",
[
null,
{}
]
],
"session-cookie-has-no-attributes.https.html": [
- "9e5264193078fec1de3304414446c1a3af9459cf",
+ "c4172a288926f6ea66df163a1aeb000ed5e69aa0",
[
null,
{}
]
],
"set-authorization.https.html": [
- "3cfe23331d1826c32c2306de0b1d4c8835f122c3",
+ "b4274ca87acd0f51de32b00d7f719758dd7f6e43",
[
null,
{}
]
],
"set-early-challenge.https.html": [
- "112c87d4aee807520bdc50cd97c129e290fefd98",
+ "8c557fdff541451972bc732ce0251e445eb3ab1d",
[
null,
{}
]
],
"set-scope-origin.https.html": [
- "2105e8745a38897bbf1656631ff166c42bf056ed",
+ "38480fc6cb477d2be879767236fbcdad14d6f8a1",
+ [
+ null,
+ {}
+ ]
+ ],
+ "set-scope-specification.https.html": [
+ "6917a76094c2b161e0bf678f393b44ae18809b63",
[
null,
{}
@@ -614170,7 +615108,7 @@
]
],
"default-permissions-policy.https.sub.html": [
- "b4696293a287cfa8ad027e3f0116829052cd267f",
+ "742a94ec4eb8ff079b1b24f17179962818fb3868",
[
null,
{
@@ -614186,7 +615124,7 @@
]
],
"disabled-by-permissions-policy.https.sub.html": [
- "5c634b1b66d7974f41a2c803037231c0e58f403a",
+ "c32f73aa309b64e5785d67b3565077a8ac6b8424",
[
null,
{
@@ -614195,7 +615133,7 @@
]
],
"enabled-on-self-origin-by-permissions-policy.https.sub.html": [
- "ec70461e3857b5c1111d3b947c45527386569ff6",
+ "d530f4920a395b0a612964a32b60fec65833054e",
[
null,
{
@@ -619499,6 +620437,13 @@
]
],
"xslt": {
+ "document-function.window.js": [
+ "a01f3b37c945d0fcded4a0853d32e97d60bb9696",
+ [
+ "dom/xslt/document-function.window.html",
+ {}
+ ]
+ ],
"functions.tentative.window.js": [
"81240022dc68a8296474fcea696cdde3b66057fd",
[
@@ -623691,7 +624636,7 @@
]
],
"styling-commands.html": [
- "2afaf9212ac6439606617e99f4d1be681ff1e853",
+ "40390c642794e4cdaba1d34d09c76cd1dfc1968a",
[
"editing/plaintext-only/styling-commands.html?styleWithCSS=false",
{
@@ -667440,7 +668385,7 @@
]
],
"server-response.https.window.js": [
- "5374adb164a7e8a18612be95d7dc4daf924b7156",
+ "d4eaf0d25123298a696f0116cb54c6fe144038d4",
[
"fledge/tentative/server-response.https.window.html?1-6",
{
@@ -667540,6 +668485,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -667644,6 +668593,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -667748,6 +668701,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -667852,6 +668809,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -667956,6 +668917,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668060,6 +669025,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668164,6 +669133,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668268,6 +669241,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668372,6 +669349,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668476,6 +669457,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668580,6 +669565,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668684,6 +669673,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668788,6 +669781,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668892,6 +669889,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -668996,6 +669997,118 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/server-response.https.window.html?67-70",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/ba-fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "third_party/cbor-js/cbor.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-6"
+ ],
+ [
+ "variant",
+ "?7-10"
+ ],
+ [
+ "variant",
+ "?11-14"
+ ],
+ [
+ "variant",
+ "?15-18"
+ ],
+ [
+ "variant",
+ "?19-22"
+ ],
+ [
+ "variant",
+ "?23-26"
+ ],
+ [
+ "variant",
+ "?27-30"
+ ],
+ [
+ "variant",
+ "?31-34"
+ ],
+ [
+ "variant",
+ "?35-38"
+ ],
+ [
+ "variant",
+ "?39-42"
+ ],
+ [
+ "variant",
+ "?43-46"
+ ],
+ [
+ "variant",
+ "?47-50"
+ ],
+ [
+ "variant",
+ "?51-54"
+ ],
+ [
+ "variant",
+ "?55-58"
+ ],
+ [
+ "variant",
+ "?59-62"
+ ],
+ [
+ "variant",
+ "?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -669100,6 +670213,10 @@
[
"variant",
"?63-66"
+ ],
+ [
+ "variant",
+ "?67-70"
]
],
"timeout": "long"
@@ -675157,6 +676274,15 @@
]
]
},
+ "hsts": {
+ "only-top-level-navigation-hsts-upgrade.tentative.sub.html": [
+ "be891d05c01e04a961842557ee5a8fb0e8941f46",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"html": {
"anonymous-iframe": {
"anonymous-iframe-popup.tentative.https.window.js": [
@@ -691738,7 +692864,7 @@
]
],
"2d.text.measure.text-clusters-split.tentative.html": [
- "63c7cce72be7c1ede567c2f00001d7a57addadbc",
+ "e4f881d03ad9aea16757fa9bcb5b2ee7605e3b53",
[
null,
{}
@@ -705677,14 +706803,14 @@
]
],
"2d.text.measure.text-clusters-split.tentative.html": [
- "6a5fd475795e140ff8b8533b8d070baf97f0ebfe",
+ "cf24a873c31398700cb466fa31a2cb111bf608e3",
[
null,
{}
]
],
"2d.text.measure.text-clusters-split.tentative.worker.js": [
- "f98c323e0e2311a25dbb2b90a192ccf6f3c8968d",
+ "e8d7519b48abb0b8866c9506247bac94d4d914dd",
[
"html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.worker.html",
{}
@@ -713224,6 +714350,13 @@
}
]
],
+ "hidden-until-found-idl.html": [
+ "dfeee855dcbfad4533f1aedffe8c5ab77a4d6ec3",
+ [
+ null,
+ {}
+ ]
+ ],
"hidden-until-found-text-fragment.html": [
"05220f7ce11b5c4d59d20904d2c6303c2107f25c",
[
@@ -718067,7 +719200,7 @@
]
],
"load-removes-queued-error-event.html": [
- "54d5c28dad55eae515516ecc6f29d1997f19d329",
+ "f7cfabf64b620f4b5c91ee2f94bcbae367d25f90",
[
null,
{}
@@ -721544,7 +722677,7 @@
],
"current-pixel-density": {
"basic.html": [
- "b2d3b53b55814850cf10029391876a6ff0001eb5",
+ "f7d47b3640dfc03516aafcb744c9e9d32295e452",
[
null,
{}
@@ -722005,6 +723138,13 @@
{}
]
],
+ "naturalWidth-naturalHeight.html": [
+ "19aa4b9344f9040ac9092c8b415267f5f5815cf2",
+ [
+ null,
+ {}
+ ]
+ ],
"non-active-document.html": [
"6072138cb387d98e3bc8ae86971e424fe7061194",
[
@@ -724699,7 +725839,7 @@
]
],
"select-events.tentative.html": [
- "28abf1534c1ccb7e4ad93e26987e78652c428459",
+ "2a9280e1ae886c3091eaf07a09547b31e4a8707a",
[
null,
{
@@ -724873,7 +726013,7 @@
]
],
"select-picker-starting-style.tentative.html": [
- "c653016875a6455367d337a9e914a7d21bac0dbb",
+ "2be9f388975aa59c8a226df07673e8702bb2664f",
[
null,
{
@@ -739852,6 +740992,13 @@
{}
]
],
+ "clip-path-animation.html": [
+ "867b025d8c3b1af88dd3af851e1ba3b1fe991348",
+ [
+ null,
+ {}
+ ]
+ ],
"clip-path.html": [
"89f6d865b27df8c5ab340309fe97897e6974b1d2",
[
@@ -746770,7 +747917,7 @@
]
],
"VideoTrackGenerator-with-window-tracks.https.html": [
- "dfe000fbddb6cddd52538dfdcb686c2357ca1ff7",
+ "1c5560f6964aac0c6506a531619392a318756c8b",
[
null,
{}
@@ -776245,6 +777392,13 @@
{}
]
],
+ "sanitizer-removeUnsafe.tentative.html": [
+ "7ad8253ad5fdec29b79c590e50e9c0d211d17031",
+ [
+ null,
+ {}
+ ]
+ ],
"sanitizer-unknown.tentative.html": [
"37bb8c832274c25e6d0eca8df859b2a915943e14",
[
@@ -778221,7 +779375,7 @@
]
],
"onchange-event-subframe.html": [
- "6eb986b43804ddd91ccd07476dc373684c4727a6",
+ "2d9529d1dcccad558ada1dbcb6c37a20cc1f9e93",
[
null,
{
@@ -788536,10 +789690,64 @@
}
]
],
- "redirect-url.sub.https.html": [
- "02bb35349ff9f72e74d0244473447b9ea89ce9a4",
+ "redirect-middle-of-prefetch.https.html": [
+ "2afa5c82a76a1022a63499bae4f6426ce126c8c8",
[
- null,
+ "speculation-rules/prefetch/redirect-middle-of-prefetch.https.html?origin=cross-site-initial",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/redirect-middle-of-prefetch.https.html?origin=cross-site-redirect",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/redirect-middle-of-prefetch.https.html?origin=same-origin",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "redirect-to-prefetch-url.https.html": [
+ "f634ede8838d1eb8b98f1c80a5c342c2db34ed52",
+ [
+ "speculation-rules/prefetch/redirect-to-prefetch-url.https.html?origin=cross-site-initial",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/redirect-to-prefetch-url.https.html?origin=cross-site-redirect",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/redirect-to-prefetch-url.https.html?origin=same-origin",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "redirect-url.https.html": [
+ "41fab0791ac5eb44f3e459d83c94c781e396356c",
+ [
+ "speculation-rules/prefetch/redirect-url.https.html?origin=cross-site-initial",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/redirect-url.https.html?origin=cross-site-redirect",
+ {
+ "timeout": "long"
+ }
+ ],
+ [
+ "speculation-rules/prefetch/redirect-url.https.html?origin=same-origin",
{
"timeout": "long"
}
@@ -791603,6 +792811,32 @@
}
]
],
+ "requestStorageAccess-cross-site-fetch.sub.https.window.js": [
+ "b46f42d1211f4205a23c02f03c4117e35e241d81",
+ [
+ "storage-access-api/requestStorageAccess-cross-site-fetch.sub.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "helpers.js"
+ ],
+ [
+ "script",
+ "/cookies/resources/cookie-helper.sub.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ]
+ ]
+ }
+ ]
+ ],
"requestStorageAccess-cross-site-iframe.sub.https.window.js": [
"53f90de75d06f6bbf95e99bd5ae7da7cd06f7830",
[
@@ -803605,6 +804839,41 @@
"subresource-integrity": {
"signatures": {
"tentative": {
+ "accept-signature.parser-inserted.html": [
+ "ccedc5ce4f9213e748611cb305892a87950978f6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "accept-signature.window.js": [
+ "efcbf0cdad6cb2816b47e989701835a30b777639",
+ [
+ "subresource-integrity/signatures/tentative/accept-signature.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "authority.https.window.js": [
+ "9f05359d43222250c9392bdf1598a8a33724ac97",
+ [
+ "subresource-integrity/signatures/tentative/authority.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
"client-initiated.cross-origin.window.js": [
"ce7b817f7e863d4502494e9946955cbefb145b0a",
[
@@ -803723,7 +804992,7 @@
]
],
"status.window.js": [
- "2cc4485a3e6fe4265b5b6e032da122e05e0470f6",
+ "d585e1716d730395d106f3ea87469143cdf19fa2",
[
"subresource-integrity/signatures/tentative/status.window.html",
{
@@ -812029,7 +813298,7 @@
]
],
"url-setters-a-area.window.js": [
- "6a5e762cd42fe89de25bef44dcad8c537b5b9874",
+ "0012595cc469ee2290a3537733c619dfaa97204b",
[
"url/url-setters-a-area.window.html?exclude=(file|javascript|mailto)",
{
@@ -812151,7 +813420,7 @@
]
],
"url-setters.any.js": [
- "fe88175ac63446927030867fcdacaae768c522c7",
+ "66b3d9b4f9d0477644db2847fa8c5769192fc990",
[
"url/url-setters.any.html?exclude=(file|javascript|mailto)",
{
@@ -812370,7 +813639,7 @@
]
],
"url-statics-canparse.any.js": [
- "74f3da31f0d17527147b4de716cec6d6574f5a66",
+ "9b352029d8569bf5f2bbc66ff8a1ad9d273b7c94",
[
"url/url-statics-canparse.any.html",
{}
@@ -812436,7 +813705,7 @@
]
],
"urlsearchparams-delete.any.js": [
- "c597142c51d5bf3cdea286cf7a6e191d4e3be828",
+ "09a5dccb6487338bc69d6fb924472b1dc8b7899d",
[
"url/urlsearchparams-delete.any.html",
{}
@@ -828769,7 +830038,7 @@
},
"webauthn": {
"conditional-mediation.https.html": [
- "1eb2ba3b1e750b261b2ae71fbf6172c624503cb2",
+ "aeb14b3b161a4a72699e8f071647f17545ae2ab2",
[
null,
{
@@ -837100,7 +838369,7 @@
]
],
"videoFrame-copyTo.any.js": [
- "0fa57f43105fd40a01ed83664f0ef46171af876f",
+ "7cd3c3f73cdd1e6b125a10526ce97051bf0426ab",
[
"webcodecs/videoFrame-copyTo.any.html",
{
@@ -856591,9 +857860,9 @@
]
],
"elementwise-binary.https.any.js": [
- "12fdc5aadc38533515e7c315e2f0abdd32f3d960",
+ "3f87e3ce0f243f3d93d9c3950147beb9a955d99f",
[
- "webnn/validation_tests/elementwise-binary.https.any.html?cpu",
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=add&device=cpu",
{
"script_metadata": [
[
@@ -856606,15 +857875,87 @@
],
[
"variant",
- "?cpu"
+ "?op=add&device=cpu"
],
[
"variant",
- "?gpu"
+ "?op=add&device=gpu"
],
[
"variant",
- "?npu"
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
],
[
"script",
@@ -856624,7 +857965,7 @@
}
],
[
- "webnn/validation_tests/elementwise-binary.https.any.html?gpu",
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=add&device=gpu",
{
"script_metadata": [
[
@@ -856637,15 +857978,87 @@
],
[
"variant",
- "?cpu"
+ "?op=add&device=cpu"
],
[
"variant",
- "?gpu"
+ "?op=add&device=gpu"
],
[
"variant",
- "?npu"
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
],
[
"script",
@@ -856655,7 +858068,7 @@
}
],
[
- "webnn/validation_tests/elementwise-binary.https.any.html?npu",
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=add&device=npu",
{
"script_metadata": [
[
@@ -856668,15 +858081,1941 @@
],
[
"variant",
- "?cpu"
+ "?op=add&device=cpu"
],
[
"variant",
- "?gpu"
+ "?op=add&device=gpu"
],
[
"variant",
- "?npu"
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=div&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=div&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=div&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=max&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=max&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=max&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=min&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=min&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=min&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=mul&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=mul&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=mul&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=pow&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=pow&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=pow&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=sub&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=sub&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-binary.https.any.html?op=sub&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise binary operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=add&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=add&device=npu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=sub&device=npu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=mul&device=npu"
+ ],
+ [
+ "variant",
+ "?op=div&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=div&device=npu"
+ ],
+ [
+ "variant",
+ "?op=max&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=max&device=npu"
+ ],
+ [
+ "variant",
+ "?op=min&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=min&device=npu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=pow&device=npu"
],
[
"script",
@@ -856687,9 +860026,9 @@
]
],
"elementwise-logical.https.any.js": [
- "40b15a5c946e48bbed6aa551c58598827c22e376",
+ "547cba3cc6c480e3e8a5a34c62e54723b7d9bd6a",
[
- "webnn/validation_tests/elementwise-logical.https.any.html?cpu",
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=equal&device=cpu",
{
"script_metadata": [
[
@@ -856702,15 +860041,123 @@
],
[
"variant",
- "?cpu"
+ "?op=equal&device=cpu"
],
[
"variant",
- "?gpu"
+ "?op=equal&device=gpu"
],
[
"variant",
- "?npu"
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
],
[
"script",
@@ -856720,7 +860167,7 @@
}
],
[
- "webnn/validation_tests/elementwise-logical.https.any.html?gpu",
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=equal&device=gpu",
{
"script_metadata": [
[
@@ -856733,15 +860180,123 @@
],
[
"variant",
- "?cpu"
+ "?op=equal&device=cpu"
],
[
"variant",
- "?gpu"
+ "?op=equal&device=gpu"
],
[
"variant",
- "?npu"
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
],
[
"script",
@@ -856751,7 +860306,7 @@
}
],
[
- "webnn/validation_tests/elementwise-logical.https.any.html?npu",
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=equal&device=npu",
{
"script_metadata": [
[
@@ -856764,15 +860319,3876 @@
],
[
"variant",
- "?cpu"
+ "?op=equal&device=cpu"
],
[
"variant",
- "?gpu"
+ "?op=equal&device=gpu"
],
[
"variant",
- "?npu"
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=greater&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=greater&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=greater&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=greaterOrEqual&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=greaterOrEqual&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=greaterOrEqual&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=lesser&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=lesser&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=lesser&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=lesserOrEqual&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=lesserOrEqual&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=lesserOrEqual&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalAnd&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalAnd&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalAnd&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalNot&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalNot&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalNot&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalOr&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalOr&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalOr&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalXor&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalXor&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=logicalXor&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=notEqual&device=cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=notEqual&device=gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webnn/validation_tests/elementwise-logical.https.any.html?op=notEqual&device=npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API element-wise logical operations"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?op=equal&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=equal&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greater&device=npu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=greaterOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesser&device=npu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=lesserOrEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=notEqual&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalAnd&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalOr&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalXor&device=npu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=cpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=gpu"
+ ],
+ [
+ "variant",
+ "?op=logicalNot&device=npu"
],
[
"script",
@@ -882231,7 +889647,7 @@
]
],
"WorkerGlobalScope_ErrorEvent_message.htm": [
- "bc1d2c45b42cb0e3cb96a243d00f2b7351e8b1d3",
+ "27d4dda5114cfe0ff5ebab090d0c41dfebf0a256",
[
null,
{}
@@ -887452,14 +894868,14 @@
]
],
"progressevent-constructor.html": [
- "0e771f4459fef7f6fe6cbee0e3d90319cc413e2f",
+ "3b9c774b8740dc9bfa8d01ae17cf7f6278068745",
[
null,
{}
]
],
"progressevent-interface.html": [
- "7552ff73d3f44997723674da0407bf59ab3f91c4",
+ "ec8d471d783d915c7da9cf3bae25f7394d23c054",
[
null,
{}
@@ -910181,6 +917597,24 @@
}
},
"input": {
+ "file_dialog_opened": {
+ "file_dialog_opened.py": [
+ "d1c4c555dcfc79877b5f0c053876ba9e730e5cbf",
+ [
+ null,
+ {}
+ ]
+ ],
+ "tentative": {
+ "show_open_file_picker.py": [
+ "cfa08f96995a131743bb8cdb4d72e017ae499c76",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
+ },
"perform_actions": {
"invalid.py": [
"98e2bde4709ec696a680da822afd7185cb8b3f19",
@@ -911206,6 +918640,39 @@
}
},
"session": {
+ "capabilities": {
+ "unhandled_prompt_behavior": {
+ "file": {
+ "accept.py": [
+ "cc1197a53f93a83251c6acb633570702fe48edd9",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "dismiss.py": [
+ "91367a33a42d0dda11d32987a254f5386fe7a9da",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "ignore.py": [
+ "9d9951dd3352ad973825aa5ded332ea4b316fc46",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ]
+ }
+ }
+ },
"new": {
"bidi_upgrade.py": [
"1060bef2be95c6fb560b4d8bbafeb02e2a5083e2",
diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html.ini
deleted file mode 100644
index 8b46280d84b..00000000000
--- a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-[corner-shape-fill-any.html?corner-bottom-left-shape=scoop&border-radius=10%]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-bottom-right-shape=scoop&border-radius=50%]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-shape=squircle&border-radius=30px]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-shape=superellipse(5.2)&border-radius=50%]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-shape=squircle&border-radius=50%]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-shape=squircle&border-radius=10%]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-shape=straight&border-radius=5px]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-shape=superellipse(5.2)&border-radius=33px]
- expected: FAIL
-
-[corner-shape-fill-any.html?corner-top-right-shape=scoop&border-radius=50px]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-color-hdr/computed.html.ini b/tests/wpt/meta/css/css-color-hdr/computed.html.ini
index 9146abf2d16..213629ecaad 100644
--- a/tests/wpt/meta/css/css-color-hdr/computed.html.ini
+++ b/tests/wpt/meta/css/css-color-hdr/computed.html.ini
@@ -58,3 +58,60 @@
[Property dynamic-range-limit value 'dynamic-range-limit-mix(high 25%, standard 25%, standard 25%, standard 25%)']
expected: FAIL
+
+ [Property dynamic-range-limit value 'no-limit']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'constrained']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 75%, no-limit 25%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 25%, no-limit 75%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 100%, standard 0%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 100%, no-limit 0%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 25%, standard 25%, standard 25%, standard 25%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 25%, standard 75%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 100%, standard 100%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 80%, standard 60%, constrained 60%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 25%, constrained 75%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(constrained 75%, standard 25%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(constrained 25%, no-limit 25%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 25%, constrained 50%, no-limit 25%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(standard 10%, constrained 20%, no-limit 20%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 10%, standard 30%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(dynamic-range-limit-mix(standard 10%, no-limit 30%) 20%, standard 80%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(dynamic-range-limit-mix(standard 25%, no-limit 75%) 20%, dynamic-range-limit-mix(standard 25%, constrained 75%) 40%, dynamic-range-limit-mix(constrained 25%, no-limit 75%) 40%)']
+ expected: FAIL
+
+ [Property dynamic-range-limit value 'dynamic-range-limit-mix(no-limit 10%, dynamic-range-limit-mix(standard 25%, constrained 75%) 20%, dynamic-range-limit-mix(constrained 10%, no-limit 30%) 20%)']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color-hdr/inheritance.html.ini b/tests/wpt/meta/css/css-color-hdr/inheritance.html.ini
index b7307d0fe24..eb225a68d99 100644
--- a/tests/wpt/meta/css/css-color-hdr/inheritance.html.ini
+++ b/tests/wpt/meta/css/css-color-hdr/inheritance.html.ini
@@ -4,3 +4,6 @@
[Property dynamic-range-limit inherits]
expected: FAIL
+
+ [Property dynamic-range-limit has initial value no-limit]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color-hdr/interpolation.html.ini b/tests/wpt/meta/css/css-color-hdr/interpolation.html.ini
index 8b0224cf3f4..b5358838b5a 100644
--- a/tests/wpt/meta/css/css-color-hdr/interpolation.html.ini
+++ b/tests/wpt/meta/css/css-color-hdr/interpolation.html.ini
@@ -190,3 +190,195 @@
[Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained-high 90%, standard 10%)\] to [dynamic-range-limit-mix(high 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, high 10%)\]]
expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0) should be [no-limit\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.25) should be [dynamic-range-limit-mix(standard 25%, no-limit 75%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 75%, no-limit 25%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [no-limit\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0) should be [constrained\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 50%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [constrained\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (0.75) should be [dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 50%, no-limit 50%)\] to [standard\] at (1) should be [standard\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, no-limit 50%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(standard 90%, no-limit 10%)\] to [dynamic-range-limit-mix(standard 10%, no-limit 90%)\] at (1) should be [dynamic-range-limit-mix(standard 10%, no-limit 90%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
+ expected: FAIL
+
+ [CSS Transitions: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
+ expected: FAIL
+
+ [CSS Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0) should be [dynamic-range-limit-mix(standard 10%, constrained 90%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (0.5) should be [dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)\]]
+ expected: FAIL
+
+ [Web Animations: property <dynamic-range-limit> from [dynamic-range-limit-mix(constrained 90%, standard 10%)\] to [dynamic-range-limit-mix(no-limit 10%, standard 90%)\] at (1) should be [dynamic-range-limit-mix(standard 90%, no-limit 10%)\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color-hdr/parsing.html.ini b/tests/wpt/meta/css/css-color-hdr/parsing.html.ini
index 5d1613e738f..0d7626461ee 100644
--- a/tests/wpt/meta/css/css-color-hdr/parsing.html.ini
+++ b/tests/wpt/meta/css/css-color-hdr/parsing.html.ini
@@ -34,3 +34,36 @@
[e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(high 1%)" should set the property value]
expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "no-limit" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "constrained" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 80%, standard 20%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 8%, standard 2%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 99%, standard 99%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 99%, standard 99%, constrained 10%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 1%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(constrained 20%, no-limit 80%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained 90%, no-limit 10%) 1%, no-limit 80%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(no-limit 1%, dynamic-range-limit-mix(constrained 2%, no-limit 10%) 80%)" should set the property value]
+ expected: FAIL
+
+ [e.style['dynamic-range-limit'\] = "dynamic-range-limit-mix(dynamic-range-limit-mix(no-limit 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained 5%, no-limit 5%) 6%)" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-mixins/at-function-cssom.tentative.html.ini b/tests/wpt/meta/css/css-mixins/at-function-cssom.tentative.html.ini
deleted file mode 100644
index 622e0c5f9b6..00000000000
--- a/tests/wpt/meta/css/css-mixins/at-function-cssom.tentative.html.ini
+++ /dev/null
@@ -1,102 +0,0 @@
-[at-function-cssom.tentative.html]
- [Empty CSSFunctionRule]
- expected: FAIL
-
- [Single CSSFunctionDeclarations]
- expected: FAIL
-
- [CSSFunctionDescriptors (result)]
- expected: FAIL
-
- [CSSFunctionDescriptors (result, repeated)]
- expected: FAIL
-
- [CSSFunctionDescriptors (local variables)]
- expected: FAIL
-
- [CSSFunctionDescriptors (local variables, repeated)]
- expected: FAIL
-
- [CSSFunctionDescriptors (local variables and result)]
- expected: FAIL
-
- [CSSFunctionDescriptors serialization]
- expected: FAIL
-
- [Unknown descriptors]
- expected: FAIL
-
- [Unknown descriptors (mutation)]
- expected: FAIL
-
- [item()]
- expected: FAIL
-
- [Indexed property getter]
- expected: FAIL
-
- [CSSFunctionRule.name]
- expected: FAIL
-
- [CSSFunctionRule.getParameters()]
- expected: FAIL
-
- [CSSFunctionRule.returnType]
- expected: FAIL
-
- [CSSFunctionRule escapes]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--empty)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--ret-length)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--ret-length-auto)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-single)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-typed)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-typed-default)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-default)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-multi)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-multi-mixed)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--body-result)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--body-locals)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-type-fn)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--param-type-fn-uni)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--ret-type-fn)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--ret-type-fn-uni)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--body-result-multi)]
- expected: FAIL
-
- [CSSFunctionRule.cssText (--escaped-)]
- expected: FAIL
-
- [@supports in body]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini b/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini
deleted file mode 100644
index 55805c45ee2..00000000000
--- a/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[table-cell-overflow-auto-scrolled.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-transforms/preserve3d-and-flattening-001.html.ini b/tests/wpt/meta/css/css-transforms/preserve3d-and-flattening-001.html.ini
deleted file mode 100644
index 1eb821dd609..00000000000
--- a/tests/wpt/meta/css/css-transforms/preserve3d-and-flattening-001.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[preserve3d-and-flattening-001.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/attr-all-types.html.ini b/tests/wpt/meta/css/css-values/attr-all-types.html.ini
index e0625023176..769d98fcfc1 100644
--- a/tests/wpt/meta/css/css-values/attr-all-types.html.ini
+++ b/tests/wpt/meta/css/css-values/attr-all-types.html.ini
@@ -2,9 +2,6 @@
[CSS Values and Units Test: attr]
expected: FAIL
- [CSS Values and Units Test: attr 1]
- expected: FAIL
-
[CSS Values and Units Test: attr 2]
expected: FAIL
@@ -23,9 +20,6 @@
[CSS Values and Units Test: attr 7]
expected: FAIL
- [CSS Values and Units Test: attr 10]
- expected: FAIL
-
[CSS Values and Units Test: attr 11]
expected: FAIL
@@ -38,12 +32,6 @@
[CSS Values and Units Test: attr 21]
expected: FAIL
- [CSS Values and Units Test: attr 36]
- expected: FAIL
-
- [CSS Values and Units Test: attr 38]
- expected: FAIL
-
[CSS Values and Units Test: attr 12]
expected: FAIL
@@ -56,9 +44,6 @@
[CSS Values and Units Test: attr 24]
expected: FAIL
- [CSS Values and Units Test: attr 20]
- expected: FAIL
-
[CSS Values and Units Test: attr 25]
expected: FAIL
@@ -119,9 +104,6 @@
[CSS Values and Units Test: attr 52]
expected: FAIL
- [CSS Values and Units Test: attr 54]
- expected: FAIL
-
[CSS Values and Units Test: attr 55]
expected: FAIL
@@ -227,9 +209,6 @@
[CSS Values and Units Test: attr 82]
expected: FAIL
- [CSS Values and Units Test: attr 91]
- expected: FAIL
-
[CSS Values and Units Test: attr 92]
expected: FAIL
@@ -238,3 +217,24 @@
[CSS Values and Units Test: attr 94]
expected: FAIL
+
+ [CSS Values and Units Test: attr 8]
+ expected: FAIL
+
+ [CSS Values and Units Test: attr 19]
+ expected: FAIL
+
+ [CSS Values and Units Test: attr 34]
+ expected: FAIL
+
+ [CSS Values and Units Test: attr 37]
+ expected: FAIL
+
+ [CSS Values and Units Test: attr 53]
+ expected: FAIL
+
+ [CSS Values and Units Test: attr 83]
+ expected: FAIL
+
+ [CSS Values and Units Test: attr 95]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-sibling-function-in-shadow-dom.html.ini b/tests/wpt/meta/css/css-values/calc-sibling-function-in-shadow-dom.html.ini
deleted file mode 100644
index 0e6faeca45b..00000000000
--- a/tests/wpt/meta/css/css-values/calc-sibling-function-in-shadow-dom.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[calc-sibling-function-in-shadow-dom.html]
- [originating element in Shadow DOM]
- expected: FAIL
-
- [Host children have sibling-index() and sibling-count() based on assignedNodes order]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-sibling-function-parsing.html.ini b/tests/wpt/meta/css/css-values/calc-sibling-function-parsing.html.ini
deleted file mode 100644
index 6b15ad93bf7..00000000000
--- a/tests/wpt/meta/css/css-values/calc-sibling-function-parsing.html.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[calc-sibling-function-parsing.html]
- [e.style['left'\] = "calc(1px * sibling-index())" should set the property value]
- expected: FAIL
-
- [e.style['left'\] = "calc(1px * sibling-index( ))" should set the property value]
- expected: FAIL
-
- [e.style['z-index'\] = "sibling-index()" should set the property value]
- expected: FAIL
-
- [e.style['left'\] = "calc(1px * sibling-count())" should set the property value]
- expected: FAIL
-
- [e.style['left'\] = "calc(1px * sibling-count( ))" should set the property value]
- expected: FAIL
-
- [e.style['z-index'\] = "sibling-count()" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-sibling-function.html.ini b/tests/wpt/meta/css/css-values/calc-sibling-function.html.ini
deleted file mode 100644
index 2c6e08fad52..00000000000
--- a/tests/wpt/meta/css/css-values/calc-sibling-function.html.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[calc-sibling-function.html]
- [basic sibling-index() test]
- expected: FAIL
-
- [basic sibling-count() test]
- expected: FAIL
-
- [sibling-index() in calc() with percentage]
- expected: FAIL
-
- [sibling-count on pseudo-element]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/sibling-function-invalidation.html.ini b/tests/wpt/meta/css/css-values/sibling-function-invalidation.html.ini
deleted file mode 100644
index a59a9023d47..00000000000
--- a/tests/wpt/meta/css/css-values/sibling-function-invalidation.html.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[sibling-function-invalidation.html]
- [Initially 6th sibling]
- expected: FAIL
-
- [5th sibling after removal]
- expected: FAIL
-
- [Initially 6 siblings]
- expected: FAIL
-
- [5 siblings after removal]
- expected: FAIL
diff --git a/tests/wpt/meta/dom/idlharness.window.js.ini b/tests/wpt/meta/dom/idlharness.window.js.ini
index f98cee42af9..e50d8b5fb02 100644
--- a/tests/wpt/meta/dom/idlharness.window.js.ini
+++ b/tests/wpt/meta/dom/idlharness.window.js.ini
@@ -409,3 +409,39 @@
[AbortController interface: calling abort(optional any) on new AbortController() with too few arguments must throw TypeError]
expected: FAIL
+
+ [Document interface: operation moveBefore(Node, Node?)]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "moveBefore(Node, Node?)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling moveBefore(Node, Node?) on new Document() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: xmlDoc must inherit property "moveBefore(Node, Node?)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling moveBefore(Node, Node?) on xmlDoc with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [DocumentFragment interface: operation moveBefore(Node, Node?)]
+ expected: FAIL
+
+ [DocumentFragment interface: document.createDocumentFragment() must inherit property "moveBefore(Node, Node?)" with the proper type]
+ expected: FAIL
+
+ [DocumentFragment interface: calling moveBefore(Node, Node?) on document.createDocumentFragment() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: operation moveBefore(Node, Node?)]
+ expected: FAIL
+
+ [Element interface: element must inherit property "moveBefore(Node, Node?)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling moveBefore(Node, Node?) on element with too few arguments must throw TypeError]
+ expected: FAIL
+
+
+[idlharness.window.html?include=Node]
diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-serializable.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-serializable.html.ini
index 7616121487c..ea398e580ef 100644
--- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-serializable.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-serializable.html.ini
@@ -1,5 +1,5 @@
[createImageBitmap-serializable.html]
- expected: TIMEOUT
+ expected: ERROR
[Serialize ImageBitmap created from a vector SVGImageElement]
expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index 7d28d586f51..56f11f614da 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,3 +1,3 @@
[iframe_sandbox_popups_escaping-1.html]
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index b83d68ddd33..841bafc6eca 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,3 +1,3 @@
[iframe_sandbox_popups_escaping-2.html]
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 7da2bc5ac80..ef88bb2e2fd 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini b/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini
index becb376ab4c..f137b6ba51c 100644
--- a/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini
+++ b/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini
@@ -1,5 +1,4 @@
[audio-tag.https.html]
- expected: TIMEOUT
[Mixed-Content: Expects blocked for audio-tag to cross-http origin and keep-scheme redirection from https context.]
expected: FAIL
diff --git a/tests/wpt/meta/resize-observer/change-layout-in-error.html.ini b/tests/wpt/meta/resize-observer/change-layout-in-error.html.ini
deleted file mode 100644
index 5d07f60e0b6..00000000000
--- a/tests/wpt/meta/resize-observer/change-layout-in-error.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[change-layout-in-error.html]
- [Changing layout in window error handler should not result in lifecyle loop when resize observer loop limit is reached.]
- expected: FAIL
diff --git a/tests/wpt/meta/url/a-element-xhtml.xhtml.ini b/tests/wpt/meta/url/a-element-xhtml.xhtml.ini
index 37f65fb63d6..7c14ebadada 100644
--- a/tests/wpt/meta/url/a-element-xhtml.xhtml.ini
+++ b/tests/wpt/meta/url/a-element-xhtml.xhtml.ini
@@ -575,5 +575,20 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> against <about:blank>]
expected: FAIL
+ [Parsing: <non-special:opaque ?hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque #hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t \t#hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t #hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque\t\t \r #hi> against <about:blank>]
+ expected: FAIL
+
[a-element-xhtml.xhtml?include=mailto]
diff --git a/tests/wpt/meta/url/a-element.html.ini b/tests/wpt/meta/url/a-element.html.ini
index 31c3d92a27d..66dacf51b20 100644
--- a/tests/wpt/meta/url/a-element.html.ini
+++ b/tests/wpt/meta/url/a-element.html.ini
@@ -576,3 +576,18 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> against <about:blank>]
expected: FAIL
+
+ [Parsing: <non-special:opaque ?hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque #hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t \t#hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t #hi> against <about:blank>]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque\t\t \r #hi> against <about:blank>]
+ expected: FAIL
diff --git a/tests/wpt/meta/url/url-constructor.any.js.ini b/tests/wpt/meta/url/url-constructor.any.js.ini
index d1bdd8b326c..6c87a0ea737 100644
--- a/tests/wpt/meta/url/url-constructor.any.js.ini
+++ b/tests/wpt/meta/url/url-constructor.any.js.ini
@@ -908,6 +908,21 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> without base]
expected: FAIL
+ [Parsing: <non-special:opaque ?hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque #hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t \t#hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t #hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque\t\t \r #hi> without base]
+ expected: FAIL
+
[url-constructor.any.worker.html?include=file]
[Parsing: </> against <file://h/C:/a/b>]
@@ -1281,6 +1296,21 @@
[Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\\\]^_`{|}~> without base]
expected: FAIL
+ [Parsing: <non-special:opaque ?hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque #hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t \t#hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque \t\t #hi> without base]
+ expected: FAIL
+
+ [Parsing: <non-special:opaque\t\t \r #hi> without base]
+ expected: FAIL
+
[url-constructor.any.html?include=file]
[Parsing: </> against <file://h/C:/a/b>]
diff --git a/tests/wpt/meta/url/url-setters-a-area.window.js.ini b/tests/wpt/meta/url/url-setters-a-area.window.js.ini
index 5886a4c2569..dfb4f500951 100644
--- a/tests/wpt/meta/url/url-setters-a-area.window.js.ini
+++ b/tests/wpt/meta/url/url-setters-a-area.window.js.ini
@@ -49,3 +49,51 @@
[<area>: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
expected: FAIL
+
+ [<a>: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<area>: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<a>: Setting <sc:space ?query>.search = '']
+ expected: FAIL
+
+ [<area>: Setting <sc:space ?query>.search = '']
+ expected: FAIL
+
+ [<a>: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<area>: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<a>: Setting <sc:space ?query#fragment>.search = '']
+ expected: FAIL
+
+ [<area>: Setting <sc:space ?query#fragment>.search = '']
+ expected: FAIL
+
+ [<a>: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<area>: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<a>: Setting <sc:space #fragment>.hash = '']
+ expected: FAIL
+
+ [<area>: Setting <sc:space #fragment>.hash = '']
+ expected: FAIL
+
+ [<a>: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<area>: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [<a>: Setting <sc:space ?query#fragment>.hash = '']
+ expected: FAIL
+
+ [<area>: Setting <sc:space ?query#fragment>.hash = '']
+ expected: FAIL
diff --git a/tests/wpt/meta/url/url-setters.any.js.ini b/tests/wpt/meta/url/url-setters.any.js.ini
index 1ce9715a481..e2c549ff034 100644
--- a/tests/wpt/meta/url/url-setters.any.js.ini
+++ b/tests/wpt/meta/url/url-setters.any.js.ini
@@ -23,6 +23,30 @@
[URL: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
expected: FAIL
+ [URL: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space ?query>.search = '']
+ expected: FAIL
+
+ [URL: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space ?query#fragment>.search = '']
+ expected: FAIL
+
+ [URL: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space #fragment>.hash = '']
+ expected: FAIL
+
+ [URL: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space ?query#fragment>.hash = '']
+ expected: FAIL
+
[url-setters.any.worker.html?include=javascript]
@@ -69,6 +93,30 @@
[URL: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
expected: FAIL
+ [URL: Setting <data:space ?query>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space ?query>.search = '']
+ expected: FAIL
+
+ [URL: Setting <data:space ?query#fragment>.search = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space ?query#fragment>.search = '']
+ expected: FAIL
+
+ [URL: Setting <data:space #fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space #fragment>.hash = '']
+ expected: FAIL
+
+ [URL: Setting <data:space ?query#fragment>.hash = '' Trailing spaces and opaque paths]
+ expected: FAIL
+
+ [URL: Setting <sc:space ?query#fragment>.hash = '']
+ expected: FAIL
+
[url-setters.any.worker.html?include=mailto]
diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml
index 96f4629d8b5..6d5c7c79a05 100644
--- a/tests/wpt/tests/.github/workflows/docker.yml
+++ b/tests/wpt/tests/.github/workflows/docker.yml
@@ -33,14 +33,14 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
- uses: docker/metadata-action@818d4b7b91585d195f67373fd9cb0332e31a7175 # v4.6.0
+ uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
latest
type=raw,value=${{ inputs.tag }}
- name: Build and push the Docker image
- uses: docker/build-push-action@0adf9959216b96bec444f325f1e493d4aa344497 # v6.14.0
+ uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
with:
context: ./tools/docker
push: true
diff --git a/tests/wpt/tests/IndexedDB/request-event-ordering-large-mixed-with-small-values.any.js b/tests/wpt/tests/IndexedDB/request-event-ordering-large-mixed-with-small-values.any.js
new file mode 100644
index 00000000000..46079437b54
--- /dev/null
+++ b/tests/wpt/tests/IndexedDB/request-event-ordering-large-mixed-with-small-values.any.js
@@ -0,0 +1,43 @@
+// META: title=IndexedDB: request result events are delivered in order
+// META: global=window,worker
+// META: script=resources/support-promises.js
+// META: script=resources/support.js
+// META: script=resources/request-event-ordering-common.js
+// META: timeout=long
+
+// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
+
+'use strict';
+
+eventsTest('large values mixed with small values', [
+ ['get', 1],
+ ['get', 2],
+ ['get-empty', 5],
+ ['count', 4],
+ ['continue-empty', null],
+ ['open', 1],
+ ['continue', 2],
+ ['open-empty', 5],
+ ['getall', 4],
+ ['open', 2],
+ ['continue-empty', null],
+ ['add', 5],
+ ['get', 3],
+ ['count', 5],
+ ['get-empty', 6],
+ ['put-with-id', 5],
+ ['getall', 5],
+ ['continue', 3],
+ ['open-empty', 6],
+ ['put', 6],
+ ['error', 1],
+ ['continue', 2],
+ ['open', 4],
+ ['get-empty', 7],
+ ['count', 6],
+ ['continue', 3],
+ ['add', 7],
+ ['getall', 7],
+ ['error', 3],
+ ['count', 7],
+]);
diff --git a/tests/wpt/tests/IndexedDB/request-event-ordering-large-then-small-values.any.js b/tests/wpt/tests/IndexedDB/request-event-ordering-large-then-small-values.any.js
new file mode 100644
index 00000000000..d7386b38412
--- /dev/null
+++ b/tests/wpt/tests/IndexedDB/request-event-ordering-large-then-small-values.any.js
@@ -0,0 +1,28 @@
+// META: title=IndexedDB: request result events are delivered in order
+// META: global=window,worker
+// META: script=resources/support-promises.js
+// META: script=resources/support.js
+// META: script=resources/request-event-ordering-common.js
+// META: timeout=long
+
+// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
+
+'use strict';
+
+eventsTest('large value followed by small values', [
+ ['get', 1],
+ ['getall', 4],
+ ['open', 2],
+ ['continue-empty', null],
+ ['get', 2],
+ ['get-empty', 5],
+ ['count', 4],
+ ['continue-empty', null],
+ ['open-empty', 5],
+ ['add', 5],
+ ['error', 1],
+ ['continue', 2],
+ ['get-empty', 6],
+ ['put-with-id', 5],
+ ['put', 6],
+]);
diff --git a/tests/wpt/tests/IndexedDB/request-event-ordering-large-values.any.js b/tests/wpt/tests/IndexedDB/request-event-ordering-large-values.any.js
new file mode 100644
index 00000000000..095ab82df01
--- /dev/null
+++ b/tests/wpt/tests/IndexedDB/request-event-ordering-large-values.any.js
@@ -0,0 +1,19 @@
+// META: title=IndexedDB: request result events are delivered in order
+// META: global=window,worker
+// META: script=resources/support-promises.js
+// META: script=resources/support.js
+// META: script=resources/request-event-ordering-common.js
+// META: timeout=long
+
+// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
+
+'use strict';
+
+eventsTest('large values', [
+ ['open', 1],
+ ['get', 1],
+ ['getall', 4],
+ ['get', 3],
+ ['continue', 3],
+ ['open', 3],
+]);
diff --git a/tests/wpt/tests/IndexedDB/request-event-ordering-small-values.any.js b/tests/wpt/tests/IndexedDB/request-event-ordering-small-values.any.js
new file mode 100644
index 00000000000..05b0ce66c02
--- /dev/null
+++ b/tests/wpt/tests/IndexedDB/request-event-ordering-small-values.any.js
@@ -0,0 +1,20 @@
+// META: title=IndexedDB: request result events are delivered in order
+// META: global=window,worker
+// META: script=resources/support-promises.js
+// META: script=resources/support.js
+// META: script=resources/request-event-ordering-common.js
+// META: timeout=long
+
+// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
+
+'use strict';
+
+eventsTest('small values', [
+ ['get', 2], ['count', 4], ['continue-empty', null],
+ ['get-empty', 5], ['add', 5], ['open', 2],
+ ['continue', 2], ['get', 4], ['get-empty', 6],
+ ['count', 5], ['put-with-id', 5], ['put', 6],
+ ['error', 3], ['continue', 4], ['count', 6],
+ ['get-empty', 7], ['open', 4], ['open-empty', 7],
+ ['add', 7],
+]);
diff --git a/tests/wpt/tests/IndexedDB/request-event-ordering.any.js b/tests/wpt/tests/IndexedDB/resources/request-event-ordering-common.js
index 89c45091f1d..f754ba5f3ab 100644
--- a/tests/wpt/tests/IndexedDB/request-event-ordering.any.js
+++ b/tests/wpt/tests/IndexedDB/resources/request-event-ordering-common.js
@@ -1,12 +1,3 @@
-// META: title=IndexedDB: request result events are delivered in order
-// META: global=window,worker
-// META: script=resources/support-promises.js
-// META: script=resources/support.js
-// META: timeout=long
-
-// Spec: https://w3c.github.io/IndexedDB/#abort-transaction
-
-'use strict';
// Should be large enough to trigger large value handling in the IndexedDB
// engines that have special code paths for large values.
@@ -289,73 +280,3 @@ function eventsTest(label, operations) {
});
}, label);
}
-
-eventsTest('small values', [
- ['get', 2], ['count', 4], ['continue-empty', null],
- ['get-empty', 5], ['add', 5], ['open', 2],
- ['continue', 2], ['get', 4], ['get-empty', 6],
- ['count', 5], ['put-with-id', 5], ['put', 6],
- ['error', 3], ['continue', 4], ['count', 6],
- ['get-empty', 7], ['open', 4], ['open-empty', 7],
- ['add', 7],
-]);
-
-eventsTest('large values', [
- ['open', 1],
- ['get', 1],
- ['getall', 4],
- ['get', 3],
- ['continue', 3],
- ['open', 3],
-]);
-
-eventsTest('large value followed by small values', [
- ['get', 1],
- ['getall', 4],
- ['open', 2],
- ['continue-empty', null],
- ['get', 2],
- ['get-empty', 5],
- ['count', 4],
- ['continue-empty', null],
- ['open-empty', 5],
- ['add', 5],
- ['error', 1],
- ['continue', 2],
- ['get-empty', 6],
- ['put-with-id', 5],
- ['put', 6],
-]);
-
-eventsTest('large values mixed with small values', [
- ['get', 1],
- ['get', 2],
- ['get-empty', 5],
- ['count', 4],
- ['continue-empty', null],
- ['open', 1],
- ['continue', 2],
- ['open-empty', 5],
- ['getall', 4],
- ['open', 2],
- ['continue-empty', null],
- ['add', 5],
- ['get', 3],
- ['count', 5],
- ['get-empty', 6],
- ['put-with-id', 5],
- ['getall', 5],
- ['continue', 3],
- ['open-empty', 6],
- ['put', 6],
- ['error', 1],
- ['continue', 2],
- ['open', 4],
- ['get-empty', 7],
- ['count', 6],
- ['continue', 3],
- ['add', 7],
- ['getall', 7],
- ['error', 3],
- ['count', 7],
-]);
diff --git a/tests/wpt/tests/accname/name/comp_name_from_content.html b/tests/wpt/tests/accname/name/comp_name_from_content.html
index 32a9a7b3c43..6626eecb0dd 100644
--- a/tests/wpt/tests/accname/name/comp_name_from_content.html
+++ b/tests/wpt/tests/accname/name/comp_name_from_content.html
@@ -259,6 +259,109 @@
<h1 data-expectedlabel="Call Us" data-testname="heading name from content with text-transform:capitalize" class="ex" style="text-transform:capitalize;">Call us</h1>
<h1 data-expectedlabel="call us" data-testname="heading name from content with text-transform:lowercase" class="ex" style="text-transform:lowercase;">Call us</h1>
+<!-- “びょういんのかんじゃサービス” means “Hospital patient services” -->
+<!-- text-transform:full-size-kana risks changing the heading’s meaning -->
+<!-- by transforming the following words: -->
+<!-- 1. びょういん (byōin = hospital) into びよういん (biyōin = beauty parlor) -->
+<!-- 2. かんじゃ (kanja = patient) into かんじや (kanjiya = [no meaning]) -->
+<h1>heading which visually transforms <span lang="ja">びょういん</span> (hospital) to
+ <span lang="ja">びよういん</span> (beauty parlor) using CSS
+ <code>text-transform:full-size-kana</code></h1>
+<h3
+ lang="ja"
+ data-expectedlabel="びょういんのかんじゃサービス"
+ data-testname="heading name from content with text-transform:full-size-kana"
+ class="ex"
+ style="text-transform:full-size-kana;"
+>びょういんのかんじゃサービス</h3>
+
+<!-- Tests `Name from Each Child` edge case failures with an embedded `term` as a child element role. -->
+<!-- https://w3c.github.io/accname/#comp_name_from_content_for_each_child -->
+
+<h2>Elements with implicit button, heading, link roles containing element with
+ implicit term role</h2>
+<button
+ data-expectedlabel="this is an example"
+ data-testname="implicit button name from content containing a dfn element"
+ class="ex iblock"
+><span>this is an </span><dfn>example</dfn></button>
+<h3
+ data-expectedlabel="this is an example"
+ data-testname="implicit heading name from content containing a dfn element"
+ class="ex iblock"
+><span>this is an </span><dfn>example</dfn></h3>
+<a
+ href="#"
+ data-expectedlabel="this is an example"
+ data-testname="implicit link name from content containing a dfn element"
+ class="ex iblock"
+><span>this is an </span><dfn>example</dfn></a>
+
+<h2>Elements with implicit button, heading, link roles containing element with
+ explicit term role</h2>
+<button
+ data-expectedlabel="this is an example"
+ data-testname="implicit button name from content containing an element with explicit term role"
+ class="ex iblock"
+><span>this is an </span><span role="term">example</span></button>
+<h3
+ data-expectedlabel="this is an example"
+ data-testname="implicit heading name from content containing an element with explicit term role"
+ class="ex iblock"
+><span>this is an </span><span role="term">example</span></h3>
+<a
+ href="#"
+ data-expectedlabel="this is an example"
+ data-testname="implicit link name from content containing an element explicit with term role"
+ class="ex iblock"
+><span>this is an </span><span role="term">example</span></a>
+
+<h2>Elements with explicit button, heading, link roles containing element with
+ implicit term role</h2>
+<div
+ role="button"
+ tabindex="0"
+ data-expectedlabel="this is an example"
+ data-testname="explicit button name from content containing a dfn element"
+ class="ex iblock"
+><span>this is an </span><dfn>example</dfn></div>
+<div
+ role="heading"
+ data-expectedlabel="this is an example"
+ data-testname="explicit heading name from content containing a dfn element"
+ class="ex iblock"
+><span>this is an </span><dfn>example</dfn></div>
+<div
+ role="link"
+ tabindex="0"
+ data-expectedlabel="this is an example"
+ data-testname="explicit link name from content containing a dfn element"
+ class="ex iblock"
+><span>this is an </span><dfn>example</dfn></div>
+
+<h2>Elements with explicit button, heading, link roles containing element with
+ explicit term role</h2>
+<div
+ role="button"
+ tabindex="0"
+ data-expectedlabel="this is an example"
+ data-testname="explicit button name from content containing an element explicit with term role"
+ class="ex iblock"
+><span>this is an </span><span role="term">example</span></div>
+<div
+ role="heading"
+ data-expectedlabel="this is an example"
+ data-testname="explicit heading name from content containing an element explicit with term role"
+ class="ex iblock"
+><span>this is an </span><span role="term">example</span></div>
+<div
+ role="link"
+ tabindex="0"
+ data-expectedlabel="this is an example"
+ data-testname="explicit link name from content containing an element explicit with term role"
+ class="ex iblock"
+><span>this is an </span><span role="term">example</span></div>
+
<script>
AriaUtils.verifyLabelsBySelector(".ex");
</script>
diff --git a/tests/wpt/tests/accname/name/comp_name_from_content.tentative.html b/tests/wpt/tests/accname/name/comp_name_from_content.tentative.html
deleted file mode 100644
index 3239a1dcf31..00000000000
--- a/tests/wpt/tests/accname/name/comp_name_from_content.tentative.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
- <title>Name Comp: Name From Content (Tentative)</title>
- <meta charset="utf-8">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="/resources/testdriver.js"></script>
- <script src="/resources/testdriver-vendor.js"></script>
- <script src="/resources/testdriver-actions.js"></script>
- <script src="/wai-aria/scripts/aria-utils.js"></script>
-</head>
-<body>
-
-<!-- “びょういんのかんじゃサービス” means “Hospital patient services” -->
-<!-- text-transform:full-size-kana visually changes: -->
-<!-- 1. びょういん (byōin = hospital) into びよういん (biyōin = beauty parlor) -->
-<!-- 2. かんじゃ (kanja = patient) into かんじや (kanjiya = [no meaning]) -->
-<!-- ...causing the whole heading to become nonsensical. -->
-<h1>heading which visually transforms <span lang="ja">びょういん</span> (hospital) to <span lang="ja">びよういん</span> (beauty parlor) using CSS <code>text-transform:full-size-kana</code></h1>
-<h3 lang="ja" data-expectedlabel="びょういんのかんじゃサービス" data-testname="heading name from content with text-transform:full-size-kana" class="ex" style="text-transform:full-size-kana;">びょういんのかんじゃサービス</h3>
-
-
-<!-- Tests `Name from Each Child` edge case failures with an embedded `term` as a child element role. -->
-<!-- https://w3c.github.io/accname/#comp_name_from_content_for_each_child -->
-
-<h2>Elements with implicit button, heading, link roles containing element with implicit term role</h2>
-<button data-expectedlabel="this is an example" data-testname="implicit button name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></button>
-<h3 data-expectedlabel="this is an example" data-testname="implicit heading name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></h3>
-<a href="#" data-expectedlabel="this is an example" data-testname="implicit link name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></a>
-
-<h2>Elements with implicit button, heading, link roles containing element with explicit term role</h2>
-<button data-expectedlabel="this is an example" data-testname="implicit button name from content containing an element with explicit term role" class="ex iblock"><span>this is an </span><span role="term">example</span></button>
-<h3 data-expectedlabel="this is an example" data-testname="implicit heading name from content containing an element with explicit term role" class="ex iblock"><span>this is an </span><span role="term">example</span></h3>
-<a href="#" data-expectedlabel="this is an example" data-testname="implicit link name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></a>
-
-<h2>Elements with explicit button, heading, link roles containing element with implicit term role</h2>
-<div role="button" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit button name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></div>
-<div role="heading" data-expectedlabel="this is an example" data-testname="explicit heading name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></div>
-<div role="link" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit link name from content containing a dfn element" class="ex iblock"><span>this is an </span><dfn>example</dfn></div>
-
-<h2>Elements with explicit button, heading, link roles containing element with explicit term role</h2>
-<div role="button" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit button name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></div>
-<div role="heading" data-expectedlabel="this is an example" data-testname="explicit heading name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></div>
-<div role="link" tabindex="0" data-expectedlabel="this is an example" data-testname="explicit link name from content containing an element explicit with term role" class="ex iblock"><span>this is an </span><span role="term">example</span></div>
-
-
-<script>
-AriaUtils.verifyLabelsBySelector(".ex");
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/ai/language_detection/capabilities-detached-crash.tentative.https.html b/tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html
index 705fff6ceec..8dd685d990a 100644
--- a/tests/wpt/tests/ai/language_detection/capabilities-detached-crash.tentative.https.html
+++ b/tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html
@@ -1,12 +1,13 @@
<!DOCTYPE html>
-<title>Assures no crash upon call of LanguageDetectorFactory.capabilities() on a detached document</title>
-<link rel="author" href="mailto:caseq@chromium.org">
+<title>Assures no crash upon call of LanguageDetector.availability() on a detached document</title>
+<link rel="author" href="mailto:christinesm@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/384233287">
<body>
<iframe src="about:blank"></iframe>
<script>
const factory = frames[0].ai.languageDetector;
+const detector = factory.create();
document.getElementsByTagName("iframe")[0].remove();
-factory.capabilities();
+detector.availability();
</script>
</body>
diff --git a/tests/wpt/tests/ai/language_detection/capabilities.tentative.https.any.js b/tests/wpt/tests/ai/language_detection/capabilities.tentative.https.any.js
deleted file mode 100644
index 3eca5119a37..00000000000
--- a/tests/wpt/tests/ai/language_detection/capabilities.tentative.https.any.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// META: title=capabilities test
-// META: global=window,worker
-
-'use strict';
-
-promise_test(async t => {
- const languageDetectorCapabilities = await ai.languageDetector.capabilities();
- const availability = languageDetectorCapabilities.available;
- assert_not_equals(availability, "no");
- // TODO(crbug.com/349927087): Add languageDetectorCapabilities.languageAvailable("en") once implemented.
-});
diff --git a/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
index 2fd91c245bb..5af45e0cbf0 100644
--- a/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
+++ b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
@@ -4,6 +4,13 @@
'use strict';
promise_test(async t => {
+ // Language detection is available after call to `create()`.
+ const detector = await ai.languageDetector.create();
+ const availability = await detector.availability();
+ assert_equals(availability, 'available');
+}, 'Simple AILanguageDetector.availability() call');
+
+promise_test(async t => {
const detector = await ai.languageDetector.create();
const results = await detector.detect('this string is in English');
// "en" should be highest confidence.
@@ -28,7 +35,8 @@ promise_test(async t => {
controller.abort();
const detector = await ai.languageDetector.create();
- const detectPromise = await detector.detect('this string is in English');
+ const detectPromise =
+ detector.detect('this string is in English', {signal: controller.signal});
await promise_rejects_dom(t, 'AbortError', detectPromise);
}, 'AILanguageDetector.detect() call with an aborted signal.');
diff --git a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js b/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
index 4dfbf874a00..729cb04fb76 100644
--- a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
+++ b/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
@@ -27,17 +27,11 @@ promise_test(async t => {
// Creating the translator with user activation succeeds.
await createTranslator(languagePair);
- // Creating it should have switched it to readily.
- const capabilities = await ai.translator.capabilities();
- const {sourceLanguage, targetLanguage} = languagePair;
- assert_equals(
- capabilities.languagePairAvailable(sourceLanguage, targetLanguage),
- 'readily');
-
+ // Creating it should have switched it to available.
const availability = await ai.translator.availability(languagePair);
assert_equals(availability, 'available');
- // Now that it is readily, we should no longer need user activation.
+ // Now that it is available, we should no longer need user activation.
await ai.translator.create(languagePair);
}, 'AITranslator.create() requires user activation when availability is "downloadable.');
@@ -131,8 +125,10 @@ promise_test(async t => {
// Must have at least 2 progress events, one for 0 and one for 1.
assert_greater_than_equal(progressEvents.length, 2);
+
+ // 0 should be the first event and 1 should be the last event.
assert_equals(progressEvents.at(0).loaded, 0);
- assert_equals(progressEvents.at(1).loaded, 1);
+ assert_equals(progressEvents.at(-1).loaded, 1);
// All progress events must have a total of 1.
for (const progressEvent of progressEvents) {
diff --git a/tests/wpt/tests/common/redirect.py b/tests/wpt/tests/common/redirect.py
index f2fd1ebd51d..1ddde9a579b 100644
--- a/tests/wpt/tests/common/redirect.py
+++ b/tests/wpt/tests/common/redirect.py
@@ -4,6 +4,9 @@ def main(request, response):
The request should typically have two query parameters:
status - The status to use for the redirection. Defaults to 302.
location - The resource to redirect to.
+
+ This utility optionally supports CORS (iff the `enable-cors` query param is
+ present).
"""
status = 302
if b"status" in request.GET:
@@ -17,3 +20,10 @@ def main(request, response):
location = request.GET.first(b"location")
response.headers.set(b"Location", location)
+
+ if request.GET.get(b"enable-cors") is not None:
+ origin = request.headers.get(b"Origin")
+ if origin:
+ response.headers.set(b"Content-Type", b"text/plain")
+ response.headers.set(b"Access-Control-Allow-Origin", origin)
+ response.headers.set(b"Access-Control-Allow-Credentials", 'true')
diff --git a/tests/wpt/tests/compute-pressure/compute_pressure_detached_iframe.https.window.js b/tests/wpt/tests/compute-pressure/compute_pressure_detached_iframe.https.window.js
index 78654626fe1..120e754cb6f 100644
--- a/tests/wpt/tests/compute-pressure/compute_pressure_detached_iframe.https.window.js
+++ b/tests/wpt/tests/compute-pressure/compute_pressure_detached_iframe.https.window.js
@@ -8,7 +8,7 @@
'use strict';
-test(() => {
+promise_test(async () => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const frame_window = iframe.contentWindow;
diff --git a/tests/wpt/tests/compute-pressure/compute_pressure_duplicate_updates.https.window.js b/tests/wpt/tests/compute-pressure/compute_pressure_duplicate_updates.https.window.js
index e6f4ed10454..fb34e57e996 100644
--- a/tests/wpt/tests/compute-pressure/compute_pressure_duplicate_updates.https.window.js
+++ b/tests/wpt/tests/compute-pressure/compute_pressure_duplicate_updates.https.window.js
@@ -17,7 +17,7 @@ pressure_test(async (t) => {
});
const syncObserver = new SyncPressureObserver(t);
- await syncObserver.observer().observe('cpu', {sampleInterval: 100});
+ await syncObserver.observer().observe('cpu');
await update_virtual_pressure_source('cpu', 'critical');
await syncObserver.waitForUpdate();
@@ -32,6 +32,30 @@ pressure_test(async (t) => {
assert_equals(syncObserver.changes()[1][0].state, 'nominal');
assert_equals(syncObserver.changes().length, 2);
-}, 'Changes that fail the "has change in data" test are discarded.');
+}, 'Changes that fail the "should dispatch" test are discarded.');
+
+pressure_test(async (t) => {
+ await create_virtual_pressure_source('cpu');
+ t.add_cleanup(async () => {
+ await remove_virtual_pressure_source('cpu');
+ });
+
+ const syncObserver = new SyncPressureObserver(t);
+ await syncObserver.observer().observe('cpu', {sampleInterval: 100});
+
+ await update_virtual_pressure_source('cpu', 'critical');
+ await syncObserver.waitForUpdate();
+ assert_equals(syncObserver.changes()[0][0].state, 'critical');
+
+ await update_virtual_pressure_source('cpu', 'critical');
+ await syncObserver.waitForUpdate();
+ assert_equals(syncObserver.changes()[1][0].state, 'critical');
+
+ await update_virtual_pressure_source('cpu', 'nominal');
+ await syncObserver.waitForUpdate();
+ assert_equals(syncObserver.changes()[2][0].state, 'nominal');
+
+ assert_equals(syncObserver.changes().length, 3);
+}, 'Updates should be received even when no changes when sampleInterval is set.');
mark_as_done();
diff --git a/tests/wpt/tests/compute-pressure/resources/common.js b/tests/wpt/tests/compute-pressure/resources/common.js
index 4f666f1557e..b5a2ca2b27f 100644
--- a/tests/wpt/tests/compute-pressure/resources/common.js
+++ b/tests/wpt/tests/compute-pressure/resources/common.js
@@ -136,6 +136,12 @@ switch (_globalScope) {
throw new Error(`Invalid variant '${_globalScope}'`);
}
+promise_setup(async () => {
+ // Ensure window's document has focus so that the global under test can
+ // receive data.
+ await test_driver.click(document.documentElement);
+});
+
const pressure_test =
_pressureTestHelper.pressure_test.bind(_pressureTestHelper);
const mark_as_done = _pressureTestHelper.mark_as_done.bind(_pressureTestHelper);
diff --git a/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html
new file mode 100644
index 00000000000..192dadee770
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'nonce-dummy' 'trusted-types-eval' -->
+ <!-- Report Only CSP served: require-trusted-types-for 'script' -->
+</head>
+
+<body>
+ <h1>Scripts injected via `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ trustedTypes.createPolicy('default', { createScript: s => s });
+ var evalScriptRan = false;
+ var indirectEvalScriptRan = false;
+ var functionScriptRan = false;
+ var setTimeoutScriptRan = false;
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(evalScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ assert_throws_js(Error,
+ function() {
+ try {
+ eval("evalScriptRan = true;");
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Scripts injected via direct `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(indirectEvalScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ assert_throws_js(Error,
+ function() {
+ try {
+ eval?.("indirectEvalScriptRan = true;");
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Scripts injected via indirect `eval` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(functionScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ assert_throws_js(Error,
+ function() {
+ try {
+ new Function("functionScriptRan = true;")();
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Scripts injected via `new Function` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(setTimeoutScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ setTimeout("setTimeoutScriptRan = true;", 0);
+ }, "Scripts injected via `setTimeout` are not allowed with `trusted-types-eval` when `require-trusted-types-for 'script'` is report only.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html.headers b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html.headers
new file mode 100644
index 00000000000..ae1e09e31ea
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_report_only_require_trusted_types_eval.html.headers
@@ -0,0 +1,6 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'nonce-dummy' 'trusted-types-eval'
+Content-Security-Policy-Report-Only: require-trusted-types-for 'script';
diff --git a/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html
new file mode 100644
index 00000000000..06fae6d623b
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `eval` are allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'nonce-dummy' 'trusted-types-eval'; require-trusted-types-for 'script'; -->
+</head>
+
+<body>
+ <h1>Scripts injected via `eval` are allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ trustedTypes.createPolicy('default', {createScript: s => s});
+
+ var evalScriptRan = false;
+ var indirectEvalScriptRan = false;
+ var functionScriptRan = false;
+ var setTimeoutScriptRan = false;
+
+ async_test(function(t) {
+ var eventHandler = t.unreached_func('No CSP violation report has fired.');
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+ try {
+ eval("evalScriptRan = true;");
+ } catch (e) {
+ assert_unreached("`eval` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+ }
+ assert_true(evalScriptRan);
+ t.done();
+ }, "Script injected via direct `eval` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+
+ async_test(function(t) {
+ var eventHandler = t.unreached_func('No CSP violation report has fired.');
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+ try {
+ eval?.("indirectEvalScriptRan = true;");
+ } catch (e) {
+ assert_unreached("indirect `eval` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+ }
+ assert_true(indirectEvalScriptRan);
+ t.done();
+ }, "Script injected via indirect `eval` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+
+ async_test(function(t) {
+ var eventHandler = t.unreached_func('No CSP violation report has fired.');
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+ try {
+ new Function("functionScriptRan = true;")();
+ } catch (e) {
+ assert_unreached("`new Function` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+ }
+ assert_true(functionScriptRan);
+ t.done();
+ }, "Script injected via `new Function` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+
+ async_test(function(t) {
+ var eventHandler = t.unreached_func('No CSP violation report has fired.');
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+ try {
+ setTimeout("setTimeoutScriptRan = true;", 0);
+ } catch (e) {
+ assert_unreached("`setTimeout` should be allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+ }
+ setTimeout(() => {
+ assert_true(setTimeoutScriptRan);
+ t.done();
+ }, 0);
+ }, "Script injected via `setTimeout` is allowed with `trusted-types-eval` and `require-trusted-types-for 'script'`.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html.headers b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html.headers
new file mode 100644
index 00000000000..3e51fcd4741
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_with_require_trusted_types_eval.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'nonce-dummy' 'trusted-types-eval'; require-trusted-types-for 'script';
diff --git a/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html
new file mode 100644
index 00000000000..f8481194f9e
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'nonce-dummy' 'trusted-types-eval' -->
+</head>
+
+<body>
+ <h1>Scripts injected via `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ var evalScriptRan = false;
+ var indirectEvalScriptRan = false;
+ var functionScriptRan = false;
+ var setTimeoutScriptRan = false;
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(evalScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ assert_throws_js(Error,
+ function() {
+ try {
+ eval("evalScriptRan = true;");
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Scripts injected via direct `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(indirectEvalScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ assert_throws_js(Error,
+ function() {
+ try {
+ eval?.("indirectEvalScriptRan = true;");
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Scripts injected via indirect `eval` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(functionScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ assert_throws_js(Error,
+ function() {
+ try {
+ new Function("functionScriptRan = true;")();
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Scripts injected via `new Function` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
+
+ async_test(function(t) {
+ var eventHandler = t.step_func_done(function(e) {
+ assert_false(setTimeoutScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ assert_equals(e.blockedURI, 'eval');
+ });
+ window.addEventListener('securitypolicyviolation', eventHandler);
+ t.add_cleanup(() => {
+ window.removeEventListener('securitypolicyviolation', eventHandler);
+ });
+
+ setTimeout("setTimeoutScriptRan = true;", 0);
+ }, "Scripts injected via `setTimeout` are not allowed with `trusted-types-eval` without `require-trusted-types-for 'script'`.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html.headers b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html.headers
new file mode 100644
index 00000000000..5658b5ab2de
--- /dev/null
+++ b/tests/wpt/tests/content-security-policy/script-src/script-src-trusted_types_eval_without_require_trusted_types_eval.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'nonce-dummy' 'trusted-types-eval'
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-fallback-to-self-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-fallback-to-self-crash.html
new file mode 100644
index 00000000000..c5a8165d113
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-fallback-to-self-crash.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Anchor-positioned element attempting to anchor to itself as a fallback</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/401633680">
+<style>
+ @position-try --pf {
+ position-anchor: --problem;
+ }
+</style>
+<div style="anchor-name:--a;"></div>
+<div style="position:absolute; anchor-name:--problem; position-anchor:--a; left:anchor(right); margin-left:10px; position-try-fallbacks:--pf;"></div>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-try-order-inset-modified-containing-block.html b/tests/wpt/tests/css/css-anchor-position/position-try-order-inset-modified-containing-block.html
new file mode 100644
index 00000000000..9a859c96bb4
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-order-inset-modified-containing-block.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning: position-try-order behavior with margins</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #cb {
+ position: absolute;
+ width: 400px;
+ height: 400px;
+ border: 1px solid black;
+ }
+ #target, #ref {
+ position: absolute;
+ left: 450px; /* force fallback */
+ height: 40px;
+ background-color: skyblue;
+ }
+ #ref {
+ background-color: seagreen;
+ }
+
+ @position-try --margin {
+ left:0px;
+ right:0px;
+ margin: 100px;
+ }
+ @position-try --no-margin {
+ left:0px;
+ right:0px;
+ }
+
+</style>
+<style id=style>
+</style>
+<div id=cb>
+ <div id=target></div>
+ <div id=ref></div>
+</div>
+<script>
+
+// Test that an element with the specified `position_try` gets the same
+// position as a reference element with `position_try_expected`.
+function test_position_try_order(position_try, position_try_expected) {
+ test((t) => {
+ style.textContent = `
+ #target {
+ position-try: ${position_try};
+ }
+ #ref {
+ position-try: ${position_try_expected};
+ }
+ `;
+ assert_true(CSS.supports('position-try', 'normal --x'));
+ assert_equals(target.offsetLeft, ref.offsetLeft, 'offsetLeft');
+ assert_equals(getComputedStyle(target).marginLeft, getComputedStyle(ref).marginLeft, 'marginLeft');
+ }, `${position_try} | ${position_try_expected}`);
+}
+
+// Margin does not affect the inset-modified containing block size so the first option should get picked.
+test_position_try_order('most-width --margin, --no-margin', '--margin');
+test_position_try_order('most-width --no-margin, --margin', '--no-margin');
+test_position_try_order('most-height --margin, --no-margin', '--margin');
+test_position_try_order('most-height --no-margin, --margin', '--no-margin');
+
+</script>
diff --git a/tests/wpt/tests/css/css-backgrounds/background-gradient-interpolation-003.html b/tests/wpt/tests/css/css-backgrounds/background-gradient-interpolation-003.html
index 0b605493554..32446b5e4e8 100644
--- a/tests/wpt/tests/css/css-backgrounds/background-gradient-interpolation-003.html
+++ b/tests/wpt/tests/css/css-backgrounds/background-gradient-interpolation-003.html
@@ -9,7 +9,7 @@
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1910153">
<!-- The background-clip:text and simple block examples should theoretically render the same,
but we allow a slight difference because of different painting codepaths. -->
-<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-6500">
+<meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-7100">
<link rel="match" href="background-gradient-interpolation-001.html">
<style>
:root {
diff --git a/tests/wpt/tests/css/css-backgrounds/border-image-space-001.html b/tests/wpt/tests/css/css-backgrounds/border-image-space-001.html
index 720f0df188d..133b0c2b41a 100644
--- a/tests/wpt/tests/css/css-backgrounds/border-image-space-001.html
+++ b/tests/wpt/tests/css/css-backgrounds/border-image-space-001.html
@@ -6,7 +6,7 @@
<link rel="author" title="Levi Weintraub" href="mailto:leviw@chromium.org">
<link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-image-repeat">
<meta name="assert" content="border-image-repeat: space property spaces out background image that doesn't fit an even number of times.">
- <meta name="fuzzy" content="maxDifference=0-80; totalPixels=0-1728">
+ <meta name="fuzzy" content="maxDifference=0-80; totalPixels=0-3850">
<link rel="match" href="reference/border-image-space-001-ref.html">
<style>
.borderContainer {
diff --git a/tests/wpt/tests/css/css-backgrounds/css3-border-image-repeat-repeat.html b/tests/wpt/tests/css/css-backgrounds/css3-border-image-repeat-repeat.html
index b6db467a668..f3dc09008a9 100644
--- a/tests/wpt/tests/css/css-backgrounds/css3-border-image-repeat-repeat.html
+++ b/tests/wpt/tests/css/css-backgrounds/css3-border-image-repeat-repeat.html
@@ -10,7 +10,7 @@
-->
<link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-image-repeat">
<link rel="match" href="reference/css3-border-image-repeat-repeat-ref.html">
- <meta name="fuzzy" content="maxDifference=0-58;totalPixels=0-412">
+ <meta name="fuzzy" content="maxDifference=0-58;totalPixels=0-5300">
<style>
div {
border: red solid 18px;
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html
new file mode 100644
index 00000000000..688f01c8668
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Borders and Box Decorations 4: 'corner-shape' parametric rendering</title>
+<canvas id="target" width="400" height="400"></canvas>
+<script src="resources/resolve-corner-style.js"></script>
+<script src="resources/corner-utils.js"></script>
+<script src="resources/corner-shape.js"></script>
+<script>
+const canvas = document.getElementById("target");
+const params = new URLSearchParams(location.search);
+const width = params.get("width") || 200;
+const height = params.get("height") || 100;
+canvas.width = width * 3;
+canvas.height = height * 3;
+canvas.style.top = -height + "px";
+canvas.style.left = -width + "px";
+canvas.style.position = "relative";
+const ctx = canvas.getContext("2d");
+ctx.translate(width, height);
+const style = resolve_corner_style(Object.fromEntries(params.entries()), width, height);
+style['background-color'] = "green";
+render_rect_with_corner_shapes(style, ctx, width, height);
+</script>
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html
new file mode 100644
index 00000000000..9c256eb8977
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Borders and Box Decorations 4: 'corner-shape' parametric rendering</title>
+<link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping">
+<link rel="match" href="corner-shape-any-ref.html">
+<meta name="variant" content="?corner-shape=squircle&border-radius=50%">
+<meta name="variant" content="?corner-shape=squircle&border-top-left-radius=30%">
+<meta name="variant" content="?corner-shape=squircle&border-top-right-radius=30px">
+<meta name="variant" content="?corner-shape=straight&border-bottom-leftradius=5px">
+<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=40%">
+<meta name="variant" content="?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%">
+<meta name="variant" content="?corner-shape=superellipse(8)&border-top-right-radius=33px">
+<meta name="variant" content="?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px">
+<meta name="variant" content="?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px">
+<meta name="variant" content="?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%">
+<meta name="fuzzy" content="maxDifference=0-180;totalPixels=0-520">
+<style>
+ #target {
+ width: 200px;
+ height: 100px;
+ box-sizing: border-box;
+ background: green;
+ }
+</style>
+<div id="target"></div>
+<script>
+ const target = document.getElementById("target");
+ const params = new URLSearchParams(location.search);
+ for (const [k, v] of params) {
+ target.style[k] = v;
+ }
+</script>
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html
deleted file mode 100644
index 7bdb829f022..00000000000
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any-ref.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>CSS Borders and Box Decorations 4: 'corner-shape' full squircle</title>
-<canvas id="target" width="200" height="100"></canvas>
-<script src="resources/resolve-corner-style.js"></script>
-<script src="resources/corner-math.js"></script>
-<script>
-const canvas = document.getElementById("target");
-const ctx = canvas.getContext("2d");
-
-let cursor = [0, 0]
-function cornerTo(x1, y1, k) {
-// ctx.lineTo(x1, y1);
- const cp = control_points_for_superellipse(k, cursor, [x1, y1]).map(
- ([x, y]) => [cursor[0] + x * (x1 - cursor[0]), cursor[1] + y * (y1 - cursor[1])]);
- ctx.bezierCurveTo(...cp[0], ...cp[1], ...cp[2]);
- ctx.bezierCurveTo(...cp[3], ...cp[4], x1, y1);
- cursor = [x1, y1];
-}
-
-function moveTo(x, y) {
- ctx.moveTo(x, y);
- cursor = [x, y];
-}
-
-function lineTo(x, y) {
- ctx.lineTo(x, y);
- cursor = [x, y];
-}
-
-
-const params = new URLSearchParams(location.search);
-const {width, height} = canvas;
-const style = resolve_corner_style(Object.fromEntries(params.entries()), width, height);
-ctx.beginPath();
-moveTo(width - style["border-top-right-radius"][0], 0);
-cornerTo(width, style["border-top-right-radius"][1], style["corner-top-right-shape"]);
-lineTo(width, height - style["border-bottom-right-radius"][1]);
-cornerTo(width - style["border-bottom-right-radius"][0], height, 1 / style["corner-bottom-right-shape"]);
-lineTo(style["border-bottom-left-radius"][0], height);
-cornerTo(0, height - style["border-bottom-left-radius"][1], style["corner-bottom-left-shape"])
-lineTo(0, style["border-top-left-radius"][1]);
-cornerTo(style["border-top-left-radius"][0], 0, 1 / style["corner-top-left-shape"]);
-moveTo(width - style["border-top-right-radius"][0], 0);
-ctx.fillStyle = "green";
-ctx.closePath();
-ctx.fill();
-</script>
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html
deleted file mode 100644
index eb3a9830837..00000000000
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill-any.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>CSS Borders and Box Decorations 4: 'corner-shape' full squircle</title>
-<link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping">
-<link rel="match" href="corner-shape-fill-any-ref.html">
-<meta name="variant" content="?corner-shape=squircle&border-radius=50%">
-<meta name="variant" content="?corner-shape=squircle&border-radius=10%">
-<meta name="variant" content="?corner-shape=squircle&border-radius=30px">
-<meta name="variant" content="?corner-shape=straight&border-radius=5px">
-<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=50%">
-<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=33px">
-<meta name="variant" content="?corner-top-right-shape=scoop&border-radius=50px">
-<meta name="variant" content="?corner-bottom-left-shape=scoop&border-radius=10%">
-<meta name="variant" content="?corner-bottom-right-shape=scoop&border-radius=50%">
-<meta name="fuzzy" content="maxDifference=0-128;totalPixels=0-500">
-<style>
- #target {
- width: 200px;
- height: 100px;
- box-sizing: border-box;
- background: green;
- }
-</style>
-<div id="target"></div>
-<script>
- const target = document.getElementById("target");
- const params = new URLSearchParams(location.search);
- for (const [k, v] of params) {
- target.style[k] = v;
- }
-</script>
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-math.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-math.js
deleted file mode 100644
index 0a2ddf0889d..00000000000
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-math.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-/**
- * @param {number} s
- * @param {number} t
- * @returns {x: number, y: number}
- */
-function se(s, t = 0.5) {
- const curvature = Math.pow(2, s);
- const x = superellipse_at(curvature);
- const y = superellipse_at(curvature, 1 - t);
- return {x, y};
-}
-
-/**
- *
- * @param {number} k
- * @returns Array<[number, number]>
- */
-function control_points_for_superellipse(k) {
- const p = [
- 1.2430920942724248, 2.010479023614843, 0.32922901179443753,
- 0.2823023142212073, 1.3473704261055421, 2.9149468637949814,
- 0.9106507102917086
- ];
-
- const s = Math.log2(k);
- const absS = Math.abs(s);
- const slope =
- p[0] + (p[6] - p[0]) * 0.5 * (1 + Math.tanh(p[5] * (absS - p[1])));
- const base = 1 / (1 + Math.exp(-slope * (0 - p[1])));
- const logistic = 1 / (1 + Math.exp(-slope * (absS - p[1])));
-
- const a = (logistic - base) / (1 - base);
- const b = p[2] * Math.exp(-p[3] * absS ** p[4]);
-
- const P3 = se(absS, 0.5);
- const P1 = {x: a, y: 1};
- const P5 = {x: 1, y: a};
-
- if (s < 0) {
- [P1.x, P1.y] = [1 - P1.y, 1 - P1.x];
- [P3.x, P3.y] = [1 - P3.y, 1 - P3.x];
- [P5.x, P5.y] = [1 - P5.y, 1 - P5.x];
- }
-
- const P2 = {x: P3.x - b, y: P3.y + b};
- const P4 = {x: P3.x + b, y: P3.y - b};
- return [P1, P2, P3, P4, P5].map(({x, y}) => [x, 1 - y]);
-}
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js
new file mode 100644
index 00000000000..2aaaf5ed289
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js
@@ -0,0 +1,166 @@
+/**
+ * Use short lines that follow the superellipse formula to generate
+ * a path that approximates a superellipse.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} ax
+ * @param {number} ay
+ * @param {number} bx
+ * @param {number} by
+ * @param {number} curvature
+ * @param {*} phase
+ * @param {*} direction
+ * @returns
+ */
+function add_corner(ctx, ax, ay, bx, by, curvature) {
+ const vertical_first = Math.sign(bx - ax) === Math.sign(by - ay);
+ function map_point({ x, y }) {
+ if (vertical_first) {
+ y = 1 - y;
+ } else {
+ [x, y] = [1 - y, x];
+ }
+
+ return [ax + x * (bx - ax), ay + y * (by - ay)];
+ }
+
+ if (curvature > 1000) {
+ ctx.lineTo(...map_point({ x: 0, y: 1 }));
+ ctx.lineTo(...map_point({ x: 1, y: 1 }));
+ ctx.lineTo(...map_point({ x: 0, y: 1 }));
+ return;
+ }
+
+ if (curvature <= 0.001) {
+ ctx.lineTo(...map_point({ x: 0, y: 1 }));
+ ctx.lineTo(...map_point({ x: 0, y: 0 }));
+ ctx.lineTo(...map_point({ x: 1, y: 0 }));
+ return;
+ }
+
+ function xy_for_t(t) {
+ return map_point(superellipse(curvature, t));
+ }
+
+ ctx.lineTo(ax, ay);
+ const t_values = new Set();
+ const antialiasing_offset = 0.25;
+ for (
+ let x = Math.min(ax, bx) + antialiasing_offset;
+ x < Math.max(ax, bx);
+ ++x
+ ) {
+ const nx = (x - ax) / (bx - ax);
+ const t = vertical_first
+ ? superellipse_t_for_x(nx, curvature)
+ : superellipse_t_for_y(1 - nx, curvature);
+ if (t > 0 && t < 1) t_values.add(t);
+ }
+
+ for (
+ let y = Math.min(ay, by) + antialiasing_offset;
+ y < Math.max(ay, by);
+ ++y
+ ) {
+ const ny = (y - ay) / (by - ay);
+ const t = vertical_first
+ ? superellipse_t_for_y(1 - ny, curvature)
+ : superellipse_t_for_x(1 - ny, curvature);
+ if (t > 0 && t < 1) t_values.add(t);
+ }
+
+ for (const t of [...t_values].sort()) {
+ const [x, y] = xy_for_t(t);
+ ctx.lineTo(x, y);
+ }
+ ctx.lineTo(bx, by);
+}
+
+/**
+ *
+ * @param {{
+ * 'corner-top-left-shape': number,
+ * 'corner-top-right-shape': number,
+ * 'corner-bottom-right-shape': number,
+ * 'corner-bottom-left-shape': number,
+ * 'border-top-left-radius': [number, number],
+ * 'border-top-right-radius': [number, number],
+ * 'border-bottom-left-radius': [number, number],
+ * 'border-bottom-right-radius': [number, number],
+ * 'border-top-color': string,
+ * 'border-right-color': string,
+ * 'border-left-color': string,
+ * 'border-bottom-color': string,
+ * 'border-top-width': number,
+ * 'border-right-width': number,
+ * 'border-bottom-width': number,
+ * 'border-left-width': number,
+ * }} style
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} width
+ * @param {number} height
+ */
+function render_rect_with_corner_shapes(style, ctx, width, height) {
+ const corner_params = resolve_corner_params(style, width, height);
+
+ function draw_outer_corner(corner, phase = "both", direction) {
+ const params = corner_params[corner];
+ add_corner(ctx, ...params.outer_rect, params.shape, phase, direction);
+ }
+
+ function draw_inner_corner_from_params(params, phase = "both", direction) {
+ add_corner(ctx, ...params.inner_rect, params.shape, phase, direction);
+ }
+
+ function draw_inner_corner(corner, phase = "both", direction) {
+ draw_inner_corner_from_params(corner_params[corner], phase, direction);
+ }
+
+ ctx.beginPath();
+
+ draw_outer_corner("top-right");
+ draw_outer_corner("bottom-right");
+ draw_outer_corner("bottom-left");
+ draw_outer_corner("top-left");
+ ctx.closePath();
+ ctx.clip("nonzero");
+
+ const inner_rect = [
+ style["border-left-width"],
+ style["border-top-width"],
+ width - style["border-right-width"],
+ height - style["border-bottom-width"],
+ ];
+ ctx.save();
+ ctx.beginPath();
+ draw_inner_corner("top-right");
+ ctx.lineTo(inner_rect[2], inner_rect[3]);
+ ctx.lineTo(inner_rect[0], inner_rect[3]);
+ ctx.lineTo(inner_rect[0], inner_rect[1]);
+ ctx.closePath();
+ ctx.clip();
+ ctx.beginPath();
+ draw_inner_corner("bottom-right");
+ ctx.lineTo(inner_rect[0], inner_rect[3]);
+ ctx.lineTo(inner_rect[0], inner_rect[1]);
+ ctx.lineTo(inner_rect[2], inner_rect[1]);
+ ctx.closePath();
+ ctx.clip();
+ ctx.beginPath();
+ draw_inner_corner("bottom-left");
+ ctx.lineTo(inner_rect[0], inner_rect[1]);
+ ctx.lineTo(inner_rect[2], inner_rect[1]);
+ ctx.lineTo(inner_rect[2], inner_rect[3]);
+ ctx.closePath();
+ ctx.clip();
+ ctx.beginPath();
+ draw_inner_corner("top-left");
+ ctx.lineTo(inner_rect[2], inner_rect[1]);
+ ctx.lineTo(inner_rect[2], inner_rect[3]);
+ ctx.lineTo(inner_rect[0], inner_rect[3]);
+ ctx.closePath();
+ ctx.clip();
+ ctx.fillStyle = style["background-color"];
+ ctx.fill();
+ ctx.restore();
+}
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js
new file mode 100644
index 00000000000..39203aefc67
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js
@@ -0,0 +1,126 @@
+/**
+ *
+ * @param {number} curvature
+ * @returns {[number, number]}
+ */
+function offset_for_curvature(curvature) {
+ // Find the superellipse's control point.
+ // we do that by approximating the superellipse as a quadratic
+ // curve that has the same point at t = 0.5.
+ if (curvature <= 0.001) return [1, -1];
+ const { x } = superellipse(curvature);
+ const [a, b] = [x, 1 - x].map((m) => 2 * m - 0.5);
+ const magnitude = Math.hypot(a, b);
+ // Normalize a & b
+ const norm_a = a / magnitude;
+ const norm_b = b / magnitude;
+ return [norm_a, -norm_b];
+}
+
+/**
+ *
+ * @param {number} curvature
+ * @param {number} t
+ * @returns {{x: number, y: number}}
+ */
+function superellipse(curvature, t = 0.5) {
+ // Make concave shapes symmetrical with convex ones.
+ if (curvature < 1) {
+ const { x, y } = superellipse(1 / curvature, t);
+ return { x: 1 - y, y: 1 - x };
+ }
+
+ const x = Math.pow(t, 1 / curvature);
+ const y = Math.pow(1 - t, 1 / curvature);
+ return { x, y };
+}
+
+function superellipse_t_for_x(x, curvature) {
+ if (curvature < 1) {
+ return 1 - superellipse_t_for_y(1 - x, 1 / curvature);
+ } else return Math.log(x) / Math.log(1 / curvature);
+}
+
+function superellipse_t_for_y(y, curvature) {
+ if (curvature < 1) {
+ return 1 - superellipse_t_for_x(1 - y, 1 / curvature);
+ } else return 1 - Math.log(y) / Math.log(1 / curvature);
+}
+
+function resolve_corner_params(style, width, height, outset = null) {
+ const params = {
+ "top-right": {
+ outer: [
+ width - style["border-top-right-radius"][0],
+ 0,
+ width,
+ style["border-top-right-radius"][1],
+ ],
+ inset: [style["border-top-width"], style["border-right-width"]],
+ },
+
+ "bottom-right": {
+ outer: [
+ width,
+ height - style["border-bottom-right-radius"][1],
+ width - style["border-bottom-right-radius"][0],
+ height,
+ ],
+ inset: [style["border-right-width"], style["border-bottom-width"]],
+ },
+
+ "bottom-left": {
+ outer: [
+ style["border-bottom-left-radius"][0],
+ height,
+ 0,
+ height - style["border-bottom-left-radius"][1],
+ ],
+ inset: [style["border-bottom-width"], style["border-left-width"]],
+ },
+
+ "top-left": {
+ outer: [
+ 0,
+ style["border-top-left-radius"][1],
+ style["border-top-left-radius"][0],
+ 0,
+ ],
+ inset: [style["border-left-width"], style["border-top-width"]],
+ },
+ };
+
+ return Object.fromEntries(
+ Object.entries(params).map(([corner, { outer, inset }]) => {
+ if (outset !== null) inset = [-outset, -outset];
+ const shape = style[`corner-${corner}-shape`];
+ const s1 = Math.sign(outer[2] - outer[0]);
+ const s2 = Math.sign(outer[3] - outer[1]);
+ const [sw1, sw2] = inset;
+ const inner_offset = [s1 * sw1, s2 * sw1, -s1 * sw2, -s2 * sw2];
+
+ const offset = offset_for_curvature(shape);
+ if (Math.sign(inner_offset[0]) === Math.sign(inner_offset[1])) {
+ offset.reverse();
+ }
+
+ const inner_rect = [
+ outer[0] + inner_offset[0] * offset[0],
+ outer[1] + inner_offset[1] * offset[1],
+ outer[2] + inner_offset[2] * offset[1],
+ outer[3] + inner_offset[3] * offset[0],
+ ];
+
+ return [
+ corner,
+ {
+ outer_rect: outer,
+ shape,
+ inset,
+ inner_rect,
+ inner_offset,
+ },
+ ];
+ })
+ );
+}
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js
index bb6fc7dca63..ea065f577e0 100644
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js
@@ -11,77 +11,26 @@ const keywords = {
straight: 1000,
};
-function superellipse_at(curvature, t = 0.5) {
- return Math.pow(t, 1 / curvature)
-}
-
-/**
- * @param {number} s
- * @param {number} t
- * @returns {x: number, y: number}
- */
-function se(s, t = 0.5) {
- const curvature = Math.pow(2, s);
- const x = superellipse_at(curvature);
- const y = superellipse_at(curvature, 1 - t);
- return {x, y};
-}
-
-
-/**
- *
- * @param {number} curvature
- * @returns number
- */
-function offset_for_curvature(curvature) {
- if (curvature === 0)
- return 1;
- if (curvature >= 2)
- return 0;
- // Find the approximate slope & magnitude of the superellipse's tangent
- const a = superellipse_at(curvature);
- const b = 1 - a;
- const slope = a / b;
- const magnitude = Math.hypot(a, b);
- // Normalize a & b
- const norm_a = a / magnitude;
- const norm_b = b / magnitude;
-
- // The outer normal offset is the intercept of the line
- // parallel to the tangent, at distance.
-
- return norm_b + slope * (norm_a - 1);
-}
-
-
-function resolve_corner_style(style, width, height) {
+function resolve_corner_style(style, w, h) {
['top', 'bottom'].forEach((vSide) => ['left', 'right'].forEach((hSide) => {
let shape = style[`corner-${vSide}-${hSide}-shape`] ||
style['corner-shape'] || 'round';
const match = shape.match(/superellipse\((\.?[0-9]+(.[0-9]+)?)\)/);
shape = match ? +match[1] : keywords[shape];
- const hWidth = style[`border-${hSide}-width`] ?? style['border-width'] ?? 0;
- const vWidth = style[`border-${vSide}-width`] ?? style['border-width'] ?? 0;
+ const hWidth = style[`border-${hSide}-width`] || style['border-width'] || 0;
+ const vWidth = style[`border-${vSide}-width`] || style['border-width'] || 0;
let radius =
- style[`border-${vSide}-${hSide}-radius`] ?? style['border-radius'];
+ style[`border-${vSide}-${hSide}-radius`] || style['border-radius'] || 0;
if (!Array.isArray(radius))
radius = [radius, radius];
if (shape > 1000)
shape = 1000;
- if (shape < 0.00000001)
- shape = 0.00000001;
if (String(radius[0]).endsWith('%'))
- radius[0] = (parseFloat(radius[0]) * width) / 100;
+ radius[0] = (parseFloat(radius[0]) * w) / 100;
if (String(radius[1]).endsWith('%'))
- radius[1] = (parseFloat(radius[1]) * height) / 100;
- radius = radius.map(r => parseFloat(r));
- ;
+ radius[1] = (parseFloat(radius[1]) * h) / 100;
+ radius = radius.map(parseFloat);
style[`corner-${vSide}-${hSide}-shape`] = shape;
- const offset = offset_for_curvature(shape);
- radius = [
- Math.min(Math.max(radius[0], hWidth), width / 2 - hWidth * offset),
- Math.min(Math.max(radius[1], vWidth), height / 2 - vWidth * offset)
- ];
style[`border-${vSide}-${hSide}-radius`] = radius;
style[`border-${hSide}-width`] = hWidth;
style[`border-${vSide}-width`] = vWidth;
diff --git a/tests/wpt/tests/css/css-cascade/layer-namespace-sandwich-crash.html b/tests/wpt/tests/css/css-cascade/layer-namespace-sandwich-crash.html
new file mode 100644
index 00000000000..c0a754e902f
--- /dev/null
+++ b/tests/wpt/tests/css/css-cascade/layer-namespace-sandwich-crash.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Crash Test: @layer statement sandwiched between namespaces</title>
+<link rel="help" href="https://issues.chromium.org/issues/402248410">
+<style>
+ @namespace "hello";
+ @layer feh;
+ @namespace "world";
+</style>
diff --git a/tests/wpt/tests/css/css-color-hdr/computed.html b/tests/wpt/tests/css/css-color-hdr/computed.html
index 48076da6b6a..47021144087 100644
--- a/tests/wpt/tests/css/css-color-hdr/computed.html
+++ b/tests/wpt/tests/css/css-color-hdr/computed.html
@@ -10,37 +10,37 @@
<div id="target"></div>
<script>
-test_computed_value("dynamic-range-limit", "high");
-test_computed_value("dynamic-range-limit", "constrained-high");
+test_computed_value("dynamic-range-limit", "no-limit");
+test_computed_value("dynamic-range-limit", "constrained");
test_computed_value("dynamic-range-limit", "standard");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 75%, high 25%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, high 75%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, standard 0%)",
- "high");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, high 0%)",
- "high");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 25%, standard 25%, standard 25%, standard 25%)",
- "dynamic-range-limit-mix(standard 75%, high 25%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 25%, standard 75%)",
- "dynamic-range-limit-mix(standard 75%, high 25%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 100%, standard 100%)",
- "dynamic-range-limit-mix(standard 50%, high 50%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 60%, constrained-high 60%)",
- "dynamic-range-limit-mix(standard 30%, constrained-high 30%, high 40%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained-high 75%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 75%, standard 25%)",
- "dynamic-range-limit-mix(standard 25%, constrained-high 75%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 25%, high 25%)",
- "dynamic-range-limit-mix(constrained-high 50%, high 50%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained-high 50%, high 25%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 10%, constrained-high 20%, high 20%)",
- "dynamic-range-limit-mix(standard 20%, constrained-high 40%, high 40%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 10%, standard 30%)",
- "dynamic-range-limit-mix(standard 75%, high 25%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 10%, high 30%) 20%, standard 80%)",
- "dynamic-range-limit-mix(standard 85%, high 15%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 25%, high 75%) 20%, dynamic-range-limit-mix(standard 25%, constrained-high 75%) 40%, dynamic-range-limit-mix(constrained-high 25%, high 75%) 40%)",
- "dynamic-range-limit-mix(standard 15%, constrained-high 40%, high 45%)");
-test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(high 10%, dynamic-range-limit-mix(standard 25%, constrained-high 75%) 20%, dynamic-range-limit-mix(constrained-high 10%, high 30%) 20%)",
- "dynamic-range-limit-mix(standard 10%, constrained-high 40%, high 50%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 75%, no-limit 25%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, no-limit 75%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 100%, standard 0%)",
+ "no-limit");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 100%, no-limit 0%)",
+ "no-limit");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 25%, standard 25%, standard 25%, standard 25%)",
+ "dynamic-range-limit-mix(standard 75%, no-limit 25%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 25%, standard 75%)",
+ "dynamic-range-limit-mix(standard 75%, no-limit 25%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 100%, standard 100%)",
+ "dynamic-range-limit-mix(standard 50%, no-limit 50%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80%, standard 60%, constrained 60%)",
+ "dynamic-range-limit-mix(standard 30%, constrained 30%, no-limit 40%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained 75%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 75%, standard 25%)",
+ "dynamic-range-limit-mix(standard 25%, constrained 75%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 25%, no-limit 25%)",
+ "dynamic-range-limit-mix(constrained 50%, no-limit 50%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 25%, constrained 50%, no-limit 25%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(standard 10%, constrained 20%, no-limit 20%)",
+ "dynamic-range-limit-mix(standard 20%, constrained 40%, no-limit 40%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 10%, standard 30%)",
+ "dynamic-range-limit-mix(standard 75%, no-limit 25%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 10%, no-limit 30%) 20%, standard 80%)",
+ "dynamic-range-limit-mix(standard 85%, no-limit 15%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(standard 25%, no-limit 75%) 20%, dynamic-range-limit-mix(standard 25%, constrained 75%) 40%, dynamic-range-limit-mix(constrained 25%, no-limit 75%) 40%)",
+ "dynamic-range-limit-mix(standard 15%, constrained 40%, no-limit 45%)");
+test_computed_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 10%, dynamic-range-limit-mix(standard 25%, constrained 75%) 20%, dynamic-range-limit-mix(constrained 10%, no-limit 30%) 20%)",
+ "dynamic-range-limit-mix(standard 10%, constrained 40%, no-limit 50%)");
</script>
diff --git a/tests/wpt/tests/css/css-color-hdr/inheritance.html b/tests/wpt/tests/css/css-color-hdr/inheritance.html
index 4f7a44a7729..6f893b6b68a 100644
--- a/tests/wpt/tests/css/css-color-hdr/inheritance.html
+++ b/tests/wpt/tests/css/css-color-hdr/inheritance.html
@@ -12,5 +12,5 @@
</div>
<script>
- assert_inherited('dynamic-range-limit', 'high', 'standard');
+ assert_inherited('dynamic-range-limit', 'no-limit', 'standard');
</script>
diff --git a/tests/wpt/tests/css/css-color-hdr/interpolation.html b/tests/wpt/tests/css/css-color-hdr/interpolation.html
index 62e079f6366..41ee8421019 100644
--- a/tests/wpt/tests/css/css-color-hdr/interpolation.html
+++ b/tests/wpt/tests/css/css-color-hdr/interpolation.html
@@ -14,52 +14,52 @@
<script>
test_interpolation({
property: "dynamic-range-limit",
- from: "high",
+ from: "no-limit",
to: "standard",
}, [
- {at: 0.0, expect: "high"},
- {at: 0.25, expect: "dynamic-range-limit-mix(standard 25%, high 75%)"},
- {at: 0.75, expect: "dynamic-range-limit-mix(standard 75%, high 25%)"},
+ {at: 0.0, expect: "no-limit"},
+ {at: 0.25, expect: "dynamic-range-limit-mix(standard 25%, no-limit 75%)"},
+ {at: 0.75, expect: "dynamic-range-limit-mix(standard 75%, no-limit 25%)"},
{at: 1.0, expect: "standard"},
]);
test_interpolation({
property: "dynamic-range-limit",
- from: "constrained-high",
+ from: "constrained",
to: "standard",
}, [
- {at: 0.0, expect: "constrained-high"},
- {at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained-high 50%)"},
+ {at: 0.0, expect: "constrained"},
+ {at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained 50%)"},
{at: 1.0, expect: "standard"},
]);
test_interpolation({
property: "dynamic-range-limit",
- from: "dynamic-range-limit-mix(standard 50%, high 50%)",
+ from: "dynamic-range-limit-mix(standard 50%, no-limit 50%)",
to: "standard",
}, [
- {at: 0.0, expect: "dynamic-range-limit-mix(standard 50%, high 50%)"},
- {at: 0.75, expect: "dynamic-range-limit-mix(standard 87.5%, high 12.5%)"},
+ {at: 0.0, expect: "dynamic-range-limit-mix(standard 50%, no-limit 50%)"},
+ {at: 0.75, expect: "dynamic-range-limit-mix(standard 87.5%, no-limit 12.5%)"},
{at: 1.0, expect: "standard"},
]);
test_interpolation({
property: "dynamic-range-limit",
- from: "dynamic-range-limit-mix(standard 90%, high 10%)",
- to: "dynamic-range-limit-mix(standard 10%, high 90%)",
+ from: "dynamic-range-limit-mix(standard 90%, no-limit 10%)",
+ to: "dynamic-range-limit-mix(standard 10%, no-limit 90%)",
}, [
- {at: 0.0, expect: "dynamic-range-limit-mix(standard 90%, high 10%)"},
- {at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, high 50%)"},
- {at: 1.0, expect: "dynamic-range-limit-mix(standard 10%, high 90%)"},
+ {at: 0.0, expect: "dynamic-range-limit-mix(standard 90%, no-limit 10%)"},
+ {at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, no-limit 50%)"},
+ {at: 1.0, expect: "dynamic-range-limit-mix(standard 10%, no-limit 90%)"},
]);
test_interpolation({
property: "dynamic-range-limit",
- from: "dynamic-range-limit-mix(constrained-high 90%, standard 10%)",
- to: "dynamic-range-limit-mix(high 10%, standard 90%)",
+ from: "dynamic-range-limit-mix(constrained 90%, standard 10%)",
+ to: "dynamic-range-limit-mix(no-limit 10%, standard 90%)",
}, [
- {at: 0.0, expect: "dynamic-range-limit-mix(standard 10%, constrained-high 90%)"},
- {at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained-high 45%, high 5%)"},
- {at: 1.0, expect: "dynamic-range-limit-mix(standard 90%, high 10%)"},
+ {at: 0.0, expect: "dynamic-range-limit-mix(standard 10%, constrained 90%)"},
+ {at: 0.5, expect: "dynamic-range-limit-mix(standard 50%, constrained 45%, no-limit 5%)"},
+ {at: 1.0, expect: "dynamic-range-limit-mix(standard 90%, no-limit 10%)"},
]);
</script>
diff --git a/tests/wpt/tests/css/css-color-hdr/parsing.html b/tests/wpt/tests/css/css-color-hdr/parsing.html
index caf3e86a27c..e165a60d7ed 100644
--- a/tests/wpt/tests/css/css-color-hdr/parsing.html
+++ b/tests/wpt/tests/css/css-color-hdr/parsing.html
@@ -9,31 +9,31 @@
<script>
test_valid_value("dynamic-range-limit", "standard");
- test_valid_value("dynamic-range-limit", "high");
- test_valid_value("dynamic-range-limit", "constrained-high");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 20%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 8%, standard 2%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 99%, standard 99%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 99%, standard 99%, constrained-high 10%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 1%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high 20%, high 80%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained-high 90%, high 10%) 1%, high 80%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 1%, dynamic-range-limit-mix(constrained-high 2%, high 10%) 80%)");
- test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(high 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained-high 5%, high 5%) 6%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80%, standard 20%, )");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high, standard 20%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained-high, high, 80%)");
+ test_valid_value("dynamic-range-limit", "no-limit");
+ test_valid_value("dynamic-range-limit", "constrained");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80%, standard 20%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 8%, standard 2%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 99%, standard 99%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 99%, standard 99%, constrained 10%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained 20%, no-limit 80%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(constrained 90%, no-limit 10%) 1%, no-limit 80%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 1%, dynamic-range-limit-mix(constrained 2%, no-limit 10%) 80%)");
+ test_valid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(no-limit 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained 5%, no-limit 5%) 6%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80%, standard 20%, )");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit, standard 20%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(constrained, no-limit, 80%)");
test_invalid_value("dynamic-range-limit", "");
test_invalid_value("dynamic-range-limit", "none");
test_invalid_value("dynamic-range-limit", "default");
test_invalid_value("dynamic-range-limit", "hdr");
test_invalid_value("dynamic-range-limit", "sdr");
test_invalid_value("dynamic-range-limit", "low");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 80% standard 20%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(low, high, 10%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 101%, standard 1%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high -1%, standard 1%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(standard, high, 0.1)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(high 0%, standard 0%)");
- test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(high 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained-high 0%, high 0%) 6%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 80% standard 20%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(low, no-limit, 10%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 101%, standard 1%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit -1%, standard 1%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(standard, no-limit, 0.1)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(no-limit 0%, standard 0%)");
+ test_invalid_value("dynamic-range-limit", "dynamic-range-limit-mix(dynamic-range-limit-mix(no-limit 1%, standard 2%) 3%, dynamic-range-limit-mix(constrained 0%, no-limit 0%) 6%)");
</script>
diff --git a/tests/wpt/tests/css/css-color/currentcolor-005-ref.html b/tests/wpt/tests/css/css-color/currentcolor-005-ref.html
new file mode 100644
index 00000000000..67c72813aff
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/currentcolor-005-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Others depend on currentcolor should be recomputed when currentcolor changes</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <style>
+ #column-rule-color-currentcolor {
+ columns: 2;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ height: 1em;
+ column-rule-color: green;
+ color: green;
+ }
+
+ #column-rule-color-color-mix-currentcolor {
+ columns: 2;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ height: 1em;
+ column-rule-color: color-mix(in hsl, green 50%, white);
+ color: green;
+ }
+ </style>
+</head>
+
+<body>
+ <div id="column-rule-color-currentcolor">XXX<br>YYY</div>
+ <div id="column-rule-color-color-mix-currentcolor">XXX<br>YYY</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-color/currentcolor-005.html b/tests/wpt/tests/css/css-color/currentcolor-005.html
new file mode 100644
index 00000000000..67a9dc2bb1f
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/currentcolor-005.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+ <title>column-rule-color that depend on currentcolor should be recomputed when currentcolor changes</title>
+ <link rel="match" href="currentcolor-005-ref.html">
+ <link rel="help" href="https://drafts.csswg.org/css-color-4/#resolving-other-colors">
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <style>
+ #column-rule-color-currentcolor {
+ columns: 2;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ height: 1em;
+ column-rule-color: currentcolor;
+ }
+
+ #column-rule-color-color-mix-currentcolor {
+ columns: 2;
+ column-rule-style: solid;
+ column-rule-width: 10px;
+ height: 1em;
+ column-rule-color: color-mix(in hsl, currentcolor 50%, white);
+ }
+ </style>
+</head>
+
+<body>
+ <div id="column-rule-color-currentcolor">XXX<br>YYY</div>
+ <div id="column-rule-color-color-mix-currentcolor">XXX<br>YYY</div>
+<script>
+ // Use double requestAnimationFrame to remove need of setTimeout.
+ // Wait for the first frame to ensure that the style is computed.
+ requestAnimationFrame(() => {
+ // Wait for the second frame to ensure that the style is painted.
+ requestAnimationFrame(() => {
+ document.getElementById("column-rule-color-currentcolor").style.color = "green";
+ document.getElementById("column-rule-color-color-mix-currentcolor").style.color = "green";
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ });
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-color/system-color-consistency.html b/tests/wpt/tests/css/css-color/system-color-consistency.html
index a3849c5781b..fd73d1ab2f2 100644
--- a/tests/wpt/tests/css/css-color/system-color-consistency.html
+++ b/tests/wpt/tests/css/css-color/system-color-consistency.html
@@ -1,19 +1,13 @@
<!DOCTYPE html>
-<html>
-
-<head>
- <meta charset="utf-8">
- <title>CSS Color 4: System color consistency</title>
- <link rel="author" title="Jan Keitel" href="mailto:jkeitel@google.com">
- <link rel="help" href="https://www.w3.org/TR/css-color-4/#css-system-colors">
- <meta name="assert" content="computed style of form elements is consistent with definition of system colors">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="/css/support/computed-testcommon.js"></script>
-</head>
-
-<body>
- <div style="display: none">
+<meta charset="utf-8">
+<title>CSS Color 4: System color consistency</title>
+<link rel="author" title="Jan Keitel" href="mailto:jkeitel@google.com">
+<link rel="help" href="https://www.w3.org/TR/css-color-4/#css-system-colors">
+<meta name="assert" content="computed style of form elements is consistent with definition of system colors">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<div style="display: none">
<div id="target"></div>
<!-- Reference elements -->
<!-- Buttons -->
@@ -31,41 +25,55 @@
<mark id="mark">Marked text</mark>
<!-- Link -->
<a href="#" id="link">Link</a>
- </div>
+ <div id="canvas" style="color: CanvasText; background-color: Canvas">Canvas Colors</mark>
+</div>
+<script>
+ function test_not_canvas(color, colorScheme) {
+ test(function() {
+ let target = document.getElementById("target");
+ target.style.color = color;
+
+ let canvas = document.getElementById("canvas");
+ assert_not_equals(getComputedStyle(target).color, getComputedStyle(canvas).backgroundColor, `${color} should not match Canvas`);
+ }, `${color} should not match Canvas in ${colorScheme} mode`);
+ }
- <script>
- ['light', 'dark'].forEach(colorScheme => {
- document.documentElement.style.colorScheme = colorScheme;
+ ['light', 'dark'].forEach(colorScheme => {
+ document.documentElement.style.colorScheme = colorScheme;
- // Buttons
- for (let element of document.getElementById("buttons").children) {
- style = document.defaultView.getComputedStyle(element);
- test_computed_value('color', 'ButtonBorder', style.getPropertyValue('border-color'), `resolves to the same color as the border-color of a ${element.name} (${colorScheme})`);
- test_computed_value('color', 'ButtonFace', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
- test_computed_value('color', 'ButtonText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
- }
+ // Buttons
+ for (let element of document.getElementById("buttons").children) {
+ style = getComputedStyle(element);
+ test_computed_value('color', 'ButtonBorder', style.getPropertyValue('border-color'), `resolves to the same color as the border-color of a ${element.name} (${colorScheme})`);
+ test_computed_value('color', 'ButtonFace', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
+ test_computed_value('color', 'ButtonText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
+ }
- // CanvasText
- style = document.defaultView.getComputedStyle(document.getElementsByTagName('html')[0]);
- test_computed_value('color', 'CanvasText', style.getPropertyValue('color'), `has the same color as the color of the html element (${colorScheme})`);
+ // CanvasText
+ style = getComputedStyle(document.getElementsByTagName('html')[0]);
+ test_computed_value('color', 'CanvasText', style.getPropertyValue('color'), `has the same color as the color of the html element (${colorScheme})`);
- // Field and FieldText
- for (let element of document.getElementById("fields").children) {
- style = document.defaultView.getComputedStyle(element);
- test_computed_value('color', 'Field', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
- test_computed_value('color', 'FieldText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
- }
+ // Field and FieldText
+ for (let element of document.getElementById("fields").children) {
+ style = getComputedStyle(element);
+ test_computed_value('color', 'Field', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
+ test_computed_value('color', 'FieldText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
+ }
- // Mark and MarkText
- style = document.defaultView.getComputedStyle(document.getElementById('mark'));
- test_computed_value('color', 'Mark', style.getPropertyValue('background-color'), `has the same color as the background-color of a mark element (${colorScheme})`);
- test_computed_value('color', 'MarkText', style.getPropertyValue('color'), `has the same color as the color of a mark element (${colorScheme})`);
+ // Mark and MarkText
+ style = getComputedStyle(document.getElementById('mark'));
+ test_computed_value('color', 'Mark', style.getPropertyValue('background-color'), `has the same color as the background-color of a mark element (${colorScheme})`);
+ test_computed_value('color', 'MarkText', style.getPropertyValue('color'), `has the same color as the color of a mark element (${colorScheme})`);
- // LinkText
- style = document.defaultView.getComputedStyle(document.getElementById('link'));
- test_computed_value('color', 'LinkText', style.getPropertyValue('color'), `has the same color as the color of an anchor element (${colorScheme})`);
- });
- </script>
-</body>
+ // LinkText
+ style = getComputedStyle(document.getElementById('link'));
+ test_computed_value('color', 'LinkText', style.getPropertyValue('color'), `has the same color as the color of an anchor element (${colorScheme})`);
-</html>
+ // These colors are only text colors and do not have corresponding
+ // backgrounds, so they should not match the canvas background (as
+ // otherwise they'd be invisible)
+ test_not_canvas("LinkText", colorScheme);
+ test_not_canvas("ActiveText", colorScheme);
+ test_not_canvas("VisitedText", colorScheme);
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html
new file mode 100644
index 00000000000..5e89048bf00
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001-ref.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient analogous missing components carry forward logic tests</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <style>
+ .test {
+ margin: 50px;
+ width: 200px;
+ height: 50px;
+ border: 1px solid black;
+ background: linear-gradient(90deg in srgb, hsl(0deg 0% 50%), yellow);
+ }
+ </style>
+</head>
+<body>
+ <div class="test"></div>
+ <div class="test"></div>
+ <div class="test"></div>
+ <div class="test"></div>
+ <div class="test"></div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001.html
new file mode 100644
index 00000000000..0bfd7bb615f
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-001.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient analogous missing components carry forward logic tests</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <meta name="assert" content="Tests that analogous missing components logic works.">
+ <link rel="match" href="gradient-analogous-missing-components-001-ref.html">
+ <style>
+ .test {
+ margin: 50px;
+ width: 200px;
+ height: 50px;
+ border: 1px solid black;
+ }
+
+ .test1 {
+ background: linear-gradient(90deg in srgb, hsl(60deg 0 50%), yellow);
+ }
+ .test2 {
+ background: linear-gradient(90deg in srgb, hsl(20deg 0 50%), yellow);
+ }
+ .test3 {
+ background: linear-gradient(90deg in srgb, hsl(60deg none 50%), yellow);
+ }
+ .test4 {
+ background: linear-gradient(90deg in srgb, hsl(none 0 50%), yellow);
+ }
+ .test5 {
+ background: linear-gradient(90deg in srgb, hsl(none none 50%), yellow);
+ }
+ </style>
+</head>
+<body>
+ <div class="test test1"></div>
+ <div class="test test2"></div>
+ <div class="test test3"></div>
+ <div class="test test4"></div>
+ <div class="test test5"></div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html
new file mode 100644
index 00000000000..ecdbc4c1148
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002-ref.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient analogous missing components carry forward logic tests</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+ <style>
+ .test {
+ margin: 10px 50px;
+ width: 200px;
+ height: 50px;
+ border: 1px solid black;
+ --color: lime;
+ }
+
+ .test1 {
+ background: linear-gradient(to right, var(--color));
+ }
+ .test2 {
+ background: linear-gradient(to right in srgb, var(--color));
+ }
+ .test3 {
+ background: linear-gradient(to right in oklab, var(--color));
+ }
+ .test4 {
+ background: linear-gradient(to right in display-p3, var(--color));
+ }
+ </style>
+</head>
+<body>
+ <p>They should be equivalent to `background: color-mix(in srgb, color(srgb none 1 none), lime)`</p>
+ <div class="test test1">This should be a lime background.</div>
+ <div class="test test2">This should be a lime background.</div>
+ <div class="test test3">This should be a lime background.</div>
+ <div class="test test4">This should be a lime background.</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002.html
new file mode 100644
index 00000000000..96038650136
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-002.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient analogous missing components carry forward logic tests</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <link rel="match" href="gradient-analogous-missing-components-002-ref.html">
+ <meta name="assert" content="Tests that analogous missing components logic works.">
+ <style>
+ .test {
+ margin: 10px 50px;
+ width: 200px;
+ height: 50px;
+ border: 1px solid black;
+ --stop2: rgb(0 255 0); /* lime */
+ }
+ .test1 {
+ background: linear-gradient(to right, color(srgb none 1 none), var(--stop2));
+ }
+ .test2 {
+ background: linear-gradient(to right in srgb, color(srgb none 1 none), var(--stop2));
+ }
+ .test3 {
+ background: linear-gradient(to right in oklab, color(srgb none 1 none), var(--stop2));
+ }
+ .test4 {
+ background: linear-gradient(to right in display-p3, color(srgb none 1 none), var(--stop2));
+ }
+ </style>
+</head>
+<body>
+ <p>They should be equivalent to `background: color-mix(in srgb, color(srgb none 1 none), lime)`</p>
+ <div class="test test1">This should be a lime background.</div>
+ <div class="test test2">This should be a lime background.</div>
+ <div class="test test3">This should be a lime background.</div>
+ <div class="test test4">This should be a lime background.</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html
new file mode 100644
index 00000000000..134388315a0
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003-ref.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient analogous missing components carry forward logic tests</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <style>
+ .test {
+ margin: 10px 50px;
+ width: 200px;
+ height: 50px;
+ border: 1px solid black;
+ background: lime;
+ }
+ </style>
+</head>
+<body>
+ <div class="test test1">This should be a lime background.</div>
+ <div class="test test2">This should be a lime background.</div>
+ <div class="test test3">This should be a lime background.</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003.html
new file mode 100644
index 00000000000..c4c8995c1ef
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-003.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient analogous missing components carry forward logic tests</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="author" title="一丝" href="mailto:yiorsi@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <meta name="assert" content="Tests that analogous missing components logic works.">
+ <link rel="match" href="gradient-analogous-missing-components-003-ref.html">
+ <style>
+ .test {
+ margin: 10px 50px;
+ width: 200px;
+ height: 50px;
+ border: 1px solid black;
+ --stop2: rgb(0 255 0); /* lime */
+ }
+ .test1 {
+ background: linear-gradient(to right in hsl shorter hue, color(srgb none 1 none), var(--stop2));
+ }
+ .test2 {
+ background: linear-gradient(to right in hsl increasing hue, color(srgb none 1 none), var(--stop2));
+ }
+ .test3 {
+ background: linear-gradient(to right in hsl decreasing hue, color(srgb none 1 none), var(--stop2));
+ }
+ </style>
+</head>
+<body>
+ <div class="test test1">This should be a lime background.</div>
+ <div class="test test2">This should be a lime background.</div>
+ <div class="test test3">This should be a lime background.</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-increasing-hue-lch.html b/tests/wpt/tests/css/css-images/gradient/gradient-increasing-hue-lch.html
index 603c023e5ca..f6de5c43dbe 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-increasing-hue-lch.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-increasing-hue-lch.html
@@ -7,7 +7,7 @@
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that 'increasing' hue renders the expected gradient">
- <meta name="fuzzy" content="maxDifference=0-18;totalPixels=0-23900">
+ <meta name="fuzzy" content="maxDifference=0-18;totalPixels=0-24900">
<link rel="match" href="gradient-increasing-hue-lch-ref.html">
<style>
body {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-longer-hue-lch-004.html b/tests/wpt/tests/css/css-images/gradient/gradient-longer-hue-lch-004.html
index 6975e26957d..e32d86d70ee 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-longer-hue-lch-004.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-longer-hue-lch-004.html
@@ -6,7 +6,7 @@
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<link rel="match" href="gradient-longer-hue-lch-004-ref.html">
<meta name="assert" content="Tests that gradient with 'longer hue' renders correctly">
-<meta name="fuzzy" content="maxDifference=0-9;totalPixels=0-1240">
+<meta name="fuzzy" content="maxDifference=0-9;totalPixels=0-1540">
<style>
div {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation-ref.html
index 89a1929e275..154112fe612 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation-ref.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation-ref.html
@@ -3,7 +3,7 @@
<head>
<style>
div {
- height: 100px;
+ height: 50px;
}
#basic {
/* "none" should split into two and take each neighboring value. */
@@ -28,6 +28,9 @@
oklch(0.451981 0.31321 264.051) = "blue" */
background: linear-gradient(to right in oklch, oklch(0.627966 0.257704 29.2346), oklch(0 0 29.2346 / 0) 50%, oklch(0 0 264.051 / 0) 50%, oklch(0.451981 0.31321 264.051));
}
+ #srgb-mixing-with-named-color {
+ background: yellow;
+ }
</style>
</head>
<body>
@@ -37,5 +40,6 @@
<div id="noneHue"></div>
<div id="noneHueLonger"></div>
<div id="transparentHueIsPowerless"></div>
+ <div id="srgb-mixing-with-named-color"></div>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation.html b/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation.html
index 06d7be6e66b..11bac74b9b5 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-none-interpolation.html
@@ -6,10 +6,10 @@
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Color stops with missing components should split into two stops and take their neighboring values.">
<link rel="match" href="gradient-none-interpolation-ref.html">
- <meta name="fuzzy" content="maxDifference=1; totalPixels=0-5000">
+ <meta name="fuzzy" content="maxDifference=1; totalPixels=0-15000">
<style>
div {
- height: 100px;
+ height: 50px;
}
#basic {
/* "none" should split into two and take each neighboring value. */
@@ -33,6 +33,9 @@
/* When "transparent" is converted to oklch, the hue of the resulting stop should act as if it were missing. */
background: linear-gradient(to right in oklch, red, transparent, blue);
}
+ #srgb-mixing-with-named-color {
+ background: linear-gradient(90deg in srgb, rgb(none 255 none), yellow);
+ }
</style>
</head>
<body>
@@ -42,5 +45,6 @@
<div id="noneHue"></div>
<div id="noneHueLonger"></div>
<div id="transparentHueIsPowerless"></div>
+ <div id="srgb-mixing-with-named-color"></div>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-001.html b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-001.html
index af43fd7e9fc..1e89b3ffc67 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-001.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
- <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
+ <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-002.html b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-002.html
index 8721f8d6dd6..912ca2016bc 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-002.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-002.html
@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
- <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
+ <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-003.html b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-003.html
index 39d9761e48b..6430cdc4296 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-003.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-003.html
@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
- <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
+ <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-004.html b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-004.html
index 191e906f0e6..7e4f675c912 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-004.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-004.html
@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
- <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
+ <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-005.html b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-005.html
index c3072c75146..a94e0ce53d6 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-005.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-005.html
@@ -8,7 +8,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images-3/#color-stop-syntax">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#coloring-gradient-line">
<meta name="assert" content="Tests that gradient with a single color stop renders the expected solid color">
- <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-4500">
+ <meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-6000">
<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
<style>
body {
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html
index 5b1dd25113a..218eec044d3 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-single-stop-longer-hue-hsl-002.html
@@ -4,7 +4,7 @@
<head>
<meta charset="utf-8">
<title>Gradient in HSL space</title>
- <meta name="fuzzy" content="maxDifference=0-8;totalPixels=0-9050">
+ <meta name="fuzzy" content="maxDifference=0-8;totalPixels=0-18000">
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that a single-stop longer-hue gradient renders a solid color, for various stop positions">
diff --git a/tests/wpt/tests/css/css-images/gradient/linear-gradient-relative-currentcolor-stop.html b/tests/wpt/tests/css/css-images/gradient/linear-gradient-relative-currentcolor-stop.html
index 901b0894e15..3ddabe7b100 100644
--- a/tests/wpt/tests/css/css-images/gradient/linear-gradient-relative-currentcolor-stop.html
+++ b/tests/wpt/tests/css/css-images/gradient/linear-gradient-relative-currentcolor-stop.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://drafts.csswg.org/css-images/#linear-gradients">
<link rel="help" href="https://drafts.csswg.org/css-color-5/#typedef-color">
<link rel="match" href="../reference/100x100-blue-green.html">
+<meta name="fuzzy" content="maxDifference=1; totalPixels=0-5000">
<style>
.g {
background-image: linear-gradient(rgb(from currentcolor r g b), rgb(from currentcolor r g b));
diff --git a/tests/wpt/tests/css/css-images/parsing/gradient-interpolation-method-invalid.html b/tests/wpt/tests/css/css-images/parsing/gradient-interpolation-method-invalid.html
index 336a387e3c2..a53d5a1b770 100644
--- a/tests/wpt/tests/css/css-images/parsing/gradient-interpolation-method-invalid.html
+++ b/tests/wpt/tests/css/css-images/parsing/gradient-interpolation-method-invalid.html
@@ -4,6 +4,7 @@
<meta charset="utf-8">
<title>CSS Images Module Level 4: parsing invalid gradients with color interpolation methods</title>
<link rel="author" title="Sam Weinig" href="mailto:weinig@apple.com">
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="help" href="https://drafts.csswg.org/css-images-4/#gradients">
<link rel="help" href="https://drafts.csswg.org/css-color-4/#color-interpolation-method">
<meta name="assert" content="gradients supports the addition of color-interpolation-method to the grammar">
@@ -41,6 +42,19 @@ function test_each_interpolation_method(gradientFunction) {
test_each_interpolation_method("linear-gradient")
test_each_interpolation_method("radial-gradient")
test_each_interpolation_method("conic-gradient")
+
+// lacking of color-space after `in`
+test_invalid_value(`background-image`, `linear-gradient(in, black, transparent)`)
+test_invalid_value(`background-image`, `linear-gradient(45deg in, black, transparent)`)
+test_invalid_value(`background-image`, `linear-gradient(in 45deg, black, transparent)`)
+test_invalid_value(`background-image`, `linear-gradient(in to right, black, transparent)`)
+test_invalid_value(`background-image`, `radial-gradient(closest-side in, black, transparent)`)
+test_invalid_value(`background-image`, `conic-gradient(in from 90deg, black, transparent)`)
+// lacking of `hue` keyword
+test_invalid_value(`background-image`, `linear-gradient(90deg in hsl longer, black, transparent)`)
+test_invalid_value(`background-image`, `linear-gradient(90deg in hsl shorter, black)`)
+test_invalid_value(`background-image`, `linear-gradient(to right in hsl increasing, black, transparent)`)
+test_invalid_value(`background-image`, `linear-gradient(to right in hsl decreasing, black, transparent)`)
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-001.html b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-001.html
new file mode 100644
index 00000000000..9663bf5133f
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-001.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<title>radial-gradient() with container relative unit &lt;position> (horizontal)</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
+<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
+<link rel="match" href="radial-gradient-container-relative-units-ref.html">
+<style>
+ #container { container-type: size; width: 100px; height: 100px; }
+ #inner {
+ width: 100%;
+ height: 100%;
+ background-image: radial-gradient(50px 50px ellipse at 50cqw 50px, green, blue);
+ }
+</style>
+<div id="container">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-002.html b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-002.html
new file mode 100644
index 00000000000..73083b095d6
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-002.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<title>radial-gradient() with container relative unit &lt;position> (vertical)</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
+<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
+<link rel="match" href="radial-gradient-container-relative-units-ref.html">
+<style>
+ #container { container-type: size; width: 100px; height: 100px; }
+ #inner {
+ width: 100%;
+ height: 100%;
+ background-image: radial-gradient(50px 50px ellipse at 50px 50cqh, green, blue);
+ }
+</style>
+<div id="container">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-003.html b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-003.html
new file mode 100644
index 00000000000..f41e23c01fa
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-003.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<title>radial-gradient() with container relative unit &lt;radial-size> (horizontal)</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
+<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
+<link rel="match" href="radial-gradient-container-relative-units-ref.html">
+<style>
+ #container { container-type: size; width: 100px; height: 100px; }
+ #inner {
+ width: 100%;
+ height: 100%;
+ background-image: radial-gradient(50cqi 50px ellipse at 50px 50px, green, blue);
+ }
+</style>
+<div id="container">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-004.html b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-004.html
new file mode 100644
index 00000000000..c99059561a3
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-004.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<title>radial-gradient() with container relative unit &lt;radial-size> (vertical)</title>
+<link rel="help" href="https://drafts.csswg.org/css-images/#radial-gradient-syntax">
+<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-lengths">
+<link rel="match" href="radial-gradient-container-relative-units-ref.html">
+<style>
+ #container { container-type: size; width: 100px; height: 100px; }
+ #inner {
+ width: 100%;
+ height: 100%;
+ background-image: radial-gradient(50px 50cqb ellipse at 50px 50px, green, blue);
+ }
+</style>
+<div id="container">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-ref.html b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-ref.html
new file mode 100644
index 00000000000..503058910dd
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/radial-gradient-container-relative-units-ref.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<title>radial-gradient() with container relative unit (reference)</title>
+<style>
+ #gradient {
+ width: 100px;
+ height: 100px;
+ background-image: radial-gradient(50px circle at 50px, green, blue);
+ }
+</style>
+<div id="gradient"></div>
diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-borderBox-1c.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-borderBox-1c.html
index 99f6bb0fc97..0783cfe0039 100644
--- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-borderBox-1c.html
+++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-borderBox-1c.html
@@ -7,7 +7,7 @@
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path">
<link rel="match" href="clip-path-geometryBox-1-ref.html">
- <meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-368">
+ <meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-750">
<meta name="assert" content="Test checks whether clip-path border-box works correctly or not. This test is for clip-path applied to an SVG SVG element.">
<style>
svg {
diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-strokeBox-1a.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-strokeBox-1a.html
index 487f5363b69..37cec39ff80 100644
--- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-strokeBox-1a.html
+++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-strokeBox-1a.html
@@ -7,7 +7,7 @@
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path">
<link rel="match" href="clip-path-geometryBox-1-ref.html">
- <meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-368">
+ <meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-750">
<meta name="assert" content="Test checks whether clip-path stroke-box works correctly or not. This test is for clip-path applied to an SVG SVG element.">
<style>
svg {
diff --git a/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1c.html b/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1c.html
index d46c6d2f03e..720b3b58754 100644
--- a/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1c.html
+++ b/tests/wpt/tests/css/css-masking/clip-path/clip-path-viewBox-1c.html
@@ -7,7 +7,7 @@
<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://www.w3.org/TR/css-masking-1/#the-clip-path">
<link rel="match" href="clip-path-geometryBox-1-ref.html">
- <meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-368">
+ <meta name="fuzzy" content="maxDifference=0-65; totalPixels=0-750">
<meta name="assert" content="Test checks whether clip-path view-box works correctly or not. This test is for clip-path applied to an SVG SVG element.">
<style>
svg {
diff --git a/tests/wpt/tests/css/css-masking/clip-path/svg-clip-path-fixed-values.html b/tests/wpt/tests/css/css-masking/clip-path/svg-clip-path-fixed-values.html
index eb2c44fbb23..3366e88fa23 100644
--- a/tests/wpt/tests/css/css-masking/clip-path/svg-clip-path-fixed-values.html
+++ b/tests/wpt/tests/css/css-masking/clip-path/svg-clip-path-fixed-values.html
@@ -2,7 +2,7 @@
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-shapes/#supported-basic-shapes">
<link rel="match" href="svg-clip-path-fixed-values-ref.html">
-<meta name="fuzzy" content="maxDifference=0-62; totalPixels=0-608">
+<meta name="fuzzy" content="maxDifference=0-62; totalPixels=0-990">
<meta name="assert" content="clip-path clips correctly">
<style>
svg {
diff --git a/tests/wpt/tests/css/css-mixins/at-function-cssom.tentative.html b/tests/wpt/tests/css/css-mixins/at-function-cssom.html
index dbf157b3c2f..dbf157b3c2f 100644
--- a/tests/wpt/tests/css/css-mixins/at-function-cssom.tentative.html
+++ b/tests/wpt/tests/css/css-mixins/at-function-cssom.html
diff --git a/tests/wpt/tests/css/css-mixins/dashed-function-named-arg.tentative.html b/tests/wpt/tests/css/css-mixins/dashed-function-named-arg.tentative.html
new file mode 100644
index 00000000000..b404c6887fa
--- /dev/null
+++ b/tests/wpt/tests/css/css-mixins/dashed-function-named-arg.tentative.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>Custom Functions: &lt;dashed-function&gt; with named argument syntax</title>
+<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#function-rule">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11749">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script>
+test_valid_value('top', '--func(myident)');
+test_valid_value('top', '--func(--myident)');
+test_valid_value('top', '--func(--)');
+test_valid_value('top', '--func(50px --myident:)');
+
+// Arguments may not begin within <dashed-ident> <colon> (ignoring whitespace);
+// this pattern is reserved for named arguments in the future.
+//
+// https://github.com/w3c/csswg-drafts/issues/11749
+//
+// Note: This matches the "bad declaration" handling in
+// https://drafts.csswg.org/css-syntax/#consume-qualified-rule
+test_invalid_value('top', '--func(--myident:)');
+test_invalid_value('top', '--func( --myident:)');
+test_invalid_value('top', '--func(--myident :)');
+test_invalid_value('top', '--func(--myident: )');
+test_invalid_value('top', '--func( --myident : )');
+test_invalid_value('top', '--func(10px, --myident : )');
+
+// It's valid when wrapped in {}, though:
+test_valid_value('top', '--func({--myident:})');
+test_valid_value('top', '--func({ --myident:})');
+test_valid_value('top', '--func({--myident :})');
+test_valid_value('top', '--func({--myident: })');
+test_valid_value('top', '--func(10px, { --myident : })');
+</script>
diff --git a/tests/wpt/tests/css/css-mixins/dashed-function-standard-property.html b/tests/wpt/tests/css/css-mixins/dashed-function-standard-property.html
new file mode 100644
index 00000000000..359377b7529
--- /dev/null
+++ b/tests/wpt/tests/css/css-mixins/dashed-function-standard-property.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>Custom Functions: Evaluating a &lt;dashed-function> in standard properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#substitute-a-dashed-function">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+ @function --ten-px() {
+ result: 10px;
+ }
+
+ @function --ten-px-typed() returns <length> {
+ result: 10px;
+ }
+
+ @function --green() {
+ result: green;
+ }
+
+ #target {
+ width: --ten-px();
+ height: --ten-px-typed();
+ color: --green();
+ padding: --ten-px();
+ }
+</style>
+
+<div id=target></div>
+
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(target).width, '10px');
+ }, '<dashed-function> in longhand');
+
+ test(() => {
+ assert_equals(getComputedStyle(target).height, '10px');
+ }, '<dashed-function> with typed result in longhand');
+
+ test(() => {
+ assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
+ }, '<dashed-function> with in inherited longhand');
+
+ test(() => {
+ assert_equals(getComputedStyle(target).padding, '10px');
+ }, '<dashed-function> with typed result in shorthand');
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-001.html b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-001.html
new file mode 100644
index 00000000000..2b566efc53c
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-001.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+<title>Tab focus and ::colum::scroll-marker</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker-next-focus">
+<style>
+ body {
+ margin: 0;
+ }
+ #container {
+ scroll-marker-group: before;
+ overflow: hidden;
+ columns: 9;
+ column-fill: auto;
+ column-rule: solid;
+ height: 100px;
+ line-height: 20px;
+ }
+ #container::scroll-marker-group {
+ display: flex;
+ height: 20px;
+ background: hotpink;
+ }
+ #container::column::scroll-marker {
+ content: "";
+ width: 20px;
+ height: 20px;
+ margin-right: 5px;
+ background: blue;
+ }
+ #container::column::scroll-marker:focus {
+ background: cyan;
+ }
+</style>
+<div id="container">
+ <!-- Column #0 -->
+ <div style="height:100px;">Nothing</div>
+
+ <!-- Column #1 -->
+ <div tabindex="0" id="c1first">line</div>
+ <div tabindex="0" id="c1second" style="height:180px;">line</div>
+
+ <!-- Column #2 only has a resumed block (#c1second). -->
+
+ <!-- Column #3 -->
+ <div tabindex="0" id="inlineBlock" style="display:inline-block; box-sizing:border-box; width:100%; height:90px; border:solid;"></div>
+
+ <!-- Column #4 -->
+ <div>
+ <div style="display:flex; flex-flow:wrap row-reverse;">
+ <div tabindex="0" id="flex1" style="width:30%; height:100px;">A</div>
+ <div tabindex="0" id="flex2" style="width:30%;">B</div>
+ <div tabindex="0" id="flex3" style="width:30%;">C</div>
+
+ <!-- Column #5 -->
+ <div tabindex="0" id="flex4" style="width:30%;">D</div>
+ <div tabindex="0" id="flex5" style="width:30%;">E</div>
+ <div tabindex="0" id="flex6" style="width:30%;">F</div>
+ </div>
+ </div>
+ <div style="display:table;">
+ <div style="display:table-caption; height:70px; background:cyan;">caption</div>
+
+ <!-- Column #6 -->
+ <div tabindex="0" id="tfoot" style="display:table-footer-group;">footer</div>
+ <div tabindex="0" id="thead" style="display:table-header-group;">header</div>
+ <div tabindex="0" id="tbody" style="display:table-row-group;">body</div>
+ </div>
+ <div style="position:relative;">
+ <div style="height:50px; background:black;"></div>
+
+ <!-- Column #7 -->
+ <div tabindex="0" id="c6Abs" style="position:absolute; left:50px;">abs</div>
+ <div tabindex="0" id="c6Block" style="width:50px;">block</div>
+ <div style="height:80px; background:black;"></div>
+
+ <!-- Column #8 -->
+ <div tabindex="0" id="c7Block" style="width:50px;">block</div>
+ <div tabindex="0" id="c7Abs" style="position:absolute; margin-top:-20px; left:50px;">abs</div>
+ </div>
+</div>
+
+<div tabindex="0" id="after">after</div>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<script>
+ async function activateMarker(idx) {
+ await new test_driver.Actions()
+ .pointerMove(5 + idx*25, 5)
+ .pointerDown()
+ .pointerUp()
+ .send();
+ }
+
+ async function focusNext() {
+ // https://w3c.github.io/webdriver/#keyboard-actions
+ const kTab = '\uE004';
+
+ await new test_driver.Actions()
+ .keyDown(kTab)
+ .keyUp(kTab)
+ .send();
+ }
+
+ promise_test(async t => {
+ await activateMarker(4);
+ await focusNext();
+ assert_equals(document.activeElement, flex1);
+ await focusNext();
+ assert_equals(document.activeElement, flex2);
+ await focusNext();
+ assert_equals(document.activeElement, flex3);
+ await focusNext();
+ assert_equals(document.activeElement, flex4);
+ }, "Column 4");
+
+ promise_test(async t => {
+ await activateMarker(3);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock);
+ await focusNext();
+ assert_equals(document.activeElement, flex1);
+ }, "Column #3");
+
+ // TODO(https://github.com/w3c/csswg-drafts/issues/11882): Figure out how to
+ // treat columns with no elements, and test it here. Column #2 has no start
+ // elements.
+ promise_test(async t => {
+ // At the very least, we should not crash. :)
+ await activateMarker(2);
+ await focusNext();
+ }, "Column #2");
+
+ promise_test(async t => {
+ await activateMarker(1);
+ await focusNext();
+ assert_equals(document.activeElement, c1first);
+ await focusNext();
+ assert_equals(document.activeElement, c1second);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock);
+ }, "Column #1");
+
+ promise_test(async t => {
+ // Column #0 has nothing focusable. The next column has something.
+ await activateMarker(0);
+ await focusNext();
+ assert_equals(document.activeElement, c1first);
+ }, "Column #0");
+
+ promise_test(async t => {
+ await activateMarker(8);
+ await focusNext();
+ assert_equals(document.activeElement, c7Block);
+ await focusNext();
+ assert_equals(document.activeElement, c7Abs);
+ await focusNext();
+ assert_equals(document.activeElement, after);
+ }, "Column #8");
+
+ promise_test(async t => {
+ await activateMarker(7);
+ await focusNext();
+ assert_equals(document.activeElement, c6Abs);
+ await focusNext();
+ assert_equals(document.activeElement, c6Block);
+ await focusNext();
+ assert_equals(document.activeElement, c7Block);
+ }, "Column 7");
+
+ promise_test(async t => {
+ await activateMarker(6);
+ await focusNext();
+ assert_equals(document.activeElement, tfoot);
+ await focusNext();
+ assert_equals(document.activeElement, thead);
+ await focusNext();
+ assert_equals(document.activeElement, tbody);
+ await focusNext();
+ assert_equals(document.activeElement, c6Abs);
+ }, "Column 6");
+
+ promise_test(async t => {
+ await activateMarker(5);
+ await focusNext();
+ assert_equals(document.activeElement, flex4);
+ await focusNext();
+ assert_equals(document.activeElement, flex5);
+ await focusNext();
+ assert_equals(document.activeElement, flex6);
+ await focusNext();
+ assert_equals(document.activeElement, tfoot);
+ }, "Column 5");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/inline-with-scroll-marker-group-crash.html b/tests/wpt/tests/css/css-overflow/inline-with-scroll-marker-group-crash.html
new file mode 100644
index 00000000000..c32c63ca050
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/inline-with-scroll-marker-group-crash.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>Attempt to set scroll-marker-group on inline</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/381444307">
+<style>
+ #test {
+ overflow: auto;
+ scroll-marker-group: after;
+ }
+ #test::scroll-marker-group {
+ display: block;
+ }
+</style>
+<span id="test"></span>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-014-crash.html b/tests/wpt/tests/css/css-overflow/scroll-marker-014-crash.html
new file mode 100644
index 00000000000..dd27d66fa5a
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-014-crash.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Non-atomic inline ::scroll-marker with scroll snapping</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/402910374">
+<style>
+ .carousel {
+ overflow: scroll;
+ scroll-marker-group: after;
+ }
+ .carousel::scroll-marker-group {
+ overflow: scroll;
+ scroll-snap-type: x mandatory;
+ }
+ .carousel > *::scroll-marker {
+ content: "x";
+ }
+</style>
+<div class="carousel">
+ <div></div>
+</div>
diff --git a/tests/wpt/tests/css/css-properties-values-api/var-reference-registered-properties.html b/tests/wpt/tests/css/css-properties-values-api/var-reference-registered-properties.html
index f8f094c9bc2..5b49c912ec5 100644
--- a/tests/wpt/tests/css/css-properties-values-api/var-reference-registered-properties.html
+++ b/tests/wpt/tests/css/css-properties-values-api/var-reference-registered-properties.html
@@ -172,11 +172,11 @@ function test_invalid_fallback(syntax, value, fallback) {
try {
element.style = `${name}: ${value}; --x:var(${name},${fallback})`;
let computedStyle = getComputedStyle(element);
- assert_equals(computedStyle.getPropertyValue('--x'), '');
+ assert_equals(computedStyle.getPropertyValue('--x'), value);
} finally {
element.style = '';
}
- }, `Invalid fallback invalidates var()-reference [${syntax}, ${fallback}]`);
+ }, `Invalid fallback doesn't invalidate var()-reference [${syntax}, ${fallback}]`);
}
test_valid_fallback('<length>', '40px', '10px');
diff --git a/tests/wpt/tests/css/css-scoping/host-has-001.html b/tests/wpt/tests/css/css-scoping/host-has-001.tentative.html
index 79c89874c63..79c89874c63 100644
--- a/tests/wpt/tests/css/css-scoping/host-has-001.html
+++ b/tests/wpt/tests/css/css-scoping/host-has-001.tentative.html
diff --git a/tests/wpt/tests/css/css-scoping/host-has-002.html b/tests/wpt/tests/css/css-scoping/host-has-002.tentative.html
index 33a705672ae..33a705672ae 100644
--- a/tests/wpt/tests/css/css-scoping/host-has-002.html
+++ b/tests/wpt/tests/css/css-scoping/host-has-002.tentative.html
diff --git a/tests/wpt/tests/css/css-scoping/host-has-003.html b/tests/wpt/tests/css/css-scoping/host-has-003.tentative.html
index 58f1482564b..58f1482564b 100644
--- a/tests/wpt/tests/css/css-scoping/host-has-003.html
+++ b/tests/wpt/tests/css/css-scoping/host-has-003.tentative.html
diff --git a/tests/wpt/tests/css/css-scroll-snap/scroll-initial-target/scroll-initial-target-with-text-fragment-navigation-target.html b/tests/wpt/tests/css/css-scroll-snap/scroll-initial-target/scroll-initial-target-with-text-fragment-navigation-target.html
index 61a3db00c66..aea8e120c15 100644
--- a/tests/wpt/tests/css/css-scroll-snap/scroll-initial-target/scroll-initial-target-with-text-fragment-navigation-target.html
+++ b/tests/wpt/tests/css/css-scroll-snap/scroll-initial-target/scroll-initial-target-with-text-fragment-navigation-target.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<html>
+<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
<body>
<style>
@@ -80,4 +81,4 @@
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-003.html b/tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-003.html
new file mode 100644
index 00000000000..f0720cd9640
--- /dev/null
+++ b/tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-003.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="display: table;">
+ <div style="display: table-cell; height: 50px;">
+ <div></div>
+ <canvas width=1 height=1 style="height: 200%; background: green;"></canvas>
+ </div>
+ <div style="display: table-cell;">
+ <div style="height: 100px;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-004.html b/tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-004.html
new file mode 100644
index 00000000000..3ef8b1b16a9
--- /dev/null
+++ b/tests/wpt/tests/css/css-tables/percent-height-replaced-in-percent-cell-004.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="display: table;">
+ <div style="display: table-cell; height: 50px;">
+ <span>
+ <canvas width=1 height=1 style="display: block; height: 200%; background: green;"></canvas>
+ </span>
+ </div>
+ <div style="display: table-cell;">
+ <div style="height: 100px;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-transforms/animation/rotate-transform-equivalent.html b/tests/wpt/tests/css/css-transforms/animation/rotate-transform-equivalent.html
index 5748d86608d..64c3007fd91 100644
--- a/tests/wpt/tests/css/css-transforms/animation/rotate-transform-equivalent.html
+++ b/tests/wpt/tests/css/css-transforms/animation/rotate-transform-equivalent.html
@@ -3,7 +3,7 @@
<meta charset="utf-8">
<title>Rotate transform equivalent</title>
<link rel="match" href="rotate-transform-equivalent-ref.html">
-<meta name="fuzzy" content="maxDifference=0-46;totalPixels=0-277">
+<meta name="fuzzy" content="maxDifference=0-46;totalPixels=0-450">
<link rel="help" href="https://drafts.csswg.org/css-transforms-2/#ctm">
<script src="/common/reftest-wait.js"></script>
<style>
diff --git a/tests/wpt/tests/css/css-transforms/group/svg-transform-group-009.html b/tests/wpt/tests/css/css-transforms/group/svg-transform-group-009.html
index 58f4beeda9c..36ecf88da85 100644
--- a/tests/wpt/tests/css/css-transforms/group/svg-transform-group-009.html
+++ b/tests/wpt/tests/css/css-transforms/group/svg-transform-group-009.html
@@ -6,7 +6,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
<link rel="match" href="reference/svg-green-square-250x250-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-47;totalPixels=0-490">
<meta name="flags" content="svg">
<meta name="assert" content="Transforms on a parent element should be pre-multiplied to a child element. The group of elements should be skewed vertically, therefore the child element should be skewed vertically to completely cover the red rect.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-009.html b/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-009.html
index fe3b06ac2c5..286325c03ea 100644
--- a/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-009.html
+++ b/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-009.html
@@ -6,7 +6,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
<link rel="match" href="reference/svg-green-square-250x250-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-1">
+ <meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-600">
<meta name="flags" content="svg">
<meta name="assert" content="Transforms on a parent element should be pre-multiplied to transforms on a child element. The group of elements should be skewed vertically. Additionally, the child rect should be skewed vertically.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-014.html b/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-014.html
index 9da7a80c101..d8084b63dde 100644
--- a/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-014.html
+++ b/tests/wpt/tests/css/css-transforms/group/svg-transform-nested-014.html
@@ -6,7 +6,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
<link rel="match" href="reference/svg-green-square-250x250-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-2;totalPixels=0-216">
<meta name="flags" content="svg">
<meta name="assert" content="Transforms on a parent element should be pre-multiplied to transforms on a child element. The group of elements should be scaled. Additionally, the child rect should be skewed vertically.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/preserve3d-and-flattening-001.html b/tests/wpt/tests/css/css-transforms/preserve3d-and-flattening-001.html
index 411b945e10e..f7dc8b296c6 100644
--- a/tests/wpt/tests/css/css-transforms/preserve3d-and-flattening-001.html
+++ b/tests/wpt/tests/css/css-transforms/preserve3d-and-flattening-001.html
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-2/#3d-transform-rendering">
<meta name="assert" content="The element is rendered at the correct position.">
<link rel="match" href="preserve3d-and-flattening-001-ref.html">
-<meta name="fuzzy" content="maxDifference=0-127;totalPixels=0-101">
+<meta name="fuzzy" content="maxDifference=0-127;totalPixels=0-500">
<style>
body {
diff --git a/tests/wpt/tests/css/css-transforms/skewX/svg-skewxy-001.html b/tests/wpt/tests/css/css-transforms/skewX/svg-skewxy-001.html
index 0eee25c5dfe..b15dff571df 100644
--- a/tests/wpt/tests/css/css-transforms/skewX/svg-skewxy-001.html
+++ b/tests/wpt/tests/css/css-transforms/skewX/svg-skewxy-001.html
@@ -9,7 +9,7 @@
<link rel="match" href="reference/svg-skewxy-ref.html">
<meta name="flags" content="svg">
<meta name="assert" content="The green rect in this test should be skewed horizontally 45 degrees and vertically 45 degrees to completely cover the red path.">
- <meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-1">
+ <meta name="fuzzy" content="maxDifference=0-2; totalPixels=0-270">
<style type="text/css">
svg {
height: 300px;
diff --git a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-001.html b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-001.html
index a5678f30fb4..d530dfad762 100644
--- a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-001.html
+++ b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform-value">
<link rel="match" href="reference/svg-skewy-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-104">
<meta name="flags" content="svg">
<meta name="assert" content="The skewY transform function must support unit less arguments for angle. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-006.html b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-006.html
index 51d7b768973..9fe8d42c083 100644
--- a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-006.html
+++ b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-006.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform-value">
<link rel="match" href="reference/svg-skewy-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-104">
<meta name="flags" content="svg">
<meta name="assert" content="The skewY transform function must support negative, unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-011.html b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-011.html
index 89f0aa9e62c..7929bf092b7 100644
--- a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-011.html
+++ b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-011.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform-value">
<link rel="match" href="reference/svg-skewy-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-104">
<meta name="flags" content="svg">
<meta name="assert" content="The skewY transform function must support 'modulo whole circle' for unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-016.html b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-016.html
index fee2331f96e..8bad647f98e 100644
--- a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-016.html
+++ b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-016.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
<link rel="match" href="reference/svg-skewy-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-104">
<meta name="flags" content="svg">
<meta name="assert" content="The skewY transform function must support scientific numbers for unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-021.html b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-021.html
index 5905e79c0d0..269c289c842 100644
--- a/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-021.html
+++ b/tests/wpt/tests/css/css-transforms/skewY/svg-skewy-021.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
<link rel="match" href="reference/svg-skewy-ref.html">
- <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
+ <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-104">
<meta name="flags" content="svg">
<meta name="assert" content="The skewY transform function must support scientific numbers with negative exponents for unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
<style type="text/css">
diff --git a/tests/wpt/tests/css/css-transforms/transform-input-005.html b/tests/wpt/tests/css/css-transforms/transform-input-005.html
index efa053e9c80..16232c89a27 100644
--- a/tests/wpt/tests/css/css-transforms/transform-input-005.html
+++ b/tests/wpt/tests/css/css-transforms/transform-input-005.html
@@ -13,7 +13,7 @@
difficult to construct a correct reference file for more complex
transforms.)'>
<link rel="match" href="transform-input-005-ref.html">
- <meta name="fuzzy" content="maxDifference=0-128;totalPixels=0-2389">
+ <meta name="fuzzy" content="maxDifference=0-180;totalPixels=0-2389">
<style>
input {
/* Margin to avoid overlap of translated inputs */
diff --git a/tests/wpt/tests/css/css-transforms/transform-percent-008.html b/tests/wpt/tests/css/css-transforms/transform-percent-008.html
index e4b33321633..1ba4ad9b913 100644
--- a/tests/wpt/tests/css/css-transforms/transform-percent-008.html
+++ b/tests/wpt/tests/css/css-transforms/transform-percent-008.html
@@ -9,7 +9,7 @@
transformed element's border box. This test adds a thicker border plus
margin and padding to make any discrepancies more evident.">
<link rel="match" href="transform-percent-ref.html">
- <meta name="fuzzy" content="maxDifference=0-102;totalPixels=0-416">
+ <meta name="fuzzy" content="maxDifference=0-102;totalPixels=0-560">
<link rel="mismatch" href="transform-percent-notref.html">
<style>
div {
diff --git a/tests/wpt/tests/css/css-transforms/transform3d-sorting-006.html b/tests/wpt/tests/css/css-transforms/transform3d-sorting-006.html
index acc478079e7..d7d08a1b8c3 100644
--- a/tests/wpt/tests/css/css-transforms/transform3d-sorting-006.html
+++ b/tests/wpt/tests/css/css-transforms/transform3d-sorting-006.html
@@ -8,7 +8,7 @@
<meta name="assert" content="This tests that when two boxes intersect in a
simple fashion, they're rendered according to Newell's algorithm.">
<link rel="match" href="transform3d-sorting-006-ref.html">
- <meta name=fuzzy content="0-179;0-544">
+ <meta name=fuzzy content="0-179;0-920">
</head>
<body>
<div style="transform-style: preserve-3d">
diff --git a/tests/wpt/tests/css/css-values/attr-all-types.html b/tests/wpt/tests/css/css-values/attr-all-types.html
index 8dce4feb5f4..5ea11a68f8e 100644
--- a/tests/wpt/tests/css/css-values/attr-all-types.html
+++ b/tests/wpt/tests/css/css-values/attr-all-types.html
@@ -91,7 +91,8 @@
}
test_valid_attr('content', 'attr(data-foo)', 'abc', '"abc"');
- test_valid_attr('content', 'attr(data-foo string)', 'abc', '"abc"');
+ test_invalid_attr('content', 'attr(data-foo string)', 'abc');
+ test_valid_attr('content', 'attr(data-foo raw-string)', 'abc', '"abc"');
test_valid_attr('content', 'attr(data-foo,)', 'abc', '"abc"');
test_valid_attr('content', 'attr(data-foo type(<string>))', '"abc"', '"abc"');
diff --git a/tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html b/tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function-in-shadow-dom.html
index 92fb6ce3351..92fb6ce3351 100644
--- a/tests/wpt/tests/css/css-values/calc-sibling-function-in-shadow-dom.html
+++ b/tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function-in-shadow-dom.html
diff --git a/tests/wpt/tests/css/css-values/calc-sibling-function-parsing.html b/tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function-parsing.html
index dfddf84a061..dfddf84a061 100644
--- a/tests/wpt/tests/css/css-values/calc-sibling-function-parsing.html
+++ b/tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function-parsing.html
diff --git a/tests/wpt/tests/css/css-values/calc-sibling-function.html b/tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function.html
index 5fe6e00a10b..5fe6e00a10b 100644
--- a/tests/wpt/tests/css/css-values/calc-sibling-function.html
+++ b/tests/wpt/tests/css/css-values/tree-counting/calc-sibling-function.html
diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-container-query.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-container-query.html
new file mode 100644
index 00000000000..addcf0b2d48
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-container-query.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() and sibling-count() in container queries</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<link rel="help" href="https://drafts.csswg.org/css-conditional-5/#container-features">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @property --length {
+ syntax: "<length>";
+ initial-value: 0px;
+ inherits: false;
+ }
+ .container { container-type: inline-size; }
+ #c1 {
+ width: 100px;
+ --length: 100px;
+ }
+ #c2 {
+ width: 400px;
+ --length: 400px;
+ }
+ span {
+ --match-100: no;
+ --match-400: no;
+ }
+ @container (width = calc(100px * sibling-index())) {
+ span { background-color: green; }
+ }
+ @container (width = calc(200px * sibling-count())) {
+ span { color: lime; }
+ }
+ @container style(--length: calc(100px * sibling-index())) {
+ span { --match-100: yes; }
+ }
+ @container style(--length: calc(200px * sibling-count())) {
+ span { --match-400: yes; }
+ }
+</style>
+<div style="color:black">
+ <div id="c1" class="container">
+ <span id="t1"></span>
+ </div>
+ <div id="c2" class="container">
+ <span id="t2"></span>
+ </div>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(t1).backgroundColor, "rgb(0, 128, 0)");
+ assert_equals(getComputedStyle(t1).color, "rgb(0, 0, 0)");
+ }, "sibling-index() in @container width query");
+
+ test(() => {
+ assert_equals(getComputedStyle(t2).backgroundColor, "rgba(0, 0, 0, 0)");
+ assert_equals(getComputedStyle(t2).color, "rgb(0, 255, 0)");
+ }, "sibling-count() in @container width query");
+
+ test(() => {
+ assert_equals(getComputedStyle(t1).getPropertyValue("--match-100"), "yes");
+ assert_equals(getComputedStyle(t1).getPropertyValue("--match-400"), "no");
+ }, "sibling-index() in @container style() query");
+
+ test(() => {
+ assert_equals(getComputedStyle(t2).getPropertyValue("--match-100"), "no");
+ assert_equals(getComputedStyle(t2).getPropertyValue("--match-400"), "yes");
+ }, "sibling-count() in @container style() query");
+</script>
diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html
new file mode 100644
index 00000000000..d31d4acf499
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-descriptors.tentative.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() and sibling-count() invalid in descriptors</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10982">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style id="test_sheet">
+ @page {
+ margin: 100px;
+ margin: calc(0px * sibling-index());
+ }
+ @page {
+ margin: 100px;
+ margin: calc(0px * sibling-count());
+ }
+ @font-face {
+ font-family: my-font;
+ font-weight: 300;
+ font-weight: calc(max(0 * sibling-index(), 400));
+ }
+ @font-face {
+ font-family: my-font;
+ font-weight: 300;
+ font-weight: calc(max(0 * sibling-count(), 400));
+ }
+</style>
+<script>
+ const rules = test_sheet.sheet.cssRules;
+
+ test(() => {
+ assert_equals(rules[0].style.margin, "100px");
+ }, "sibling-index() should not be allowed in @page properties");
+
+ test(() => {
+ assert_equals(rules[1].style.margin, "100px");
+ }, "sibling-count() should not be allowed in @page properties");
+
+ test(() => {
+ assert_equals(rules[2].style.fontWeight, "300");
+ }, "sibling-index() should not be allowed in @font-face descriptors");
+
+ test(() => {
+ assert_equals(rules[3].style.fontWeight, "300");
+ }, "sibling-count() should not be allowed in @font-face descriptors");
+</script>
diff --git a/tests/wpt/tests/css/css-values/sibling-function-invalidation.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-invalidation.html
index 74f4995f5f7..3c75c78530d 100644
--- a/tests/wpt/tests/css/css-values/sibling-function-invalidation.html
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-invalidation.html
@@ -48,3 +48,55 @@
assert_equals(t2.offsetHeight, 50);
}, "5 siblings after removal");
</script>
+
+<style>
+ #t3 {
+ width: calc(10px * sibling-index());
+ height: 50px;
+ background: teal;
+ }
+</style>
+<div>
+ <template shadowrootmode="open">
+ <slot></slot>
+ </template>
+ <div id="rm3"></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div id="t3"></div>
+</div>
+<script>
+ test(() => assert_equals(t3.offsetWidth, 60), "Initially 6th slotted sibling");
+ test(() => {
+ rm3.slot = "null";
+ assert_equals(t3.offsetWidth, 50);
+ }, "5th sibling after slot change");
+</script>
+
+<style>
+ #t4 {
+ width: 50px;
+ height: calc(10px * sibling-count());
+ background: teal;
+ }
+</style>
+<div>
+ <template shadowrootmode="open">
+ <slot></slot>
+ </template>
+ <div id="t4"></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div id="rm4"></div>
+</div>
+<script>
+ test(() => assert_equals(t4.offsetHeight, 60), "Initially 6 slotted siblings");
+ test(() => {
+ rm4.slot = "null";
+ assert_equals(t4.offsetHeight, 50);
+ }, "5 siblings after slot change");
+</script>
diff --git a/tests/wpt/tests/css/css-values/tree-counting/sibling-function-media-query.tentative.html b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-media-query.tentative.html
new file mode 100644
index 00000000000..c76ac449e48
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/tree-counting/sibling-function-media-query.tentative.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: sibling-index() and sibling-count() invalid in media queries</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<link rel="help" href="https://drafts.csswg.org/mediaqueries-5/#width">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10982">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style id="test_sheet">
+ #target {
+ background-color: green;
+ }
+ @media (width > CALC(0px * sibling-index())) {
+ #target { background-color: red; }
+ }
+ @media (width > CALC(0px * sibling-count())) {
+ #target { background-color: red; }
+ }
+</style>
+<div id="target"></div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(target).backgroundColor, "rgb(0, 128, 0)");
+ }, "sibling-index() and sibling-count() are not valid in @media queries");
+
+ test(() => {
+ let rules = test_sheet.sheet.cssRules;
+ assert_equals(rules.length, 3);
+ assert_equals(rules[1].media.mediaText, "(width > CALC(0px * sibling-index()))");
+ assert_equals(rules[2].media.mediaText, "(width > CALC(0px * sibling-count()))");
+ }, "@media queries with sibling-index() and sibling-count() as general-enclosed");
+
+</script>
diff --git a/tests/wpt/tests/css/css-values/tree-counting/tree-scoped-sibling-function.html b/tests/wpt/tests/css/css-values/tree-counting/tree-scoped-sibling-function.html
new file mode 100644
index 00000000000..979466bb7cf
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/tree-counting/tree-scoped-sibling-function.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Tree-scoped sibling-index()</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #host1::part(--p) {
+ z-index: sibling-index();
+ /* Add 1 since widows does not accept 0 */
+ widows: calc(1 + sibling-count());
+ }
+</style>
+<div id="host1">
+ <template shadowrootmode="open">
+ <div></div>
+ <div></div>
+ <div id="t1" part="--p"></div>
+ </template>
+</div>
+<script>
+ test(() => {
+ const style = getComputedStyle(host1.shadowRoot.querySelector("#t1"));
+ assert_equals(style.zIndex, "0", "z-index should be 0");
+ assert_equals(style.widows, "1", "widows should be 1");
+ }, "sibling-index() and sibling-count() evaluates to 0 from outer tree with ::part");
+</script>
+
+<div>
+ <div></div>
+ <div></div>
+ <div id="t2">
+ <template shadowrootmode="open">
+ <style>
+ :host {
+ z-index: sibling-index();
+ widows: sibling-count();
+ }
+ </style>
+ </template>
+ </div>
+ <div></div>
+ <div></div>
+</div>
+<script>
+ test(() => {
+ const style = getComputedStyle(t2);
+ assert_equals(style.zIndex, "3", ":host is the third sibling");
+ assert_equals(style.widows, "5", ":host total sibling count is 5");
+ }, "sibling-index() and sibling-count() evaluate as normal from inner tree");
+</script>
diff --git a/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed-with-sign-expression.html b/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed-with-sign-expression.html
new file mode 100644
index 00000000000..8029fd3a65e
--- /dev/null
+++ b/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed-with-sign-expression.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: getComputedStyle().zoom, with a specified value that includes a sign() expression</title>
+<link rel="help" href="https://drafts.csswg.org/css-viewport/#zoom-property">
+<link rel="help" href="https://drafts.csswg.org/css-viewport/#zoom-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #container {
+ container-type: inline-size;
+ width: 100px;
+ font-size: 20px;
+ }
+</style>
+<div id="container">
+ <div id="target"></div>
+</div>
+<script>
+// The sign() expressions below are all expected to resolve to -1.
+
+// Same units:
+test_computed_value("zoom", 'calc(1 + (sign(2cqw - 3cqw) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(1 + (sign(5px - 10px) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(1 + (sign(5 - 10) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(1 + (sign(30deg - 40deg) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(1 + (sign(3em - 5em) * 0.5))', '0.5');
+
+// Mixed absolute units:
+test_computed_value("zoom", 'calc(1 + (sign(1cm - 1in) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(1 + (sign(1deg - 1rad) * 0.5))', '0.5');
+
+// Mixed units, one or more of which is context-dependent:
+test_computed_value("zoom", 'calc(1 + (sign(2cqw - 10px) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(100% + (sign(2cqw - 10px) * 50%))', '0.5');
+test_computed_value("zoom", 'calc(100% + (sign(1em - 30px) * 50%))', '0.5');
+test_computed_value("zoom", 'calc(100% + (sign(2cqw - 1em) * 50%))', '0.5');
+</script>
diff --git a/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed.html b/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed.html
index b7484169f74..c6b4afc92a3 100644
--- a/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed.html
+++ b/tests/wpt/tests/css/css-viewport/zoom/parsing/zoom-computed.html
@@ -5,12 +5,6 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
-<style>
- #container {
- container-type: inline-size;
- width: 100px;
- }
-</style>
<div id="container">
<div id="target"></div>
</div>
@@ -20,12 +14,14 @@ test_computed_value("zoom", "normal", "1");
test_computed_value("zoom", "1", "1");
test_computed_value("zoom", "1.5", "1.5");
test_computed_value("zoom", "0.75", "0.75");
-test_computed_value("zoom", 'calc(1 + (sign(2cqw - 10px) * 0.5))', '0.5');
+test_computed_value("zoom", 'calc(1 - 0.5)', '0.5');
+test_computed_value("zoom", 'calc(1 * 0.5)', '0.5');
test_computed_value("zoom", "100%", "1");
test_computed_value("zoom", "150%", "1.5");
test_computed_value("zoom", "75%", "0.75");
-test_computed_value("zoom", 'calc(100% + (sign(2cqw - 10px) * 50%))', '0.5');
+test_computed_value("zoom", 'calc(100% - 50%)', '0.5');
+test_computed_value("zoom", 'calc(100% * 0.5)', '0.5');
// Legacy crap, wat
test_computed_value("zoom", "0", "1");
diff --git a/tests/wpt/tests/css/css-writing-modes/available-size-020.html b/tests/wpt/tests/css/css-writing-modes/available-size-020.html
new file mode 100644
index 00000000000..bf09886f30a
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/available-size-020.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Nested Orthogonal Flows vertical-rl Block Container Auto-Sizing</title>
+<link rel="match" href="reference/available-size-020-ref.html">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
+<meta name="assert" content="Test passes if vertical-rl block container orthogonal to parent which is itself orthogonal to the ICB is sized to fit into the smaller of its containing block’s fixed-size constraints or the ICB.">
+<style>
+/* Set up orthogonal flows */
+html { writing-mode: vertical-lr; word-break: break-all; font: 15px/1 sans-serif; }
+article { writing-mode: horizontal-tb; margin-left: 0.5em; }
+aside { writing-mode: vertical-rl; width: 2em; overflow: hidden; color: blue;
+ margin: 2em 0 4em; padding: 2em 0; border: solid 4px silver; }
+/* Limits on direct containing block trump ICB */
+.fixed-parent > div { min-height: 30vh; height: 50vh; max-height: 60vh; }
+.min-fixed-parent > div { min-height: 50vh; height: 30vh; max-height: 60vh; }
+.max-fixed-parent > div { min-height: 30vh; height: 60vh; max-height: 50vh; }
+.max-parent > div { min-height: 30vh; max-height: 50vh; }
+.min-max-parent > div { min-height: 50vh; max-height: 30vh; }
+/* But not if they're larger than ICB */
+.large-parent > div { height: 120vh; }
+.min-large-parent > div { min-height: 120vh; max-height: 30vh; }
+/* Ancestor should have no effect, only containing block */
+.auto { min-height: 40vh; height: 30vh; max-height: 20vh; }
+
+/* References */
+.fixed aside { height: calc(50vh - 10em - 8px); }
+.full aside { height: calc(100vh - 10em - 8px); }
+html { overflow: hidden; /* avoid scrollbar variance */ }
+</style>
+
+<p style="transform-origin: top right; transform: rotate(-90deg); height: max-content">Test passes if the first five boxes are identical, and the last four boxes are identical.
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="auto">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
diff --git a/tests/wpt/tests/css/css-writing-modes/available-size-021.html b/tests/wpt/tests/css/css-writing-modes/available-size-021.html
new file mode 100644
index 00000000000..4547ba1934f
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/available-size-021.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Nested Orthogonal Flows vertical-rl Block Container Auto-Sizing w/ Contained Ancestor</title>
+<link rel="match" href="reference/available-size-020-ref.html">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
+<link rel="help" href="https://www.w3.org/TR/css-contain-1/">
+<meta name="assert" content="Test passes if vertical-rl block container orthogonal to parent which is itself orthogonal to the ICB is sized to fit into the smaller of its containing block’s fixed-size constraints or the ICB even if there's an intervening contained element.">
+<style>
+/* Set up orthogonal flows */
+html { writing-mode: vertical-lr; word-break: break-all; font: 15px/1 sans-serif; }
+article { writing-mode: horizontal-tb; margin-left: 0.5em; }
+aside { writing-mode: vertical-rl; width: 2em; overflow: hidden; color: blue;
+ margin: 2em 0 4em; padding: 2em 0; border: solid 4px silver; }
+/* Limits on direct containing block trump ICB */
+.fixed-parent > div { min-height: 30vh; height: 50vh; max-height: 60vh; }
+.min-fixed-parent > div { min-height: 50vh; height: 30vh; max-height: 60vh; }
+.max-fixed-parent > div { min-height: 30vh; height: 60vh; max-height: 50vh; }
+.max-parent > div { min-height: 30vh; max-height: 50vh; }
+.min-max-parent > div { min-height: 50vh; max-height: 30vh; }
+/* But not if they're larger than ICB */
+.large-parent > div { height: 120vh; }
+.min-large-parent > div { min-height: 120vh; max-height: 30vh; }
+/* Ancestor should have no effect, only containing block */
+.auto { min-height: 40vh; height: 30vh; max-height: 20vh; }
+
+/* References */
+.fixed aside { height: calc(50vh - 10em - 8px); }
+.full aside { height: calc(100vh - 10em - 8px); }
+html { overflow: hidden; /* avoid scrollbar variance */ }
+
+div {
+ /* Test intervening reflow root */
+ contain: layout size;
+ /* We're not testing widths; let's just match a nice reference. */
+ width: calc(2em + 8px);
+}
+</style>
+
+<p style="transform-origin: top right; transform: rotate(-90deg); height: max-content">Test passes if the first five boxes are identical, and the last four boxes are identical.
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="auto">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
diff --git a/tests/wpt/tests/css/css-writing-modes/available-size-022.html b/tests/wpt/tests/css/css-writing-modes/available-size-022.html
new file mode 100644
index 00000000000..5e6e684adae
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/available-size-022.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Nested Orthogonal Flows vertical-rl Block Container Auto-Sizing with Contained Ancestor within Scroll Container</title>
+<link rel="match" href="reference/available-size-022-ref.html">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
+<link rel="help" href="https://www.w3.org/TR/css-contain-1/">
+<meta name="assert" content="Test passes if vertical-rl block container orthogonal to parent which is itself orthogonal to the ICB is sized to fit into the smaller of scroll container’s fixed-size constraints or the ICB even when there is a contained intervening ancestor.">
+<style>
+/* Set up orthogonal flows */
+html { writing-mode: vertical-lr; word-break: break-all; font: 15px/1 sans-serif; }
+article { writing-mode: horizontal-tb; margin-left: 0.5em; overflow: hidden; }
+aside { writing-mode: vertical-rl; width: 2em; overflow: hidden; color: blue;
+ margin: 4em 0; padding: 2em 0; border: solid 4px silver; }
+/* Limits on scroll container block trump ICB */
+.fixed-parent { min-height: 30vh; height: 50vh; max-height: 60vh; }
+.min-fixed-parent { min-height: 50vh; height: 30vh; max-height: 60vh; }
+.max-fixed-parent { min-height: 30vh; height: 60vh; max-height: 50vh; }
+.max-parent { min-height: 30vh; max-height: 50vh; }
+.min-max-parent { min-height: 50vh; max-height: 30vh; }
+/* But not if they're larger than ICB */
+.large-parent { height: 120vh; }
+.min-large-parent { min-height: 120vh; max-height: 30vh; }
+/* Auto height should have no effect, only fixed height */
+.auto { min-height: 30vh; }
+
+/* Highlight truncated cases for visual verification */
+.max-parent aside, .auto aside, em { border-color: blue; color: blue }
+
+/* References */
+.fixed { height: 50vh; }
+.full { height: 100vh; }
+html { overflow: hidden; /* avoid scrollbar variance */ }
+
+div {
+ /* Test intervening reflow root */
+ contain: layout size;
+ /* We're not testing widths; let's just match a nice reference. */
+ width: calc(2em + 8px);
+}
+</style>
+
+<p style="position: absolute; writing-mode: horizontal-tb; word-break: normal">Test passes if the <strong>contents</strong> of the first five boxes are identical, and of the last four boxes are identical,
+except that <em>blue</em> boxes are truncated.
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="auto">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
diff --git a/tests/wpt/tests/css/css-writing-modes/available-size-023.html b/tests/wpt/tests/css/css-writing-modes/available-size-023.html
new file mode 100644
index 00000000000..a1be62a27e2
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/available-size-023.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Nested Orthogonal Flows vertical-rl Block Container Auto-Sizing within Contained Scroll Container</title>
+<link rel="match" href="reference/available-size-022-ref.html">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto">
+<link rel="help" href="https://www.w3.org/TR/css-contain-1/">
+<meta name="assert" content="Test passes if vertical-rl block container orthogonal to parent which is itself orthogonal to the ICB is sized to fit into the smaller of its scroll container’s fixed-size constraints or the ICB even if there's an intervening contained element.">
+<style>
+/* Set up orthogonal flows */
+html { writing-mode: vertical-lr; word-break: break-all; font: 15px/1 sans-serif; }
+article { writing-mode: horizontal-tb; margin-left: 0.5em; overflow: hidden; }
+aside { writing-mode: vertical-rl; width: 2em; overflow: hidden; color: blue;
+ margin: 4em 0; padding: 2em 0; border: solid 4px silver; }
+/* Limits on scroll container block trump ICB */
+.fixed-parent { min-height: 30vh; height: 50vh; max-height: 60vh; }
+.min-fixed-parent { min-height: 50vh; height: 30vh; max-height: 60vh; }
+.max-fixed-parent { min-height: 30vh; height: 60vh; max-height: 50vh; }
+.max-parent { min-height: 30vh; max-height: 50vh; }
+.min-max-parent { min-height: 50vh; max-height: 30vh; }
+/* But not if they're larger than ICB */
+.large-parent { height: 120vh; }
+.min-large-parent { min-height: 120vh; max-height: 30vh; }
+/* Auto height should have no effect, only fixed height */
+.auto { min-height: 30vh; }
+
+/* Highlight truncated cases for visual verification */
+.max-parent aside, .auto aside, em { border-color: blue; color: blue }
+
+/* References */
+.fixed { height: 50vh; }
+.full { height: 100vh; }
+html { overflow: hidden; /* avoid scrollbar variance */ }
+
+article {
+ /* Test scroller as reflow root */
+ contain: layout size;
+ /* We're not testing widths; let's just match a nice reference. */
+ width: calc(2em + 8px);
+}
+</style>
+
+<p style="position: absolute; writing-mode: horizontal-tb; word-break: normal">Test passes if the <strong>contents</strong> of the first five boxes are identical, and of the last four boxes are identical,
+except that <em>blue</em> boxes are truncated.
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-fixed-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-max-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="min-large-parent">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="auto">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
diff --git a/tests/wpt/tests/css/css-writing-modes/reference/available-size-020-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/available-size-020-ref.html
new file mode 100644
index 00000000000..ecd3ac273a2
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/reference/available-size-020-ref.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Reftest Reference</title>
+<style>
+/* Set up orthogonal flows */
+html { word-break: break-all; font: 15px/1 sans-serif; writing-mode: vertical-lr; }
+article { margin-left: 0.5em; }
+aside { width: 2em; overflow: hidden; color: blue; writing-mode: vertical-rl;
+ margin: 2em 0 4em; padding: 2em 0; border: solid 4px silver; }
+/* References */
+html, body, article, div { height: 100%; }
+.fixed aside { height: calc(50% - 10em - 8px); }
+.full aside { height: calc(100% - 10em - 8px); }
+html { overflow: hidden; /* avoid scrollbar variance */ }
+</style>
+
+<p style="transform-origin: top right; transform: rotate(-90deg); height: max-content">Test passes if the first five boxes are identical, and the last four boxes are identical.
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
diff --git a/tests/wpt/tests/css/css-writing-modes/reference/available-size-022-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/available-size-022-ref.html
new file mode 100644
index 00000000000..c1e492ef24d
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/reference/available-size-022-ref.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Reftest Reference</title>
+<style>
+/* Set up */
+html { word-break: break-all; font: 15px/1 sans-serif; writing-mode: vertical-lr; }
+article { margin-left: 0.5em; }
+aside { writing-mode: vertical-rl; width: 2em; overflow: hidden; color: blue;
+ margin: 4em 0; padding: 2em 0; border: solid 4px silver; }
+/* Highlight truncated cases for visual verification */
+.clamp aside, em { border-color: blue; color: blue }
+
+/* References */
+.fixed aside { height: calc(50vh - 12em - 8px); }
+.full aside { height: calc(100vh - 12em - 8px); }
+.clamp { height: 30vh; overflow: hidden; }
+html { overflow: hidden; /* avoid scrollbar variance */ }
+</style>
+
+<p style="position: absolute; writing-mode: horizontal-tb; word-break: normal">Test passes if the <strong>contents</strong> of the first five boxes are identical, and of the last four boxes are identical,
+except that <em>blue</em> boxes are truncated.
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed clamp">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="fixed">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+<article class="full clamp">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
+
+
+<article class="full">
+ <div>
+ <aside>abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde fghijk lmnop qrstu vwxyz abcde</aside>
+ </div>
+</article>
diff --git a/tests/wpt/tests/css/cssom/insertRule-import-no-sheet-crash.html b/tests/wpt/tests/css/cssom/insertRule-import-no-sheet-crash.html
new file mode 100644
index 00000000000..43e82e817f6
--- /dev/null
+++ b/tests/wpt/tests/css/cssom/insertRule-import-no-sheet-crash.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script>
+window.addEventListener("load", () => {
+ const style = document.createElement("style")
+ document.documentElement.appendChild(style)
+ style.textContent = `@import "dom--1052-ovLJsB5L67uQ-.css" supports(not ((selector(::backdrop)))); }`
+ style.title = "ó «£ð³\uD8E3𐖇𛛛𛊲\"𣪍\rÛ¹ó “ˆó º ð¤©¸<<=𝉃Fð‘‰‰ð–ƒ¬ð¡¤ó ª—ð Ÿ¤î©š0=ó …´á­²-=ä©“ê™½ðŸ¸¡àµ¤ó ƒ¶\bð¯”­ó ±¿î·œl𯋞꣪2٫𦔑^́>0ß­ê£ \\ó Ÿªð¤â‹¹ðŸ½¿ð›â€Œ7â¡á¯ó •æ¡ð‘¾”\n ó Ž‰áŽš\n‮߰\uDC80甅⤀𝅯*â’Ž;𝆪𓸤𝥷\xA0\u202F5>>>=\r\nA𯭓"
+ style.sheet.insertRule("HTML {transition: normal }", 0)
+})
+</script>
diff --git a/tests/wpt/tests/css/motion/offset-path-url-003.html b/tests/wpt/tests/css/motion/offset-path-url-003.html
index 4485b52d071..7e0c2fe0b50 100644
--- a/tests/wpt/tests/css/motion/offset-path-url-003.html
+++ b/tests/wpt/tests/css/motion/offset-path-url-003.html
@@ -5,7 +5,7 @@
<link rel="help" href="https://drafts.fxtf.org/motion/#valdef-offset-path-url">
<link rel="help" href="https://svgwg.org/svg2-draft/shapes.html#CircleElement">
<link rel="match" href="offset-path-url-003-ref.html">
- <meta name=fuzzy content="0-35;0-76">
+ <meta name=fuzzy content="0-35;0-85">
<meta name="assert" content="This tests that url() referenced to a circle
generates a rotation and translation.">
<style>
diff --git a/tests/wpt/tests/css/motion/offset-path-url-004.html b/tests/wpt/tests/css/motion/offset-path-url-004.html
index 05aea375a18..d1e4135a263 100644
--- a/tests/wpt/tests/css/motion/offset-path-url-004.html
+++ b/tests/wpt/tests/css/motion/offset-path-url-004.html
@@ -5,7 +5,7 @@
<link rel="help" href="https://drafts.fxtf.org/motion/#valdef-offset-path-url">
<link rel="help" href="https://svgwg.org/svg2-draft/shapes.html#EllipseElement">
<link rel="match" href="offset-path-url-004-ref.html">
- <meta name=fuzzy content="0-15;0-65">
+ <meta name=fuzzy content="0-15;0-70">
<meta name="assert" content="This tests that url() referenced to an ellipse
generates a rotation and translation.">
<style>
diff --git a/tests/wpt/tests/css/motion/offset-rotate-001.html b/tests/wpt/tests/css/motion/offset-rotate-001.html
index e5b13fe8a9a..56173cf4e4f 100644
--- a/tests/wpt/tests/css/motion/offset-rotate-001.html
+++ b/tests/wpt/tests/css/motion/offset-rotate-001.html
@@ -5,6 +5,7 @@
<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
<link rel="match" href="offset-rotate-ref.html">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="assert" content="This tests offset-rotate auto">
<style>
#target {
diff --git a/tests/wpt/tests/css/motion/offset-rotate-002.html b/tests/wpt/tests/css/motion/offset-rotate-002.html
index 1edf38d546d..29888029b7b 100644
--- a/tests/wpt/tests/css/motion/offset-rotate-002.html
+++ b/tests/wpt/tests/css/motion/offset-rotate-002.html
@@ -5,6 +5,7 @@
<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
<link rel="match" href="offset-rotate-ref.html">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="assert" content="This tests offset-rotate reverse <angle>">
<style>
#target {
diff --git a/tests/wpt/tests/css/motion/offset-rotate-003.html b/tests/wpt/tests/css/motion/offset-rotate-003.html
index 522ff35b051..7a8ddbe8142 100644
--- a/tests/wpt/tests/css/motion/offset-rotate-003.html
+++ b/tests/wpt/tests/css/motion/offset-rotate-003.html
@@ -4,6 +4,7 @@
<title>CSS Motion Path: offset-rotate</title>
<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
<link rel="match" href="offset-rotate-ref.html">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="assert" content="This tests offset-rotate <angle>">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-57" />
<style>
diff --git a/tests/wpt/tests/css/motion/offset-rotate-004.html b/tests/wpt/tests/css/motion/offset-rotate-004.html
index 33783d423b5..c55887d4f61 100644
--- a/tests/wpt/tests/css/motion/offset-rotate-004.html
+++ b/tests/wpt/tests/css/motion/offset-rotate-004.html
@@ -4,6 +4,7 @@
<title>CSS Motion Path: offset-rotate</title>
<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
<link rel="match" href="offset-rotate-ref.html">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="assert" content="This tests offset-rotate auto with path()">
<style>
#target {
diff --git a/tests/wpt/tests/css/motion/offset-rotate-005.html b/tests/wpt/tests/css/motion/offset-rotate-005.html
index 9b1c40ed112..42070b5bef4 100644
--- a/tests/wpt/tests/css/motion/offset-rotate-005.html
+++ b/tests/wpt/tests/css/motion/offset-rotate-005.html
@@ -5,6 +5,7 @@
<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
<link rel="match" href="offset-rotate-ref.html">
<meta name="assert" content="This tests offset-rotate reverse <angle> with path()">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
<style>
#target {
position: absolute;
diff --git a/tests/wpt/tests/css/motion/offset-rotate-ref.html b/tests/wpt/tests/css/motion/offset-rotate-ref.html
index ec22768e96a..4b2d36529af 100644
--- a/tests/wpt/tests/css/motion/offset-rotate-ref.html
+++ b/tests/wpt/tests/css/motion/offset-rotate-ref.html
@@ -3,6 +3,7 @@
<head>
<title>CSS Motion Path: offset-rotate</title>
<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
<style>
#target {
position: absolute;
diff --git a/tests/wpt/tests/custom-elements/form-associated/form-reset-callback.html b/tests/wpt/tests/custom-elements/form-associated/form-reset-callback.html
index 8b8497f8b6c..5bfd93b9513 100644
--- a/tests/wpt/tests/custom-elements/form-associated/form-reset-callback.html
+++ b/tests/wpt/tests/custom-elements/form-associated/form-reset-callback.html
@@ -13,8 +13,25 @@ class MyControl extends HTMLElement {
formResetCallback() {
this.resetCalled_ = true;
+ if (this.outputElement_) {
+ this.outputValueDuringResetCallback_ = this.outputElement_.value;
+ }
}
get resetCalled() { return this.resetCalled_; }
+
+ // This is only used in a single test below; the idea is this: before the form
+ // gets reset (i.e., before `formResetCallback()` is queued and run by the
+ // platform), we assign an `HTMLOutputElement` whose value we record *while*
+ // `formResetCallback()` runs. This lets the test verify that built-in form
+ // controls are reset *before* custom element `formResetCallback()`s are run
+ // with custom element reaction timing, at the very end of the form reset
+ // process.
+ set outputToObserve(output) {
+ this.outputElement_ = output;
+ }
+ get outputElementValueDuringResetCallback() {
+ return this.outputValueDuringResetCallback_;
+ }
}
customElements.define('my-control', MyControl);
@@ -34,14 +51,23 @@ test(() => {
let custom = form.firstChild;
let output = form.lastChild;
output.value = 'updated';
- output.addEventListener('DOMSubtreeModified', () => {
- assert_false(custom.resetCalled, 'formResetCallback should not be ' +
- 'called before built-in control\'s reset');
- });
+
+ // This is the `HTMLOutputElement` that `custom` will record the `value` of,
+ // when `custom`'s `formResetCallback()` runs.
+ custom.outputToObserve = output;
+
+ // Reset the form.
+ assert_false(custom.resetCalled,
+ "formResetCallback is not called before the form is reset");
form.reset();
- assert_true(custom.resetCalled);
-}, 'form.reset(): formResetCallback is called after reset of the last ' +
- 'built-in form control and before the next statement.');
+ assert_true(custom.resetCalled, "formResetCallback is called " +
+ "synchronously after the form is reset");
+ assert_equals(custom.outputElementValueDuringResetCallback, "default",
+ "formResetCallback() runs *after* built-in form control reset " +
+ "algorithms run, and can observe their effects");
+}, 'form.reset(): formResetCallback is called synchronously at the end of ' +
+ 'form reset, with custom element reaction timing, *after* built-in form ' +
+ 'control reset algorithms run.');
promise_test(() => {
document.body.insertAdjacentHTML('beforeend',
diff --git a/tests/wpt/tests/device-bound-session-credentials/clear-site-data.https.html b/tests/wpt/tests/device-bound-session-credentials/clear-site-data.https.html
index 2d6e42977d1..6c16d31d551 100644
--- a/tests/wpt/tests/device-bound-session-credentials/clear-site-data.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/clear-site-data.https.html
@@ -13,12 +13,12 @@
const testId = await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// The server ends the session.
const end_session_response = await fetch('end_session_via_clear_site_data.py');
@@ -38,12 +38,12 @@
const testId = await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// The server ends the session.
const end_session_response = await fetch('end_session_via_clear_site_data.py', {method: 'POST', body: '"storage"'});
diff --git a/tests/wpt/tests/device-bound-session-credentials/create-session.https.html b/tests/wpt/tests/device-bound-session-credentials/create-session.https.html
index cddfd179797..95c39608a61 100644
--- a/tests/wpt/tests/device-bound-session-credentials/create-session.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/create-session.https.html
@@ -13,12 +13,12 @@
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html b/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html
new file mode 100644
index 00000000000..8f516d6995c
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/credentials-matching.https.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC credentials matching</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="helper.js" type="module"></script>
+
+<script type="module">
+ import { expireCookie, documentHasCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState, configureServer, pullServerState} from "./helper.js";
+
+ const futureDate = new Date();
+ futureDate.setFullYear(futureDate.getFullYear() + 1);
+
+ async function runTest(t, sessionCookieAttributes, requestCookieAttributes, expectCallRefresh) {
+ await setupShardedServerState();
+ const expectedCookieAndValue = "auth_cookie=abcdef0123";
+ const expectedAttributes = sessionCookieAttributes;
+ const expectedCookieAndAttributes = `${expectedCookieAndValue};${expectedAttributes}`;
+ addCookieAndSessionCleanup(t);
+
+ // Configure server to set the session credentials and the associated Set-Cookie header.
+ configureServer({ cookieAttributes: expectedAttributes });
+
+ // Prompt starting a session, and wait until registration completes.
+ const login_response = await fetch('login.py');
+ assert_equals(login_response.status, 200);
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
+
+ // Confirm that a request has the cookie set.
+ const auth_response = await fetch('verify_authenticated.py');
+ assert_equals(auth_response.status, 200);
+
+ // Delete the cookie, and replace it with a similar cookie with custom attributes.
+ expireCookie(expectedCookieAndAttributes);
+ assert_false(documentHasCookie(expectedCookieAndValue));
+ await fetch('set_cookie.py', {
+ method: 'POST',
+ body: `${expectedCookieAndValue};${requestCookieAttributes}`,
+ });
+
+ // Send a request. Then, confirm refresh was or was not sent.
+ const auth_response_after_expiry = await fetch('verify_authenticated.py');
+ assert_equals(auth_response_after_expiry.status, 200);
+ assert_true(documentHasCookie(expectedCookieAndValue));
+ const serverState = await pullServerState();
+ assert_equals(serverState.hasCalledRefresh, expectCallRefresh);
+ }
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;Expires=${futureDate.toUTCString()}`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/false);
+ }, "Expires attribute in credentials doesn't affect matching");
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;Max-Age=86400`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/false);
+ }, "Max-Age attribute in credentials doesn't affect matching");
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;HttpOnly`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
+ }, "HttpOnly attribute in credentials affects matching");
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;SameSite=Strict`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
+ }, "SameSite attribute in credentials affects matching");
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;Secure`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
+ }, "Secure attribute in credentials affects matching");
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
+ }, "Path attribute in credentials affects matching");
+
+ promise_test(async t => {
+ const sessionCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;Secure`;
+ const requestCookieAttributes = `Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials;Partitioned;Secure`;
+ await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true);
+ }, "Partition attribute in credentials affects matching");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/excludeInScopeSpecification/excluded_verify_authenticated.py b/tests/wpt/tests/device-bound-session-credentials/excludeInScopeSpecification/excluded_verify_authenticated.py
new file mode 100644
index 00000000000..d4a7dce24b0
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/excludeInScopeSpecification/excluded_verify_authenticated.py
@@ -0,0 +1,5 @@
+import importlib
+util = importlib.import_module('device-bound-session-credentials.verify_authenticated_util')
+
+def main(request, response):
+ return util.verify_authenticated(request, response) \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/helper.js b/tests/wpt/tests/device-bound-session-credentials/helper.js
index c4cfcfc1f75..1cea6711c8a 100644
--- a/tests/wpt/tests/device-bound-session-credentials/helper.js
+++ b/tests/wpt/tests/device-bound-session-credentials/helper.js
@@ -2,20 +2,21 @@ export function documentHasCookie(cookieAndValue) {
return document.cookie.split(';').some(item => item.includes(cookieAndValue));
}
-export function waitForCookie(cookieAndValue) {
+export async function waitForCookie(cookieAndValue, expectCookie) {
const startTime = Date.now();
- return new Promise(resolve => {
+ const hasCookie = await new Promise(resolve => {
const interval = setInterval(() => {
if (documentHasCookie(cookieAndValue)) {
clearInterval(interval);
resolve(true);
}
- if (Date.now() - startTime >= 1000) {
+ if (!expectCookie && Date.now() - startTime >= 1000) {
clearInterval(interval);
resolve(false);
}
}, 100);
});
+ assert_equals(hasCookie, expectCookie);
}
export function expireCookie(cookieAndAttributes) {
@@ -23,12 +24,19 @@ export function expireCookie(cookieAndAttributes) {
cookieAndAttributes + '; expires=Thu, 01 Jan 1970 00:00:00 UTC;';
}
-export function addCookieAndSessionCleanup(test, cookieAndAttributes) {
+export function addCookieAndSessionCleanup(test) {
// Clean up any set cookies once the test completes.
test.add_cleanup(async () => {
const response = await fetch('end_session_via_clear_site_data.py');
assert_equals(response.status, 200);
- expireCookie(cookieAndAttributes);
+ });
+}
+
+export async function postJson(url, obj) {
+ return await fetch(url, {
+ method: 'POST',
+ headers: {'Content-Type': 'application/json'},
+ body: JSON.stringify(obj),
});
}
@@ -56,3 +64,9 @@ export async function setupShardedServerState(testId) {
document.cookie.split(';').filter(item => item.includes('test_id'))[0];
return testIdCookie.split('=')[1];
}
+
+export async function pullServerState() {
+ const response = await fetch('pull_server_state.py');
+ assert_equals(response.status, 200);
+ return await response.json();
+}
diff --git a/tests/wpt/tests/device-bound-session-credentials/include-site.https.html b/tests/wpt/tests/device-bound-session-credentials/include-site.https.html
new file mode 100644
index 00000000000..aa011284073
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/include-site.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC session over multiple origins</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="helper.js" type="module"></script>
+
+<script type="module">
+ import { expireCookie, documentHasCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState } from "./helper.js";
+
+ promise_test(async t => {
+ await setupShardedServerState();
+ const expectedCookieAndValue = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t);
+
+ // Prompt starting a session, and wait until registration completes.
+ const login_response = await fetch('login.py');
+ assert_equals(login_response.status, 200);
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
+
+ // Confirm that expiring the cookie still leads to a request with the cookie set (refresh occurs).
+ expireCookie(expectedCookieAndAttributes);
+ assert_false(documentHasCookie(expectedCookieAndValue));
+ const url = get_host_info().HTTPS_REMOTE_ORIGIN + '/device-bound-session-credentials/verify_authenticated.py';
+ const auth_response_after_expiry = await fetch(url, {credentials: "include"});
+ assert_equals(auth_response_after_expiry.status, 200);
+ assert_true(documentHasCookie(expectedCookieAndValue));
+ }, "An established session refreshes across sites");
+</script>
diff --git a/tests/wpt/tests/device-bound-session-credentials/includeInScopeSpecification/included_verify_authenticated.py b/tests/wpt/tests/device-bound-session-credentials/includeInScopeSpecification/included_verify_authenticated.py
new file mode 100644
index 00000000000..d4a7dce24b0
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/includeInScopeSpecification/included_verify_authenticated.py
@@ -0,0 +1,5 @@
+import importlib
+util = importlib.import_module('device-bound-session-credentials.verify_authenticated_util')
+
+def main(request, response):
+ return util.verify_authenticated(request, response) \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/login.py b/tests/wpt/tests/device-bound-session-credentials/login.py
index 2e2d93a8e47..722c4b7afee 100644
--- a/tests/wpt/tests/device-bound-session-credentials/login.py
+++ b/tests/wpt/tests/device-bound-session-credentials/login.py
@@ -1,11 +1,35 @@
+import json
import importlib
session_manager = importlib.import_module('device-bound-session-credentials.session_manager')
def main(request, response):
+ num_sessions = 1
+ use_single_header = True
+ registration_url = "/device-bound-session-credentials/start_session.py"
+ request_body_raw = request.body.decode('utf-8')
+ if len(request_body_raw) > 0:
+ request_body = json.loads(request_body_raw)
+ maybe_num_sessions = request_body.get("numSessions")
+ if maybe_num_sessions is not None:
+ num_sessions = maybe_num_sessions
+ maybe_use_single_header = request_body.get("useSingleHeader")
+ if maybe_use_single_header is not None:
+ use_single_header = maybe_use_single_header
+ maybe_registration_url = request_body.get("registrationUrl")
+ if maybe_registration_url is not None:
+ registration_url = maybe_registration_url
+
authorization_value = session_manager.find_for_request(request).get_authorization_value()
authorization_header = ""
if authorization_value is not None:
authorization_header = ';authorization="' + authorization_value + '"'
- headers = [('Sec-Session-Registration', '(RS256);challenge="login_challenge_value";path="/device-bound-session-credentials/start_session.py"' + authorization_header)]
- return (200, headers, "")
+ registrations = []
+ for i in range(num_sessions):
+ registrations.append(('Sec-Session-Registration', '(RS256);challenge="login_challenge_value";path="' + registration_url + '"' + authorization_header))
+
+ if use_single_header:
+ combined_registrations = [("Sec-Session-Registration", ", ".join([registration[1] for registration in registrations]))]
+ return (200, combined_registrations, "")
+ else:
+ return (200, registrations, "")
diff --git a/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html b/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html
new file mode 100644
index 00000000000..1a2bcf5a95a
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/multiple-registrations.https.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC multiple registrations</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="helper.js" type="module"></script>
+
+<script type="module">
+ import { expireCookie, waitForCookie, addCookieAndSessionCleanup, configureServer, setupShardedServerState, postJson, documentHasCookie } from "./helper.js";
+
+ async function runMultipleRegistrationsTest(t, useSingleHeader) {
+ await setupShardedServerState();
+ const expectedCookieAndValue1 = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes1 = `${expectedCookieAndValue1};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t, expectedCookieAndAttributes1);
+ const expectedCookieAndValue2 = "other_cookie=ghijkl4567";
+ const expectedCookieAndAttributes2 = `${expectedCookieAndValue2};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t, expectedCookieAndAttributes2);
+
+ // Configure server to configure cookies for next two created sessions.
+ configureServer({
+ cookieNamesAndValuesForNextRegisteredSessions: [expectedCookieAndValue1, expectedCookieAndValue2]
+ });
+
+ // Prompt starting one session, and wait until registration completes.
+ const login_response = await postJson('login.py', { numSessions: 2, useSingleHeader });
+ assert_equals(login_response.status, 200);
+ await waitForCookie(expectedCookieAndValue1, /*expectCookie=*/true);
+ await waitForCookie(expectedCookieAndValue2, /*expectCookie=*/true);
+
+ async function triggerRefreshAndCheckBothCookies() {
+ const auth_response = await fetch('verify_authenticated.py');
+ assert_equals(auth_response.status, 200);
+ assert_true(documentHasCookie(expectedCookieAndValue1))
+ assert_true(documentHasCookie(expectedCookieAndValue2))
+ }
+ // Trigger a refresh for the first session, and confirm we have both cookies.
+ expireCookie(expectedCookieAndAttributes1);
+ await triggerRefreshAndCheckBothCookies();
+ // Trigger a refresh for the second session, and confirm we have both cookies.
+ expireCookie(expectedCookieAndAttributes2);
+ await triggerRefreshAndCheckBothCookies();
+ // Trigger a refresh for both sessions, and confirm we have both cookies.
+ expireCookie(expectedCookieAndAttributes1);
+ expireCookie(expectedCookieAndAttributes2);
+ await triggerRefreshAndCheckBothCookies();
+ }
+
+ promise_test(async t => {
+ await runMultipleRegistrationsTest(t, /*useSingleHeader=*/true);
+ }, "Multiple registrations can be triggered in one response (single header)");
+
+ promise_test(async t => {
+ await runMultipleRegistrationsTest(t, /*useSingleHeader=*/false);
+ }, "Multiple registrations can be triggered in one response (multiple headers)");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/not-secure-connection.html b/tests/wpt/tests/device-bound-session-credentials/not-secure-connection.html
index 93736c0b596..3ff834dc7c0 100644
--- a/tests/wpt/tests/device-bound-session-credentials/not-secure-connection.html
+++ b/tests/wpt/tests/device-bound-session-credentials/not-secure-connection.html
@@ -12,13 +12,12 @@
promise_test(async t => {
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
- const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
// For HTTP, this call will time out, because the cookie is never set.
- assert_false(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/false);
}, "Try to establish a session over HTTP");
</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/pull_server_state.py b/tests/wpt/tests/device-bound-session-credentials/pull_server_state.py
new file mode 100644
index 00000000000..6870ed5291f
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/pull_server_state.py
@@ -0,0 +1,6 @@
+import json
+import importlib
+session_manager = importlib.import_module('device-bound-session-credentials.session_manager')
+
+def main(request, response):
+ return (200, response.headers, json.dumps(session_manager.find_for_request(request).pull_server_state()))
diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html b/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html
new file mode 100644
index 00000000000..4e48d1d9ece
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/refresh-does-not-send-challenge.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC refresh does not send back Sec-Session-Challenge</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="helper.js" type="module"></script>
+
+<script type="module">
+ import { expireCookie, waitForCookie, addCookieAndSessionCleanup, configureServer, setupShardedServerState, documentHasCookie } from "./helper.js";
+
+ promise_test(async t => {
+ await setupShardedServerState();
+ const expectedCookieAndValue = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t);
+
+ // Configure server to avoid sending back a challenge during refresh.
+ configureServer({ refreshSendsChallenge: false });
+
+ // Prompt starting a session, and wait until registration completes.
+ const login_response = await fetch('login.py');
+ assert_equals(login_response.status, 200);
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
+
+ // Confirm that a request has the cookie set.
+ const auth_response = await fetch('verify_authenticated.py');
+ assert_equals(auth_response.status, 200);
+
+ // Trigger refresh and confirm that the cookie gets set again.
+ expireCookie(expectedCookieAndAttributes);
+ assert_false(documentHasCookie(expectedCookieAndValue));
+ const auth_response_after_expiry = await fetch('verify_authenticated.py');
+ assert_equals(auth_response_after_expiry.status, 200);
+ assert_true(documentHasCookie(expectedCookieAndValue));
+}, "Refresh does not send back Sec-Session-Challenge");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html b/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html
index 1ac8096b5de..406658595dc 100644
--- a/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/refresh-replaces-config.https.html
@@ -13,15 +13,14 @@
await setupShardedServerState();
const expectedCookieAndValue1 = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes1 = `${expectedCookieAndValue1};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes1);
const expectedCookieAndValue2 = "other_cookie=ghijkl4567";
const expectedCookieAndAttributes2 = `${expectedCookieAndValue2};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes2);
+ addCookieAndSessionCleanup(t);
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue1));
+ await waitForCookie(expectedCookieAndValue1, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html b/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html
index 9ebec220977..bf066cb9a6b 100644
--- a/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/refresh-with-continue-false.https.html
@@ -13,7 +13,7 @@
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Configure server to end the session upon refresh.
configureServer({ shouldRefreshEndSession: true });
@@ -21,7 +21,7 @@
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/refresh_session.py b/tests/wpt/tests/device-bound-session-credentials/refresh_session.py
index 9b39118ce71..c31c5192d7c 100644
--- a/tests/wpt/tests/device-bound-session-credentials/refresh_session.py
+++ b/tests/wpt/tests/device-bound-session-credentials/refresh_session.py
@@ -4,11 +4,12 @@ jwt_helper = importlib.import_module('device-bound-session-credentials.jwt_helpe
session_manager = importlib.import_module('device-bound-session-credentials.session_manager')
def main(request, response):
+ test_session_manager = session_manager.find_for_request(request)
+ test_session_manager.set_has_called_refresh(True)
session_id_header = request.headers.get("Sec-Session-Id")
if session_id_header == None:
return (400, response.headers, "")
session_id = session_id_header.decode('utf-8')
- test_session_manager = session_manager.find_for_request(request)
if test_session_manager.get_should_refresh_end_session():
response_body = {
@@ -21,16 +22,18 @@ def main(request, response):
if session_key == None:
return (400, response.headers, "")
- challenge = "refresh_challenge_value"
- if request.headers.get("Sec-Session-Response") == None:
- return (401, [('Sec-Session-Challenge', '"' + challenge + '";id="' + session_id + '"')], "")
+ if test_session_manager.get_refresh_sends_challenge():
+ challenge = "refresh_challenge_value"
+ if request.headers.get("Sec-Session-Response") == None:
+ return (401, [('Sec-Session-Challenge', '"' + challenge + '";id="' + session_id + '"')], "")
- jwt_header, jwt_payload, verified = jwt_helper.decode_jwt(request.headers.get("Sec-Session-Response").decode('utf-8'), session_key)
+ jwt_header, jwt_payload, verified = jwt_helper.decode_jwt(request.headers.get("Sec-Session-Response").decode('utf-8'), session_key)
- if test_session_manager.get_send_challenge_early():
- challenge = "early_challenge"
+ early_challenge = test_session_manager.get_early_challenge(session_id)
+ if early_challenge is not None:
+ challenge = early_challenge
- if not verified or jwt_payload.get("jti") != challenge:
- return (400, response.headers, "")
+ if not verified or jwt_payload.get("jti") != challenge:
+ return (400, response.headers, "")
return test_session_manager.get_session_instructions_response(session_id, request)
diff --git a/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html b/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html
index 36aeb631fcd..f7069332b2a 100644
--- a/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/registration-sends-challenge.https.html
@@ -13,7 +13,7 @@
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Configure server to send back a challenge during registration.
configureServer({ registrationSendsChallenge: true });
@@ -21,7 +21,7 @@
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/request_early_challenge.py b/tests/wpt/tests/device-bound-session-credentials/request_early_challenge.py
index e3e429ee76f..b63b87c27f6 100644
--- a/tests/wpt/tests/device-bound-session-credentials/request_early_challenge.py
+++ b/tests/wpt/tests/device-bound-session-credentials/request_early_challenge.py
@@ -1,10 +1,22 @@
+import json
import importlib
session_manager = importlib.import_module('device-bound-session-credentials.session_manager')
def main(request, response):
- session_ids = session_manager.find_for_request(request).get_session_ids()
- if len(session_ids) != 1:
- return (500, "", "")
- session_id_header = ';id="' + session_ids[0] + '"'
+ test_session_manager = session_manager.find_for_request(request)
- return (200, [("Sec-Session-Challenge", '"early_challenge"' + session_id_header)], "")
+ use_single_header = json.loads(request.body.decode('utf-8')).get("useSingleHeader")
+ if use_single_header is None:
+ return (400, response.headers, "")
+
+ challenges = []
+ for session_id in session_manager.find_for_request(request).get_session_ids():
+ early_challenge = test_session_manager.get_early_challenge(session_id)
+ if early_challenge is not None:
+ challenges.append(("Sec-Session-Challenge", '"' + early_challenge + '"' + ';id="' + session_id + '"'))
+
+ if use_single_header:
+ combined_challenges = [("Sec-Session-Challenge", ", ".join([challenge[1] for challenge in challenges]))]
+ return (200, combined_challenges, "")
+ else:
+ return (200, challenges, "")
diff --git a/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html b/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html
new file mode 100644
index 00000000000..1010f7c43d6
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/resolving-urls.https.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC session configuration resolving URLs</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="helper.js" type="module"></script>
+
+<script type="module">
+ import { expireCookie, waitForCookie, addCookieAndSessionCleanup, configureServer, setupShardedServerState, documentHasCookie, postJson } from "./helper.js";
+
+ async function runTest(t, registrationUrl, refreshUrl) {
+ await setupShardedServerState();
+ const expectedCookieAndValue = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+
+ // Configure server to use the absolute URL for refresh instead of a relative URL.
+ configureServer({ refreshUrl });
+
+ // Configure registration to use absolute URL instead of relative.
+ // Prompt starting a session, and wait until registration completes.
+ const login_response = await postJson('login.py', { registrationUrl });
+ assert_equals(login_response.status, 200);
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
+
+ // Confirm that a request has the cookie set.
+ const auth_response = await fetch('verify_authenticated.py');
+ assert_equals(auth_response.status, 200);
+
+ // Trigger refresh and confirm that the cookie gets set again.
+ expireCookie(expectedCookieAndAttributes);
+ assert_false(documentHasCookie(expectedCookieAndValue));
+ const auth_response_after_expiry = await fetch('verify_authenticated.py');
+ assert_equals(auth_response_after_expiry.status, 200);
+ assert_true(documentHasCookie(expectedCookieAndValue));
+ }
+
+ promise_test(async t => {
+ const registrationUrl = `${location.origin}/device-bound-session-credentials/start_session.py`;
+ const refreshUrl = `${location.origin}/device-bound-session-credentials/refresh_session.py`;
+ await runTest(t, registrationUrl, refreshUrl);
+ }, "The registration and refresh endpoints can be configured as absolute URLs");
+
+ promise_test(async t => {
+ const registrationUrl = `/device-bound-session-credentials/start_session.py`;
+ const refreshUrl = `/device-bound-session-credentials/refresh_session.py`;
+ await runTest(t, registrationUrl, refreshUrl);
+ }, "The registration and refresh endpoints can be configured as relative URLs with leading slash");
+
+ promise_test(async t => {
+ const registrationUrl = `start_session.py`;
+ const refreshUrl = `refresh_session.py`;
+ await runTest(t, registrationUrl, refreshUrl);
+ }, "The registration and refresh endpoints can be configured as relative URLs without leading slash");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html b/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html
index 9e526419307..c4172a28892 100644
--- a/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/session-cookie-has-no-attributes.https.html
@@ -12,15 +12,15 @@
promise_test(async t => {
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
- addCookieAndSessionCleanup(t, expectedCookieAndValue);
+ addCookieAndSessionCleanup(t);
// Configure server to set up a session with a cookie that has no attributes.
- configureServer({ cookieHasNoAttributes: true });
+ configureServer({ cookieAttributes: "" });
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/session_manager.py b/tests/wpt/tests/device-bound-session-credentials/session_manager.py
index 98eb120ed7c..7058bdbb2f2 100644
--- a/tests/wpt/tests/device-bound-session-credentials/session_manager.py
+++ b/tests/wpt/tests/device-bound-session-credentials/session_manager.py
@@ -19,14 +19,24 @@ class SessionManager:
self.session_to_key_map = {}
self.should_refresh_end_session = False
self.authorization_value = None
- self.send_challenge_early = False
- self.cookie_has_no_attributes = False
+ self.cookie_attributes = None
self.scope_origin = None
self.registration_sends_challenge = False
self.cookie_name_and_value = "auth_cookie=abcdef0123"
+ self.session_to_cookie_name_and_value_map = {}
+ self.session_to_early_challenge_map = {}
+ self.has_called_refresh = False
+ self.scope_specification_items = []
+ self.refresh_sends_challenge = True
+ self.refresh_url = "/device-bound-session-credentials/refresh_session.py"
+
+ def next_session_id_value(self):
+ return len(self.session_to_key_map)
+ def next_session_id(self):
+ return str(self.next_session_id_value())
def create_new_session(self):
- session_id = str(len(self.session_to_key_map))
+ session_id = self.next_session_id()
self.session_to_key_map[session_id] = None
return session_id
@@ -51,13 +61,9 @@ class SessionManager:
if authorization_value is not None:
self.authorization_value = authorization_value
- send_challenge_early = configuration.get("sendChallengeEarly")
- if send_challenge_early is not None:
- self.send_challenge_early = send_challenge_early
-
- cookie_has_no_attributes = configuration.get("cookieHasNoAttributes")
- if cookie_has_no_attributes is not None:
- self.cookie_has_no_attributes = cookie_has_no_attributes
+ cookie_attributes = configuration.get("cookieAttributes")
+ if cookie_attributes is not None:
+ self.cookie_attributes = cookie_attributes
scope_origin = configuration.get("scopeOrigin")
if scope_origin is not None:
@@ -71,27 +77,68 @@ class SessionManager:
if cookie_name_and_value is not None:
self.cookie_name_and_value = cookie_name_and_value
+ next_sessions_cookie_names_and_values = configuration.get("cookieNamesAndValuesForNextRegisteredSessions")
+ if next_sessions_cookie_names_and_values is not None:
+ next_session_id_value = self.next_session_id_value()
+ for cookie_name_and_value in next_sessions_cookie_names_and_values:
+ self.session_to_cookie_name_and_value_map[str(next_session_id_value)] = cookie_name_and_value
+ next_session_id_value += 1
+
+ next_session_early_challenge = configuration.get("earlyChallengeForNextRegisteredSession")
+ if next_session_early_challenge is not None:
+ self.session_to_early_challenge_map[self.next_session_id()] = next_session_early_challenge
+
+ scope_specification_items = configuration.get("scopeSpecificationItems")
+ if scope_specification_items is not None:
+ self.scope_specification_items = scope_specification_items
+
+ refresh_sends_challenge = configuration.get("refreshSendsChallenge")
+ if refresh_sends_challenge is not None:
+ self.refresh_sends_challenge = refresh_sends_challenge
+
+ refresh_url = configuration.get("refreshUrl")
+ if refresh_url is not None:
+ self.refresh_url = refresh_url
+
def get_should_refresh_end_session(self):
return self.should_refresh_end_session
def get_authorization_value(self):
return self.authorization_value
- def get_send_challenge_early(self):
- return self.send_challenge_early
-
def get_registration_sends_challenge(self):
return self.registration_sends_challenge
def reset_registration_sends_challenge(self):
self.registration_sends_challenge = False
+ def get_refresh_sends_challenge(self):
+ return self.refresh_sends_challenge
+
+ def set_has_called_refresh(self, has_called_refresh):
+ self.has_called_refresh = has_called_refresh
+
+ def pull_server_state(self):
+ return {
+ "hasCalledRefresh": self.has_called_refresh
+ }
+
+ def get_cookie_name_and_value(self, session_id):
+ # Try to use the session-specific override first.
+ if self.session_to_cookie_name_and_value_map.get(session_id) is not None:
+ return self.session_to_cookie_name_and_value_map[session_id]
+ # If there isn't any, use the general override.
+ return self.cookie_name_and_value
+
+ def get_early_challenge(self, session_id):
+ return self.session_to_early_challenge_map.get(session_id)
+
def get_session_instructions_response(self, session_id, request):
- cookie_parts = [self.cookie_name_and_value]
- cookie_attributes = ""
- if not self.cookie_has_no_attributes:
+ cookie_parts = [self.get_cookie_name_and_value(session_id)]
+ cookie_attributes = self.cookie_attributes
+ if cookie_attributes is None:
cookie_attributes = "Domain=" + request.url_parts.hostname + "; Path=/device-bound-session-credentials"
- cookie_parts.append(cookie_attributes)
+ cookie_parts.append(cookie_attributes)
value_of_set_cookie = "; ".join(cookie_parts)
scope_origin = ""
@@ -100,18 +147,20 @@ class SessionManager:
response_body = {
"session_identifier": session_id,
- "refresh_url": "/device-bound-session-credentials/refresh_session.py",
+ "refresh_url": self.refresh_url,
"scope": {
"origin": scope_origin,
"include_site": True,
- "scope_specification" : [
+ "scope_specification" : self.scope_specification_items + [
{ "type": "exclude", "domain": request.url_parts.hostname, "path": "/device-bound-session-credentials/request_early_challenge.py" },
{ "type": "exclude", "domain": request.url_parts.hostname, "path": "/device-bound-session-credentials/end_session_via_clear_site_data.py" },
+ { "type": "exclude", "domain": request.url_parts.hostname, "path": "/device-bound-session-credentials/pull_server_state.py" },
+ { "type": "exclude", "domain": request.url_parts.hostname, "path": "/device-bound-session-credentials/set_cookie.py" },
]
},
"credentials": [{
"type": "cookie",
- "name": self.cookie_name_and_value.split("=")[0],
+ "name": self.get_cookie_name_and_value(session_id).split("=")[0],
"attributes": cookie_attributes
}]
}
diff --git a/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html b/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html
index 3cfe23331d1..b4274ca87ac 100644
--- a/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/set-authorization.https.html
@@ -12,8 +12,7 @@
promise_test(async t => {
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
- const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Configure server send back an authorization header for registration.
configureServer({ authorizationValue: "authcode" });
@@ -22,7 +21,7 @@
// The server will confirm that the authorization is sent in registration.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that registration succeeded (cookie was set).
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html b/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html
index 112c87d4aee..8c557fdff54 100644
--- a/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/set-early-challenge.https.html
@@ -13,18 +13,22 @@
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ const earlyChallengeString = "early_challenge";
+ addCookieAndSessionCleanup(t);
- // Configure server send back an authorization header for registration.
- configureServer({ sendChallengeEarly: true });
+ // Configure server for sending back a challenge early on refresh.
+ configureServer({ earlyChallengeForNextRegisteredSession: earlyChallengeString });
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Set up a challenge in advance.
- const challenge_response = await fetch('request_early_challenge.py');
+ const challenge_response = await fetch('request_early_challenge.py', {
+ method: 'POST',
+ body: JSON.stringify({ useSingleHeader: true })
+ });
assert_equals(challenge_response.status, 200);
// Trigger a refresh. The server will confirm the early challenge matches.
@@ -32,4 +36,66 @@
const auth_response = await fetch('verify_authenticated.py');
assert_equals(auth_response.status, 200);
}, "A challenge can be set ahead of time");
+
+ async function runMultipleChallengesTest(t, useSingleHeader) {
+ await setupShardedServerState();
+ const expectedCookieAndValue1 = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes1 = `${expectedCookieAndValue1};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const earlyChallenge1 = "early_challenge1";
+ const expectedCookieAndValue2 = "other_cookie=ghijkl4567";
+ const expectedCookieAndAttributes2 = `${expectedCookieAndValue2};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
+ const earlyChallenge2 = "early_challenge2";
+ addCookieAndSessionCleanup(t);
+
+ // Configure server for sending back a challenge early. Also configure the session's cookie
+ // for test clarity (not strictly needed).
+ configureServer({
+ earlyChallengeForNextRegisteredSession: earlyChallenge1,
+ cookieNamesAndValuesForNextRegisteredSessions: [expectedCookieAndValue1]
+ });
+
+ // Prompt starting one session, and wait until registration completes.
+ const login_response1 = await fetch('login.py');
+ assert_equals(login_response1.status, 200);
+ await waitForCookie(expectedCookieAndValue1, /*expectCookie=*/true);
+
+ // Configure server for sending back a challenge early, and configure the second session's
+ // cookie.
+ configureServer({
+ earlyChallengeForNextRegisteredSession: earlyChallenge2,
+ cookieNamesAndValuesForNextRegisteredSessions: [expectedCookieAndValue2]
+ });
+
+ // Prompt starting second session, and wait until registration completes.
+ const login_response2 = await fetch('login.py');
+ assert_equals(login_response2.status, 200);
+ await waitForCookie(expectedCookieAndValue2, /*expectCookie=*/true);
+
+ // Set up a challenge in advance.
+ const challenge_response = await fetch('request_early_challenge.py', {
+ method: 'POST',
+ body: JSON.stringify({ useSingleHeader })
+ });
+ assert_equals(challenge_response.status, 200);
+
+ // Trigger a refresh. The server will confirm the early challenge matches.
+ expireCookie(expectedCookieAndAttributes1);
+ const auth_response1 = await fetch('verify_authenticated.py');
+ assert_equals(auth_response1.status, 200);
+
+ expireCookie(expectedCookieAndAttributes2);
+ const alternate_auth_response = await fetch('verify_authenticated.py', {
+ method: 'POST',
+ body: expectedCookieAndValue2
+ });
+ assert_equals(alternate_auth_response.status, 200);
+ }
+
+ promise_test(async t => {
+ await runMultipleChallengesTest(t, /*useSingleHeader=*/true);
+ }, "A challenge can be set for multiple sessions ahead of time (single header)");
+
+ promise_test(async t => {
+ await runMultipleChallengesTest(t, /*useSingleHeader=*/false);
+ }, "A challenge can be set for multiple sessions ahead of time (multiple headers)");
</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html b/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html
index 2105e8745a3..38480fc6cb4 100644
--- a/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html
+++ b/tests/wpt/tests/device-bound-session-credentials/set-scope-origin.https.html
@@ -13,7 +13,7 @@
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Configure server to have the same scope origin as the upcoming request.
configureServer({ scopeOrigin: get_host_info().HTTPS_ORIGIN });
@@ -21,7 +21,7 @@
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
@@ -39,7 +39,7 @@
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${get_host_info().ORIGINAL_HOST};Path=/device-bound-session-credentials`;
- addCookieAndSessionCleanup(t, expectedCookieAndAttributes);
+ addCookieAndSessionCleanup(t);
// Configure server to have a scope origin that does not match the upcoming request.
configureServer({ scopeOrigin: get_host_info().OTHER_ORIGIN });
@@ -47,7 +47,7 @@
// Prompt starting a session, and wait until registration completes.
const login_response = await fetch('login.py');
assert_equals(login_response.status, 200);
- assert_true(await waitForCookie(expectedCookieAndValue));
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// Confirm that a request has the cookie set.
const auth_response = await fetch('verify_authenticated.py');
diff --git a/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html b/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html
new file mode 100644
index 00000000000..6917a76094c
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/set-scope-specification.https.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC scope specification set</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helper.js" type="module"></script>
+
+<script type="module">
+ import { expireCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState, configureServer} from "./helper.js";
+
+ promise_test(async t => {
+ await setupShardedServerState();
+ const expectedCookieAndValue = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t);
+
+ // Configure server to set scope specification.
+ configureServer({ scopeSpecificationItems: [{
+ "type": "include",
+ "domain": location.hostname,
+ "path": "/device-bound-session-credentials/excludeInScopeSpecification/excluded_verify_authenticated.py"
+ }, {
+ "type": "exclude",
+ "domain": location.hostname,
+ "path": "/device-bound-session-credentials/excludeInScopeSpecification"
+ }, {
+ "type": "include",
+ "domain": location.hostname,
+ "path": "/device-bound-session-credentials/includeInScopeSpecification/included_verify_authenticated.py"
+ }, {
+ "type": "exclude",
+ "domain": location.hostname,
+ "path": "/device-bound-session-credentials/verify_authenticated.py"
+ }, {
+ "type": "include",
+ "domain": location.hostname,
+ "path": "/device-bound-session-credentials/verify_authenticated_alternate.py"
+ }, {
+ "type": "include",
+ "domain": `www1.${location.hostname}`,
+ "path": "/device-bound-session-credentials/verify_authenticated.py"
+ }, {
+ "type": "exclude",
+ "domain": `www2.${location.hostname}`,
+ "path": "/device-bound-session-credentials/verify_authenticated.py"
+ }] });
+
+ // Prompt starting a session, and wait until registration completes.
+ const login_response = await fetch('login.py');
+ assert_equals(login_response.status, 200);
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
+
+ async function expireCookieAndTriggerRequest(endpoint, expectRefresh) {
+ expireCookie(expectedCookieAndAttributes);
+ const auth_response = await fetch(endpoint, { credentials: "include" });
+ assert_equals(auth_response.status, expectRefresh ? 200 : 401);
+ }
+
+ await expireCookieAndTriggerRequest("verify_authenticated.py", /*expectRefresh=*/false);
+ await expireCookieAndTriggerRequest("verify_authenticated_alternate.py", /*expectRefresh=*/true);
+ // This one is marked as included, but excludeInScopeSpecification/ is marked as excluded, and order matters.
+ await expireCookieAndTriggerRequest("excludeInScopeSpecification/excluded_verify_authenticated.py", /*expectRefresh=*/false);
+ await expireCookieAndTriggerRequest("includeInScopeSpecification/included_verify_authenticated.py", /*expectRefresh=*/true);
+ await expireCookieAndTriggerRequest(`${location.protocol}//www1.${location.hostname}:${location.port}/device-bound-session-credentials/verify_authenticated.py`, /*expectRefresh=*/true);
+ await expireCookieAndTriggerRequest(`${location.protocol}//www2.${location.hostname}:${location.port}/device-bound-session-credentials/verify_authenticated.py`, /*expectRefresh=*/false);
+ }, "Scope specification configuration is respected");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/set_cookie.py b/tests/wpt/tests/device-bound-session-credentials/set_cookie.py
new file mode 100644
index 00000000000..73fde3ca523
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/set_cookie.py
@@ -0,0 +1,8 @@
+import importlib
+session_manager = importlib.import_module('device-bound-session-credentials.session_manager')
+
+# The client will ask the server to set a cookie, because client code can't
+# always do so itself (e.g. HttpOnly attribute).
+def main(request, response):
+ request_body = request.body.decode('utf-8')
+ return (200, [("Set-Cookie", request_body)], "")
diff --git a/tests/wpt/tests/device-bound-session-credentials/verify_authenticated.py b/tests/wpt/tests/device-bound-session-credentials/verify_authenticated.py
index fa81f0f0d20..ea4b5a2162a 100644
--- a/tests/wpt/tests/device-bound-session-credentials/verify_authenticated.py
+++ b/tests/wpt/tests/device-bound-session-credentials/verify_authenticated.py
@@ -1,10 +1,5 @@
-def main(request, response):
- expected_cookie_name_and_value = request.body
- if expected_cookie_name_and_value == b"":
- expected_cookie_name_and_value = b"auth_cookie=abcdef0123"
- (expected_name, expected_value) = expected_cookie_name_and_value.split(b"=")
+import importlib
+util = importlib.import_module('device-bound-session-credentials.verify_authenticated_util')
- cookie = request.cookies.get(expected_name)
- if cookie == None or cookie.value != expected_value:
- return (401, response.headers, "")
- return (200, response.headers, "")
+def main(request, response):
+ return util.verify_authenticated(request, response)
diff --git a/tests/wpt/tests/device-bound-session-credentials/verify_authenticated_alternate.py b/tests/wpt/tests/device-bound-session-credentials/verify_authenticated_alternate.py
new file mode 100644
index 00000000000..d4a7dce24b0
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/verify_authenticated_alternate.py
@@ -0,0 +1,5 @@
+import importlib
+util = importlib.import_module('device-bound-session-credentials.verify_authenticated_util')
+
+def main(request, response):
+ return util.verify_authenticated(request, response) \ No newline at end of file
diff --git a/tests/wpt/tests/device-bound-session-credentials/verify_authenticated_util.py b/tests/wpt/tests/device-bound-session-credentials/verify_authenticated_util.py
new file mode 100644
index 00000000000..e9bbb74793e
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/verify_authenticated_util.py
@@ -0,0 +1,16 @@
+def verify_authenticated(request, response):
+ expected_cookie_name_and_value = request.body
+ if expected_cookie_name_and_value == b"":
+ expected_cookie_name_and_value = b"auth_cookie=abcdef0123"
+ (expected_name, expected_value) = expected_cookie_name_and_value.split(b"=")
+
+ headers = []
+ # Only CORS requests need the CORS headers
+ if request.headers.get(b"origin") != None:
+ headers = [(b"Access-Control-Allow-Origin",request.headers.get(b"origin")),
+ (b"Access-Control-Allow-Credentials", b"true")]
+
+ cookie = request.cookies.get(expected_name)
+ if cookie == None or cookie.value != expected_value:
+ return (401, headers, "")
+ return (200, headers, "")
diff --git a/tests/wpt/tests/digital-credentials/META.yml b/tests/wpt/tests/digital-credentials/META.yml
index 7273f019d78..d062affc184 100644
--- a/tests/wpt/tests/digital-credentials/META.yml
+++ b/tests/wpt/tests/digital-credentials/META.yml
@@ -4,3 +4,4 @@ suggested_reviewers:
- samuelgoto
- tplooker
- pkotwicz
+ - mohamedamir
diff --git a/tests/wpt/tests/digital-credentials/default-permissions-policy.https.sub.html b/tests/wpt/tests/digital-credentials/default-permissions-policy.https.sub.html
index b4696293a28..742a94ec4eb 100644
--- a/tests/wpt/tests/digital-credentials/default-permissions-policy.https.sub.html
+++ b/tests/wpt/tests/digital-credentials/default-permissions-policy.https.sub.html
@@ -15,12 +15,12 @@
const cross_origin_src = new URL(same_origin_src, HTTPS_REMOTE_ORIGIN).href;
promise_test(async (test) => {
- await test_driver.bless("user activation for DC" , function() {
- // When passing a correct request, it should succeed, since it is
- // allowed by the permission policy.
- navigator.credentials.get(makeGetOptions("openid4vp"));
- });
-
+ await test_driver.bless("user activation");
+ await promise_rejects_js(
+ test,
+ TypeError,
+ navigator.credentials.get(makeGetOptions([]))
+ );
await test_feature_availability({
feature_description: "Digital Credential API",
diff --git a/tests/wpt/tests/digital-credentials/disabled-by-permissions-policy.https.sub.html b/tests/wpt/tests/digital-credentials/disabled-by-permissions-policy.https.sub.html
index 5c634b1b66d..c32f73aa309 100644
--- a/tests/wpt/tests/digital-credentials/disabled-by-permissions-policy.https.sub.html
+++ b/tests/wpt/tests/digital-credentials/disabled-by-permissions-policy.https.sub.html
@@ -19,7 +19,7 @@
await promise_rejects_dom(
test,
"NotAllowedError",
- navigator.credentials.get(makeGetOptions("openid4vp"))
+ navigator.credentials.get(makeGetOptions([]))
);
}, "Permissions-Policy header digital-credentials-get=() disallows the top-level document.");
@@ -44,6 +44,6 @@
is_promise_test: true,
needs_focus: true,
});
- }, "Permissions-Policy header digital-credentials-get=() cannot be overriden using the allow attribute.");
+ }, "Permissions-Policy header digital-credentials-get=() cannot be overridden using the allow attribute.");
</script>
diff --git a/tests/wpt/tests/digital-credentials/enabled-on-self-origin-by-permissions-policy.https.sub.html b/tests/wpt/tests/digital-credentials/enabled-on-self-origin-by-permissions-policy.https.sub.html
index ec70461e385..d530f4920a3 100644
--- a/tests/wpt/tests/digital-credentials/enabled-on-self-origin-by-permissions-policy.https.sub.html
+++ b/tests/wpt/tests/digital-credentials/enabled-on-self-origin-by-permissions-policy.https.sub.html
@@ -16,11 +16,11 @@
promise_test(async (test) => {
await test_driver.bless("user activation");
- try {
- await navigator.credentials.get(makeGetOptions("openid4vp"));
- } catch (e) {
- assert_unreached();
- }
+ await promise_rejects_js(
+ test,
+ TypeError,
+ navigator.credentials.get(makeGetOptions([]))
+ );
}, "Permissions-Policy header digital-credentials-get=(self) allows the top-level document.");
promise_test(async (test) => {
diff --git a/tests/wpt/tests/dom/xslt/document-function.window.js b/tests/wpt/tests/dom/xslt/document-function.window.js
new file mode 100644
index 00000000000..a01f3b37c94
--- /dev/null
+++ b/tests/wpt/tests/dom/xslt/document-function.window.js
@@ -0,0 +1,43 @@
+const xmlString = `
+<foo>
+ <bar>x</bar>
+ <bar>y</bar>
+</foo>
+`;
+const xsltString = `
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:template match="/">
+ <result>
+ <xsl:apply-templates select="document('resources/test.xml')//static" />
+ <xsl:apply-templates select="foo" />
+ </result>
+ </xsl:template>
+ <xsl:template match="static">
+ <failure />
+ </xsl:template>
+ <xsl:template match="foo">
+ <success />
+ </xsl:template>
+</xsl:stylesheet>
+`;
+const parser = new DOMParser();
+
+const xmlDoc = parser.parseFromString(xmlString, "application/xml");
+const xsltDoc = parser.parseFromString(xsltString, "application/xml");
+const xsltProcessor = new XSLTProcessor();
+
+xsltProcessor.importStylesheet(xsltDoc);
+
+test(() => {
+ const resultFrag = xsltProcessor.transformToFragment(xmlDoc, document);
+ assert_equals(resultFrag.firstChild.localName, "result");
+ assert_true(Array.prototype.every.call(resultFrag.firstChild.children,
+ (e) => e.localName == "success"));
+}, `xsl:document function disabled in transformToFragment`);
+
+test(() => {
+ const resultDoc = xsltProcessor.transformToDocument(xmlDoc);
+ assert_equals(resultDoc.documentElement.localName, "result");
+ assert_true(Array.prototype.every.call(resultDoc.documentElement.children,
+ (e) => e.localName == "success"));
+}, `xsl:document function disabled in transformToDocument`);
diff --git a/tests/wpt/tests/editing/other/delete-selection-with-null-range-crash.html b/tests/wpt/tests/editing/crashtests/delete-selection-with-null-range.html
index 4d814eab807..4d814eab807 100644
--- a/tests/wpt/tests/editing/other/delete-selection-with-null-range-crash.html
+++ b/tests/wpt/tests/editing/crashtests/delete-selection-with-null-range.html
diff --git a/tests/wpt/tests/editing/other/design-mode-textarea-crash.html b/tests/wpt/tests/editing/crashtests/design-mode-textarea.html
index d9f01e41653..d9f01e41653 100644
--- a/tests/wpt/tests/editing/other/design-mode-textarea-crash.html
+++ b/tests/wpt/tests/editing/crashtests/design-mode-textarea.html
diff --git a/tests/wpt/tests/editing/run/empty-editable-crash.html b/tests/wpt/tests/editing/crashtests/empty-editable.html
index eda75a13cd5..eda75a13cd5 100644
--- a/tests/wpt/tests/editing/run/empty-editable-crash.html
+++ b/tests/wpt/tests/editing/crashtests/empty-editable.html
diff --git a/tests/wpt/tests/editing/run/first-letter-crossing-engine-boundary-crash.html b/tests/wpt/tests/editing/crashtests/first-letter-crossing-engine-boundary.html
index be6325fce48..ccea4365a69 100644
--- a/tests/wpt/tests/editing/run/first-letter-crossing-engine-boundary-crash.html
+++ b/tests/wpt/tests/editing/crashtests/first-letter-crossing-engine-boundary.html
@@ -8,10 +8,7 @@
<div id="edit" style="overflow:hidden;" contenteditable>xx</div>
<div id="elm" style="display:none;">PASS</div>
</div>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
<script>
document.body.offsetTop;
elm.style.display = "initial";
- test(()=>{}, "No crash or DCHECK failure");
</script>
diff --git a/tests/wpt/tests/editing/plaintext-only/styling-commands.html b/tests/wpt/tests/editing/plaintext-only/styling-commands.html
index 2afaf9212ac..40390c64279 100644
--- a/tests/wpt/tests/editing/plaintext-only/styling-commands.html
+++ b/tests/wpt/tests/editing/plaintext-only/styling-commands.html
@@ -61,6 +61,9 @@ addEventListener("load", () => {
function onInput(event) {
inputEvent = `input={inputType="${event.inputType}"}`;
}
+ test(() => {
+ assert_false(document.queryCommandEnabled(testing.command));
+ }, `${t.name}: the command should be disabled`);
let ret;
try {
editingHost.addEventListener("input", onInput);
diff --git a/tests/wpt/tests/fledge/tentative/server-response.https.window.js b/tests/wpt/tests/fledge/tentative/server-response.https.window.js
index 5374adb164a..d4eaf0d2512 100644
--- a/tests/wpt/tests/fledge/tentative/server-response.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/server-response.https.window.js
@@ -22,6 +22,7 @@
// META: variant=?55-58
// META: variant=?59-62
// META: variant=?63-66
+// META: variant=?67-70
// These tests focus on the serverResponse field in AuctionConfig, e.g.
// auctions involving bidding and auction services.
@@ -556,12 +557,10 @@ subsetTest(promise_test, async test => {
test, /*expectSuccess=*/ true, msg => {msg.isChaff = false});
}, 'Basic B&A auction - response marked as non-chaff');
-// Disabled while spec clarifying expected behavior is in-progress.
-//
-// subsetTest(promise_test, async test => {
-// await BA.testWithMutatedServerResponse(
-// test, /*expectSuccess=*/ true, msg => {msg.isChaff = 'yes'});
-// }, 'Basic B&A auction - response marked as chaff incorrectly');
+subsetTest(promise_test, async test => {
+ await BA.testWithMutatedServerResponse(
+ test, /*expectSuccess=*/ false, msg => {msg.isChaff = 'yes'});
+}, 'Basic B&A auction - response marked as chaff incorrectly');
subsetTest(promise_test, async test => {
await BA.testWithMutatedServerResponse(
@@ -569,12 +568,10 @@ subsetTest(promise_test, async test => {
msg => {msg.topLevelSeller = 'https://example.org/'});
}, 'Basic B&A auction - incorrectly includes topLevelSeller');
-// Disabled while spec clarifying expected behavior is in-progress.
-//
-// subsetTest(promise_test, async test => {
-// await BA.testWithMutatedServerResponse(
-// test, /*expectSuccess=*/ true, msg => {msg.topLevelSeller = 1});
-// }, 'Basic B&A auction - non-string top-level seller ignored');
+subsetTest(promise_test, async test => {
+ await BA.testWithMutatedServerResponse(
+ test, /*expectSuccess=*/ false, msg => {msg.topLevelSeller = 1});
+}, 'Basic B&A auction - non-string top-level seller invalid');
subsetTest(promise_test, async test => {
await BA.testWithMutatedServerResponse(
@@ -582,12 +579,10 @@ subsetTest(promise_test, async test => {
msg => {msg.topLevelSeller = 'http://example.org/'});
}, 'Basic B&A auction - http:// topLevelSeller is bad, too');
-// Disabled while spec clarifying expected behavior is in-progress.
-//
-// subsetTest(promise_test, async test => {
-// await BA.testWithMutatedServerResponse(
-// test, /*expectSuccess=*/ true, msg => {msg.bid = '10 cents'});
-// }, 'Basic B&A auction - non-number bid is ignored');
+subsetTest(promise_test, async test => {
+ await BA.testWithMutatedServerResponse(
+ test, /*expectSuccess=*/ false, msg => {msg.bid = '10 cents'});
+}, 'Basic B&A auction - non-number bid is invalid');
subsetTest(promise_test, async test => {
await BA.testWithMutatedServerResponse(
diff --git a/tests/wpt/tests/generic-sensor/generic-sensor-iframe-tests.sub.js b/tests/wpt/tests/generic-sensor/generic-sensor-iframe-tests.sub.js
index 277d5d0ea9b..a63729ec2e6 100644
--- a/tests/wpt/tests/generic-sensor/generic-sensor-iframe-tests.sub.js
+++ b/tests/wpt/tests/generic-sensor/generic-sensor-iframe-tests.sub.js
@@ -48,6 +48,11 @@ function run_generic_sensor_iframe_tests(sensorData, readingData) {
}, name, properties);
}
+ promise_setup(async () => {
+ // Ensure window's document starts with focus so that it can receive data.
+ await test_driver.click(document.documentElement);
+ });
+
sensor_test(async (t, readings) => {
// This is a specialized EventWatcher that works with a sensor inside a
// cross-origin iframe. We cannot manipulate the sensor object there
diff --git a/tests/wpt/tests/generic-sensor/generic-sensor-tests.js b/tests/wpt/tests/generic-sensor/generic-sensor-tests.js
index b4ed22554a0..970dc3314c3 100644
--- a/tests/wpt/tests/generic-sensor/generic-sensor-tests.js
+++ b/tests/wpt/tests/generic-sensor/generic-sensor-tests.js
@@ -36,6 +36,12 @@ function runGenericSensorTests(sensorData, readingData) {
}, name, properties);
}
+ promise_setup(async () => {
+ // Ensure window's document has focus so that the global under test can
+ // receive data.
+ await test_driver.click(document.documentElement);
+ });
+
sensor_test(async t => {
await test_driver.set_permission({name: permissionName}, 'denied');
@@ -614,7 +620,7 @@ function runGenericSensorTests(sensorData, readingData) {
immediately accessible to all sensors.`);
// Re-enable after https://github.com/w3c/sensors/issues/361 is fixed.
- // test(() => {
+ // promise_test(async () => {
// assert_throws_dom("NotSupportedError",
// () => { new sensorType({invalid: 1}) });
// assert_throws_dom("NotSupportedError",
@@ -626,7 +632,7 @@ function runGenericSensorTests(sensorData, readingData) {
// }, `${sensorName}: throw 'NotSupportedError' for an unsupported sensor\
// option.`);
- test(() => {
+ promise_test(async () => {
const invalidFreqs = ['invalid', NaN, Infinity, -Infinity, {}];
invalidFreqs.map(freq => {
assert_throws_js(
diff --git a/tests/wpt/tests/hsts/only-top-level-navigation-hsts-upgrade.tentative.sub.html b/tests/wpt/tests/hsts/only-top-level-navigation-hsts-upgrade.tentative.sub.html
new file mode 100644
index 00000000000..be891d05c01
--- /dev/null
+++ b/tests/wpt/tests/hsts/only-top-level-navigation-hsts-upgrade.tentative.sub.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script type="module">
+ // Check HSTS upgrades only apply to top-level (outermost) frame navigations.
+ // Note that this test must be run on an insecure origin because it relies on
+ // insecure iframes being loadable. If it's instead run on a secure origin
+ // then mixed content blocking will prevent HSTS from working.
+
+ // 0) Confirm that insecure iframes can be loaded.
+ // 1) Pin the alt hostname to the HSTS via hsts.html
+ // 2) Attempt to load an iframe via http. This should fail because
+ // http://{{hosts[alt][]}}:{{ports[https][0]}} is an invalid origin *and*
+ // HSTS should not upgrade the iframe navigation to https.
+ // 3) Open a new window and navigate it to the same http origin. This should
+ // successfully be upgraded to https, load, and then postMessage its origin.
+
+ promise_test(async() => {
+
+ function onMessageWithTimeout(name) {
+ return new Promise((resolve, reject) => {
+
+ const timeoutID = step_timeout(() => {
+ reject(new Error("Timeout: Didn't receive message for " + name));
+ onmessage = null;
+ }, 3000);
+
+ onmessage = (event) => {
+ clearTimeout(timeoutID);
+ resolve(event);
+ };
+ });
+ };
+
+ // Step 0.
+ const iframeLoadable = document.createElement('iframe');
+ const iframeLoadablePromise = onMessageWithTimeout("Step 0");
+
+ iframeLoadable.src = "http://{{hosts[][]}}:{{ports[http][0]}}/hsts/resources/hsts.html";
+ document.body.appendChild(iframeLoadable);
+ await iframeLoadablePromise;
+
+ // Step 1.
+ // Add HSTS pin for domain.
+ await fetch("https://{{hosts[alt][]}}:{{ports[https][0]}}/hsts/resources/hsts.html?as-fetch");
+
+ // Step 2.
+ // Note: HTTP, not HTTPS:
+ const hstsIframe = document.createElement('iframe');
+ const hstsIframePromise = onMessageWithTimeout("Step 2")
+ .then(resolve => assert_false(true, "HSTS iframe unexpectedly loaded"),
+ reject => {/*frame didn't load, as expected */});
+
+ hstsIframe.src = "http://{{hosts[alt][]}}:{{ports[https][0]}}/hsts/resources/hsts.html";
+ document.body.appendChild(hstsIframe);
+ await hstsIframePromise;
+
+ // Step 3.
+ const hstsWindowPromise = onMessageWithTimeout("Step 3")
+ .then((event) =>
+ assert_equals(event.data.origin,
+ "https://{{hosts[alt][]}}:{{ports[https][0]}}"));
+
+ const w = window.open("http://{{hosts[alt][]}}:{{ports[https][0]}}/hsts/resources/post-origin-to-opener.html", "_blank");
+ if(!w) {
+ assert_false(true, "Window didn't open. Is there a popup blocker?");
+ }
+
+ await hstsWindowPromise;
+}, "HSTS only navigates top-level");
+
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/hsts/resources/hsts.html b/tests/wpt/tests/hsts/resources/hsts.html
new file mode 100644
index 00000000000..aad90f8b193
--- /dev/null
+++ b/tests/wpt/tests/hsts/resources/hsts.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+ top.postMessage("hsts", "*");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/hsts/resources/hsts.html.headers b/tests/wpt/tests/hsts/resources/hsts.html.headers
new file mode 100644
index 00000000000..1e3f57846f9
--- /dev/null
+++ b/tests/wpt/tests/hsts/resources/hsts.html.headers
@@ -0,0 +1,2 @@
+Strict-Transport-Security: max-age=60
+Access-Control-Allow-Origin: * \ No newline at end of file
diff --git a/tests/wpt/tests/hsts/resources/post-origin-to-opener.html b/tests/wpt/tests/hsts/resources/post-origin-to-opener.html
new file mode 100644
index 00000000000..8d0ac71c29c
--- /dev/null
+++ b/tests/wpt/tests/hsts/resources/post-origin-to-opener.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+ opener.postMessage({ 'origin': self.origin }, '*');
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang-ref.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang-ref.html
index 19e283985cc..0822e6dce16 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang-ref.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang-ref.html
@@ -3,12 +3,12 @@
<title>HTML5 Canvas Test Reference: The lang attribute.</title>
<link rel="author" href="mailto:schenney@chromium.org"/>
<style>
- #canvas-zh {
+ #canvas-en {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-tr {
position: absolute;
top: 120px;
left: 10px;
@@ -19,19 +19,28 @@
var canvas = document.getElementById('canvas-' + language);
var ctx = canvas.getContext('2d');
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
}
function generateReference() {
- drawText('zh');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="generateReference()">
- <canvas lang="zh-CN" id="canvas-zh" width="300" height="100">
+ <canvas lang="en" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas lang="ja" id="canvas-ja" width="300" height="100">
+ <canvas lang="tr" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic-ref.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic-ref.html
index 18027189f39..380162b3566 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic-ref.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic-ref.html
@@ -26,38 +26,47 @@
</style>
<script>
function generateReference() {
- var canvas1 = document.getElementById('canvas1');
- var ctx1 = canvas1.getContext('2d');
- ctx1.font = '25px serif';
- ctx1.fillText('今骨直', 60, 30);
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
- var canvas2 = document.getElementById('canvas2');
- var ctx2 = canvas2.getContext('2d');
- ctx2.font = '25px serif';
- ctx2.fillText('今骨直', 60, 30);
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ var canvas1 = document.getElementById('canvas1');
+ var ctx1 = canvas1.getContext('2d');
+ ctx1.font = '25px Lato-Medium';
+ ctx1.fillText('fi', 60, 30);
- var canvas3 = document.getElementById('canvas3');
- var ctx3 = canvas3.getContext('2d');
- ctx3.font = '25px serif';
- ctx3.fillText('今骨直', 60, 30);
+ var canvas2 = document.getElementById('canvas2');
+ var ctx2 = canvas2.getContext('2d');
+ ctx2.font = '25px Lato-Medium';
+ ctx2.fillText('fi', 60, 30);
- var canvas4 = document.getElementById('canvas4');
- var ctx4 = canvas4.getContext('2d');
- ctx4.font = '25px serif';
- ctx4.fillText('今骨直', 60, 30);
+ var canvas3 = document.getElementById('canvas3');
+ var ctx3 = canvas3.getContext('2d');
+ ctx3.font = '25px Lato-Medium';
+ ctx3.fillText('fi', 60, 30);
+
+ var canvas4 = document.getElementById('canvas4');
+ var ctx4 = canvas4.getContext('2d');
+ ctx4.font = '25px Lato-Medium';
+ ctx4.fillText('fi', 60, 30);
+ });
}
</script>
<body onload="generateReference()">
- <canvas id="canvas1" lang="ja" width="300" height="50">
+ <canvas id="canvas1" lang="en" width="300" height="50">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas2" lang="zh-CN" width="300" height="50">
+ <canvas id="canvas2" lang="tr" width="300" height="50">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas3" lang="ja" width="300" height="50">
+ <canvas id="canvas3" lang="en" width="300" height="50">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas4" lang="zh-CN" width="300" height="50">
+ <canvas id="canvas4" lang="tr" width="300" height="50">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic.html
index ad23b2c2338..b6bf559c1f9 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic.html
@@ -15,24 +15,33 @@
</style>
<script type="text/javascript">
function runTest() {
- var canvas = document.getElementById('canvas1');
- var ctx = canvas.getContext('2d');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 60, 30);
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ var canvas = document.getElementById('canvas1');
+ var ctx = canvas.getContext('2d');
- canvas.setAttribute('lang', 'zh-CN');
- ctx.fillText('今骨直', 60, 80);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 60, 30);
- ctx.lang = 'ja';
- ctx.fillText('今骨直', 60, 130);
+ canvas.setAttribute('lang', 'tr');
+ ctx.fillText('fi', 60, 80);
- ctx.lang = 'inherit';
- ctx.fillText('今骨直', 60, 180);
+ ctx.lang = 'en';
+ ctx.fillText('fi', 60, 130);
+
+ ctx.lang = 'inherit';
+ ctx.fillText('fi', 60, 180);
+ });
}
</script>
<body onload="runTest()">
- <canvas lang="ja" id="canvas1" width="300" height="200">
+ <canvas lang="en" id="canvas1" width="300" height="200">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty-ref.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty-ref.html
index fda8b02a344..580d9dac442 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty-ref.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty-ref.html
@@ -4,13 +4,22 @@
<link rel="author" href="mailto:schenney@chromium.org"/>
<script>
function generateReference() {
- var canvas = document.getElementById('canvas1');
- var ctx = canvas.getContext('2d');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
- // With no lang defined anywhere, this reference will use the unknown
- // language, whatever that might produce on the platform.
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ var canvas = document.getElementById('canvas1');
+ var ctx = canvas.getContext('2d');
+
+ // With no lang defined anywhere, this reference will use the unknown
+ // language, whatever that might produce on the platform.
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
+ });
}
</script>
<body onload="generateReference()">
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty.canvas.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty.canvas.html
index d1b6e52f796..d4495194397 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty.canvas.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty.canvas.html
@@ -8,14 +8,23 @@
<meta name="assert" content="When the lang attribute is the empty string, use the unknown language." />
<script type="text/javascript">
function runTest() {
- var canvas = document.getElementById('canvas1');
- var ctx = canvas.getContext('2d');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
- // An empty lang string should produce the same result as no language
- // attribute at all, on the canvas element or document element.
- ctx.font = '25px serif';
- ctx.lang = '';
- ctx.fillText('今骨直', 5, 50);
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ var canvas = document.getElementById('canvas1');
+ var ctx = canvas.getContext('2d');
+
+ // An empty lang string should produce the same result as no language
+ // attribute at all, on the canvas element or document element.
+ ctx.font = '25px Lato-Medium';
+ ctx.lang = '';
+ ctx.fillText('fi', 5, 50);
+ });
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.html
index 372cf8c04cd..41e146cf75b 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.html
@@ -7,12 +7,12 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="When the canvas context has a lang attribute, override the document." />
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -23,20 +23,29 @@
var canvas = document.getElementById('canvas-' + language);
var ctx = canvas.getContext('2d');
- ctx.font = '25px serif';
+ ctx.font = '25px Lato-Medium';
ctx.lang = language;
- ctx.fillText('今骨直', 5, 50);
+ ctx.fillText('fi', 5, 50);
}
function runTest() {
- drawText('zh-CN');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="runTest()">
- <canvas id="canvas-zh-CN" width="300" height="100">
+ <canvas id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas-ja" width="300" height="100">
+ <canvas id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.html
index 7b28b1fb950..dee7326d244 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.html
@@ -8,12 +8,12 @@
href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="Verify that a disconnected canvas uses the canvas lang."/>
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -29,15 +29,24 @@
canvas.setAttribute('lang', language);
var ctx = canvas.getContext('2d');
- // The default for direction is inherit
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ // The default for lang is inherit
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
document.body.appendChild(canvas);
}
- drawText('zh-CN');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
</script>
</body>
</html>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.document.disconnected.canvas.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html
index e6a463ae375..e16b5c50307 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.document.disconnected.canvas.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html
@@ -1,19 +1,19 @@
<!doctype HTML>
-<html lang="zh-CN">
+<html lang="tr">
<meta charset="utf-8">
- <title>HTML5 Canvas Test: The lang attribute inherits the document lang when disconnected</title>
- <link rel="match" href="canvas.2d.lang-ref.html"/>
+ <title>HTML5 Canvas Test: The lang attribute inherits the unknown lang when disconnected and no lang attribute</title>
+ <link rel="match" href="canvas.2d.unknown.lang-ref.html"/>
<link rel="author" href="mailto:schenney@chromium.org"/>
<link rel="help"
href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
- <meta name="assert" content="Verify that a disconnected canvas with no lang attribute uses the document lang."/>
+ <meta name="assert" content="Verify that a disconnected canvas with no lang attribute uses the unknown lang."/>
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -28,16 +28,25 @@
canvas.setAttribute('id', 'canvas-' + language);
var ctx = canvas.getContext('2d');
- // The default for direction is inherit
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ // The default for lang is inherit
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
document.body.appendChild(canvas);
}
- drawText('zh-CN');
- document.documentElement.setAttribute('lang', 'ja');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ document.documentElement.setAttribute('lang', 'en');
+ drawText('en');
+ });
</script>
</body>
-</html>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.html
index bb2e655e15a..41da3d5c442 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.html
@@ -1,5 +1,5 @@
<!doctype HTML>
-<html lang="ja">
+<html lang="en">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute inherits from the canvas rather than the document</title>
<link rel="match" href="canvas.2d.lang-ref.html" />
@@ -7,39 +7,48 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="When the canvas element has a lang attribute, override the document." />
<style>
- #canvas-zh {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
}
</style>
<script>
- function generateReference() {
- // The 'canvas-zh' element has a lang attribute, use it.
- var canvasZH = document.getElementById('canvas-zh');
- var ctxZH = canvasZH.getContext('2d');
+ function runTest() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
- ctxZH.font = '25px serif';
- ctxZH.fillText('今骨直', 5, 50);
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ // The 'canvas-tr' element has a lang attribute, use it.
+ var canvasTR = document.getElementById('canvas-tr');
+ var ctxTR = canvasTR.getContext('2d');
- // The 'canvas-ja' element has no lang attribute, use the document lang.
- var canvasJA = document.getElementById('canvas-ja');
- var ctxJA = canvasJA.getContext('2d');
+ ctxTR.font = '25px Lato-Medium';
+ ctxTR.fillText('fi', 5, 50);
- ctxJA.font = '25px serif';
- ctxJA.fillText('今骨直', 5, 50);
+ // The 'canvas-en' element has no lang attribute, use the document lang.
+ var canvasEN = document.getElementById('canvas-en');
+ var ctxEN = canvasEN.getContext('2d');
+
+ ctxEN.font = '25px Lato-Medium';
+ ctxEN.fillText('fi', 5, 50);
+ });
}
</script>
- <body onload="generateReference()">
- <canvas lang="zh-CN" id="canvas-zh" width="300" height="100">
+ <body onload="runTest()">
+ <canvas lang="tr" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas-ja" width="300" height="100">
+ <canvas id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.unknown.lang-ref.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.unknown.lang-ref.html
new file mode 100644
index 00000000000..89a2c92af09
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.unknown.lang-ref.html
@@ -0,0 +1,47 @@
+<!doctype HTML>
+<meta charset="utf-8">
+<title>HTML5 Canvas Test Reference: The lang attribute.</title>
+<link rel="author" href="mailto:schenney@chromium.org"/>
+<style>
+ #canvas-en {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ }
+ #canvas-tr {
+ position: absolute;
+ top: 120px;
+ left: 10px;
+ }
+</style>
+<script>
+ function drawText(language) {
+ var canvas = document.getElementById('canvas-' + language);
+ var ctx = canvas.getContext('2d');
+
+ // With no lang attribute anywhere, this will use the unknown language.
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
+ }
+ function generateReference() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
+ }
+</script>
+<body onload="generateReference()">
+ <canvas id="canvas-tr" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas id="canvas-en" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+</body>
diff --git a/tests/wpt/tests/html/canvas/element/text/2d.text.measure.text-clusters-split.tentative.html b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.text-clusters-split.tentative.html
index 63c7cce72be..e4f881d03ad 100644
--- a/tests/wpt/tests/html/canvas/element/text/2d.text.measure.text-clusters-split.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.text-clusters-split.tentative.html
@@ -28,22 +28,22 @@ _addTest(function(canvas, ctx) {
// Should return 6 clusters(A|B|C| |☺️|❤️).
_assertSame(clusters.length, 6, "clusters.length", "6");
// A from position 0 to 1.
- _assertSame(clusters[0].begin, 0, "clusters[\""+(0)+"\"].begin", "0");
+ _assertSame(clusters[0].start, 0, "clusters[\""+(0)+"\"].start", "0");
_assertSame(clusters[0].end, 1, "clusters[\""+(0)+"\"].end", "1");
// B from position 1 to 2.
- _assertSame(clusters[1].begin, 1, "clusters[\""+(1)+"\"].begin", "1");
+ _assertSame(clusters[1].start, 1, "clusters[\""+(1)+"\"].start", "1");
_assertSame(clusters[1].end, 2, "clusters[\""+(1)+"\"].end", "2");
// C from position 2 to 3.
- _assertSame(clusters[2].begin, 2, "clusters[\""+(2)+"\"].begin", "2");
+ _assertSame(clusters[2].start, 2, "clusters[\""+(2)+"\"].start", "2");
_assertSame(clusters[2].end, 3, "clusters[\""+(2)+"\"].end", "3");
// space from position 3 to 4.
- _assertSame(clusters[3].begin, 3, "clusters[\""+(3)+"\"].begin", "3");
+ _assertSame(clusters[3].start, 3, "clusters[\""+(3)+"\"].start", "3");
_assertSame(clusters[3].end, 4, "clusters[\""+(3)+"\"].end", "4");
// ☺️ from position 4 to 6.
- _assertSame(clusters[4].begin, 4, "clusters[\""+(4)+"\"].begin", "4");
+ _assertSame(clusters[4].start, 4, "clusters[\""+(4)+"\"].start", "4");
_assertSame(clusters[4].end, 6, "clusters[\""+(4)+"\"].end", "6");
// ❤️ from position 6 to 8.
- _assertSame(clusters[5].begin, 6, "clusters[\""+(5)+"\"].begin", "6");
+ _assertSame(clusters[5].start, 6, "clusters[\""+(5)+"\"].start", "6");
_assertSame(clusters[5].end, 8, "clusters[\""+(5)+"\"].end", "8");
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang-ref.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang-ref.html
index aa13564fbba..0e54d6a8e2b 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang-ref.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang-ref.html
@@ -3,12 +3,12 @@
<title>HTML5 Canvas Test Reference: The lang attribute in an offscreen canvas</title>
<link rel="author" href="mailto:schenney@chromium.org"/>
<style>
- #canvas-zh {
+ #canvas-en {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-tr {
position: absolute;
top: 120px;
left: 10px;
@@ -19,19 +19,28 @@
var canvas = document.getElementById('canvas-' + language);
var ctx = canvas.getContext('2d');
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
}
function generateReference() {
- drawText('zh');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="generateReference()">
- <canvas lang="zh-CN" id="canvas-zh" width="300" height="100">
+ <canvas lang="en" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas lang="ja" id="canvas-ja" width="300" height="100">
+ <canvas lang="tr" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html
index 0179dad8fea..1d34794f75d 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html
@@ -7,12 +7,12 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="An offscreen canvas respects the lang text attribute." />
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -26,23 +26,33 @@
var offscreen = new OffscreenCanvas(300, 100);
var offscreen_ctx = offscreen.getContext('2d');
- offscreen_ctx.font = '25px serif';
+ offscreen_ctx.font = '25px Lato-Medium';
offscreen_ctx.lang = language;
- offscreen_ctx.fillText('今骨直', 5, 50);
+ offscreen_ctx.fillText('fi', 5, 50);
const bitmap = offscreen.transferToImageBitmap();
bitmap_ctx.transferFromImageBitmap(bitmap);
}
+
function runTest() {
- drawText('zh-CN');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="runTest()">
- <canvas id="canvas-zh-CN" width="300" height="100">
+ <canvas id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas-ja" width="300" height="100">
+ <canvas id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html
index 5b027f6dae0..8916c591082 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html
@@ -1,5 +1,5 @@
<!doctype HTML>
-<html lang="zh-CN">
+<html lang="tr">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute is inherited from the document in offscreen canvas</title>
<link rel="match" href="canvas.2d.offscreen.lang-ref.html" />
@@ -7,12 +7,12 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="An offscreen canvas inherits the lang from the document." />
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -26,24 +26,33 @@
var offscreen = new OffscreenCanvas(300, 100);
var offscreen_ctx = offscreen.getContext('2d');
- offscreen_ctx.font = '25px serif';
- offscreen_ctx.fillText('今骨直', 5, 50);
+ offscreen_ctx.font = '25px Lato-Medium';
+ offscreen_ctx.fillText('fi', 5, 50);
const bitmap = offscreen.transferToImageBitmap();
bitmap_ctx.transferFromImageBitmap(bitmap);
}
function runTest() {
- drawText('zh-CN');
- document.documentElement.setAttribute('lang', 'ja');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ document.documentElement.setAttribute('lang', 'en');
+ drawText('en');
+ });
}
</script>
<body onload="runTest()">
- <canvas lang="zh-CN" id="canvas-zh-CN" width="300" height="100">
+ <canvas lang="tr" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas lang="ja" id="canvas-ja" width="300" height="100">
+ <canvas lang="en" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html
index 049f5484058..051d21ca7f5 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html
@@ -7,12 +7,12 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="Verify that setting lang in a transferred offscreen works." />
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -23,20 +23,30 @@
var canvas = document.getElementById('canvas-' + language);
var ctx = canvas.transferControlToOffscreen().getContext('2d');
- ctx.font = '25px serif';
+ ctx.font = '25px Lato-Medium';
ctx.lang = language;
- ctx.fillText('今骨直', 5, 50);
+ ctx.fillText('fi', 5, 50);
}
+
function runTest() {
- drawText('zh-CN');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="runTest()">
- <canvas lang="zh-CN" id="canvas-zh-CN" width="300" height="100">
+ <canvas lang="tr" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas lang="ja" id="canvas-ja" width="300" height="100">
+ <canvas lang="en" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html
index 732496c93b0..243392874a2 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html
@@ -1,5 +1,5 @@
<!doctype HTML>
-<html lang="zh-CN">
+<html lang="tr">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute inherits from the canvas in a transferred offscreen</title>
<link rel="match" href="canvas.2d.offscreen.lang-ref.html" />
@@ -7,12 +7,12 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="An offscreen transferred from a canvas inherits the document language." />
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -24,21 +24,30 @@
var ctx = canvas.transferControlToOffscreen().getContext('2d');
// The default for lang is inherit
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
}
- function runTest() {
- drawText('zh-CN');
- document.documentElement.setAttribute('lang', 'ja');
- drawText('ja');
+ function runTest() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ document.documentElement.setAttribute('lang', 'en');
+ drawText('en');
+ });
}
</script>
<body onload="runTest()">
- <canvas lang="zh-CN" id="canvas-zh-CN" width="300" height="100">
+ <canvas lang="tr" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas lang="ja" id="canvas-ja" width="300" height="100">
+ <canvas lang="en" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html
index 9ffb6a49306..ffd0ae4aae5 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html
@@ -7,12 +7,12 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="An offscreen transferred from a canvas element inherits the canvas language." />
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -24,19 +24,28 @@
var ctx = canvas.transferControlToOffscreen().getContext('2d');
// The default for lang is inherit
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
}
function runTest() {
- drawText('zh-CN');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="runTest()">
- <canvas lang="zh-CN" id="canvas-zh-CN" width="300" height="100">
+ <canvas lang="tr" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas lang="ja" id="canvas-ja" width="300" height="100">
+ <canvas lang="en" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang-ref.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang-ref.html
index 82b6e731639..551a092b234 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang-ref.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang-ref.html
@@ -3,12 +3,12 @@
<title>HTML5 Canvas Test Reference: The lang attribute in an offscreen worker</title>
<link rel="author" href="mailto:schenney@chromium.org"/>
<style>
- #canvas-zh-CN {
+ #canvas-en {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-tr {
position: absolute;
top: 120px;
left: 10px;
@@ -19,22 +19,31 @@
var canvas = document.getElementById('canvas-' + language);
var ctx = canvas.getContext('2d');
- ctx.font = '25px serif';
- ctx.fillText('今骨直', 5, 50);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
ctx.fillStyle = '#0f0';
ctx.fillRect(0, 0, 1, 1);
}
function generateReference() {
- drawText('zh-CN');
- drawText('ja');
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ });
}
</script>
<body onload="generateReference()">
- <canvas id="canvas-zh-CN" lang="zh-CN" width="300" height="100">
+ <canvas lang="en" id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas-ja" lang="ja" width="300" height="100">
+ <canvas lang="tr" id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.html
index ed438c68f91..8ed884a1775 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.html
@@ -8,12 +8,12 @@
<meta name="assert" content="An offscreen canvas in a worker respects the lang text attribute." />
<script src="/common/reftest-wait.js"></script>
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -21,34 +21,34 @@
</style>
<script type="text/javascript">
function runTest() {
- const placeholder_canvas_zh = document.createElement('canvas');
- placeholder_canvas_zh.setAttribute('width', '300');
- placeholder_canvas_zh.setAttribute('height', '100');
- const offscreen_zh = placeholder_canvas_zh.transferControlToOffscreen();
+ const placeholder_canvas_tr = document.createElement('canvas');
+ placeholder_canvas_tr.setAttribute('width', '300');
+ placeholder_canvas_tr.setAttribute('height', '100');
+ const offscreen_tr = placeholder_canvas_tr.transferControlToOffscreen();
- const worker_zh = new Worker('text-lang-worker-zh-CN.js');
- worker_zh.postMessage({canvas: offscreen_zh}, [offscreen_zh]);
+ const worker_tr = new Worker('text-lang-worker-tr.js');
+ worker_tr.postMessage({canvas: offscreen_tr}, [offscreen_tr]);
- const placeholder_canvas_ja = document.createElement('canvas');
- placeholder_canvas_ja.setAttribute('width', '300');
- placeholder_canvas_ja.setAttribute('height', '100');
- const offscreen_ja = placeholder_canvas_ja.transferControlToOffscreen();
+ const placeholder_canvas_en = document.createElement('canvas');
+ placeholder_canvas_en.setAttribute('width', '300');
+ placeholder_canvas_en.setAttribute('height', '100');
+ const offscreen_en = placeholder_canvas_en.transferControlToOffscreen();
- const worker_ja = new Worker('text-lang-worker-ja.js');
- worker_ja.postMessage({canvas: offscreen_ja}, [offscreen_ja]);
+ const worker_en = new Worker('text-lang-worker-en.js');
+ worker_en.postMessage({canvas: offscreen_en}, [offscreen_en]);
- const canvas_zh = document.getElementById('canvas-zh-CN');
- const ctx_zh = canvas_zh.getContext('2d', {willReadFrequently: true});
- const canvas_ja = document.getElementById('canvas-ja');
- const ctx_ja = canvas_ja.getContext('2d', {willReadFrequently: true});
+ const canvas_tr = document.getElementById('canvas-tr');
+ const ctx_tr = canvas_tr.getContext('2d', {willReadFrequently: true});
+ const canvas_en = document.getElementById('canvas-en');
+ const ctx_en = canvas_en.getContext('2d', {willReadFrequently: true});
function checkResult() {
// Wait until frame propagates.
- ctx_zh.drawImage(placeholder_canvas_zh, 0, 0);
- const pixel_zh = ctx_zh.getImageData(0, 0, 1, 1).data;
- ctx_ja.drawImage(placeholder_canvas_ja, 0, 0);
- const pixel_ja = ctx_ja.getImageData(0, 0, 1, 1).data;
+ ctx_tr.drawImage(placeholder_canvas_tr, 0, 0);
+ const pixel_tr = ctx_tr.getImageData(0, 0, 1, 1).data;
+ ctx_en.drawImage(placeholder_canvas_en, 0, 0);
+ const pixel_en = ctx_en.getImageData(0, 0, 1, 1).data;
- if (pixel_zh[3] == 0 || pixel_ja[3] == 0) {
+ if (pixel_tr[3] == 0 || pixel_en[3] == 0) {
// Results not available, wait longer.
requestAnimationFrame(checkResult);
} else {
@@ -59,10 +59,10 @@
}
</script>
<body onload="runTest()">
- <canvas id="canvas-zh-CN" width="300" height="100">
+ <canvas id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas-ja" width="300" height="100">
+ <canvas id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.inherit.html b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.inherit.html
index ca0d0ffeee6..43157d54d2b 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.inherit.html
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.inherit.html
@@ -8,12 +8,12 @@
<meta name="assert" content="An offscreen canvas in a worker inherits the lang attribute." />
<script src="/common/reftest-wait.js"></script>
<style>
- #canvas-zh-CN {
+ #canvas-tr {
position: absolute;
top: 10px;
left: 10px;
}
- #canvas-ja {
+ #canvas-en {
position: absolute;
top: 120px;
left: 10px;
@@ -21,36 +21,36 @@
</style>
<script type="text/javascript">
function runTest() {
- const placeholder_canvas_zh = document.createElement('canvas');
- placeholder_canvas_zh.setAttribute('width', '300');
- placeholder_canvas_zh.setAttribute('height', '100');
- placeholder_canvas_zh.setAttribute('lang', 'zh-CN');
- const offscreen_zh = placeholder_canvas_zh.transferControlToOffscreen();
+ const placeholder_canvas_tr = document.createElement('canvas');
+ placeholder_canvas_tr.setAttribute('width', '300');
+ placeholder_canvas_tr.setAttribute('height', '100');
+ placeholder_canvas_tr.setAttribute('lang', 'tr');
+ const offscreen_tr = placeholder_canvas_tr.transferControlToOffscreen();
- const worker_zh = new Worker('text-lang-worker-inherit.js');
- worker_zh.postMessage({canvas: offscreen_zh}, [offscreen_zh]);
+ const worker_tr = new Worker('text-lang-worker-inherit.js');
+ worker_tr.postMessage({canvas: offscreen_tr}, [offscreen_tr]);
- const placeholder_canvas_ja = document.createElement('canvas');
- placeholder_canvas_ja.setAttribute('width', '300');
- placeholder_canvas_ja.setAttribute('height', '100');
- placeholder_canvas_zh.setAttribute('lang', 'ja');
- const offscreen_ja = placeholder_canvas_ja.transferControlToOffscreen();
+ const placeholder_canvas_en = document.createElement('canvas');
+ placeholder_canvas_en.setAttribute('width', '300');
+ placeholder_canvas_en.setAttribute('height', '100');
+ placeholder_canvas_en.setAttribute('lang', 'en');
+ const offscreen_en = placeholder_canvas_en.transferControlToOffscreen();
- const worker_ja = new Worker('text-lang-worker-inherit.js');
- worker_ja.postMessage({canvas: offscreen_ja}, [offscreen_ja]);
+ const worker_en = new Worker('text-lang-worker-inherit.js');
+ worker_en.postMessage({canvas: offscreen_en}, [offscreen_en]);
- const canvas_zh = document.getElementById('canvas-zh-CN');
- const ctx_zh = canvas_zh.getContext('2d', {willReadFrequently: true});
- const canvas_ja = document.getElementById('canvas-ja');
- const ctx_ja = canvas_ja.getContext('2d', {willReadFrequently: true});
+ const canvas_tr = document.getElementById('canvas-tr');
+ const ctx_tr = canvas_tr.getContext('2d', {willReadFrequently: true});
+ const canvas_en = document.getElementById('canvas-en');
+ const ctx_en = canvas_en.getContext('2d', {willReadFrequently: true});
function checkResult() {
// Wait until frame propagates.
- ctx_zh.drawImage(placeholder_canvas_zh, 0, 0);
- const pixel_zh = ctx_zh.getImageData(0, 0, 1, 1).data;
- ctx_ja.drawImage(placeholder_canvas_ja, 0, 0);
- const pixel_ja = ctx_ja.getImageData(0, 0, 1, 1).data;
+ ctx_tr.drawImage(placeholder_canvas_tr, 0, 0);
+ const pixel_tr = ctx_tr.getImageData(0, 0, 1, 1).data;
+ ctx_en.drawImage(placeholder_canvas_en, 0, 0);
+ const pixel_en = ctx_en.getImageData(0, 0, 1, 1).data;
- if (pixel_zh[3] == 0 || pixel_ja[3] == 0) {
+ if (pixel_tr[3] == 0 || pixel_en[3] == 0) {
// Results not available, wait longer.
requestAnimationFrame(checkResult);
} else {
@@ -61,10 +61,10 @@
}
</script>
<body onload="runTest()">
- <canvas id="canvas-zh-CN" width="300" height="100">
+ <canvas id="canvas-tr" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
- <canvas id="canvas-ja" width="300" height="100">
+ <canvas id="canvas-en" width="300" height="100">
Browser does not support HTML5 Canvas.
</canvas>
</body>
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-en.js b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-en.js
new file mode 100644
index 00000000000..08958811348
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-en.js
@@ -0,0 +1,21 @@
+self.onmessage = function(e) {
+ const offscreen = e.data.canvas;
+ offscreen_ctx = offscreen.getContext('2d');
+
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ self.fonts.add(font);
+ offscreen_ctx.font = '25px Lato-Medium';
+ offscreen_ctx.lang = 'en';
+ offscreen_ctx.fillText('fi', 5, 50);
+
+ // Draw a single pixel, used to detect that the worker has completed.
+ offscreen_ctx.fillStyle = '#0f0';
+ offscreen_ctx.fillRect(0, 0, 1, 1);
+ });
+}
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-inherit.js b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-inherit.js
index 20d96d94c93..6bc3371faf2 100644
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-inherit.js
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-inherit.js
@@ -2,10 +2,19 @@ self.onmessage = function(e) {
const offscreen = e.data.canvas;
offscreen_ctx = offscreen.getContext('2d');
- offscreen_ctx.font = '25px serif';
- offscreen_ctx.fillText('今骨直', 5, 50);
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
- // Draw a single pixel, used to detect that the worker has completed.
- offscreen_ctx.fillStyle = '#0f0';
- offscreen_ctx.fillRect(0, 0, 1, 1);
+ test_font.load().then((font) => {
+ self.fonts.add(font);
+ offscreen_ctx.font = '25px Lato-Medium';
+ offscreen_ctx.fillText('fi', 5, 50);
+
+ // Draw a single pixel, used to detect that the worker has completed.
+ offscreen_ctx.fillStyle = '#0f0';
+ offscreen_ctx.fillRect(0, 0, 1, 1);
+ });
}
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-ja.js b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-ja.js
deleted file mode 100644
index 585fc066ac3..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-ja.js
+++ /dev/null
@@ -1,12 +0,0 @@
-self.onmessage = function(e) {
- const offscreen = e.data.canvas;
- offscreen_ctx = offscreen.getContext('2d');
-
- offscreen_ctx.font = '25px serif';
- offscreen_ctx.lang = 'ja';
- offscreen_ctx.fillText('今骨直', 5, 50);
-
- // Draw a single pixel, used to detect that the worker has completed.
- offscreen_ctx.fillStyle = '#0f0';
- offscreen_ctx.fillRect(0, 0, 1, 1);
-}
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-tr.js b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-tr.js
new file mode 100644
index 00000000000..5cf708a4a02
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-tr.js
@@ -0,0 +1,21 @@
+self.onmessage = function(e) {
+ const offscreen = e.data.canvas;
+ offscreen_ctx = offscreen.getContext('2d');
+
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/css/css-fonts/support/fonts/Lato-Medium.ttf)"
+ );
+
+ test_font.load().then((font) => {
+ self.fonts.add(font);
+ offscreen_ctx.font = '25px Lato-Medium';
+ offscreen_ctx.lang = 'tr';
+ offscreen_ctx.fillText('fi', 5, 50);
+
+ // Draw a single pixel, used to detect that the worker has completed.
+ offscreen_ctx.fillStyle = '#0f0';
+ offscreen_ctx.fillRect(0, 0, 1, 1);
+ });
+}
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-zh-CN.js b/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-zh-CN.js
deleted file mode 100644
index cbededf3384..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/manual/text/text-lang-worker-zh-CN.js
+++ /dev/null
@@ -1,12 +0,0 @@
-self.onmessage = function(e) {
- const offscreen = e.data.canvas;
- offscreen_ctx = offscreen.getContext('2d');
-
- offscreen_ctx.font = '25px serif';
- offscreen_ctx.lang = 'zh-CN';
- offscreen_ctx.fillText('今骨直', 5, 50);
-
- // Draw a single pixel, used to detect that the worker has completed.
- offscreen_ctx.fillStyle = '#0f0';
- offscreen_ctx.fillRect(0, 0, 1, 1);
-}
diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.html b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.html
index 6a5fd475795..cf24a873c31 100644
--- a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.html
@@ -29,22 +29,22 @@ t.step(function() {
// Should return 6 clusters(A|B|C| |☺️|❤️).
_assertSame(clusters.length, 6, "clusters.length", "6");
// A from position 0 to 1.
- _assertSame(clusters[0].begin, 0, "clusters[\""+(0)+"\"].begin", "0");
+ _assertSame(clusters[0].start, 0, "clusters[\""+(0)+"\"].start", "0");
_assertSame(clusters[0].end, 1, "clusters[\""+(0)+"\"].end", "1");
// B from position 1 to 2.
- _assertSame(clusters[1].begin, 1, "clusters[\""+(1)+"\"].begin", "1");
+ _assertSame(clusters[1].start, 1, "clusters[\""+(1)+"\"].start", "1");
_assertSame(clusters[1].end, 2, "clusters[\""+(1)+"\"].end", "2");
// C from position 2 to 3.
- _assertSame(clusters[2].begin, 2, "clusters[\""+(2)+"\"].begin", "2");
+ _assertSame(clusters[2].start, 2, "clusters[\""+(2)+"\"].start", "2");
_assertSame(clusters[2].end, 3, "clusters[\""+(2)+"\"].end", "3");
// space from position 3 to 4.
- _assertSame(clusters[3].begin, 3, "clusters[\""+(3)+"\"].begin", "3");
+ _assertSame(clusters[3].start, 3, "clusters[\""+(3)+"\"].start", "3");
_assertSame(clusters[3].end, 4, "clusters[\""+(3)+"\"].end", "4");
// ☺️ from position 4 to 6.
- _assertSame(clusters[4].begin, 4, "clusters[\""+(4)+"\"].begin", "4");
+ _assertSame(clusters[4].start, 4, "clusters[\""+(4)+"\"].start", "4");
_assertSame(clusters[4].end, 6, "clusters[\""+(4)+"\"].end", "6");
// ❤️ from position 6 to 8.
- _assertSame(clusters[5].begin, 6, "clusters[\""+(5)+"\"].begin", "6");
+ _assertSame(clusters[5].start, 6, "clusters[\""+(5)+"\"].start", "6");
_assertSame(clusters[5].end, 8, "clusters[\""+(5)+"\"].end", "8");
t.done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.worker.js
index f98c323e0e2..e8d7519b48a 100644
--- a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.text-clusters-split.tentative.worker.js
@@ -24,22 +24,22 @@ t.step(function() {
// Should return 6 clusters(A|B|C| |☺️|❤️).
_assertSame(clusters.length, 6, "clusters.length", "6");
// A from position 0 to 1.
- _assertSame(clusters[0].begin, 0, "clusters[\""+(0)+"\"].begin", "0");
+ _assertSame(clusters[0].start, 0, "clusters[\""+(0)+"\"].start", "0");
_assertSame(clusters[0].end, 1, "clusters[\""+(0)+"\"].end", "1");
// B from position 1 to 2.
- _assertSame(clusters[1].begin, 1, "clusters[\""+(1)+"\"].begin", "1");
+ _assertSame(clusters[1].start, 1, "clusters[\""+(1)+"\"].start", "1");
_assertSame(clusters[1].end, 2, "clusters[\""+(1)+"\"].end", "2");
// C from position 2 to 3.
- _assertSame(clusters[2].begin, 2, "clusters[\""+(2)+"\"].begin", "2");
+ _assertSame(clusters[2].start, 2, "clusters[\""+(2)+"\"].start", "2");
_assertSame(clusters[2].end, 3, "clusters[\""+(2)+"\"].end", "3");
// space from position 3 to 4.
- _assertSame(clusters[3].begin, 3, "clusters[\""+(3)+"\"].begin", "3");
+ _assertSame(clusters[3].start, 3, "clusters[\""+(3)+"\"].start", "3");
_assertSame(clusters[3].end, 4, "clusters[\""+(3)+"\"].end", "4");
// ☺️ from position 4 to 6.
- _assertSame(clusters[4].begin, 4, "clusters[\""+(4)+"\"].begin", "4");
+ _assertSame(clusters[4].start, 4, "clusters[\""+(4)+"\"].start", "4");
_assertSame(clusters[4].end, 6, "clusters[\""+(4)+"\"].end", "6");
// ❤️ from position 6 to 8.
- _assertSame(clusters[5].begin, 6, "clusters[\""+(5)+"\"].begin", "6");
+ _assertSame(clusters[5].start, 6, "clusters[\""+(5)+"\"].start", "6");
_assertSame(clusters[5].end, 8, "clusters[\""+(5)+"\"].end", "8");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/tools/yaml/text.yaml b/tests/wpt/tests/html/canvas/tools/yaml/text.yaml
index c572f00cb0c..48a0429f267 100644
--- a/tests/wpt/tests/html/canvas/tools/yaml/text.yaml
+++ b/tests/wpt/tests/html/canvas/tools/yaml/text.yaml
@@ -2058,22 +2058,22 @@
// Should return 6 clusters(A|B|C| |☺️|❤️).
@assert clusters.length === 6;
// A from position 0 to 1.
- @assert clusters[0].begin === 0;
+ @assert clusters[0].start === 0;
@assert clusters[0].end === 1;
// B from position 1 to 2.
- @assert clusters[1].begin === 1;
+ @assert clusters[1].start === 1;
@assert clusters[1].end === 2;
// C from position 2 to 3.
- @assert clusters[2].begin === 2;
+ @assert clusters[2].start === 2;
@assert clusters[2].end === 3;
// space from position 3 to 4.
- @assert clusters[3].begin === 3;
+ @assert clusters[3].start === 3;
@assert clusters[3].end === 4;
// ☺️ from position 4 to 6.
- @assert clusters[4].begin === 4;
+ @assert clusters[4].start === 4;
@assert clusters[4].end === 6;
// ❤️ from position 6 to 8.
- @assert clusters[5].begin === 6;
+ @assert clusters[5].start === 6;
@assert clusters[5].end === 8;
- name: 2d.text.measure.text-clusters-exceptions.tentative
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-idl.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-idl.html
new file mode 100644
index 00000000000..dfeee855dcb
--- /dev/null
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-idl.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://html.spec.whatwg.org/#the-hidden-attribute">
+<link rel=helph href="https://issues.chromium.org/issues/402108887">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id=target>div</div>
+
+<script>
+test(() => {
+ const target = document.getElementById('target');
+ target.setAttribute('hidden', 'UNTIL-FOUND');
+ assert_equals(target.hidden, 'until-found');
+ target.setAttribute('hidden', 'uNtIl-FoUnD');
+ assert_equals(target.hidden, 'until-found');
+ target.setAttribute('hidden', 'until-found');
+ assert_equals(target.hidden, 'until-found');
+}, 'element.hidden should return "until-found" regardless of uppercase letters.');
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/load-removes-queued-error-event.html b/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/load-removes-queued-error-event.html
index 54d5c28dad5..f7cfabf64b6 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/load-removes-queued-error-event.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/media-elements/loading-the-media-resource/load-removes-queued-error-event.html
@@ -23,7 +23,26 @@ async_test(function(t) {
}
});
v.src = '';
-}, 'video error event');
+}, 'video error event with load()');
+
+async_test(function(t) {
+ var v = document.createElement('video');
+ var events = [];
+ v.onloadstart = v.onerror = v.onsuspend = t.step_func(function(e) {
+ events.push(e.type);
+ if (events.length == 1) {
+ // Wait for a usable resource to check that no 'error' event is pending.
+ v.src = '/media/sound_0.mp3';
+ } else if (events.length == 3) {
+ // 'suspend' is queued "if the user agent intends to not attempt to
+ // fetch the resource", "when a media element's download has been
+ // suspended", or "once the entire media resource has been fetched".
+ assert_array_equals(events, ['loadstart', 'loadstart', 'suspend']);
+ t.done();
+ }
+ });
+ v.src = '';
+}, 'video error event with src resource');
async_test(function(t) {
var v = document.createElement('video');
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html b/tests/wpt/tests/html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html
index b2d3b53b558..f7d47b3640d 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html
@@ -15,12 +15,9 @@
<img srcset="/images/green-256x256.png 256w" sizes="1px" data-expect="1">
<img srcset="/images/green-256x256.png 256w" sizes="0px" data-expect="0">
<!-- SVG -->
-<img srcset="data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20width='20'%20height='20'><circle%20r='1'/></svg> 2x"
- data-expect="10">
-<img srcset="data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20width='20'><circle%20r='1'/></svg> 2x"
- data-expect="10" data-expect-natural-height="0">
-<img srcset="data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20height='20'><circle%20r='1'/></svg> 2x"
- data-expect="10" data-expect-natural-width="0">
+<img srcset="data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20width='20'%20height='20'><circle%20r='1'/></svg> 2x" data-expect="10">
+<img srcset="data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20width='20'><circle%20r='1'/></svg> 2x" data-expect="10">
+<img srcset="data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='-1%20-1%202%202'%20height='20'><circle%20r='1'/></svg> 2x" data-expect="10">
<script>
setup({explicit_done:true});
onload = function() {
@@ -31,12 +28,8 @@ onload = function() {
assert_equals(img.height, expected, 'height');
assert_equals(img.clientWidth, expected, 'clientWidth');
assert_equals(img.clientHeight, expected, 'clientHeight');
- const expectedNaturalWidth =
- parseFloat(img.dataset.expectNaturalWidth ?? img.dataset.expect);
- assert_equals(img.naturalWidth, expectedNaturalWidth, 'naturalWidth');
- const expectedNaturalHeight =
- parseFloat(img.dataset.expectNaturalHeight ?? img.dataset.expect);
- assert_equals(img.naturalHeight, expectedNaturalHeight, 'naturalHeight');
+ assert_equals(img.naturalWidth, expected, 'naturalWidth');
+ assert_equals(img.naturalHeight, expected, 'naturalHeight');
}, img.outerHTML);
});
done();
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-img-element/naturalWidth-naturalHeight.html b/tests/wpt/tests/html/semantics/embedded-content/the-img-element/naturalWidth-naturalHeight.html
new file mode 100644
index 00000000000..19aa4b9344f
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-img-element/naturalWidth-naturalHeight.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<title>HTMLImageElement.prototype.naturalWidth/naturalHeight</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<img src="resources/cat.jpg"
+ title="raster image" data-width="320" data-height="240">
+<img src="resources/cat.jpg" width="10" height="10"
+ title="raster image with width/height attributes" data-width="320" data-height="240">
+<img src="non-existent.jpg"
+ title="non existent image, no natural dimensions" data-width="0" data-height="0">
+<img src="non-existent.jpg" width="10" height="10"
+ title="non existent image with width/height attributes, no natural dimensions" data-width="0" data-height="0">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>"
+ title="SVG image, no natural dimensions" data-width="0" data-height="0">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='500' height='400'></svg>"
+ title="SVG image, width/height in pixels" data-width="500" data-height="400">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='500'></svg>"
+ title="SVG image, width in pixels; height unspecified" data-width="500" data-height="0">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='500' height='100%'></svg>"
+ title="SVG image, width in pixels; percentage height" data-width="500" data-height="0">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='500' height='400' viewBox='0 0 800 600'></svg>"
+ title="SVG image, width/height in pixels; viewBox" data-width="500" data-height="400">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 600'></svg>"
+ title="SVG image, width/height unspecified; viewBox" data-width="0" data-height="0">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='400' viewBox='0 0 800 600'></svg>"
+ title="SVG image, width in pixels; height unspecified; viewBox" data-width="400" data-height="300">
+<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' height='300' viewBox='0 0 800 600'></svg>"
+ title="SVG image, width unspecified; height in pixels; viewBox" data-width="400" data-height="300">
+<script>
+setup({explicit_done:true});
+onload = function() {
+ Array.from(document.images).forEach(img => {
+ test(function() {
+ const expectedWidth = parseFloat(img.dataset.width);
+ const expectedHeight = parseFloat(img.dataset.height);
+ assert_equals(img.naturalWidth, expectedWidth, 'naturalWidth');
+ assert_equals(img.naturalHeight, expectedHeight, 'naturalHeight');
+ }, `${document.title}, ${img.title}`);
+ });
+ done();
+};
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css
index 9cac1c5899c..13a500a6197 100644
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/resources/customizable-select-styles.css
@@ -74,6 +74,10 @@
min-block-size: max(24px, 1lh);
}
+.customizable-select-button.disabled {
+ color: color-mix(in srgb, currentColor 50%, transparent);
+}
+
.customizable-select-button.hover {
background-color: color-mix(in lab, currentColor 10%, transparent);
}
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled-ref.html
new file mode 100644
index 00000000000..cee0175b715
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled-ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/customizable-select-styles.css">
+
+<div class="customizable-select-button disabled" popovertarget=popover id=button>
+ <span class=customizable-select-selectedcontent>option</span>
+</div>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled.tentative.html
new file mode 100644
index 00000000000..a20fb4e0904
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-appearance-disabled.tentative.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta name=fuzzy content="maxDifference=0-41;totalPixels=0-1">
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/w3c/csswg-drafts/issues/10857">
+<link rel=match href="select-appearance-disabled-ref.html">
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+<select disabled>
+ <option>option</option>
+</select>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-events.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-events.tentative.html
index 28abf1534c1..2a9280e1ae8 100644
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-events.tentative.html
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-events.tentative.html
@@ -48,7 +48,13 @@
eventList = [];
}
function getEventHandler(description) {
- return (e) => eventList.push(`${e.type} on ${e.target.className} at ${description}`);
+ return (e) => {
+ let focused = '';
+ if (e.type == 'keydown' || e.type == 'keyup') {
+ focused = ` focused: ${document.activeElement.className || document.activeElement.tagName}.`;
+ }
+ eventList.push(`${e.type} on ${e.target.className} at ${description}. open: ${select.matches(':open')}.${focused}`);
+ };
}
events.forEach(evt => wrapper.addEventListener(evt,getEventHandler('wrapper')));
events.forEach(evt => select.addEventListener(evt,getEventHandler('select')));
@@ -58,12 +64,18 @@
await test_driver.click(select);
assert_true(select.matches(':open'));
assert_events([
- 'pointerdown on select at select', 'pointerdown on select at wrapper',
- 'mousedown on select at select', 'mousedown on select at wrapper',
- 'focusin on option1 at select', 'focusin on option1 at wrapper',
- 'pointerup on select at select', 'pointerup on select at wrapper',
- 'mouseup on select at select', 'mouseup on select at wrapper',
- 'click on select at select', 'click on select at wrapper'
+ 'pointerdown on select at select. open: false.',
+ 'pointerdown on select at wrapper. open: false.',
+ 'mousedown on select at select. open: false.',
+ 'mousedown on select at wrapper. open: false.',
+ 'focusin on option1 at select. open: true.',
+ 'focusin on option1 at wrapper. open: true.',
+ 'pointerup on select at select. open: true.',
+ 'pointerup on select at wrapper. open: true.',
+ 'mouseup on select at select. open: true.',
+ 'mouseup on select at wrapper. open: true.',
+ 'click on select at select. open: true.',
+ 'click on select at wrapper. open: true.'
],'after showing, events from test_driver.click');
// Press arrow-down, and preventDefault
@@ -71,18 +83,24 @@
await test_driver.send_keys(document.activeElement, keys.ArrowDown);
assert_equals(select.selectedOptions[0].innerText,'one');
assert_events([
- 'keydown on option1 at select', 'keydown on option1 at wrapper',
- 'keyup on option1 at select', 'keyup on option1 at wrapper'
+ 'keydown on option1 at select. open: true. focused: option1.',
+ 'keydown on option1 at wrapper. open: true. focused: option1.',
+ 'keyup on option1 at select. open: true. focused: option1.',
+ 'keyup on option1 at wrapper. open: true. focused: option1.'
],'arrow down, with preventDefault');
// Press arrow-down, no preventDefault
await test_driver.send_keys(document.activeElement, keys.ArrowDown);
assert_equals(select.selectedOptions[0].innerText,'one','selection does not follow focus');
assert_events([
- 'keydown on option1 at select', 'keydown on option1 at wrapper',
- 'focusout on option1 at select', 'focusout on option1 at wrapper',
- 'focusin on option2 at select', 'focusin on option2 at wrapper',
- 'keyup on option2 at select', 'keyup on option2 at wrapper'
+ 'keydown on option1 at select. open: true. focused: option1.',
+ 'keydown on option1 at wrapper. open: true. focused: option1.',
+ 'focusout on option1 at select. open: true.',
+ 'focusout on option1 at wrapper. open: true.',
+ 'focusin on option2 at select. open: true.',
+ 'focusin on option2 at wrapper. open: true.',
+ 'keyup on option2 at select. open: true. focused: option2.',
+ 'keyup on option2 at wrapper. open: true. focused: option2.'
],'arrow down, no preventDefault');
// Press escape, and preventDefault
@@ -90,18 +108,24 @@
await test_driver.send_keys(document.activeElement, keys.Escape);
assert_true(select.matches(':open'));
assert_events([
- 'keydown on option2 at select', 'keydown on option2 at wrapper',
- 'keyup on option2 at select', 'keyup on option2 at wrapper'
+ 'keydown on option2 at select. open: true. focused: option2.',
+ 'keydown on option2 at wrapper. open: true. focused: option2.',
+ 'keyup on option2 at select. open: true. focused: option2.',
+ 'keyup on option2 at wrapper. open: true. focused: option2.'
],'escape, with preventDefault');
// Press escape, no preventDefault
await test_driver.send_keys(document.activeElement, keys.Escape);
assert_false(select.matches(':open'),'select should be closed escape no preventDefault');
assert_events([
- 'keydown on option2 at select', 'keydown on option2 at wrapper',
- 'focusout on option2 at select', 'focusout on option2 at wrapper',
- 'focusin on select at select', 'focusin on select at wrapper',
- 'keyup on select at select', 'keyup on select at wrapper'
+ 'keydown on option2 at select. open: true. focused: option2.',
+ 'keydown on option2 at wrapper. open: true. focused: option2.',
+ 'focusout on option2 at select. open: false.',
+ 'focusout on option2 at wrapper. open: false.',
+ 'focusin on select at select. open: false.',
+ 'focusin on select at wrapper. open: false.',
+ 'keyup on select at select. open: false. focused: select.',
+ 'keyup on select at wrapper. open: false. focused: select.'
],'escape, no preventDefault');
// Re-open the picker and hit arrow-down again.
@@ -118,8 +142,10 @@
assert_true(select.matches(':open'));
assert_equals(select.value,'one','value has not changed');
assert_events([
- 'keydown on option2 at select', 'keydown on option2 at wrapper',
- 'keyup on option2 at select', 'keyup on option2 at wrapper'
+ 'keydown on option2 at select. open: true. focused: option2.',
+ 'keydown on option2 at wrapper. open: true. focused: option2.',
+ 'keyup on option2 at select. open: true. focused: option2.',
+ 'keyup on option2 at wrapper. open: true. focused: option2.'
],'enter, with preventDefault');
// Press enter to select an option, no preventDefault
@@ -127,11 +153,18 @@
assert_false(select.matches(':open'),'select should be closed enter no preventDefault');
assert_equals(select.value,'two');
assert_events([
- 'keydown on option2 at select', 'keydown on option2 at wrapper',
- 'input on select at select', 'input on select at wrapper', 'change on select at select',
- 'change on select at wrapper', 'focusout on option2 at select', 'focusout on option2 at wrapper',
- 'focusin on select at select', 'focusin on select at wrapper',
- 'keyup on select at select', 'keyup on select at wrapper'
+ 'keydown on option2 at select. open: true. focused: option2.',
+ 'keydown on option2 at wrapper. open: true. focused: option2.',
+ 'input on select at select. open: true.',
+ 'input on select at wrapper. open: true.',
+ 'change on select at select. open: true.',
+ 'change on select at wrapper. open: true.',
+ 'focusout on option2 at select. open: false.',
+ 'focusout on option2 at wrapper. open: false.',
+ 'focusin on select at select. open: false.',
+ 'focusin on select at wrapper. open: false.',
+ 'keyup on select at select. open: false. focused: select.',
+ 'keyup on select at wrapper. open: false. focused: select.'
],'enter, no preventDefault');
// Re-open the picker.
@@ -149,13 +182,20 @@
.send();
assert_true(select.matches(':open'),'click should be cancelled');
assert_events([
- 'pointerdown on option1 at select', 'pointerdown on option1 at wrapper',
- 'mousedown on option1 at select', 'mousedown on option1 at wrapper',
- 'focusout on option2 at select', 'focusout on option2 at wrapper',
- 'focusin on option1 at select', 'focusin on option1 at wrapper',
- 'pointerup on option1 at select', 'pointerup on option1 at wrapper',
- 'mouseup on option1 at select', 'mouseup on option1 at wrapper',
- 'click on option1 at select', 'click on option1 at wrapper'
+ 'pointerdown on option1 at select. open: true.',
+ 'pointerdown on option1 at wrapper. open: true.',
+ 'mousedown on option1 at select. open: true.',
+ 'mousedown on option1 at wrapper. open: true.',
+ 'focusout on option2 at select. open: true.',
+ 'focusout on option2 at wrapper. open: true.',
+ 'focusin on option1 at select. open: true.',
+ 'focusin on option1 at wrapper. open: true.',
+ 'pointerup on option1 at select. open: true.',
+ 'pointerup on option1 at wrapper. open: true.',
+ 'mouseup on option1 at select. open: true.',
+ 'mouseup on option1 at wrapper. open: true.',
+ 'click on option1 at select. open: true.',
+ 'click on option1 at wrapper. open: true.'
],'click option, with preventDefault');
// Click on an option, no preventDefault
@@ -167,15 +207,24 @@
.send();
assert_false(select.matches(':open'),'select should be closed click option no preventDefault');
assert_events([
- 'pointerdown on option1 at select', 'pointerdown on option1 at wrapper',
- 'mousedown on option1 at select', 'mousedown on option1 at wrapper',
- 'pointerup on option1 at select', 'pointerup on option1 at wrapper',
- 'mouseup on option1 at select', 'mouseup on option1 at wrapper',
- 'input on select at select', 'input on select at wrapper',
- 'change on select at select', 'change on select at wrapper',
- 'focusout on option1 at select', 'focusout on option1 at wrapper',
- 'focusin on select at select', 'focusin on select at wrapper',
- 'click on option1 at select', 'click on option1 at wrapper'
+ 'pointerdown on option1 at select. open: true.',
+ 'pointerdown on option1 at wrapper. open: true.',
+ 'mousedown on option1 at select. open: true.',
+ 'mousedown on option1 at wrapper. open: true.',
+ 'pointerup on option1 at select. open: true.',
+ 'pointerup on option1 at wrapper. open: true.',
+ 'mouseup on option1 at select. open: true.',
+ 'mouseup on option1 at wrapper. open: true.',
+ 'input on select at select. open: true.',
+ 'input on select at wrapper. open: true.',
+ 'change on select at select. open: true.',
+ 'change on select at wrapper. open: true.',
+ 'focusout on option1 at select. open: false.',
+ 'focusout on option1 at wrapper. open: false.',
+ 'focusin on select at select. open: false.',
+ 'focusin on select at wrapper. open: false.',
+ 'click on option1 at select. open: false.',
+ 'click on option1 at wrapper. open: false.'
],'click option, no preventDefault');
},`Events, ${wrapper.dataset.description}`);
});
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-picker-starting-style.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-picker-starting-style.tentative.html
index c653016875a..2be9f388975 100644
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-picker-starting-style.tentative.html
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-picker-starting-style.tentative.html
@@ -18,15 +18,24 @@ select, ::picker(select) {
::picker(select) {
color: white;
}
+option {
+ background-color: black;
+}
.animate::picker(select) {
transition: color 100s steps(2, start);
}
+.animate option {
+ transition: background-color 100s steps(2, start);
+}
@starting-style {
.animate::picker(select) {
color: black;
}
+ .animate option {
+ background-color: white;
+ }
}
</style>
@@ -43,5 +52,7 @@ promise_test(async () => {
const style = getComputedStyle(option);
assert_equals(style.color, 'rgb(128, 128, 128)',
'color should transition based on @starting-style.');
+ assert_equals(style.backgroundColor, 'rgb(128, 128, 128)',
+ 'background-color should transition based on @starting-style.');
}, '@starting-style should work on ::picker(select) just like a popover.');
</script>
diff --git a/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/WEB_FEATURES.yml b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/WEB_FEATURES.yml
new file mode 100644
index 00000000000..fb5c8374b7a
--- /dev/null
+++ b/tests/wpt/tests/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: parse-html-unsafe
+ files: "**"
diff --git a/tests/wpt/tests/interfaces/css-mixins.idl b/tests/wpt/tests/interfaces/css-mixins.idl
index 6629b3861f6..86015e7dd0e 100644
--- a/tests/wpt/tests/interfaces/css-mixins.idl
+++ b/tests/wpt/tests/interfaces/css-mixins.idl
@@ -4,7 +4,17 @@
// Source: CSS Functions and Mixins Module (https://drafts.csswg.org/css-mixins-1/)
[Exposed=Window]
-interface CSSFunctionRule : CSSGroupingRule { };
+interface CSSFunctionRule : CSSGroupingRule {
+ readonly attribute CSSOMString name;
+ sequence<FunctionParameter> getParameters();
+ readonly attribute CSSOMString returnType;
+};
+
+dictionary FunctionParameter {
+ required CSSOMString name;
+ required CSSOMString type;
+ CSSOMString? defaultValue;
+};
[Exposed=Window]
interface CSSFunctionDescriptors : CSSStyleDeclaration {
diff --git a/tests/wpt/tests/interfaces/dom.idl b/tests/wpt/tests/interfaces/dom.idl
index 814040a2c40..7b4fcb920e2 100644
--- a/tests/wpt/tests/interfaces/dom.idl
+++ b/tests/wpt/tests/interfaces/dom.idl
@@ -124,6 +124,8 @@ interface mixin ParentNode {
[CEReactions, Unscopable] undefined append((Node or DOMString)... nodes);
[CEReactions, Unscopable] undefined replaceChildren((Node or DOMString)... nodes);
+ [CEReactions] undefined moveBefore(Node node, Node? child);
+
Element? querySelector(DOMString selectors);
[NewObject] NodeList querySelectorAll(DOMString selectors);
};
diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl
index 7c026d4c0a4..8dc3a0ebc14 100644
--- a/tests/wpt/tests/interfaces/webnn.idl
+++ b/tests/wpt/tests/interfaces/webnn.idl
@@ -286,6 +286,21 @@ partial dictionary MLOpSupportLimits {
MLConv2dSupportLimits convTranspose2d;
};
+dictionary MLCumulativeSumOptions : MLOperatorOptions {
+ boolean exclusive = false;
+ boolean reversed = false;
+};
+
+partial interface MLGraphBuilder {
+ MLOperand cumulativeSum(MLOperand input,
+ unsigned long axis,
+ optional MLCumulativeSumOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLSingleInputSupportLimits cumulativeSum;
+};
+
partial interface MLGraphBuilder {
MLOperand add(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
MLOperand sub(MLOperand a, MLOperand b, optional MLOperatorOptions options = {});
@@ -310,6 +325,9 @@ partial interface MLGraphBuilder {
MLOperand equal(MLOperand a,
MLOperand b,
optional MLOperatorOptions options = {});
+ MLOperand notEqual(MLOperand a,
+ MLOperand b,
+ optional MLOperatorOptions options = {});
MLOperand greater(MLOperand a,
MLOperand b,
optional MLOperatorOptions options = {});
@@ -323,6 +341,15 @@ partial interface MLGraphBuilder {
MLOperand b,
optional MLOperatorOptions options = {});
MLOperand logicalNot(MLOperand a, optional MLOperatorOptions options = {});
+ MLOperand logicalAnd(MLOperand a,
+ MLOperand b,
+ optional MLOperatorOptions options = {});
+ MLOperand logicalOr(MLOperand a,
+ MLOperand b,
+ optional MLOperatorOptions options = {});
+ MLOperand logicalXor(MLOperand a,
+ MLOperand b,
+ optional MLOperatorOptions options = {});
};
dictionary MLLogicalNotSupportLimits {
@@ -332,11 +359,15 @@ dictionary MLLogicalNotSupportLimits {
partial dictionary MLOpSupportLimits {
MLBinarySupportLimits equal;
+ MLBinarySupportLimits notEqual;
MLBinarySupportLimits greater;
MLBinarySupportLimits greaterOrEqual;
MLBinarySupportLimits lesser;
MLBinarySupportLimits lesserOrEqual;
MLLogicalNotSupportLimits logicalNot;
+ MLBinarySupportLimits logicalAnd;
+ MLBinarySupportLimits logicalOr;
+ MLBinarySupportLimits logicalXor;
};
partial interface MLGraphBuilder {
@@ -351,6 +382,7 @@ partial interface MLGraphBuilder {
MLOperand neg(MLOperand input, optional MLOperatorOptions options = {});
MLOperand reciprocal(MLOperand input, optional MLOperatorOptions options = {});
MLOperand sin(MLOperand input, optional MLOperatorOptions options = {});
+ MLOperand sign(MLOperand input, optional MLOperatorOptions options = {});
MLOperand sqrt(MLOperand input, optional MLOperatorOptions options = {});
MLOperand tan(MLOperand input, optional MLOperatorOptions options = {});
};
@@ -367,10 +399,40 @@ partial dictionary MLOpSupportLimits {
MLSingleInputSupportLimits neg;
MLSingleInputSupportLimits reciprocal;
MLSingleInputSupportLimits sin;
+ MLSingleInputSupportLimits sign;
MLSingleInputSupportLimits sqrt;
MLSingleInputSupportLimits tan;
};
+partial interface MLGraphBuilder {
+ MLOperand dequantizeLinear(MLOperand input,
+ MLOperand scale,
+ MLOperand zeroPoint,
+ optional MLOperatorOptions options = {});
+};
+
+dictionary MLQuantizationSupportLimits {
+ MLSupportLimits input;
+ MLSupportLimits scale;
+ MLSupportLimits zeroPoint;
+ MLSupportLimits output;
+};
+
+partial dictionary MLOpSupportLimits {
+ MLQuantizationSupportLimits dequantizeLinear;
+};
+
+partial interface MLGraphBuilder {
+ MLOperand quantizeLinear(MLOperand input,
+ MLOperand scale,
+ MLOperand zeroPoint,
+ optional MLOperatorOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLQuantizationSupportLimits quantizeLinear;
+};
+
dictionary MLEluOptions : MLOperatorOptions {
double alpha = 1;
};
@@ -414,6 +476,26 @@ partial dictionary MLOpSupportLimits {
};
partial interface MLGraphBuilder {
+ MLOperand gatherElements(MLOperand input,
+ MLOperand indices,
+ optional MLGatherOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLGatherSupportLimits gatherElements;
+};
+
+partial interface MLGraphBuilder {
+ MLOperand gatherND(MLOperand input,
+ MLOperand indices,
+ optional MLOperatorOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLGatherSupportLimits gatherND;
+};
+
+partial interface MLGraphBuilder {
MLOperand gelu(MLOperand input, optional MLOperatorOptions options = {});
};
@@ -830,6 +912,51 @@ partial dictionary MLOpSupportLimits {
MLSingleInputSupportLimits reshape;
};
+dictionary MLReverseOptions : MLOperatorOptions {
+ sequence<[EnforceRange] unsigned long> axes;
+};
+
+partial interface MLGraphBuilder {
+ MLOperand reverse(MLOperand input, optional MLReverseOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLSingleInputSupportLimits reverse;
+};
+
+dictionary MLScatterOptions : MLOperatorOptions {
+ [EnforceRange] unsigned long axis = 0;
+};
+
+partial interface MLGraphBuilder {
+ MLOperand scatterElements(MLOperand input,
+ MLOperand indices,
+ MLOperand updates,
+ optional MLScatterOptions options = {});
+};
+
+dictionary MLScatterSupportLimits {
+ MLSupportLimits input;
+ MLSupportLimits indices;
+ MLSupportLimits updates;
+ MLSupportLimits output;
+};
+
+partial dictionary MLOpSupportLimits {
+ MLScatterSupportLimits scatterElements;
+};
+
+partial interface MLGraphBuilder {
+ MLOperand scatterND(MLOperand input,
+ MLOperand indices,
+ MLOperand updates,
+ optional MLOperatorOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLScatterSupportLimits scatterND;
+};
+
partial interface MLGraphBuilder {
MLOperand sigmoid(MLOperand input, optional MLOperatorOptions options = {});
};
@@ -838,14 +965,18 @@ partial dictionary MLOpSupportLimits {
MLSingleInputSupportLimits sigmoid;
};
+dictionary MLSliceOptions : MLOperatorOptions {
+ sequence<[EnforceRange] unsigned long> strides;
+};
+
partial interface MLGraphBuilder {
MLOperand slice(MLOperand input,
sequence<[EnforceRange] unsigned long> starts,
sequence<[EnforceRange] unsigned long> sizes,
- optional MLOperatorOptions options = {});
+ optional MLSliceOptions options = {});
};
-partial dictionary MLOpSupportLimits {
+partial dictionary MLOpSupportLimits {
MLSingleInputSupportLimits slice;
};
@@ -903,6 +1034,16 @@ partial dictionary MLOpSupportLimits {
MLSingleInputSupportLimits tanh;
};
+partial interface MLGraphBuilder {
+ MLOperand tile(MLOperand input,
+ sequence<unsigned long> repetitions,
+ optional MLOperatorOptions options = {});
+};
+
+partial dictionary MLOpSupportLimits {
+ MLSingleInputSupportLimits tile;
+};
+
dictionary MLTransposeOptions : MLOperatorOptions {
sequence<[EnforceRange] unsigned long> permutation;
};
diff --git a/tests/wpt/tests/interfaces/webtransport.idl b/tests/wpt/tests/interfaces/webtransport.idl
index 24fe5b7e61b..eb456336081 100644
--- a/tests/wpt/tests/interfaces/webtransport.idl
+++ b/tests/wpt/tests/interfaces/webtransport.idl
@@ -3,10 +3,18 @@
// (https://github.com/w3c/webref)
// Source: WebTransport (https://w3c.github.io/webtransport/)
+[Exposed=(Window,Worker), SecureContext, Transferable]
+interface WebTransportDatagramsWritable : WritableStream {
+ attribute WebTransportSendGroup? sendGroup;
+ attribute long long sendOrder;
+};
+
[Exposed=(Window,Worker), SecureContext]
interface WebTransportDatagramDuplexStream {
+ WebTransportDatagramsWritable createWritable(
+ optional WebTransportSendOptions options = {});
readonly attribute ReadableStream readable;
- readonly attribute WritableStream writable;
+ readonly attribute WebTransportDatagramsWritable writable;
readonly attribute unsigned long maxDatagramSize;
attribute unrestricted double? incomingMaxAge;
@@ -79,9 +87,12 @@ dictionary WebTransportCloseInfo {
USVString reason = "";
};
-dictionary WebTransportSendStreamOptions {
+dictionary WebTransportSendOptions {
WebTransportSendGroup? sendGroup = null;
long long sendOrder = 0;
+};
+
+dictionary WebTransportSendStreamOptions : WebTransportSendOptions {
boolean waitUntilAvailable = false;
};
diff --git a/tests/wpt/tests/interfaces/xhr.idl b/tests/wpt/tests/interfaces/xhr.idl
index b4c27c8aca9..6ff75fd2774 100644
--- a/tests/wpt/tests/interfaces/xhr.idl
+++ b/tests/wpt/tests/interfaces/xhr.idl
@@ -88,12 +88,12 @@ interface ProgressEvent : Event {
constructor(DOMString type, optional ProgressEventInit eventInitDict = {});
readonly attribute boolean lengthComputable;
- readonly attribute unsigned long long loaded;
- readonly attribute unsigned long long total;
+ readonly attribute double loaded;
+ readonly attribute double total;
};
dictionary ProgressEventInit : EventInit {
boolean lengthComputable = false;
- unsigned long long loaded = 0;
- unsigned long long total = 0;
+ double loaded = 0;
+ double total = 0;
};
diff --git a/tests/wpt/tests/intersection-observer/clip-path-animation.html b/tests/wpt/tests/intersection-observer/clip-path-animation.html
new file mode 100644
index 00000000000..867b025d8c3
--- /dev/null
+++ b/tests/wpt/tests/intersection-observer/clip-path-animation.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<link rel="help" href="https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+@keyframes clippath {
+ 0% {
+ clip-path: inset(30%);
+ }
+ 100% {
+ clip-path: inset(40%);
+ }
+}
+body { margin: 0 }
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#target {
+ position: absolute;
+ top: 0px;
+ background-color: green;
+ width: 100px;
+ height: 100px;
+}
+#container {
+ margin: 20px;
+ position: relative;
+ padding: 8px;
+ width: 0px;
+ height: 0px;
+}
+.animation {
+ animation: clippath 100s steps(2, jump-end);
+}
+</style>
+
+<div id="container">
+ <div id="target"></div>
+</div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var target = undefined;
+var container = undefined;
+var observer = undefined;
+var entries = [];
+
+// See crbug.com/40690885. In principle, this test should not need this,
+// however browser support of updating intersection obsevers in response
+// to animations (and in particular, clip-paths) is spotty. Forcing a
+// fresh listener allows the test to guard against regression of
+// crbug.com/394244260, and test that resolution of clip rects with
+// animations isn't particularly broken in some way.
+async function forceReset() {
+ if(observer) { observer.disconnect(); }
+ observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, {
+ root: container
+ });
+ observer.observe(target);
+ await waitForNotification();
+}
+
+promise_test(async function(t) {
+ target = document.getElementById("target");
+ container = document.getElementById("container");
+ await forceReset();
+
+ // See intersection-observer-test-utils.js for the meaning of these values.
+ checkLastEntry(
+ entries,
+ 0,
+ [28, 128, 20, 120, 28, 36, 20, 36, 20, 36, 20, 36, true],
+ );
+ target.className = "animation";
+ await forceReset();
+
+ checkLastEntry(
+ entries,
+ 1,
+ [28, 128, 20, 120, 0, 0, 0, 0, 20, 36, 20, 36, false],
+ );
+ target.className = "";
+ await forceReset();
+
+ checkLastEntry(
+ entries,
+ 2,
+ [28, 128, 20, 120, 28, 36, 20, 36, 20, 36, 20, 36, true],
+ );
+});
+</script>
diff --git a/tests/wpt/tests/lint.ignore b/tests/wpt/tests/lint.ignore
index 1d552f3468a..65e22dccbc1 100644
--- a/tests/wpt/tests/lint.ignore
+++ b/tests/wpt/tests/lint.ignore
@@ -695,7 +695,6 @@ TESTHARNESS-IN-OTHER-TYPE: css/css-text/white-space/pre-line-br-with-whitespace-
TESTHARNESS-IN-OTHER-TYPE: css/css-text/white-space/pre-with-whitespace-crash.html
TESTHARNESS-IN-OTHER-TYPE: css/css-writing-modes/bidi-inline-fragment-crash.html
TESTHARNESS-IN-OTHER-TYPE: dom/svg-insert-crash.html
-TESTHARNESS-IN-OTHER-TYPE: editing/run/first-letter-crossing-engine-boundary-crash.html
TESTHARNESS-IN-OTHER-TYPE: html/canvas/element/manual/wide-gamut-canvas/imagedata-no-color-settings-crash.html
TESTHARNESS-IN-OTHER-TYPE: html/semantics/embedded-content/the-object-element/block-object-with-ruby-crash.html
TESTHARNESS-IN-OTHER-TYPE: html/semantics/forms/the-input-element/time-datalist-crash.html
diff --git a/tests/wpt/tests/mediacapture-insertable-streams/VideoTrackGenerator-with-window-tracks.https.html b/tests/wpt/tests/mediacapture-insertable-streams/VideoTrackGenerator-with-window-tracks.https.html
index dfe000fbddb..1c5560f6964 100644
--- a/tests/wpt/tests/mediacapture-insertable-streams/VideoTrackGenerator-with-window-tracks.https.html
+++ b/tests/wpt/tests/mediacapture-insertable-streams/VideoTrackGenerator-with-window-tracks.https.html
@@ -248,7 +248,8 @@
// The first frame may not have had scaleResolutionDownBy applied
const numTries = 5;
for (let i = 1; i <= numTries; i++) {
- worker.postMessage({type:"getVideoFrame", track: e.track}, [e.track]);
+ const clone = e.track.clone();
+ worker.postMessage({type:"getVideoFrame", track: clone}, [clone]);
const {frame: outputFrame} = await new Promise(resolve => worker.onmessage = e => resolve(e.data));
if (outputFrame.displayWidth !== width / 2) {
assert_less_than(i, numTries, `First ${numTries} frames were the wrong size.`);
diff --git a/tests/wpt/tests/permissions-policy/resources/digital-credentials-get.html b/tests/wpt/tests/permissions-policy/resources/digital-credentials-get.html
index 12a450a1ae4..543417f230a 100644
--- a/tests/wpt/tests/permissions-policy/resources/digital-credentials-get.html
+++ b/tests/wpt/tests/permissions-policy/resources/digital-credentials-get.html
@@ -11,22 +11,17 @@
}
let enabled = undefined;
try {
- // Provide a complete correct request to test permission policy.
- await navigator.credentials.get(makeGetOptions("openid4vp"));
- // If no exception is thrown, then the feature is allowed by
- // the permission policy.
- enabled = true;
+ await navigator.credentials.get(makeGetOptions([]));
} catch (e) {
switch (e.name) {
- // Unless a "NotAllowedError" exception is thrown, we assume
- // the feature is allowed by permission policy. This is
- // suitable for the tests that are using this helper method.
case "NotAllowedError":
enabled = false;
break;
- default:
+ case "TypeError":
enabled = true;
break;
+ default:
+ throw e;
}
} finally {
window.parent.postMessage({ type, enabled }, "*");
diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-removeUnsafe.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-removeUnsafe.tentative.html
new file mode 100644
index 00000000000..7ad8253ad5f
--- /dev/null
+++ b/tests/wpt/tests/sanitizer-api/sanitizer-removeUnsafe.tentative.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+test(t => {
+ // Create an empty config.
+ let s = new Sanitizer({});
+ // Remove everything unsafe.
+ s.removeUnsafe();
+
+ let config = s.get();
+ assert_equals(config.elements.length, 0, "no elements");
+ assert_equals(config.replaceWithChildrenElements.length, 0, "no replaceWithChildrenElements");
+ assert_equals(config.attributes.length, 0, "no attributes");
+
+ // https://wicg.github.io/sanitizer-api/#built-in-safe-baseline-configuration
+ const SAFE_BASELINE = {
+ "removeElements": [
+ {
+ "namespace": "http://www.w3.org/1999/xhtml",
+ "name": "script"
+ },
+ {
+ "namespace": "http://www.w3.org/1999/xhtml",
+ "name": "frame"
+ },
+ {
+ "namespace": "http://www.w3.org/1999/xhtml",
+ "name": "iframe"
+ },
+ {
+ "namespace": "http://www.w3.org/1999/xhtml",
+ "name": "object"
+ },
+ {
+ "namespace": "http://www.w3.org/1999/xhtml",
+ "name": "embed"
+ },
+ {
+ "namespace": "http://www.w3.org/2000/svg",
+ "name": "script"
+ },
+ {
+ "namespace": "http://www.w3.org/2000/svg",
+ "name": "use"
+ }
+ ],
+ "removeAttributes": []
+ };
+
+ assert_equals(config.removeElements.length, SAFE_BASELINE.removeElements.length);
+ for (let i = 0; i < SAFE_BASELINE.removeElements.length; i++) {
+ let element = config.removeElements[i];
+ assert_own_property(element, "name");
+ assert_equals(element.name, SAFE_BASELINE.removeElements[i].name);
+ assert_own_property(element, "namespace");
+ assert_equals(element.namespace, SAFE_BASELINE.removeElements[i].namespace);
+ }
+
+ // This list depends on the implementation defined "event handler content attributes"
+ assert_true(config.removeAttributes.length > 0, "Has removeAttributes");
+ for (let attribute of config.removeAttributes) {
+ assert_own_property(attribute, "name");
+ assert_true(attribute.name.startsWith("on"), `attribute '${attribute.name}' starts with "on"`);
+ assert_own_property(attribute, "namespace"); // XXX Maybe optional?
+ assert_equals(attribute.namespace, null, "attribute is in null namespace");
+ }
+}, "removeUnsafe removes the right elements and attributes");
+
+test(t => {
+ let s = new Sanitizer("default");
+ let before = s.get();
+
+ let s2 = new Sanitizer("default");
+ s2.removeUnsafe();
+ let after = s2.get();
+
+ // None of the default config elements are unsafe.
+ assert_true(before.elements.length > 0);
+ assert_equals(before.elements.length, after.elements.length, "elements don't change");
+
+ // Not in default config.
+ assert_equals(before.replaceWithChildrenElements.length, 0);
+ assert_equals(after.replaceWithChildrenElements.length, 0);
+
+ assert_equals(before.removeElements.length, 0);
+ assert_equals(after.removeElements.length, 7, "removeElements are added");
+
+ // None of the default config attributes are unsafe.
+ assert_true(before.attributes.length > 0);
+ assert_equals(before.attributes.length, after.attributes.length, "attributes don't change");
+
+ // Imeplementation defined "event handler content attributes"
+ assert_equals(before.removeAttributes.length, 0);
+ assert_true(after.removeAttributes.length > 0, "removeAttributes are added");
+}, "removeUnsafe with default config")
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/sanitizer-api/sethtml-tree-construction.sub.dat b/tests/wpt/tests/sanitizer-api/sethtml-tree-construction.sub.dat
index d39447345f9..47cc159df1f 100644
--- a/tests/wpt/tests/sanitizer-api/sethtml-tree-construction.sub.dat
+++ b/tests/wpt/tests/sanitizer-api/sethtml-tree-construction.sub.dat
@@ -304,34 +304,46 @@ TypeError
#data
<area href='javascript:evil.com'>
+#config
+{}
#document
| <area>
#data
<area href=' javascript:evil.com'>
+#config
+{}
#document
| <area>
#data
<area href='http:evil.com'>
+#config
+{}
#document
| <area>
| href="http:evil.com"
#data
<form action='javascript:evil.com'>Click.</form>
+#config
+{}
#document
| <form>
| "Click."
#data
<form action=' javascript:evil.com'>Click.</form>
+#config
+{}
#document
| <form>
| "Click."
#data
<form action='http:evil.com'>Click.</form>
+#config
+{}
#document
| <form>
| action="http:evil.com"
@@ -339,34 +351,46 @@ TypeError
#data
<input formaction='javascript:evil.com'>
+#config
+{}
#document
| <input>
#data
<input formaction=' javascript:evil.com'>
+#config
+{}
#document
| <input>
#data
<input formaction='http:evil.com'>
+#config
+{}
#document
| <input>
| formaction="http:evil.com"
#data
<button formaction='javascript:evil.com'>Click.</button>
+#config
+{}
#document
| <button>
| "Click."
#data
<button formaction=' javascript:evil.com'>Click.</button>
+#config
+{}
#document
| <button>
| "Click."
#data
<button formaction='http:evil.com'>Click.</button>
+#config
+{}
#document
| <button>
| formaction="http:evil.com"
diff --git a/tests/wpt/tests/screen-orientation/onchange-event-subframe.html b/tests/wpt/tests/screen-orientation/onchange-event-subframe.html
index 6eb986b4380..2d9529d1dcc 100644
--- a/tests/wpt/tests/screen-orientation/onchange-event-subframe.html
+++ b/tests/wpt/tests/screen-orientation/onchange-event-subframe.html
@@ -45,12 +45,32 @@
t.add_cleanup(makeCleanup());
const iframe = await attachIframe();
let opposite = getOppositeOrientation();
+ const original = screen.orientation.type;
// Fail fast in case the API is not supported
await test_driver.bless("request fullscreen", null, iframe.contentWindow);
await iframe.contentDocument.documentElement.requestFullscreen();
await iframe.contentWindow.screen.orientation.lock(opposite);
+ // we have to wait for completion of unlock since unlock doesn't return
+ // promise.
+ const unlockPromise =
+ new Promise(resolve => {
+ function onChange() {
+ if (screen.orientation.type == original) {
+ screen.orientation.removeEventListener("change", onChange);
+ resolve();
+ }
+ }
+
+ screen.orientation.addEventListener("change", onChange);
+ });
iframe.contentWindow.screen.orientation.unlock();
+ await unlockPromise;
+
+ // Lock from the iframe
+ await test_driver.bless("request fullscreen", null, iframe.contentWindow);
+ await iframe.contentDocument.documentElement.requestFullscreen();
+
opposite = getOppositeOrientation();
const topEventPromise = new EventWatcher(
@@ -64,9 +84,6 @@
"change"
).wait_for("change");
- // Lock from the iframe
- await test_driver.bless("request fullscreen", null, iframe.contentWindow);
- await iframe.contentDocument.documentElement.requestFullscreen();
const lockPromise = iframe.contentWindow.screen.orientation.lock(opposite);
const winningEvent = await Promise.race([
diff --git a/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center-ref.html b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center-ref.html
new file mode 100644
index 00000000000..b9a3a74ef36
--- /dev/null
+++ b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>URL Fragment Text Directives: Reference - Scrolling to a text directive should center it in the block flow direction</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="place-content: center; height: 150px;">
+ <div style="background: green; width: 100px; height: 100px;"></div>
+</div>
diff --git a/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center.html b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center.html
new file mode 100644
index 00000000000..a3739f0b5ff
--- /dev/null
+++ b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-diretive-center.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>URL Fragment Text Directives: Scrolling to a text directive should center it in the block flow direction</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://wicg.github.io/scroll-to-text-fragment/#invoking-text-directives">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<link rel="match" href="scroll-to-text-diretive-center-ref.html">
+<style>
+ .container {
+ overflow: scroll;
+ scrollbar-width: none;
+ width: 200px;
+ height: 150px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ }
+ ::target-text {
+ color: red;
+ }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position: relative;">
+ <div id="container1" class="container">
+ <div style="height: 1000px;"></div>
+ <div style="position: absolute; left: 0; top: 500px; font: 100px/1 Ahem;">X</div>
+ </div>
+ <div id="container2" class="container" style="place-content: center;">
+ <div style="background: green; width: 100px; height: 100px;"></div>
+ </div>
+</div>
+<script>
+ window.location.hash = "#:~:text=X";
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https.html b/tests/wpt/tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https.html
new file mode 100644
index 00000000000..2afa5c82a76
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<meta name="variant" content="?origin=same-origin">
+<meta name="variant" content="?origin=cross-site-redirect">
+<meta name="variant" content="?origin=cross-site-initial">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script src="resources/redirect-helper.sub.js"></script>
+
+<script>
+setup(() => assertSpeculationRulesIsSupported());
+// Attempt to use the prefetched result in the middle of its redirects during
+// prefetch.
+// i.e. prefetch `prefetchInitialUrl` that is redirected to `prefetchFinalUrl`,
+// then navigate (either directly or via redirect) to `prefetchFinalUrl.
+
+// Prefetches should be completed before navigation starts, because otherwise
+// the prefetch's redirected URL is not known at the time of navigation.
+const prefetchTiming = 'redirect-received-before-navigation-start';
+
+promise_test(async t => {
+ const {agent,
+ prefetchInitialUrl,
+ prefetchFinalUrl,
+ redirectToPrefetchInitialUrl,
+ redirectToPrefetchFinalUrl} = await prepare(t, prefetchTiming);
+
+ await agent.forceSinglePrefetch(prefetchInitialUrl);
+ await agent.navigate(prefetchFinalUrl,
+ {expectedDestinationUrl: prefetchFinalUrl});
+
+ assert_not_prefetched(await agent.getRequestHeaders(),
+ 'Prefetched response should not be used by navigation.');
+}, 'Navigate to the final URL of the prefetch');
+
+promise_test(async t => {
+ const {agent,
+ prefetchInitialUrl,
+ prefetchFinalUrl,
+ redirectToPrefetchInitialUrl,
+ redirectToPrefetchFinalUrl} = await prepare(t, prefetchTiming);
+
+ await agent.forceSinglePrefetch(prefetchInitialUrl);
+ await agent.navigate(redirectToPrefetchFinalUrl,
+ {expectedDestinationUrl: prefetchFinalUrl});
+
+ assert_not_prefetched(await agent.getRequestHeaders(),
+ 'Prefetched response should not be used by navigation.');
+}, 'Navigation is redirected to the final URL of the prefetch');
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/redirect-to-prefetch-url.https.html b/tests/wpt/tests/speculation-rules/prefetch/redirect-to-prefetch-url.https.html
new file mode 100644
index 00000000000..f634ede8838
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/redirect-to-prefetch-url.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<meta name="variant" content="?origin=same-origin">
+<meta name="variant" content="?origin=cross-site-redirect">
+<meta name="variant" content="?origin=cross-site-initial">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script src="resources/redirect-helper.sub.js"></script>
+
+<script>
+setup(() => assertSpeculationRulesIsSupported());
+// Navigation is redirected to the prefetch URL, not directly navigating to
+// the prefetch URL.
+// The spec doesn't serve the prefetched result, but the Chromium does.
+// The tests here is based on the spec.
+// https://github.com/WICG/nav-speculation/issues/367
+for (const prefetchTiming of
+ ['redirect-received-before-navigation-start',
+ 'redirect-received-after-navigation-start']) {
+ promise_test(async t => {
+ const {agent,
+ prefetchInitialUrl,
+ prefetchFinalUrl,
+ redirectToPrefetchInitialUrl,
+ redirectToPrefetchFinalUrl} = await prepare(t, prefetchTiming);
+
+ await agent.forceSinglePrefetch(prefetchInitialUrl);
+ await agent.navigate(redirectToPrefetchInitialUrl,
+ {expectedDestinationUrl: prefetchFinalUrl});
+
+ assert_not_prefetched(await agent.getRequestHeaders(),
+ 'Prefetched response should not be used by navigation.');
+ }, prefetchTiming);
+}
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/redirect-url.https.html b/tests/wpt/tests/speculation-rules/prefetch/redirect-url.https.html
new file mode 100644
index 00000000000..41fab0791ac
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/redirect-url.https.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<meta name="variant" content="?origin=same-origin">
+<meta name="variant" content="?origin=cross-site-redirect">
+<meta name="variant" content="?origin=cross-site-initial">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script src="resources/redirect-helper.sub.js"></script>
+
+<script>
+setup(() => assertSpeculationRulesIsSupported());
+// Navigate to the initial URL of the prefetch.
+for (const prefetchTiming of
+ ['redirect-received-before-navigation-start',
+ 'redirect-received-after-navigation-start']) {
+ promise_test(async t => {
+ const {agent,
+ prefetchInitialUrl,
+ prefetchFinalUrl,
+ redirectToPrefetchInitialUrl,
+ redirectToPrefetchFinalUrl} = await prepare(t, prefetchTiming);
+
+ await agent.forceSinglePrefetch(prefetchInitialUrl);
+ await agent.navigate(prefetchInitialUrl,
+ {expectedDestinationUrl: prefetchFinalUrl});
+
+ assert_prefetched(await agent.getRequestHeaders(),
+ 'Prefetched response should be used by navigation.');
+ }, prefetchTiming);
+}
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/redirect-url.sub.https.html b/tests/wpt/tests/speculation-rules/prefetch/redirect-url.sub.https.html
deleted file mode 100644
index 02bb35349ff..00000000000
--- a/tests/wpt/tests/speculation-rules/prefetch/redirect-url.sub.https.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<meta name="timeout" content="long">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../resources/utils.js"></script>
-<script src="resources/utils.sub.js"></script>
-
-<script>
- setup(() => assertSpeculationRulesIsSupported());
-
- promise_test(async t => {
- const agent = await spawnWindow(t);
- // Because `forceSinglePrefetch()` waits for 2 seconds, the redirect and final
- // responses are expected to be received before `navigate()` below.
- const nextUrl = new URL('/common/redirect.py', location.href);
- const finalUrl = agent.getExecutorURL({ page: 2 });
- nextUrl.searchParams.set('location', finalUrl);
- await agent.forceSinglePrefetch(nextUrl);
- await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});
-
- assert_prefetched(await agent.getRequestHeaders(),
- 'Prefetched response should be used by navigation.');
- }, 'Redirect and final response received before navigation start');
-
- promise_test(async t => {
- const agent = await spawnWindow(t);
- // Because `forceSinglePrefetch()` waits for 2 seconds, we put 2.5-second delay
- // here to make the redirect response is received after `navigate()` below.
- const nextUrl = new URL('/common/slow-redirect.py?delay=2.5', location.href);
- const finalUrl = agent.getExecutorURL({ page: 2 });
- nextUrl.searchParams.set('location', finalUrl);
- await agent.forceSinglePrefetch(nextUrl);
- await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});
-
- assert_prefetched(await agent.getRequestHeaders(),
- 'Prefetched response should be used by navigation.');
- }, 'Same-origin redirect response received after navigation start');
-
- promise_test(async t => {
- const agent = await spawnWindow(t);
- // Because `forceSinglePrefetch()` waits for 2 seconds, we put 2.5-second delay
- // here to make the redirect response is received after `navigate()` below.
- const nextUrl = new URL('/common/slow-redirect.py?delay=2.5', location.href);
- const finalUrl = agent.getExecutorURL({ page: 2, hostname: '{{hosts[alt][www]}}' });
- nextUrl.searchParams.set('location', finalUrl);
- await agent.forceSinglePrefetch(nextUrl);
- await agent.navigate(nextUrl, {expectedDestinationUrl: finalUrl});
-
- assert_prefetched(await agent.getRequestHeaders(),
- 'Prefetched response should be used by navigation.');
- }, 'Cross-site redirect response received after navigation start');
-</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/resources/redirect-helper.sub.js b/tests/wpt/tests/speculation-rules/prefetch/resources/redirect-helper.sub.js
new file mode 100644
index 00000000000..a17eaabe243
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/resources/redirect-helper.sub.js
@@ -0,0 +1,71 @@
+// Prefetched redirect chain (as test variant parameters):
+// origin=same-origin:
+// initiator-(same-origin)->prefetchInitialUrl-(same-origin)->prefetchFinalUrl
+// origin=cross-site-initial:
+// initiator-(cross-site)-->prefetchInitialUrl-(same-origin)->prefetchFinalUrl
+// origin=cross-site-redirect:
+// initiator-(same-origin)->prefetchInitialUrl-(cross-site)-->prefetchFinalUrl
+const { origin } = Object.fromEntries(new URLSearchParams(location.search));
+
+// `prefetchTiming`:
+// - 'redirect-received-after-navigation-start':
+// prefetch is started before navigation starts but the redirect response
+// is received after navigation starts.
+// - Otherwise:
+// prefetch (including its redirects) is completed before navigation starts.
+async function prepare(t, prefetchTiming) {
+ const agent = await spawnWindow(t);
+
+ let prefetchFinalUrl;
+ let prefetchInitialOrigin;
+ if (origin === 'same-origin') {
+ prefetchFinalUrl = agent.getExecutorURL({ page: 2 });
+ prefetchInitialOrigin = location.origin;
+ } else if (origin === 'cross-site-initial') {
+ prefetchFinalUrl = agent.getExecutorURL(
+ { page: 2, hostname: '{{hosts[alt][www]}}' });
+ prefetchInitialOrigin = prefetchFinalUrl.origin;
+ } else if (origin === 'cross-site-redirect') {
+ prefetchFinalUrl = agent.getExecutorURL(
+ { page: 2, hostname: '{{hosts[alt][www]}}' });
+ prefetchInitialOrigin = location.origin;
+ } else {
+ t.assert_unreached('Invalid origin option: ' + origin);
+ }
+
+ let prefetchInitialUrl;
+ if (prefetchTiming === 'redirect-received-after-navigation-start') {
+ // Because `forceSinglePrefetch()` waits for 2 seconds, we put 4-second
+ // delay here to make the redirect response is received after `navigate()`
+ // below.
+ prefetchInitialUrl = new URL('/common/slow-redirect.py?delay=4',
+ prefetchInitialOrigin);
+ prefetchInitialUrl.searchParams.set('location', prefetchFinalUrl);
+ } else {
+ // Because `forceSinglePrefetch()` waits for 2 seconds, the redirect and
+ // final responses are expected to be received before `navigate()` below.
+ prefetchInitialUrl = new URL('/common/redirect.py', prefetchInitialOrigin);
+ prefetchInitialUrl.searchParams.set('location', prefetchFinalUrl);
+ }
+
+ const redirectToPrefetchInitialUrl = new URL('/common/redirect.py',
+ location.href);
+ redirectToPrefetchInitialUrl.searchParams.set(
+ 'location', prefetchInitialUrl);
+
+ const redirectToPrefetchFinalUrl = new URL('/common/redirect.py',
+ location.href);
+ redirectToPrefetchFinalUrl.searchParams.set(
+ 'location', prefetchFinalUrl);
+
+ // `type` is set just to make `redirectToPrefetchFinalUrl` different
+ // from `prefetchInitialUrl`.
+ redirectToPrefetchFinalUrl.searchParams.set(
+ 'type', 'navigation');
+
+ return {agent,
+ prefetchInitialUrl,
+ prefetchFinalUrl,
+ redirectToPrefetchInitialUrl,
+ redirectToPrefetchFinalUrl};
+}
diff --git a/tests/wpt/tests/storage-access-api/requestStorageAccess-cross-site-fetch.sub.https.window.js b/tests/wpt/tests/storage-access-api/requestStorageAccess-cross-site-fetch.sub.https.window.js
new file mode 100644
index 00000000000..b46f42d1211
--- /dev/null
+++ b/tests/wpt/tests/storage-access-api/requestStorageAccess-cross-site-fetch.sub.https.window.js
@@ -0,0 +1,52 @@
+// META: script=helpers.js
+// META: script=/cookies/resources/cookie-helper.sub.js
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+'use strict';
+
+const mainHost = "https://{{host}}:{{ports[https][0]}}";
+const altRoot = "https://{{hosts[alt][]}}:{{ports[https][0]}}";
+const responderPath = "/storage-access-api/resources/script-with-cookie-header.py?script=embedded_responder.js";
+
+const altRootResponder = `${altRoot}${responderPath}`;
+const domainCookieString = "cookie=unpartitioned;Secure;SameSite=None;Path=/;Domain={{hosts[alt][]}}";
+
+async function SetUpResponderFrame(t, url) {
+ const frame = await CreateFrame(url);
+
+ t.add_cleanup(async () => {
+ await test_driver.delete_all_cookies();
+ await SetPermissionInFrame(frame, [{ name: 'storage-access' }, 'prompt']);
+ });
+
+ return frame;
+}
+
+promise_test(async (t) => {
+ const frame = await SetUpResponderFrame(t, altRootResponder);
+ await SetDocumentCookieFromFrame(frame, domainCookieString);
+
+ const initiallyHasCookieAccess =
+ cookieStringHasCookie("cookie", "unpartitioned",
+ await FetchSubresourceCookiesFromFrame(frame, altRoot));
+ if (initiallyHasCookieAccess) {
+ // Nothing to test here; third-party cookies are already accessible.
+ return;
+ }
+
+ await SetPermissionInFrame(frame, [{ name: 'storage-access' }, 'granted']);
+
+ assert_true(await RequestStorageAccessInFrame(frame), "requestStorageAccess resolves without requiring a gesture.");
+ assert_true(await FrameHasStorageAccess(frame), "frame has storage access after request.");
+ await SetDocumentCookieFromFrame(frame, domainCookieString);
+ assert_true(await HasUnpartitionedCookie(frame), "frame has access to cookies after request.");
+
+ // Redirect back to the iframe's origin, via a cross-site redirect. The
+ // frame's origin is `{{hosts[alt][]}}`, so `{{host}}` is cross-site to it.
+ const dest = `${altRoot}/storage-access-api/resources/echo-cookie-header.py`;
+ const redirect = `${mainHost}/common/redirect.py?enable-cors=&location=${encodeURIComponent(dest)}`;
+ assert_false(
+ cookieStringHasCookie("cookie", "unpartitioned",
+ await FetchFromFrame(frame, redirect)),
+ "fetch is not credentialed after a cross-site redirect");
+}, "Cross-site HTTP redirects from a frame with storage-access are not credentialed by default");
diff --git a/tests/wpt/tests/storage-access-api/resources/echo-cookie-header.py b/tests/wpt/tests/storage-access-api/resources/echo-cookie-header.py
index f1599e3a899..0d84b0edd18 100644
--- a/tests/wpt/tests/storage-access-api/resources/echo-cookie-header.py
+++ b/tests/wpt/tests/storage-access-api/resources/echo-cookie-header.py
@@ -1,12 +1,9 @@
def main(request, response):
# Set the cors enabled headers.
origin = request.headers.get(b"Origin")
- headers = []
- if origin is not None and origin != b"null":
- headers.append((b"Content-Type", b"text/plain"))
- headers.append((b"Access-Control-Allow-Origin", origin))
- headers.append((b"Access-Control-Allow-Credentials", 'true'))
+ if origin:
+ response.headers.set(b"Content-Type", b"text/plain")
+ response.headers.set(b"Access-Control-Allow-Origin", origin)
+ response.headers.set(b"Access-Control-Allow-Credentials", 'true')
- cookie_header = request.headers.get(b"Cookie", b"")
-
- return (200, headers, cookie_header)
+ return request.headers.get(b"Cookie", b"")
diff --git a/tests/wpt/tests/subresource-integrity/signatures/accept-signature-script.py b/tests/wpt/tests/subresource-integrity/signatures/accept-signature-script.py
new file mode 100644
index 00000000000..a1c61f396d5
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/signatures/accept-signature-script.py
@@ -0,0 +1,34 @@
+'''
+SRI Message Signature helper for `accept-signature` header validation for
+<script> element requests.
+
+It compares the `accept-signature` header delivered with a request to a
+`header` GET parameter. If they match, a `matched` attribute on the current
+script element will be set to true.
+'''
+def main(request, response):
+ actual_header = request.headers.get(b'accept-signature', b'')
+ expected_header = request.GET.first(b'header', b'')
+
+ # Set common aspects of the response:
+ response.status = 200
+ response.headers.set(b'content-type', b'application/json')
+ response.headers.set(b'access-control-allow-origin', b'*')
+ response.headers.set(b'signature-input', \
+ b'signature=("unencoded-digest";sf); ' \
+ b'keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; ' \
+ b'tag="sri"')
+
+ # Do the exciting and complicated matching calculation:
+ body = b'document.currentScript.setAttribute(`matched`, false);'
+ digest = b'es+3YnsBqgi4mkbDZd3Vghz6PsqpNeg5CEJn7WOKzJI='
+ signature = b'y91SB5QNcqsZBd0XOnuf83W1FOgTWYOP+0gJZ+Lj3JahopKDedZDne9LsJ1KmV4JnjpF8LF5jJzbOO5snLidAg=='
+ if actual_header == expected_header:
+ body = b'document.currentScript.setAttribute(`matched`, true);'
+ digest = b'dq6r7uJehA7JvZk7hczA4TM0uQ5Ad9WkKKihnuQ+B3c='
+ signature = b'93PZphf5q5GJ0esZxDk/RJTG5WcExWsRAYSPgXdiQDQVyOH33qgwi0nvon9kQj7jdtoLg7uEOceGv/DBTAbRDQ=='
+
+ # Then set those bits.
+ response.content = body
+ response.headers.set(b'unencoded-digest', b'sha-256=:%s:' % digest)
+ response.headers.set(b'signature', b'signature=:%s:' % signature)
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.parser-inserted.html b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.parser-inserted.html
new file mode 100644
index 00000000000..ccedc5ce4f9
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.parser-inserted.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <!--
+ The following tests replicate the requests made in
+ `accept-signature.window.js`, but do so via script blocks inline in the HTML
+ document. Some user agents have different loading paths for parser-initiated
+ scripts and scripts inserted via other scripts, and we should verify both.
+ -->
+
+ <!--
+ {
+ integrity: `ed25519-${kValidKeys['rfc']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ }
+ -->
+ <script integrity="ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="
+ src="/subresource-integrity/signatures/accept-signature-script.py?header=sig0%3D%28%22unencoded-digest%22%3Bsf%29%3Bkeyid%3D%22JrQLj5P%2F89iXES9%2BvFgrIy29clF9CC%2FoPPsw3c5D0bs%3D%22%3Btag%3D%22sri%22&counter=1"
+ id="test1"
+ ></script>
+ <script>
+ test(_ => {
+ let matched = document.querySelector(`#test1`).getAttribute('matched');
+ assert_equals(matched, 'true');
+ }, "Single, valid integrity assertion.");
+ </script>
+
+ <!--
+ {
+ integrity: `ed25519-${kValidKeys['rfc']} malformed-thing`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ }
+ -->
+ <script integrity="ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= malformed-thing"
+ src="/subresource-integrity/signatures/accept-signature-script.py?header=sig0%3D%28%22unencoded-digest%22%3Bsf%29%3Bkeyid%3D%22JrQLj5P%2F89iXES9%2BvFgrIy29clF9CC%2FoPPsw3c5D0bs%3D%22%3Btag%3D%22sri%22&counter=2"
+ id="test2"
+ ></script>
+ <script>
+ test(_ => {
+ let matched = document.querySelector(`#test2`).getAttribute('matched');
+ assert_equals(matched, 'true');
+ }, "One matching + malformed integrity assertion.");
+ </script>
+
+ <!--
+ {
+ integrity: `ed25519-${kValidKeys['arbitrary']} ed25519-${kValidKeys['rfc']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri", ` +
+ `sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ }
+ -->
+ <script integrity="ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE= ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="
+ src="/subresource-integrity/signatures/accept-signature-script.py?header=sig0%3D%28%22unencoded-digest%22%3Bsf%29%3Bkeyid%3D%22xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE%3D%22%3Btag%3D%22sri%22%2C+sig1%3D%28%22unencoded-digest%22%3Bsf%29%3Bkeyid%3D%22JrQLj5P%2F89iXES9%2BvFgrIy29clF9CC%2FoPPsw3c5D0bs%3D%22%3Btag%3D%22sri%22&counter=3"
+ id="test3"
+ ></script>
+ <script>
+ test(_ => {
+ let matched = document.querySelector(`#test3`).getAttribute('matched');
+ assert_equals(matched, 'true');
+ }, "One matching + one mismatching integrity assertion.");
+ </script>
+
+ <!--
+ {
+ integrity: `ed25519-${kValidKeys['arbitrary']} malformed-thing ed25519-${kValidKeys['rfc']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri", ` +
+ `sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ }
+ -->
+ <script integrity="ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE= malformed-thing ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="
+ src="/subresource-integrity/signatures/accept-signature-script.py?header=sig0%3D%28%22unencoded-digest%22%3Bsf%29%3Bkeyid%3D%22xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE%3D%22%3Btag%3D%22sri%22%2C+sig1%3D%28%22unencoded-digest%22%3Bsf%29%3Bkeyid%3D%22JrQLj5P%2F89iXES9%2BvFgrIy29clF9CC%2FoPPsw3c5D0bs%3D%22%3Btag%3D%22sri%22&counter=4"
+ id="test4"
+ ></script>
+ <script>
+ test(_ => {
+ let matched = document.querySelector(`#test4`).getAttribute('matched');
+ assert_equals(matched, 'true');
+ }, "One matching + one mismatching + malformed integrity assertion.");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js
new file mode 100644
index 00000000000..efcbf0cdad6
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js
@@ -0,0 +1,44 @@
+// META: script=helper.js
+//
+// The following tests verify that `accept-signature` headers are sent when
+// requesting resources via `<script>` elements.
+
+let test_cases = [
+ {
+ integrity: `ed25519-${kValidKeys['rfc']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ },
+ {
+ integrity: `ed25519-${kValidKeys['rfc']} malformed-thing`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ },
+ {
+ integrity: `ed25519-${kValidKeys['arbitrary']} ed25519-${kValidKeys['rfc']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri", ` +
+ `sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ },
+ {
+ integrity: `ed25519-${kValidKeys['arbitrary']} malformed-thing ed25519-${kValidKeys['rfc']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri", ` +
+ `sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ },
+];
+
+let test_counter = 0;
+for (let test of test_cases) {
+ test_counter++;
+ async_test(t => {
+ let s = document.createElement('script');
+ let resource = new URL("/subresource-integrity/signatures/accept-signature-script.py", self.location);
+ resource.searchParams.set("header", test.header);
+ resource.searchParams.set("counter", test_counter); // Just to force independent requests.
+ s.src = resource;
+ s.integrity = test.integrity;
+ s.onload = t.step_func_done(e => {
+ assert_equals(s.getAttribute('matched'), 'true');
+ });
+ s.onerror = t.unreached_func("Script should not fail.");
+
+ document.body.appendChild(s);
+ }, test.integrity)
+}
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/authority.https.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/authority.https.window.js
new file mode 100644
index 00000000000..9f05359d432
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/authority.https.window.js
@@ -0,0 +1,88 @@
+// META: script=helper.js
+
+// The following tests validate the behavior of the `@authority` derived
+// component.
+//
+// Since the authority is dependent on the runtime environment, we can't vary
+// the authority value freely, and these tests must sign the headers live using
+// the WebCrypto API. Usage of that API restricts this test to secure contexts.
+//
+// These tests are all be rooted in the following response, generated using the
+// steps at https://wicg.github.io/signature-based-sri/#examples, relying on
+// the test key from
+// https://www.rfc-editor.org/rfc/rfc9421.html#name-example-ed25519-test-key:
+//
+// ```
+// NOTE: '\' line wrapping per RFC 8792
+//
+// HTTP/1.1 200 OK
+// Date: Tue, 20 Apr 2021 02:07:56 GMT
+// Content-Type: application/json
+// Unencoded-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
+// Content-Length: 18
+// Signature-Input: signature=("unencoded-digest";sf "@authority"); \
+// keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; \
+// tag="sri"
+// Signature: signature=:oVQ+s/OqXLAVdfvgZ3HaPiyzkpNXZSit9l6e1FB/gOOL3t8FOrIRDV \
+// CkcIEcJjd3MA1mROn39/WQShTmnKmlDg==:
+//
+//
+// {"hello": "world"}
+// ```
+
+const kAuthority = (new URL(window.location.href)).host;
+
+// Metadata from the response above:
+const kRequestsWithValidSignature = [
+ // `unencoded-digest` then `@authority`.
+ {
+ body: "window.hello = `world`;",
+ digest: "sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:",
+ signatureInput: `signature=("unencoded-digest";sf "@authority";req);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ signatureBase: `"unencoded-digest";sf: sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+"@authority";req: ${kAuthority}
+"@signature-params": ("unencoded-digest";sf "@authority";req);keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"`
+ },
+
+ // `@authority` then `unencoded-digest`.
+ {
+ body: "window.hello = `world`;",
+ digest: "sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:",
+ signatureInput: `signature=("@authority";req "unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ signatureBase: `"@authority";req: ${kAuthority}
+"unencoded-digest";sf: sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+"@signature-params": ("@authority";req "unencoded-digest";sf);keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"`
+ }
+];
+
+// Valid signatures depend upon integrity checks.
+//
+// We're testing our handling of malformed and multiple keys generally in
+// the broader `client-initiated.*` tests. Here we'll just focus on ensuring
+// that responses with `@authority` components load at all (no integrity check),
+// load when integrity checks match, and fail when integrity checks mismatch.
+for (const constRequest of kRequestsWithValidSignature) {
+ signSignatureBase(constRequest.signatureBase, kValidKeysJWK['rfc']).then(plainSignature => {
+ let request = {
+ ...constRequest,
+ signature: `signature=:` + plainSignature + `:`,
+ };
+
+ // fetch():
+ generate_fetch_test(request, {}, EXPECT_LOADED,
+ `Valid signature (${request.signature}), no integrity check: loads.`);
+ generate_fetch_test(request, {integrity:`ed25519-${kValidKeys['rfc']}`}, EXPECT_LOADED,
+ `Valid signature (${request.signature}), matching integrity check: loads.`);
+ generate_fetch_test(request, {integrity:`ed25519-${kInvalidKey}`}, EXPECT_BLOCKED,
+ `Valid signature (${request.signature}), mismatched integrity check: blocked.`);
+
+ // <script>:
+ generate_script_test(request, "", EXPECT_LOADED,
+ `Valid signature (${request.signature}), no integrity check: loads with live signature.`);
+ generate_script_test(request, `ed25519-${kValidKeys['rfc']}`, EXPECT_LOADED,
+ `Valid signature (${request.signature}), matching integrity check: loads with live signature.`);
+ generate_script_test(request, `ed25519-${kInvalidKey}`, EXPECT_BLOCKED,
+ `Valid signature (${request.signature}), mismatched integrity check: blocked.`);
+ });
+}
+
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
index 1258f3bef72..e5e00ec7b53 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
@@ -18,6 +18,27 @@ const kValidKeys = {
arbitrary: "xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE="
};
+// As above in kValidKeys, but in JWK format (including the private key).
+const kValidKeysJWK = {
+ // https://www.rfc-editor.org/rfc/rfc9421.html#name-example-ed25519-test-key
+ rfc: {
+ "kty": "OKP",
+ "crv": "Ed25519",
+ "kid": "test-key-ed25519",
+ "d": "n4Ni-HpISpVObnQMW0wOhCKROaIKqKtW_2ZYb2p9KcU",
+ "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs"
+ },
+
+ // Matching private key to arbitrary public key above.
+ arbitrary: {
+ "crv": "Ed25519",
+ "d": "MTodZiTA9CBsuIvSfO679TThkG3b7ce6R3sq_CdyVp4",
+ "ext": true,
+ "kty": "OKP",
+ "x": "xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE"
+ }
+};
+
// A key with the right length that cannot be used to verify the HTTP response
// above.
const kInvalidKey = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
@@ -44,6 +65,31 @@ function resourceURL(data, host) {
return result.href;
}
+// Given a signature base (actually an arbitrary string) and a key in JWK
+// format, generates a base64-encoded Ed25519 signature. Only available over
+// HTTPS.
+async function signSignatureBase(signatureBase, privateKeyJWK) {
+ assert_true(self.isSecureContext, "Signatures can only be generated in secure contexts.");
+ const privateKey = await crypto.subtle.importKey(
+ 'jwk',
+ privateKeyJWK,
+ 'Ed25519',
+ true, // extractable
+ ['sign']
+ );
+
+ const encoder = new TextEncoder();
+ const messageBytes = encoder.encode(signatureBase);
+
+ const signatureBytes = await crypto.subtle.sign(
+ { name: 'Ed25519' },
+ privateKey,
+ messageBytes
+ );
+
+ return btoa(String.fromCharCode(...new Uint8Array(signatureBytes)));
+}
+
function generate_fetch_test(request_data, options, expectation, description) {
promise_test(test => {
const url = resourceURL(request_data, options.host);
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/status.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/status.window.js
index 2cc4485a3e6..d585e1716d7 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/status.window.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/status.window.js
@@ -47,7 +47,7 @@ const kRequestsWithValidSignature = [
signatureInput: `signature=("unencoded-digest";sf "@status");keyid="${kValidKeys['rfc']}";tag="sri"`
},
- // `@path` then `unencoded-digest`, with the following signature base:
+ // `@status` then `unencoded-digest`, with the following signature base:
//
// ```
// "@status": 200
diff --git a/tests/wpt/tests/svg/animations/reftests/discard-check-remove2.html b/tests/wpt/tests/svg/animations/reftests/discard-check-remove2.html
new file mode 100644
index 00000000000..92ecaec9d21
--- /dev/null
+++ b/tests/wpt/tests/svg/animations/reftests/discard-check-remove2.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html class="reftest-wait">
+<head>
+ <meta charset="utf-8">
+ <title>discard element removes the element it references and itself</title>
+ <script src="/common/rendering-utils.js"></script>
+ <script src="/common/reftest-wait.js"></script>
+ <link rel="help" href="https://svgwg.org/specs/animations/#DiscardElement">
+ <link rel="match" href="reference/green-100x100.svg">
+</head>
+<body>
+ <style>
+ html, body, svg {
+ padding: 0;
+ margin: 0;
+ }
+ </style>
+ <svg onload="startTest()">
+ <rect id="r1" width="100" height="100" fill="green"/>
+ <rect id="r2" width="100" height="100" fill="red" />
+ <discard id="discard1" href="#r2" begin="2s"/>
+ <set attributeName="display" to="inline" begin="2.01s" dur="1s" fill="freeze" onbegin="checkDelete()"/>
+
+ <script>
+ function startTest() {
+ document.documentElement.setCurrentTime(2);
+ }
+
+ function checkDelete() {
+ let d1 = document.getElementById("discard1");
+ let r2 = document.getElementById("r2");
+
+ if (d1 || r2) {
+ document.getElementById("r1").setAttribute("fill", "orange");
+ }
+ takeScreenshot();
+ }
+ </script>
+ </svg>
+</body>
+</html>
diff --git a/tests/wpt/tests/svg/pservers/reftests/gradient-color-interpolation.svg b/tests/wpt/tests/svg/pservers/reftests/gradient-color-interpolation.svg
index f7959437734..91dad7dcf0e 100644
--- a/tests/wpt/tests/svg/pservers/reftests/gradient-color-interpolation.svg
+++ b/tests/wpt/tests/svg/pservers/reftests/gradient-color-interpolation.svg
@@ -6,7 +6,7 @@
<html:link rel="help"
href="https://www.w3.org/TR/SVG2/pservers.html#LinearGradients"/>
<html:link rel="match" href="reference/gradient-color-interpolation-ref.svg" />
- <html:meta name="fuzzy" content="maxDifference=0-20;totalPixels=0-29200" />
+ <html:meta name="fuzzy" content="maxDifference=0-20;totalPixels=0-29400" />
</g>
<defs>
diff --git a/tests/wpt/tests/svg/shapes/reftests/pathlength-005-ref.html b/tests/wpt/tests/svg/shapes/reftests/pathlength-005-ref.html
new file mode 100644
index 00000000000..b99474aa466
--- /dev/null
+++ b/tests/wpt/tests/svg/shapes/reftests/pathlength-005-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<svg width="100" height="100" viewBox="-20 -20 40 40" style="fill:none;">
+ <circle r="18" pathlength="100" stroke="green" stroke-width="1" stroke-dasharray="50,50"/>
+</svg>
diff --git a/tests/wpt/tests/svg/shapes/reftests/pathlength-005.html b/tests/wpt/tests/svg/shapes/reftests/pathlength-005.html
new file mode 100644
index 00000000000..59d4ae5fa64
--- /dev/null
+++ b/tests/wpt/tests/svg/shapes/reftests/pathlength-005.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<title>Test of 'pathLength' on shapes with zoom.</title>
+<link rel="help"
+ href="https://www.w3.org/TR/SVG2/shapes.html#CircleElement">
+<link rel="match" href="pathlength-005-ref.html">
+
+<svg id="test-body-content" width="400" viewBox="-20 -20 40 40" style="fill:none;zoom: 0.25;">
+ <circle r="18" pathlength="100" stroke="green" stroke-width="1" stroke-dasharray="50,50"/>
+</svg>
diff --git a/tests/wpt/tests/url/resources/setters_tests.json b/tests/wpt/tests/url/resources/setters_tests.json
index efd548b6c88..cf8a420caab 100644
--- a/tests/wpt/tests/url/resources/setters_tests.json
+++ b/tests/wpt/tests/url/resources/setters_tests.json
@@ -1141,6 +1141,42 @@
"host": "example.com",
"hostname": "example.com"
}
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "*",
+ "expected": {
+ "href": "https://*/",
+ "host": "*",
+ "hostname": "*"
+ }
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "x@x",
+ "expected": {
+ "href": "https://test.invalid/",
+ "host": "test.invalid",
+ "hostname": "test.invalid"
+ }
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "foo\t\r\nbar",
+ "expected": {
+ "href": "https://foobar/",
+ "host": "foobar",
+ "hostname": "foobar"
+ }
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "><",
+ "expected": {
+ "href": "https://test.invalid/",
+ "host": "test.invalid",
+ "hostname": "test.invalid"
+ }
}
],
"hostname": [
@@ -1552,6 +1588,42 @@
"host": "example.com",
"hostname": "example.com"
}
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "*",
+ "expected": {
+ "href": "https://*/",
+ "host": "*",
+ "hostname": "*"
+ }
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "x@x",
+ "expected": {
+ "href": "https://test.invalid/",
+ "host": "test.invalid",
+ "hostname": "test.invalid"
+ }
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "foo\t\r\nbar",
+ "expected": {
+ "href": "https://foobar/",
+ "host": "foobar",
+ "hostname": "foobar"
+ }
+ },
+ {
+ "href": "https://test.invalid/",
+ "new_value": "><",
+ "expected": {
+ "href": "https://test.invalid/",
+ "host": "test.invalid",
+ "hostname": "test.invalid"
+ }
}
],
"port": [
@@ -2169,12 +2241,12 @@
}
},
{
- "comment": "Drop trailing spaces from trailing opaque paths",
+ "comment": "Trailing spaces and opaque paths",
"href": "data:space ?query",
"new_value": "",
"expected": {
- "href": "data:space",
- "pathname": "space",
+ "href": "data:space%20",
+ "pathname": "space%20",
"search": ""
}
},
@@ -2182,17 +2254,17 @@
"href": "sc:space ?query",
"new_value": "",
"expected": {
- "href": "sc:space",
- "pathname": "space",
+ "href": "sc:space%20",
+ "pathname": "space%20",
"search": ""
}
},
{
- "comment": "Do not drop trailing spaces from non-trailing opaque paths",
+ "comment": "Trailing spaces and opaque paths",
"href": "data:space ?query#fragment",
"new_value": "",
"expected": {
- "href": "data:space #fragment",
+ "href": "data:space %20#fragment",
"search": ""
}
},
@@ -2200,7 +2272,7 @@
"href": "sc:space ?query#fragment",
"new_value": "",
"expected": {
- "href": "sc:space #fragment",
+ "href": "sc:space %20#fragment",
"search": ""
}
},
@@ -2357,12 +2429,12 @@
}
},
{
- "comment": "Drop trailing spaces from trailing opaque paths",
+ "comment": "Trailing spaces and opaque paths",
"href": "data:space #fragment",
"new_value": "",
"expected": {
- "href": "data:space",
- "pathname": "space",
+ "href": "data:space %20",
+ "pathname": "space %20",
"hash": ""
}
},
@@ -2370,17 +2442,17 @@
"href": "sc:space #fragment",
"new_value": "",
"expected": {
- "href": "sc:space",
- "pathname": "space",
+ "href": "sc:space %20",
+ "pathname": "space %20",
"hash": ""
}
},
{
- "comment": "Do not drop trailing spaces from non-trailing opaque paths",
+ "comment": "Trailing spaces and opaque paths",
"href": "data:space ?query#fragment",
"new_value": "",
"expected": {
- "href": "data:space ?query",
+ "href": "data:space %20?query",
"hash": ""
}
},
@@ -2388,7 +2460,7 @@
"href": "sc:space ?query#fragment",
"new_value": "",
"expected": {
- "href": "sc:space ?query",
+ "href": "sc:space %20?query",
"hash": ""
}
},
diff --git a/tests/wpt/tests/url/resources/toascii.json b/tests/wpt/tests/url/resources/toascii.json
index 02291962ebc..588ef150f9c 100644
--- a/tests/wpt/tests/url/resources/toascii.json
+++ b/tests/wpt/tests/url/resources/toascii.json
@@ -1,6 +1,9 @@
[
"This contains assorted IDNA tests that IdnaTestV2 might not cover.",
"Feel free to deduplicate with a clear commit message.",
+ "",
+ "If the test only applies to the URL Standard's 'domain to ASCII', ",
+ "and not to TR46's ToASCII, then tag it with `urlStandardOnly`",
{
"comment": "Label with hyphens in 3rd and 4th position",
"input": "aa--",
@@ -239,11 +242,13 @@
},
{
"input": "www.lookout.net\u2A7480",
- "output": null
+ "output": null,
+ "urlStandardOnly": true
},
{
"input": "www\u00A0.lookout.net",
- "output": null
+ "output": null,
+ "urlStandardOnly": true
},
{
"input": "\u1680lookout.net",
@@ -251,7 +256,8 @@
},
{
"input": "\u001flookout.net",
- "output": null
+ "output": null,
+ "urlStandardOnly": true
},
{
"input": "look\u06DDout.net",
diff --git a/tests/wpt/tests/url/resources/urltestdata.json b/tests/wpt/tests/url/resources/urltestdata.json
index 214ed0852aa..d1a06f6319d 100644
--- a/tests/wpt/tests/url/resources/urltestdata.json
+++ b/tests/wpt/tests/url/resources/urltestdata.json
@@ -3778,6 +3778,126 @@
"search": "",
"hash": ""
},
+ {
+ "input": "non-special:opaque ",
+ "base": null,
+ "href": "non-special:opaque",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "non-special:opaque ?hi",
+ "base": null,
+ "href": "non-special:opaque %20?hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque %20",
+ "search": "?hi",
+ "hash": ""
+ },
+ {
+ "input": "non-special:opaque #hi",
+ "base": null,
+ "href": "non-special:opaque %20#hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque %20",
+ "search": "",
+ "hash": "#hi"
+ },
+ {
+ "input": "non-special:opaque x?hi",
+ "base": null,
+ "href": "non-special:opaque x?hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque x",
+ "search": "?hi",
+ "hash": ""
+ },
+ {
+ "input": "non-special:opaque x#hi",
+ "base": null,
+ "href": "non-special:opaque x#hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque x",
+ "search": "",
+ "hash": "#hi"
+ },
+ {
+ "input": "non-special:opaque \t\t \t#hi",
+ "base": null,
+ "href": "non-special:opaque %20#hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque %20",
+ "search": "",
+ "hash": "#hi"
+ },
+ {
+ "input": "non-special:opaque \t\t #hi",
+ "base": null,
+ "href": "non-special:opaque %20#hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque %20",
+ "search": "",
+ "hash": "#hi"
+ },
+ {
+ "input": "non-special:opaque\t\t \r #hi",
+ "base": null,
+ "href": "non-special:opaque %20#hi",
+ "origin": "null",
+ "protocol": "non-special:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "opaque %20",
+ "search": "",
+ "hash": "#hi"
+ },
"Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)",
{
"input": "http://www.foo。bar.com",
diff --git a/tests/wpt/tests/url/url-setters-a-area.window.js b/tests/wpt/tests/url/url-setters-a-area.window.js
index 6a5e762cd42..0012595cc46 100644
--- a/tests/wpt/tests/url/url-setters-a-area.window.js
+++ b/tests/wpt/tests/url/url-setters-a-area.window.js
@@ -8,36 +8,37 @@
promise_test(() => fetch("resources/setters_tests.json").then(res => res.json()).then(runURLSettersTests), "Loading data…");
-function runURLSettersTests(all_test_cases) {
- for (var attribute_to_be_set in all_test_cases) {
- if (attribute_to_be_set == "comment") {
+function runURLSettersTests(allTestCases) {
+ for (const [propertyToBeSet, testCases] of Object.entries(allTestCases)) {
+ if (propertyToBeSet === "comment") {
continue;
}
- var test_cases = all_test_cases[attribute_to_be_set];
- for(var i = 0, l = test_cases.length; i < l; i++) {
- var test_case = test_cases[i];
- var name = "Setting <" + test_case.href + ">." + attribute_to_be_set +
- " = '" + test_case.new_value + "'";
- if ("comment" in test_case) {
- name += " " + test_case.comment;
- }
- const key = test_case.href.split(":")[0];
- subsetTestByKey(key, test, function() {
- var url = document.createElement("a");
- url.href = test_case.href;
- url[attribute_to_be_set] = test_case.new_value;
- for (var attribute in test_case.expected) {
- assert_equals(url[attribute], test_case.expected[attribute])
+
+ for (const testCase of testCases) {
+ const name = `Setting <${testCase.href}>.${propertyToBeSet} = '${testCase.new_value}'${
+ testCase.comment ? ` ${testCase.comment}` : ''
+ }`;
+
+ const key = testCase.href.split(":")[0];
+ subsetTestByKey(key, test, () => {
+ const url = document.createElement("a");
+ url.href = testCase.href;
+ url[propertyToBeSet] = testCase.new_value;
+
+ for (const [property, expectedValue] of Object.entries(testCase.expected)) {
+ assert_equals(url[property], expectedValue);
}
- }, "<a>: " + name)
- subsetTestByKey(key, test, function() {
- var url = document.createElement("area");
- url.href = test_case.href;
- url[attribute_to_be_set] = test_case.new_value;
- for (var attribute in test_case.expected) {
- assert_equals(url[attribute], test_case.expected[attribute])
+ }, `<a>: ${name}`);
+
+ subsetTestByKey(key, test, () => {
+ const url = document.createElement("area");
+ url.href = testCase.href;
+ url[propertyToBeSet] = testCase.new_value;
+
+ for (const [property, expectedValue] of Object.entries(testCase.expected)) {
+ assert_equals(url[property], expectedValue);
}
- }, "<area>: " + name)
+ }, `<area>: ${name}`);
}
}
}
diff --git a/tests/wpt/tests/url/url-setters.any.js b/tests/wpt/tests/url/url-setters.any.js
index fe88175ac63..66b3d9b4f9d 100644
--- a/tests/wpt/tests/url/url-setters.any.js
+++ b/tests/wpt/tests/url/url-setters.any.js
@@ -8,27 +8,26 @@
promise_test(() => fetch("resources/setters_tests.json").then(res => res.json()).then(runURLSettersTests), "Loading data…");
-function runURLSettersTests(all_test_cases) {
- for (var attribute_to_be_set in all_test_cases) {
- if (attribute_to_be_set == "comment") {
+function runURLSettersTests(allTestCases) {
+ for (const [propertyToBeSet, testCases] of Object.entries(allTestCases)) {
+ if (propertyToBeSet === "comment") {
continue;
}
- var test_cases = all_test_cases[attribute_to_be_set];
- for(var i = 0, l = test_cases.length; i < l; i++) {
- var test_case = test_cases[i];
- var name = "Setting <" + test_case.href + ">." + attribute_to_be_set +
- " = '" + test_case.new_value + "'";
- if ("comment" in test_case) {
- name += " " + test_case.comment;
- }
+
+ for (const test_case of testCases) {
+ const name = `Setting <${test_case.href}>.${propertyToBeSet} = '${test_case.new_value}'${
+ test_case.comment ? ` ${test_case.comment}` : ''
+ }`;
+
const key = test_case.href.split(":")[0];
- subsetTestByKey(key, test, function() {
- var url = new URL(test_case.href);
- url[attribute_to_be_set] = test_case.new_value;
- for (var attribute in test_case.expected) {
- assert_equals(url[attribute], test_case.expected[attribute])
+ subsetTestByKey(key, test, () => {
+ const url = new URL(test_case.href);
+ url[propertyToBeSet] = test_case.new_value;
+
+ for (const [property, expectedValue] of Object.entries(test_case.expected)) {
+ assert_equals(url[property], expectedValue);
}
- }, "URL: " + name)
+ }, `URL: ${name}`);
}
}
}
diff --git a/tests/wpt/tests/url/url-statics-canparse.any.js b/tests/wpt/tests/url/url-statics-canparse.any.js
index 74f3da31f0d..9b352029d85 100644
--- a/tests/wpt/tests/url/url-statics-canparse.any.js
+++ b/tests/wpt/tests/url/url-statics-canparse.any.js
@@ -16,6 +16,11 @@
"expected": false
},
{
+ "url": undefined,
+ "base": "https://test:test/",
+ "expected": false
+ },
+ {
"url": "aaa:/b",
"base": undefined,
"expected": true
diff --git a/tests/wpt/tests/url/urlsearchparams-delete.any.js b/tests/wpt/tests/url/urlsearchparams-delete.any.js
index c597142c51d..09a5dccb648 100644
--- a/tests/wpt/tests/url/urlsearchparams-delete.any.js
+++ b/tests/wpt/tests/url/urlsearchparams-delete.any.js
@@ -50,17 +50,17 @@ test(() => {
url.searchParams.delete('test');
assert_false(url.searchParams.has('test'));
assert_equals(url.search, '');
- assert_equals(url.pathname, 'space');
- assert_equals(url.href, 'data:space');
-}, 'Changing the query of a URL with an opaque path can impact the path');
+ assert_equals(url.pathname, 'space %20');
+ assert_equals(url.href, 'data:space %20');
+}, 'Changing the query of a URL with an opaque path with trailing spaces');
test(() => {
const url = new URL('data:space ?test#test');
url.searchParams.delete('test');
assert_equals(url.search, '');
- assert_equals(url.pathname, 'space ');
- assert_equals(url.href, 'data:space #test');
-}, 'Changing the query of a URL with an opaque path can impact the path if the URL has no fragment');
+ assert_equals(url.pathname, 'space %20');
+ assert_equals(url.href, 'data:space %20#test');
+}, 'Changing the query of a URL with an opaque path with trailing spaces and a fragment');
test(() => {
const params = new URLSearchParams();
diff --git a/tests/wpt/tests/urlpattern/META.yml b/tests/wpt/tests/urlpattern/META.yml
new file mode 100644
index 00000000000..ad348f6dfd7
--- /dev/null
+++ b/tests/wpt/tests/urlpattern/META.yml
@@ -0,0 +1,5 @@
+spec: https://urlpattern.spec.whatwg.org/
+suggested_reviewers:
+ - sisidovski
+ - anonrig
+ - annevk
diff --git a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json
index 3d5ddce1eab..f92ab76b71d 100644
--- a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json
+++ b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json
@@ -2432,8 +2432,10 @@
},
{
"pattern": [{ "hostname": "bad#hostname" }],
- "inputs": [{ "hostname": "bad" }],
- "exactly_empty_components": ["port"],
+ "inputs": [{ "hostname": "bad" }],
+ "expected_obj": {
+ "hostname": "bad"
+ },
"expected_match": {
"hostname": { "input": "bad", "groups": {} }
}
@@ -2445,6 +2447,9 @@
{
"pattern": [{ "hostname": "bad/hostname" }],
"inputs": [{ "hostname": "bad" }],
+ "expected_obj": {
+ "hostname": "bad"
+ },
"expected_match": {
"hostname": { "input": "bad", "groups": {} }
}
@@ -2480,6 +2485,9 @@
{
"pattern": [{ "hostname": "bad\\\\hostname" }],
"inputs": [{ "hostname": "badhostname" }],
+ "expected_obj": {
+ "hostname": "bad"
+ },
"expected_match": null
},
{
@@ -2493,6 +2501,9 @@
{
"pattern": [{ "hostname": "bad\nhostname" }],
"inputs": [{ "hostname": "badhostname" }],
+ "expected_obj": {
+ "hostname": "badhostname"
+ },
"expected_match": {
"hostname": { "input": "badhostname", "groups": {} }
}
@@ -2500,6 +2511,9 @@
{
"pattern": [{ "hostname": "bad\rhostname" }],
"inputs": [{ "hostname": "badhostname" }],
+ "expected_obj": {
+ "hostname": "badhostname"
+ },
"expected_match": {
"hostname": { "input": "badhostname", "groups": {} }
}
@@ -2507,6 +2521,9 @@
{
"pattern": [{ "hostname": "bad\thostname" }],
"inputs": [{ "hostname": "badhostname" }],
+ "expected_obj": {
+ "hostname": "badhostname"
+ },
"expected_match": {
"hostname": { "input": "badhostname", "groups": {} }
}
diff --git a/tests/wpt/tests/wai-aria/scripts/aria-utils.js b/tests/wpt/tests/wai-aria/scripts/aria-utils.js
index 5ed73b06e45..ec53464c18f 100644
--- a/tests/wpt/tests/wai-aria/scripts/aria-utils.js
+++ b/tests/wpt/tests/wai-aria/scripts/aria-utils.js
@@ -45,9 +45,6 @@ const AriaUtils = {
}
for (const el of els) {
let role = el.getAttribute("data-expectedrole");
- if (!role) {
- throw `Element should have attribute \'data-expectedrole\'. Element: ${el.outerHTML}`;
- }
let testName = el.getAttribute("data-testname") || role; // data-testname optional if role is unique per test file
if (typeof roleTestNamePrefix !== "undefined") {
testName = roleTestNamePrefix + testName;
@@ -140,9 +137,6 @@ const AriaUtils = {
}
for (const el of els) {
let label = el.getAttribute("data-expectedlabel");
- if (!label) {
- throw `Element should have attribute \'data-expectedlabel\'. Element: ${el.outerHTML}`;
- }
let testName = el.getAttribute("data-testname") || label; // data-testname optional if label is unique per test file
if (typeof labelTestNamePrefix !== "undefined") {
testName = labelTestNamePrefix + testName;
diff --git a/tests/wpt/tests/webauthn/conditional-mediation.https.html b/tests/wpt/tests/webauthn/conditional-mediation.https.html
index 1eb2ba3b1e7..aeb14b3b161 100644
--- a/tests/wpt/tests/webauthn/conditional-mediation.https.html
+++ b/tests/wpt/tests/webauthn/conditional-mediation.https.html
@@ -10,7 +10,7 @@
<script>
"use strict";
-// Test that conditional mediation is supported.
+// Test that conditional mediation (get) is supported.
virtualAuthenticatorPromiseTest(async t => {
assert_own_property(window.PublicKeyCredential, "isConditionalMediationAvailable");
assert_true(await window.PublicKeyCredential.isConditionalMediationAvailable());
@@ -19,6 +19,21 @@ virtualAuthenticatorPromiseTest(async t => {
hasResidentKey: true,
hasUserVerification: true,
transport: "internal",
-}, "Conditional mediation supported");
+}, "Conditional mediation supported"
+);
+
+
+// Test that conditional create is supported.
+virtualAuthenticatorPromiseTest(async t => {
+ assert_own_property(window.PublicKeyCredential, "getClientCapabilities");
+ let capabilities = await window.PublicKeyCredential.getClientCapabilities();
+ assert_true(typeof (capabilities["conditionalCreate"]) == "boolean");
+ assert_true(capabilities["conditionalCreate"]);
+}, {
+ protocol: "ctap2",
+ hasResidentKey: true,
+ hasUserVerification: true,
+ transport: "internal",
+}, "Conditional create supported");
</script>
diff --git a/tests/wpt/tests/webcodecs/videoFrame-copyTo.any.js b/tests/wpt/tests/webcodecs/videoFrame-copyTo.any.js
index 0fa57f43105..7cd3c3f73cd 100644
--- a/tests/wpt/tests/webcodecs/videoFrame-copyTo.any.js
+++ b/tests/wpt/tests/webcodecs/videoFrame-copyTo.any.js
@@ -310,3 +310,58 @@ promise_test(async t => {
const data = new Uint8Array(12);
await promise_rejects_js(t, TypeError, frame.copyTo(data, options));
}, 'Test invalid rect.');
+
+promise_test(async t => {
+ let init = {
+ format: 'I420',
+ timestamp: 1234,
+ codedWidth: 8,
+ codedHeight: 16,
+ visibleRect: {
+ x: 2,
+ y: 2,
+ width: 4,
+ height: 8,
+ },
+ colorSpace: {
+ primaries: 'smpte170m',
+ transfer: 'smpte170m',
+ matrix: 'smpte170m',
+ fullRange: false,
+ }
+ };
+
+ // Define YUV values for BT.601 red.
+ const redY = 76;
+ const redU = 84;
+ const redV = 255;
+
+ const ySize = init.codedWidth * init.codedHeight;
+ const uvSize = ySize / 4;
+ let data = new Uint8Array(ySize + 2 * uvSize);
+ fillYUV(data, init.codedWidth, init.codedHeight, init.visibleRect, redY, redU,
+ redV);
+
+ let frame = new VideoFrame(data, init);
+ assert_equals(frame.codedWidth, init.visibleRect.width);
+ assert_equals(frame.codedHeight, init.visibleRect.height);
+ assert_equals(frame.visibleRect.x, 0);
+ assert_equals(frame.visibleRect.y, 0);
+ assert_equals(frame.visibleRect.width, init.visibleRect.width);
+ assert_equals(frame.visibleRect.height, init.visibleRect.height);
+ assert_equals(frame.displayWidth, init.visibleRect.width);
+ assert_equals(frame.displayHeight, init.visibleRect.height);
+
+ let options = {rect: frame.visibleRect};
+ let copied_data = new Uint8Array(frame.allocationSize(options));
+ await frame.copyTo(copied_data, options);
+
+ // We could write a bunch of code to carefully slice out the visible region
+ // of `data`, but it's simpler and works better with testharness.js operators
+ // to just create a fresh packed version for direct comparison.
+ let packed_data = new Uint8Array(frame.allocationSize(options));
+ fillYUV(packed_data, frame.codedWidth, frame.codedHeight, frame.visibleRect,
+ redY, redU, redV);
+
+ assert_array_equals(copied_data, packed_data, `Copied frame data incorrect.`);
+}, 'copyTo from byte data with non-default visibleRect');
diff --git a/tests/wpt/tests/webcodecs/videoFrame-utils.js b/tests/wpt/tests/webcodecs/videoFrame-utils.js
index a4c761306c0..f03d8f38147 100644
--- a/tests/wpt/tests/webcodecs/videoFrame-utils.js
+++ b/tests/wpt/tests/webcodecs/videoFrame-utils.js
@@ -116,3 +116,31 @@ function verifyTimestampRequiredToConstructFrame(imageSource) {
let validFrame = new VideoFrame(imageSource, {timestamp: 0});
validFrame.close();
}
+
+// Fills a visible region within `data` with the given YUV values.
+function fillYUV(data, codedWidth, codedHeight, visibleRect, v_y, v_u, v_v) {
+ for (let y = 0; y < codedHeight; y++) {
+ for (let x = 0; x < codedWidth; x++) {
+ data[y * codedWidth + x] =
+ (x >= visibleRect.x && y < visibleRect.y + visibleRect.height) ? v_y
+ : 0;
+ }
+ }
+ const uvWidth = codedWidth / 2;
+ const uvHeight = codedHeight / 2;
+ const uvPlaneSize = uvWidth * uvHeight;
+ const uvOffset = codedWidth * codedHeight;
+ const uvX = visibleRect.x / 2;
+ const uvMaxY = (visibleRect.y + visibleRect.height) / 2;
+ for (let y = 0; y < uvHeight; y++) {
+ for (let x = 0; x < uvWidth; x++) {
+ if (x >= uvX && y < uvMaxY) {
+ data[uvOffset + y * uvWidth + x] = v_u;
+ data[uvOffset + uvPlaneSize + y * uvWidth + x] = v_v;
+ } else {
+ data[uvOffset + y * uvWidth + x] =
+ data[uvOffset + uvPlaneSize + y * uvWidth + x] = 128;
+ }
+ }
+ }
+}
diff --git a/tests/wpt/tests/webdriver/tests/bidi/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/__init__.py
index ba982d1dc64..8e45c0f7265 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/__init__.py
@@ -1,10 +1,12 @@
from typing import Any, Callable, Dict, List, Mapping
from webdriver.bidi.modules.script import ContextTarget
+from webdriver.bidi.undefined import UNDEFINED
# Compares 2 objects recursively.
# Actual value can have more keys as part of the forwards-compat design.
-# Expected value can be a callable delegate, asserting the value.
+# Expected value can be a value, a callable delegate, asserting the value, or UNDEFINED.
+# If expected value is UNDEFINED, the actual value should not be present.
def recursive_compare(expected: Any, actual: Any) -> None:
if callable(expected):
expected(actual)
@@ -17,11 +19,19 @@ def recursive_compare(expected: Any, actual: Any) -> None:
return
if isinstance(actual, Dict) and isinstance(expected, Dict):
+
+ # Expected keys with UNDEFINED values should not be present.
+ unexpected_keys = {key: value for key, value in expected.items() if
+ value is UNDEFINED}.keys()
+ assert not (unexpected_keys & actual.keys()), \
+ f"Keys should not be present: {unexpected_keys & actual.keys()}"
+
+ expected_keys = expected.keys() - unexpected_keys
# Actual Mapping can have more keys as part of the forwards-compat design.
assert (
- expected.keys() <= actual.keys()
- ), f"Key set should be present: {set(expected.keys()) - set(actual.keys())}"
- for key in expected.keys():
+ expected_keys <= actual.keys()
+ ), f"Key set should be present: {set(expected_keys) - set(actual.keys())}"
+ for key in expected_keys:
recursive_compare(expected[key], actual[key])
return
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/__init__.py
new file mode 100644
index 00000000000..27f5918b4c8
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/__init__.py
@@ -0,0 +1,10 @@
+from tests.bidi import recursive_compare, any_bool, any_dict
+
+
+def assert_file_dialog_opened_event(event, context, multiple=any_bool,
+ element=any_dict):
+ recursive_compare({
+ 'context': context,
+ 'element': element,
+ 'multiple': multiple
+ }, event)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/file_dialog_opened.py b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/file_dialog_opened.py
new file mode 100644
index 00000000000..d1c4c555dcf
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/file_dialog_opened.py
@@ -0,0 +1,109 @@
+import pytest
+from tests.support.sync import AsyncPoll
+
+from webdriver.bidi.modules.script import ContextTarget
+from . import assert_file_dialog_opened_event
+
+from webdriver.error import TimeoutException
+
+pytestmark = pytest.mark.asyncio
+
+FILE_DIALOG_OPENED_EVENT = "input.fileDialogOpened"
+
+
+async def test_unsubscribe(bidi_session, inline, top_context, wait_for_event,
+ wait_for_future_safe):
+ await bidi_session.session.subscribe(events=[FILE_DIALOG_OPENED_EVENT])
+ await bidi_session.session.unsubscribe(events=[FILE_DIALOG_OPENED_EVENT])
+
+ # Track all received browsingContext.navigationStarted events in the events array
+ events = []
+
+ async def on_event(method, data):
+ events.append(data)
+
+ remove_listener = bidi_session.add_event_listener(FILE_DIALOG_OPENED_EVENT,
+ on_event)
+
+ url = inline("<input id=input type=file />")
+ await bidi_session.browsing_context.navigate(context=top_context["context"],
+ url=url, wait="complete")
+
+ await bidi_session.script.evaluate(
+ expression="input.click()",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ user_activation=True
+ )
+
+ wait = AsyncPoll(bidi_session, timeout=0.5)
+ with pytest.raises(TimeoutException):
+ await wait.until(lambda _: len(events) > 0)
+
+ remove_listener()
+
+
+async def test_subscribe(bidi_session, subscribe_events, inline, top_context,
+ wait_for_event, wait_for_future_safe):
+ await subscribe_events(events=[FILE_DIALOG_OPENED_EVENT])
+ on_entry = wait_for_event(FILE_DIALOG_OPENED_EVENT)
+
+ url = inline("<input id=input type=file />")
+ await bidi_session.browsing_context.navigate(context=top_context["context"],
+ url=url, wait="complete")
+
+ await bidi_session.script.evaluate(
+ expression="input.click()",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ user_activation=True
+ )
+
+ event = await wait_for_future_safe(on_entry)
+ assert_file_dialog_opened_event(event, top_context["context"])
+
+
+@pytest.mark.parametrize("multiple", [True, False])
+async def test_multiple(bidi_session, subscribe_events, inline, top_context,
+ wait_for_event, wait_for_future_safe, multiple):
+ await subscribe_events(events=[FILE_DIALOG_OPENED_EVENT])
+ on_entry = wait_for_event(FILE_DIALOG_OPENED_EVENT)
+
+ url = inline(
+ f"<input id=input type=file {'multiple' if multiple else ''} />")
+ await bidi_session.browsing_context.navigate(context=top_context["context"],
+ url=url, wait="complete")
+
+ await bidi_session.script.evaluate(
+ expression="input.click()",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ user_activation=True
+ )
+ event = await wait_for_future_safe(on_entry)
+ assert_file_dialog_opened_event(event, top_context["context"],
+ multiple=multiple)
+
+
+async def test_element(bidi_session, subscribe_events, inline, top_context,
+ wait_for_event, wait_for_future_safe):
+ await subscribe_events(events=[FILE_DIALOG_OPENED_EVENT])
+ on_entry = wait_for_event(FILE_DIALOG_OPENED_EVENT)
+
+ url = inline("<input id=input type=file />")
+ await bidi_session.browsing_context.navigate(context=top_context["context"],
+ url=url, wait="complete")
+
+ node = await bidi_session.script.evaluate(
+ expression="input.click(); input",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ user_activation=True
+ )
+
+ event = await wait_for_future_safe(on_entry)
+ expected_element = {
+ 'sharedId': node["sharedId"],
+ }
+ assert_file_dialog_opened_event(event, top_context["context"],
+ element=expected_element)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/__init__.py
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/show_open_file_picker.py b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/show_open_file_picker.py
new file mode 100644
index 00000000000..cfa08f96995
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/file_dialog_opened/tentative/show_open_file_picker.py
@@ -0,0 +1,32 @@
+import pytest
+
+from webdriver.bidi.modules.script import ContextTarget
+from webdriver.bidi.undefined import UNDEFINED
+from tests.bidi.input.file_dialog_opened import assert_file_dialog_opened_event
+
+pytestmark = pytest.mark.asyncio
+
+FILE_DIALOG_OPENED_EVENT = "input.fileDialogOpened"
+
+
+@pytest.mark.parametrize("multiple", [True, False])
+async def test_show_open_file_picker(bidi_session, subscribe_events, inline,
+ top_context, wait_for_event, wait_for_future_safe, multiple):
+ await subscribe_events(events=[FILE_DIALOG_OPENED_EVENT])
+ on_file_dialog_opened = wait_for_event(FILE_DIALOG_OPENED_EVENT)
+
+ # Navigate to a page to enable file picker.
+ await bidi_session.browsing_context.navigate(context=top_context["context"],
+ url=(inline("")),
+ wait="complete")
+
+ await bidi_session.script.evaluate(
+ expression=f"window.showOpenFilePicker({{'multiple': {'true' if multiple else 'false'}}})",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ user_activation=True
+ )
+
+ event = await wait_for_future_safe(on_file_dialog_opened)
+ assert_file_dialog_opened_event(event, top_context["context"],
+ multiple=multiple, element=UNDEFINED)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/accept.py b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/accept.py
new file mode 100644
index 00000000000..cc1197a53f9
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/accept.py
@@ -0,0 +1,25 @@
+# META: timeout=long
+import pytest
+
+pytestmark = pytest.mark.asyncio
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": 'accept'})
+async def test_string_accept(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": 'accept and notify'})
+async def test_string_accept_and_notify(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": {'default': 'accept'}})
+async def test_default_accept(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
+
+
+@pytest.mark.capabilities(
+ {"unhandledPromptBehavior": {'file': 'accept', 'default': 'ignore'}})
+async def test_file_accept(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/conftest.py
new file mode 100644
index 00000000000..397b5a610ef
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/conftest.py
@@ -0,0 +1,60 @@
+import pytest
+import pytest_asyncio
+import asyncio
+
+from webdriver.error import TimeoutException
+from webdriver.bidi.modules.script import ContextTarget
+
+
+@pytest_asyncio.fixture
+async def assert_file_dialog_canceled(bidi_session, inline, top_context):
+ async def assert_file_dialog_canceled():
+ cancel_event = await bidi_session.script.evaluate(
+ expression="""
+ new Promise(resolve => {
+ const picker = document.createElement('input');
+ picker.type = 'file';
+ picker.addEventListener('cancel', (event) => {
+ resolve(event.isTrusted);
+ });
+ picker.click();
+ })""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ user_activation=True
+ )
+
+ # Assert the `cancel` event is dispatched and the event is trusted.
+ assert cancel_event == {
+ 'type': 'boolean',
+ 'value': True
+ }
+
+ yield assert_file_dialog_canceled
+
+
+@pytest_asyncio.fixture
+async def assert_file_dialog_not_canceled(bidi_session, inline, top_context,
+ wait_for_future_safe):
+ async def assert_file_dialog_not_canceled():
+ cancel_event_future = asyncio.create_task(bidi_session.script.evaluate(
+ expression="""
+ new Promise(resolve => {
+ const picker = document.createElement('input');
+ picker.type = 'file';
+ picker.addEventListener('cancel', (event) => {
+ resolve(event.isTrusted);
+ });
+ picker.click();
+ })""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ user_activation=True
+ ))
+
+ with pytest.raises(TimeoutException):
+ await wait_for_future_safe(cancel_event_future, timeout=0.5)
+
+ cancel_event_future.cancel()
+
+ yield assert_file_dialog_not_canceled
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/dismiss.py b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/dismiss.py
new file mode 100644
index 00000000000..91367a33a42
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/dismiss.py
@@ -0,0 +1,25 @@
+# META: timeout=long
+import pytest
+
+pytestmark = pytest.mark.asyncio
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": 'dismiss'})
+async def test_string_dismiss(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": 'dismiss and notify'})
+async def test_string_dismiss_and_notify(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": {'default': 'dismiss'}})
+async def test_default_dismiss(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
+
+
+@pytest.mark.capabilities(
+ {"unhandledPromptBehavior": {'file': 'dismiss', 'default': 'ignore'}})
+async def test_file_dismiss(assert_file_dialog_canceled):
+ await assert_file_dialog_canceled()
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/ignore.py b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/ignore.py
new file mode 100644
index 00000000000..9d9951dd335
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/capabilities/unhandled_prompt_behavior/file/ignore.py
@@ -0,0 +1,24 @@
+# META: timeout=long
+import pytest
+
+pytestmark = pytest.mark.asyncio
+
+
+async def test_no_capabilities(assert_file_dialog_not_canceled):
+ await assert_file_dialog_not_canceled()
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": 'ignore'})
+async def test_string_ignore(assert_file_dialog_not_canceled):
+ await assert_file_dialog_not_canceled()
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": {'default': 'ignore'}})
+async def test_default_ignore(assert_file_dialog_not_canceled):
+ await assert_file_dialog_not_canceled()
+
+
+@pytest.mark.capabilities(
+ {"unhandledPromptBehavior": {'file': 'ignore', 'default': 'accept'}})
+async def test_file_ignore(assert_file_dialog_not_canceled):
+ await assert_file_dialog_not_canceled()
diff --git a/tests/wpt/tests/webnn/resources/utils_validation.js b/tests/wpt/tests/webnn/resources/utils_validation.js
index 4ee0a9fd257..77a6d79205b 100644
--- a/tests/wpt/tests/webnn/resources/utils_validation.js
+++ b/tests/wpt/tests/webnn/resources/utils_validation.js
@@ -197,7 +197,8 @@ promise_setup(async () => {
if (navigator.ml === undefined) {
return;
}
- const deviceType = location.search.substring(1);
+ const deviceType = new URLSearchParams(location.search).get('device') ||
+ location.search.substring(1);
context = await navigator.ml.createContext({deviceType: deviceType});
}, {explicit_timeout: true});
@@ -584,8 +585,6 @@ function validateTwoInputsFromMultipleBuilders(operatorName) {
function multi_builder_test(func, description) {
promise_test(async t => {
- const context = await navigator.ml.createContext();
-
const builder = new MLGraphBuilder(context);
const otherBuilder = new MLGraphBuilder(context);
diff --git a/tests/wpt/tests/webnn/validation_tests/elementwise-binary.https.any.js b/tests/wpt/tests/webnn/validation_tests/elementwise-binary.https.any.js
index 12fdc5aadc3..3f87e3ce0f2 100644
--- a/tests/wpt/tests/webnn/validation_tests/elementwise-binary.https.any.js
+++ b/tests/wpt/tests/webnn/validation_tests/elementwise-binary.https.any.js
@@ -1,21 +1,32 @@
// META: title=validation tests for WebNN API element-wise binary operations
// META: global=window
-// META: variant=?cpu
-// META: variant=?gpu
-// META: variant=?npu
+// META: variant=?op=add&device=cpu
+// META: variant=?op=add&device=gpu
+// META: variant=?op=add&device=npu
+// META: variant=?op=sub&device=cpu
+// META: variant=?op=sub&device=gpu
+// META: variant=?op=sub&device=npu
+// META: variant=?op=mul&device=cpu
+// META: variant=?op=mul&device=gpu
+// META: variant=?op=mul&device=npu
+// META: variant=?op=div&device=cpu
+// META: variant=?op=div&device=gpu
+// META: variant=?op=div&device=npu
+// META: variant=?op=max&device=cpu
+// META: variant=?op=max&device=gpu
+// META: variant=?op=max&device=npu
+// META: variant=?op=min&device=cpu
+// META: variant=?op=min&device=gpu
+// META: variant=?op=min&device=npu
+// META: variant=?op=pow&device=cpu
+// META: variant=?op=pow&device=gpu
+// META: variant=?op=pow&device=npu
// META: script=../resources/utils_validation.js
'use strict';
-const kElementwiseBinaryOperators = [
- 'add',
- 'sub',
- 'mul',
- 'div',
- 'max',
- 'min',
- 'pow',
-];
+const queryParams = new URLSearchParams(window.location.search);
+const operatorName = queryParams.get('op');
const label = 'elementwise_binary_op';
const regrexp = new RegExp('\\[' + label + '\\]');
@@ -54,40 +65,35 @@ const tests = [
},
];
-function runElementWiseBinaryTests(operatorName, tests) {
- tests.forEach(test => {
- promise_test(async t => {
- const builder = new MLGraphBuilder(context);
- if (!context.opSupportLimits().input.dataTypes.includes(
- test.a.dataType)) {
- assert_throws_js(TypeError, () => builder.input('a', test.a));
- return;
- }
- if (!context.opSupportLimits().input.dataTypes.includes(
- test.b.dataType)) {
- assert_throws_js(TypeError, () => builder.input('b', test.b));
- return;
- }
- const a = builder.input('a', test.a);
- const b = builder.input('b', test.b);
-
- if (test.output) {
- const output = builder[operatorName](a, b);
- assert_equals(output.dataType, test.output.dataType);
- assert_array_equals(output.shape, test.output.shape);
- } else {
- const options = {label};
- assert_throws_with_label(
- () => builder[operatorName](a, b, options), regrexp);
- }
- }, test.name.replace('[binary]', `[${operatorName}]`));
- });
-}
+tests.forEach(test => {
+ promise_test(async t => {
+ const builder = new MLGraphBuilder(context);
+ if (!context.opSupportLimits().input.dataTypes.includes(
+ test.a.dataType)) {
+ assert_throws_js(TypeError, () => builder.input('a', test.a));
+ return;
+ }
+ if (!context.opSupportLimits().input.dataTypes.includes(
+ test.b.dataType)) {
+ assert_throws_js(TypeError, () => builder.input('b', test.b));
+ return;
+ }
+ const a = builder.input('a', test.a);
+ const b = builder.input('b', test.b);
-kElementwiseBinaryOperators.forEach((operatorName) => {
- validateTwoInputsOfSameDataType(operatorName, label);
- validateTwoInputsBroadcastable(operatorName, label);
- validateTwoInputsFromMultipleBuilders(operatorName);
- validateTwoBroadcastableInputsTensorLimit(operatorName, label);
- runElementWiseBinaryTests(operatorName, tests);
+ if (test.output) {
+ const output = builder[operatorName](a, b);
+ assert_equals(output.dataType, test.output.dataType);
+ assert_array_equals(output.shape, test.output.shape);
+ } else {
+ const options = {label};
+ assert_throws_with_label(
+ () => builder[operatorName](a, b, options), regrexp);
+ }
+ }, test.name.replace('[binary]', `[${operatorName}]`));
});
+
+validateTwoInputsOfSameDataType(operatorName, label);
+validateTwoInputsBroadcastable(operatorName, label);
+validateTwoInputsFromMultipleBuilders(operatorName);
+validateTwoBroadcastableInputsTensorLimit(operatorName, label);
diff --git a/tests/wpt/tests/webnn/validation_tests/elementwise-logical.https.any.js b/tests/wpt/tests/webnn/validation_tests/elementwise-logical.https.any.js
index 40b15a5c946..547cba3cc6c 100644
--- a/tests/wpt/tests/webnn/validation_tests/elementwise-logical.https.any.js
+++ b/tests/wpt/tests/webnn/validation_tests/elementwise-logical.https.any.js
@@ -1,31 +1,48 @@
// META: title=validation tests for WebNN API element-wise logical operations
// META: global=window
-// META: variant=?cpu
-// META: variant=?gpu
-// META: variant=?npu
+// META: variant=?op=equal&device=cpu
+// META: variant=?op=equal&device=gpu
+// META: variant=?op=equal&device=npu
+// META: variant=?op=greater&device=cpu
+// META: variant=?op=greater&device=gpu
+// META: variant=?op=greater&device=npu
+// META: variant=?op=greaterOrEqual&device=cpu
+// META: variant=?op=greaterOrEqual&device=gpu
+// META: variant=?op=greaterOrEqual&device=npu
+// META: variant=?op=lesser&device=cpu
+// META: variant=?op=lesser&device=gpu
+// META: variant=?op=lesser&device=npu
+// META: variant=?op=lesserOrEqual&device=cpu
+// META: variant=?op=lesserOrEqual&device=gpu
+// META: variant=?op=lesserOrEqual&device=npu
+// META: variant=?op=notEqual&device=cpu
+// META: variant=?op=notEqual&device=gpu
+// META: variant=?op=notEqual&device=npu
+// META: variant=?op=logicalAnd&device=cpu
+// META: variant=?op=logicalAnd&device=gpu
+// META: variant=?op=logicalAnd&device=npu
+// META: variant=?op=logicalOr&device=cpu
+// META: variant=?op=logicalOr&device=gpu
+// META: variant=?op=logicalOr&device=npu
+// META: variant=?op=logicalXor&device=cpu
+// META: variant=?op=logicalXor&device=gpu
+// META: variant=?op=logicalXor&device=npu
+// META: variant=?op=logicalNot&device=cpu
+// META: variant=?op=logicalNot&device=gpu
+// META: variant=?op=logicalNot&device=npu
// META: script=../resources/utils_validation.js
'use strict';
-const kElementwiseLogicalBinaryOperators = [
- 'equal',
- 'greater',
- 'greaterOrEqual',
- 'lesser',
- 'lesserOrEqual',
- 'notEqual',
- 'logicalAnd',
- 'logicalOr',
- 'logicalXor',
-];
+const queryParams = new URLSearchParams(window.location.search);
+const operatorName = queryParams.get('op');
-const label = 'elementwise_logic_op';
-
-kElementwiseLogicalBinaryOperators.forEach((operatorName) => {
+if (operatorName === 'logicalNot') {
+ // The `logicalNot()` operator is unary.
+ validateInputFromAnotherBuilder(operatorName);
+} else {
+ const label = 'elementwise_logic_op';
validateTwoInputsOfSameDataType(operatorName, label);
validateTwoInputsFromMultipleBuilders(operatorName);
validateTwoInputsBroadcastable(operatorName, label);
-});
-
-// The `logicalNot()` operator is unary.
-validateInputFromAnotherBuilder('logicalNot');
+}
diff --git a/tests/wpt/tests/workers/WorkerGlobalScope_ErrorEvent_message.htm b/tests/wpt/tests/workers/WorkerGlobalScope_ErrorEvent_message.htm
index bc1d2c45b42..27d4dda5114 100644
--- a/tests/wpt/tests/workers/WorkerGlobalScope_ErrorEvent_message.htm
+++ b/tests/wpt/tests/workers/WorkerGlobalScope_ErrorEvent_message.htm
@@ -14,6 +14,7 @@ async_test(function(t) {
worker.onmessage = t.step_func_done(function(e) {
assert_greater_than(e.data.message.indexOf(message), -1);
});
+ worker.onerror = e => e.preventDefault();
worker.postMessage(message);
});
</script>
diff --git a/tests/wpt/tests/xhr/progressevent-constructor.html b/tests/wpt/tests/xhr/progressevent-constructor.html
index 0e771f4459f..3b9c774b874 100644
--- a/tests/wpt/tests/xhr/progressevent-constructor.html
+++ b/tests/wpt/tests/xhr/progressevent-constructor.html
@@ -40,6 +40,36 @@ test(function() {
assert_equals(ev.loaded, 2)
}, "ECMAScript value conversion test.")
test(function() {
+ var ev = new ProgressEvent(null, { loaded: 1, total: 2 })
+ assert_equals(ev.type, "null")
+ assert_equals(ev.loaded, 1)
+ assert_equals(ev.total, 2)
+}, "Positive integer number test.")
+test(function () {
+ var ev = new ProgressEvent(null, { loaded: 0, total: 1 })
+ assert_equals(ev.type, "null")
+ assert_equals(ev.loaded, 0)
+ assert_equals(ev.total, 1)
+}, "Zero test.")
+test(function () {
+ var ev = new ProgressEvent(null, { loaded: 1.5, total: 3.5 })
+ assert_equals(ev.type, "null")
+ assert_equals(ev.loaded, 1.5)
+ assert_equals(ev.total, 3.5)
+}, "Decimal number test.")
+test(function () {
+ var ev = new ProgressEvent(null, { loaded: 1.5, total: 5 })
+ assert_equals(ev.type, "null")
+ assert_equals(ev.loaded, 1.5)
+ assert_equals(ev.total, 5)
+}, "Mixed integer and decimal number test.")
+test(function () {
+ var ev = new ProgressEvent(null, { loaded: -1, total: -5.5 })
+ assert_equals(ev.type, "null")
+ assert_equals(ev.loaded, -1)
+ assert_equals(ev.total, -5.5)
+}, "Negative number.")
+test(function () {
var ev = new ProgressEvent("Xx", { lengthcomputable: true})
assert_equals(ev.type, "Xx")
assert_equals(ev.lengthComputable, false)
diff --git a/tests/wpt/tests/xhr/progressevent-interface.html b/tests/wpt/tests/xhr/progressevent-interface.html
index 7552ff73d3f..ec8d471d783 100644
--- a/tests/wpt/tests/xhr/progressevent-interface.html
+++ b/tests/wpt/tests/xhr/progressevent-interface.html
@@ -23,8 +23,8 @@ test(function() {
}, "interface prototype object")
var attributes = [
["boolean", "lengthComputable"],
- ["unsigned long long", "loaded"],
- ["unsigned long long", "total"]
+ ["double", "loaded"],
+ ["double", "total"]
];
attributes.forEach(function(a) {
test(function() {
diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
index 2f1648b219b..09ff6f30b8e 100644
--- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
+++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
@@ -23,9 +23,6 @@
[WebGL test #236]
expected: FAIL
- [WebGL test #52]
- expected: FAIL
-
[WebGL test #588]
expected: FAIL