aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini6
-rw-r--r--tests/wpt/meta/MANIFEST.json4281
-rw-r--r--tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini2
-rw-r--r--tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini6
-rw-r--r--tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini2
-rw-r--r--tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini29
-rw-r--r--tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini47
-rw-r--r--tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini59
-rw-r--r--tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini26
-rw-r--r--tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini2
-rw-r--r--tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini2
-rw-r--r--tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini15
-rw-r--r--tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini12
-rw-r--r--tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini6
-rw-r--r--tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini6
-rw-r--r--tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini2
-rw-r--r--tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini12
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini3
-rw-r--r--tests/wpt/meta/css/css-grid/grid-flex-spanning-items-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini3
-rw-r--r--tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/root-scroll-marker.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini6
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-005.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-006.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-overflow/scroll-marker-contain-007.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini2
-rw-r--r--tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini2
-rw-r--r--tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-computed.html.ini11
-rw-r--r--tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-valid.html.ini3
-rw-r--r--tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini6
-rw-r--r--tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini27
-rw-r--r--tests/wpt/meta/css/css-values/if-cycle.html.ini (renamed from tests/wpt/meta/css/css-values/if-cycle.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/css/css-values/progress-computed.html.ini60
-rw-r--r--tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini147
-rw-r--r--tests/wpt/meta/css/css-values/progress-serialize.html.ini66
-rw-r--r--tests/wpt/meta/css/css-values/progress-serialize.tentative.html.ini144
-rw-r--r--tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input-svg.html.ini2
-rw-r--r--tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini2
-rw-r--r--tests/wpt/meta/dom/nodes/moveBefore/focus-preserve.html.ini (renamed from tests/wpt/meta/dom/nodes/moveBefore/tentative/focus-preserve.html.ini)0
-rw-r--r--tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini6
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini9
-rw-r--r--tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini12
-rw-r--r--tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini15
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini3
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini3
-rw-r--r--tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini12
-rw-r--r--tests/wpt/meta/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html.ini2
-rw-r--r--tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini2
-rw-r--r--tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.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_nonescaping-3.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-loading-lazy-subframe-detached-crash.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html.ini3
-rw-r--r--tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini3
-rw-r--r--tests/wpt/meta/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html.ini24
-rw-r--r--tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini9
-rw-r--r--tests/wpt/meta/subresource-integrity/signatures/tentative/scheme.window.js.ini12
-rw-r--r--tests/wpt/meta/subresource-integrity/signatures/tentative/unknown-parameter.window.js.ini18
-rw-r--r--tests/wpt/meta/urlpattern/urlpattern.any.js.ini30
-rw-r--r--tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini30
-rw-r--r--tests/wpt/meta/webxr/idlharness.https.window.js.ini6
-rw-r--r--tests/wpt/meta/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/tests/.github/workflows/check-workflow-run.yml6
-rw-r--r--tests/wpt/tests/.github/workflows/docker.yml4
-rw-r--r--tests/wpt/tests/.github/workflows/documentation.yml10
-rw-r--r--tests/wpt/tests/.github/workflows/epochs.yml2
-rw-r--r--tests/wpt/tests/.github/workflows/interfaces.yml2
-rw-r--r--tests/wpt/tests/.github/workflows/manifest.yml2
-rw-r--r--tests/wpt/tests/.github/workflows/regen_certs.yml2
-rw-r--r--tests/wpt/tests/.github/workflows/update-wasm-tests.yml2
-rw-r--r--tests/wpt/tests/.github/workflows/wpt_fyi_notify.yml3
-rw-r--r--tests/wpt/tests/accname/META.yml1
-rw-r--r--tests/wpt/tests/accname/manual/description_test_case_557-manual.html2
-rw-r--r--tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html2
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js64
-rw-r--r--tests/wpt/tests/ai/translator/ai_translator_bad_input.tentative.https.any.js23
-rw-r--r--tests/wpt/tests/ai/translator/translator_bad_input.tentative.https.any.js23
-rw-r--r--tests/wpt/tests/ai/translator/translator_translate.tentative.https.any.js (renamed from tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js)76
-rw-r--r--tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html149
-rw-r--r--tests/wpt/tests/clear-site-data/clear-cache.https.html167
-rw-r--r--tests/wpt/tests/clear-site-data/support/clear-cache-helper.sub.js (renamed from tests/wpt/tests/clear-site-data/clear-cache-partitioning.sub.https.html)158
-rw-r--r--tests/wpt/tests/container-timing/META.yml2
-rw-r--r--tests/wpt/tests/container-timing/resources/container-timing-helpers.js22
-rw-r--r--tests/wpt/tests/container-timing/resources/square100.pngbin0 -> 12940 bytes
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-body-with-child-img.html42
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-img-itself.html42
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-observe-no-paint.html37
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-text-itself.html39
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-two-overlapping-imgs.html57
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-with-child-img.html45
-rw-r--r--tests/wpt/tests/container-timing/tentative/containertiming-with-child-text.html43
-rw-r--r--tests/wpt/tests/container-timing/tentative/img-not-child-of-container-timing.html44
-rw-r--r--tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html51
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js22
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js16
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js15
-rw-r--r--tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.js9
-rw-r--r--tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js14
-rw-r--r--tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-embedder-opener.html71
-rw-r--r--tests/wpt/tests/cookies/third-party-cookies/third-party-cookies.tentative.https.html56
-rw-r--r--tests/wpt/tests/core-aam/META.yml1
-rw-r--r--tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html3
-rw-r--r--tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html14
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-display-none-crash.html21
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-flip-sibling-index.html32
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-sibling-index.html31
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html28
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html28
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-area-basic.html6
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed-ref.html17
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed.html (renamed from tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed.tentative.html)4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed-ref.html9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.html50
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.tentative.html42
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position-ref.html31
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position.html8
-rw-r--r--tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html16
-rw-r--r--tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html34
-rw-r--r--tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html85
-rw-r--r--tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html17
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html5
-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-bevel-overflow.html2
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill.html2
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-gallery.manual.html60
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html44
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html48
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html172
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html37
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-shape.js124
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/corner-utils.js89
-rw-r--r--tests/wpt/tests/css/css-borders/tentative/corner-shape/resources/resolve-corner-style.js16
-rw-r--r--tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html2
-rw-r--r--tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html24
-rw-r--r--tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html24
-rw-r--r--tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html41
-rw-r--r--tests/wpt/tests/css/css-contain/content-visibility/content-visibility-auto-text-fragment.html2
-rw-r--r--tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html10
-rw-r--r--tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html16
-rw-r--r--tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html14
-rw-r--r--tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html2
-rw-r--r--tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html22
-rw-r--r--tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html125
-rw-r--r--tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html16
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html94
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html45
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html188
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html50
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html102
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html48
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html71
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html39
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html94
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html46
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html68
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html43
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html71
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html45
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html94
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html68
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html42
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html95
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html49
-rw-r--r--tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html2
-rw-r--r--tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001-ref.html19
-rw-r--r--tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001.html27
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html1
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html1
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html90
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html68
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html62
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html54
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html62
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html54
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html56
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html59
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html56
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html59
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html46
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html48
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html43
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html47
-rw-r--r--tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html12
-rw-r--r--tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html13
-rw-r--r--tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html37
-rw-r--r--tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html78
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html29
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html44
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html3
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html7
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl-ref.html33
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl.html49
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb-ref.html34
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb.html49
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch-ref.html38
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch.html54
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch-ref.html37
-rw-r--r--tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch.html54
-rw-r--r--tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html1
-rw-r--r--tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html1
-rw-r--r--tests/wpt/tests/css/css-images/parsing/WEB_FEATURES.yml1
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-geometry-box-delay.html50
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-non-shape-delay-ref.html17
-rw-r--r--tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-reference-delay.html59
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-001.html10
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-002.html12
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-003.html13
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-004.html14
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-005.html12
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-006.html21
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-007.html15
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-008.html15
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-009-ref.html40
-rw-r--r--tests/wpt/tests/css/css-multicol/column-height-009.html28
-rw-r--r--tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html139
-rw-r--r--tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-003.html142
-rw-r--r--tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-004.html173
-rw-r--r--tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-011.tentative.html24
-rw-r--r--tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html22
-rw-r--r--tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html27
-rw-r--r--tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-011-ref.html14
-rw-r--r--tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-012-ref.html13
-rw-r--r--tests/wpt/tests/css/css-overflow/root-scroll-marker-activation-and-scroll-tracking.html71
-rw-r--r--tests/wpt/tests/css/css-overflow/root-scroll-marker-ref.html44
-rw-r--r--tests/wpt/tests/css/css-overflow/root-scroll-marker.html51
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-15.html62
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html38
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html44
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html41
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html48
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html49
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html66
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html47
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-005.tentative.html52
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-006.tentative.html52
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-007.tentative.html47
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-008-ref.tentative.html33
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-marker-contain-008.tentative.html47
-rw-r--r--tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html3
-rw-r--r--tests/wpt/tests/css/css-page/crashtests/counter-containment-001.html12
-rw-r--r--tests/wpt/tests/css/css-page/crashtests/counter-containment-002.html12
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html23
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html27
-rw-r--r--tests/wpt/tests/css/css-pseudo/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html37
-rw-r--r--tests/wpt/tests/css/css-scoping/host-has-internal-004.html22
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html2
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/scroll-start/scroll-start-overflow-toggled.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html63
-rw-r--r--tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-computed.html1
-rw-r--r--tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-valid.html2
-rw-r--r--tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html6
-rw-r--r--tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html6
-rw-r--r--tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html10
-rw-r--r--tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html10
-rw-r--r--tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html3
-rw-r--r--tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html3
-rw-r--r--tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html2
-rw-r--r--tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html2
-rw-r--r--tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-computed.html6
-rw-r--r--tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-valid.html1
-rw-r--r--tests/wpt/tests/css/css-transitions/support/properties.js1
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html1
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html24
-rw-r--r--tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html27
-rw-r--r--tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html26
-rw-r--r--tests/wpt/tests/css/css-values/crashtests/chrome-405422528-crash.html4
-rw-r--r--tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html3
-rw-r--r--tests/wpt/tests/css/css-values/if-cycle.html (renamed from tests/wpt/tests/css/css-values/if-cycle.tentative.html)0
-rw-r--r--tests/wpt/tests/css/css-values/progress-computed.html (renamed from tests/wpt/tests/css/css-values/progress-computed.tentative.html)0
-rw-r--r--tests/wpt/tests/css/css-values/progress-invalid.html (renamed from tests/wpt/tests/css/css-values/progress-invalid.tentative.html)0
-rw-r--r--tests/wpt/tests/css/css-values/progress-serialize.html (renamed from tests/wpt/tests/css/css-values/progress-serialize.tentative.html)0
-rw-r--r--tests/wpt/tests/css/css-view-transitions/auto-name-from-id.html19
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html7
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/resources/at-rule-types-shared-elements.html52
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/resources/auto-name-from-id.html2
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html3
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements-ref.html14
-rw-r--r--tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements.html38
-rw-r--r--tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html26
-rw-r--r--tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html67
-rw-r--r--tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-ident.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-partial.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-wildcard.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-new-with-class-old-without.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-old-with-class-new-without.html5
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html5
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html7
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/iframe-very-small-zoom-001-crash.html4
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/zoom-iframe-dynamic.html39
-rw-r--r--tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html4
-rw-r--r--tests/wpt/tests/css/css-writing-modes/reference/text-orientation-020-ref.html28
-rw-r--r--tests/wpt/tests/css/css-writing-modes/reference/text-orientation-021-ref.html22
-rw-r--r--tests/wpt/tests/css/css-writing-modes/text-orientation-020.html39
-rw-r--r--tests/wpt/tests/css/css-writing-modes/text-orientation-021.html27
-rw-r--r--tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html5
-rw-r--r--tests/wpt/tests/css/cssom-view/support/action-utils.js23
-rw-r--r--tests/wpt/tests/css/cssom-view/visual-scrollIntoView-001.html (renamed from tests/wpt/tests/css/cssom-view/visual-scrollIntoView.html)22
-rw-r--r--tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html61
-rw-r--r--tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html67
-rw-r--r--tests/wpt/tests/css/cssom/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html5
-rw-r--r--tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-svg.html22
-rw-r--r--tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html36
-rw-r--r--tests/wpt/tests/css/filter-effects/parsing/flood-opacity-computed.svg2
-rw-r--r--tests/wpt/tests/css/filter-effects/parsing/flood-opacity-valid.svg1
-rw-r--r--tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml6
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/fetch-no-credentials.https.html56
-rw-r--r--tests/wpt/tests/device-bound-session-credentials/fetch-verify-authenticated.https.html12
-rw-r--r--tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html213
-rw-r--r--tests/wpt/tests/dom/nodes/moveBefore/focus-preserve.html (renamed from tests/wpt/tests/dom/nodes/moveBefore/tentative/focus-preserve.html)0
-rw-r--r--tests/wpt/tests/ecmascript/locale-compat.html7
-rw-r--r--tests/wpt/tests/editing/crashtests/inserthorizontalrule-to-replace-selection-containing-comment.html21
-rw-r--r--tests/wpt/tests/editing/whitespaces/delete-word-around-span.html75
-rw-r--r--tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html75
-rw-r--r--tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.https.html51
-rw-r--r--tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record.https.html51
-rw-r--r--tests/wpt/tests/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.https.html51
-rw-r--r--tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.https.html53
-rw-r--r--tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record.https.html53
-rw-r--r--tests/wpt/tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.https.html53
-rw-r--r--tests/wpt/tests/encrypted-media/polyfill/edge-persistent-usage-record.js193
-rw-r--r--tests/wpt/tests/encrypted-media/resources/drm-retrieve-persistent-usage-record.html70
-rw-r--r--tests/wpt/tests/encrypted-media/resources/retrieve-persistent-usage-record.html92
-rw-r--r--tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record-events.js109
-rw-r--r--tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record.js104
-rw-r--r--tests/wpt/tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js114
-rw-r--r--tests/wpt/tests/event-timing/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-button-space.html2
-rw-r--r--tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-checkbox-space.html2
-rw-r--r--tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-link-enter.html2
-rw-r--r--tests/wpt/tests/fetch/content-encoding/zstd/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/fetch/private-network-access/README.md3
-rw-r--r--tests/wpt/tests/file-system-access/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/fledge/tentative/abort.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/additional-bids.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/auction-config.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/cross-origin.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/currency.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js4
-rw-r--r--tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js4
-rw-r--r--tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/no-winner.https.window.js8
-rw-r--r--tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js6
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js4
-rw-r--r--tests/wpt/tests/fledge/tentative/round-a-value.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/send-report-to.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/server-response.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/tie.https.window.js4
-rw-r--r--tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js2
-rw-r--r--tests/wpt/tests/fonts/Lato-Medium-Liga.ttf (renamed from tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium-Liga.ttf)bin12836 -> 12836 bytes
-rw-r--r--tests/wpt/tests/fonts/Lato-Medium.ttf (renamed from tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium.ttf)bin637068 -> 637068 bytes
-rw-r--r--tests/wpt/tests/graphics-aam/META.yml1
-rw-r--r--tests/wpt/tests/html-aam/META.yml1
-rw-r--r--tests/wpt/tests/html-aam/roles-contextual.html4
-rw-r--r--tests/wpt/tests/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html2
-rw-r--r--tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html28
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang-ref.html90
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic-ref.html138
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.dynamic.html86
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty-ref.html56
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.empty.canvas.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html6
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.unknown.lang-ref.html92
-rw-r--r--tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html48
-rw-r--r--tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html48
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang-ref.html90
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang-ref.html94
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.html53
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/text/canvas.2d.offscreen.worker.lang.inherit.html56
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html37
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html38
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js30
-rw-r--r--tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js3
-rw-r--r--tests/wpt/tests/html/canvas/resources/canvas-promise-test.js8
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml/text.yaml61
-rw-r--r--tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html107
-rw-r--r--tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html75
-rw-r--r--tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html75
-rw-r--r--tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html75
-rw-r--r--tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html49
-rw-r--r--tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html119
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html49
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html49
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-element-fragment-navigation.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-scroll-to-text-fragment.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-001.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-002.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-004.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005-ref.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-006-ref.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-007.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-text-fragment.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/resources/container-ref.html2
-rw-r--r--tests/wpt/tests/html/editing/the-hidden-attribute/resources/spacer-and-container-ref.html2
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html238
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles.html1
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html32
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html30
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html30
-rw-r--r--tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html4
-rw-r--r--tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html8
-rw-r--r--tests/wpt/tests/html/rendering/the-details-element/auto-expand-details-text-fragment.html2
-rw-r--r--tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html2
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-form-element/form-controls-id-removal-crash.html29
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html21
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html17
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html7
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error-location.tentative.html24
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error.html10
-rw-r--r--tests/wpt/tests/infrastructure/metadata/infrastructure/window/minimize-1.html.ini4
-rw-r--r--tests/wpt/tests/infrastructure/window/minimize-1.html15
-rw-r--r--tests/wpt/tests/infrastructure/window/minimize-2.html13
-rw-r--r--tests/wpt/tests/interfaces/fedcm.idl3
-rw-r--r--tests/wpt/tests/interfaces/webaudio.idl3
-rw-r--r--tests/wpt/tests/interfaces/webgpu.idl8
-rw-r--r--tests/wpt/tests/interfaces/webxr.idl2
-rw-r--r--tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/lint.ignore3
-rw-r--r--tests/wpt/tests/media-capabilities/decodingInfo-webrtc.any.js91
-rw-r--r--tests/wpt/tests/media-capabilities/decodingInfo.any.js95
-rw-r--r--tests/wpt/tests/media-capabilities/decodingInfoEncryptedMedia.https.html26
-rw-r--r--tests/wpt/tests/media-capabilities/encodingInfo-webrtc.any.js40
-rw-r--r--tests/wpt/tests/media-capabilities/encodingInfo.any.js91
-rw-r--r--tests/wpt/tests/mediacapture-record/META.yml4
-rw-r--r--tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html98
-rw-r--r--tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html165
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/after-transition-push.html23
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-explicit-commit.html39
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/after-transition-reload.html19
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/after-transition-replace.html19
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html31
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/commit-throws.html95
-rw-r--r--tests/wpt/tests/navigation-api/commit-behavior/redirect-throws.html141
-rw-r--r--tests/wpt/tests/navigation-api/navigate-event/defaultPrevented-window-stop-after-dispatch.html3
-rw-r--r--tests/wpt/tests/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.html16
-rw-r--r--tests/wpt/tests/navigation-api/navigate-event/signal-abort-window-stop.html3
-rw-r--r--tests/wpt/tests/navigation-api/ordering-and-transition/navigate-intercept-precommitHandler-redirect.html (renamed from tests/wpt/tests/navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept-with-redirect.html)31
-rw-r--r--tests/wpt/tests/navigation-api/ordering-and-transition/navigate-intercept-precommitHandler.html (renamed from tests/wpt/tests/navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept.html)22
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/multiple-intercept.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/multiple-intercept.html)42
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-new-navigation-before-commit.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-new-navigation-before-commit.html)4
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-push.html22
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-push.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-push.html)9
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-replace.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-replace.html)9
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-throws.html87
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-reload.html18
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-replace.html18
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traversal-commit-new-navigation-before-commit.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-traversal-commit-new-navigation-before-commit.html)4
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traversal-window-stop-before-commit.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-traversal-window-stop-before-commit.html)5
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traverse.html35
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-uncancelable.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-uncancelable.html)7
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-window-stop-before-commit.html (renamed from tests/wpt/tests/navigation-api/commit-behavior/after-transition-window-stop-before-commit.html)4
-rw-r--r--tests/wpt/tests/navigation-api/precommit-handler/resources/precommitHandler-helpers.js (renamed from tests/wpt/tests/navigation-api/commit-behavior/resources/after-transition-commit-helpers.js)45
-rw-r--r--tests/wpt/tests/navigation-api/scroll-behavior/manual-scroll-in-precommit-handler.html (renamed from tests/wpt/tests/navigation-api/scroll-behavior/manual-scroll-before-after-transition-commit.html)8
-rw-r--r--tests/wpt/tests/paint-timing/paint-timing-mixin.html8
-rw-r--r--tests/wpt/tests/requestidlecallback/callback-iframe-different-origin.html19
-rw-r--r--tests/wpt/tests/requestidlecallback/resources/child.html17
-rw-r--r--tests/wpt/tests/resources/testdriver.js37
-rw-r--r--tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html3
-rw-r--r--tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html10
-rw-r--r--tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html16
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html165
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both-ref.html34
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both.tentative.html42
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none-ref.html30
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none.tentative.html40
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html114
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html148
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html163
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html182
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html179
-rw-r--r--tests/wpt/tests/scroll-animations/animation-trigger/support/support.js86
-rw-r--r--tests/wpt/tests/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html227
-rw-r--r--tests/wpt/tests/shadow-dom/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html63
-rw-r--r--tests/wpt/tests/shadow-dom/reference-target/tentative/form.html60
-rw-r--r--tests/wpt/tests/shadow-dom/reference-target/tentative/property-reflection.html18
-rw-r--r--tests/wpt/tests/soft-navigation-heuristics/navigation-api-precommit.tentative.html (renamed from tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html)7
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html107
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html140
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html57
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js28
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html13
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js5
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html15
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html58
-rw-r--r--tests/wpt/tests/streams/readable-byte-streams/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/streams/transferable/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js14
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/client-initiated.cross-origin.window.js28
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js13
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/scheme.window.js73
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/server-initiated.window.js16
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/unknown-parameter.window.js73
-rw-r--r--tests/wpt/tests/svg-aam/META.yml1
-rw-r--r--tests/wpt/tests/svg/embedded/image-embedding-nested-data-url-png.html8
-rw-r--r--tests/wpt/tests/svg/embedded/image-embedding-nested-data-url.html12
-rw-r--r--tests/wpt/tests/svg/embedded/image-embedding-nested-external-data-url-png.html4
-rw-r--r--tests/wpt/tests/svg/embedded/image-embedding-nested-http-url.sub.html9
-rw-r--r--tests/wpt/tests/svg/embedded/image-embedding-nesteder-data-url.html16
-rw-r--r--tests/wpt/tests/svg/embedded/support/external-with-data-url.svg15
-rw-r--r--tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-font.html20
-rw-r--r--tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-zero-height-font.html20
-rw-r--r--tests/wpt/tests/svg/fonts/zero-font-size-adjust.html21
-rw-r--r--tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg64
-rw-r--r--tests/wpt/tests/tools/ci/requirements_build.txt2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py10
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py6
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py13
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py17
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py10
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py30
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py12
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js10
-rw-r--r--tests/wpt/tests/trusted-types/ServiceWorkerContainer-register-from-ServiceWorker.https.html1
-rw-r--r--tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html20
-rw-r--r--tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html19
-rw-r--r--tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html7
-rw-r--r--tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html.headers (renamed from tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers)2
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-001.html15
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html9
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-003.html8
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html38
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html8
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/csp-violations.js4
-rw-r--r--tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js12
-rw-r--r--tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js.headers (renamed from tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers)1
-rw-r--r--tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js35
-rw-r--r--tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js.headers7
-rw-r--r--tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js21
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js20
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js9
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js28
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js.headers9
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js16
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js23
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js19
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js24
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js15
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-location.js22
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js5
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.headers6
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js15
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js7
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers7
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js13
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js11
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js16
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js11
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js27
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js16
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js11
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js21
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js11
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js29
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js24
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers2
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html7
-rw-r--r--tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers3
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html18
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html18
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html53
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-report-only.html16
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers2
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html31
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html31
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html (renamed from tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html)10
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html.sub.headers (renamed from tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html.sub.headers)2
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html20
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers7
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html15
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html15
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.https.html15
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html14
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html14
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html9
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html10
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html10
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html10
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html10
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html10
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting.html24
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers2
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html27
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers3
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html18
-rw-r--r--tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json49
-rw-r--r--tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js12
-rw-r--r--tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html7
-rw-r--r--tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js9
-rw-r--r--tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js107
-rw-r--r--tests/wpt/tests/webcodecs/video-encoder-rescaling.https.any.js10
-rw-r--r--tests/wpt/tests/webcodecs/video-encoder-utils.js12
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/__init__.py8
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py3
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py20
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_destroyed/context_destroyed.py22
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/__init__.py0
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/download_will_begin.py78
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/frames.py13
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/max_depth.py6
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/root.py19
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/__init__.py10
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py36
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py75
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py3
-rw-r--r--tests/wpt/tests/webdriver/tests/support/fixtures.py20
-rw-r--r--tests/wpt/tests/webdriver/tests/support/helpers.py9
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/batch_normalization.https.any.js586
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/clamp.https.any.js676
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js96
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/dequantizeLinear.https.any.js37
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/elu.https.any.js339
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/hard_sigmoid.https.any.js654
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/hard_swish.https.any.js269
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js296
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/layer_normalization.https.any.js492
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/leaky_relu.https.any.js446
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/prelu.https.any.js525
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/quantizeLinear.https.any.js4
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_l1.https.any.js23
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_l2.https.any.js23
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_log_sum.https.any.js24
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_log_sum_exp.https.any.js24
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_max.https.any.js23
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_mean.https.any.js23
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_min.https.any.js23
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_product.https.any.js24
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reduce_sum.https.any.js23
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/relu.https.any.js207
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js42
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/sigmoid.https.any.js349
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/softmax.https.any.js154
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/softplus.https.any.js227
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/softsign.https.any.js304
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js131
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/tanh.https.any.js327
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js28
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html39
-rw-r--r--tests/wpt/tests/webrtc/RTCIceTransport.html30
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html24
-rw-r--r--tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html10
-rw-r--r--tests/wpt/tests/webrtc/protocol/av1-profile-asymmetry.https.html51
-rw-r--r--tests/wpt/tests/webrtc/protocol/h265-loopback.https.html76
-rw-r--r--tests/wpt/tests/xhr/resources/redirect.py5
-rw-r--r--tests/wpt/tests/xhr/send-redirect.htm85
-rw-r--r--tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm38
-rw-r--r--tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini23
734 files changed, 24398 insertions, 5393 deletions
diff --git a/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini
index 5f4566bad57..292dc852b9f 100644
--- a/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini
+++ b/tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini
@@ -5,9 +5,6 @@
[Revoke blob URL after creating Request, then clone Request, will fetch]
expected: FAIL
- [Revoke blob URL after calling fetch, fetch should succeed]
- expected: FAIL
-
[url-with-fetch.any.worker.html]
[Revoke blob URL after creating Request, will fetch]
@@ -15,6 +12,3 @@
[Revoke blob URL after creating Request, then clone Request, will fetch]
expected: FAIL
-
- [Revoke blob URL after calling fetch, fetch should succeed]
- expected: FAIL
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 522021d0a9c..a84fe9adcc4 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -411,7 +411,7 @@
"ai": {
"language_detection": {
"availability-detached-crash.tentative.https.html": [
- "8dd685d990ad0c2e2524ab134da7284dbe79d010",
+ "5f76d59eb3540048bc0586f2a1ac5b3b313a147e",
[
null,
{}
@@ -612,6 +612,13 @@
{}
]
],
+ "anchor-display-none-crash.html": [
+ "bf513e391473d788fd2e06de7a2088e1d13939a1",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-fallback-to-self-crash.html": [
"c5a8165d11322901546f30f948041ca96cf43639",
[
@@ -762,6 +769,13 @@
{}
]
],
+ "chrome-bug-404743651.html": [
+ "238862374028415bb2ddb91de5f9a16132ec654d",
+ [
+ null,
+ {}
+ ]
+ ],
"pseudo-element-animation-with-marker.html": [
"ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5",
[
@@ -2496,6 +2510,15 @@
]
]
},
+ "css-easing": {
+ "linear-timing-functions-chrome-405004975-crash.html": [
+ "510b51716cec67fcdad51d44e2124c5986efa3f3",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"css-flexbox": {
"animation": {
"flex-basis-content-crash.html": [
@@ -4169,6 +4192,13 @@
{}
]
],
+ "line-clamp-auto-002-crash.html": [
+ "be5693c70456bd664dd219d6985067400a26084e",
+ [
+ null,
+ {}
+ ]
+ ],
"webkit-line-clamp-041-crash.html": [
"3f4bf3c8ef578fa22469e81e504879aa5d713bf8",
[
@@ -4306,6 +4336,20 @@
},
"css-page": {
"crashtests": {
+ "counter-containment-001.html": [
+ "2672bfffb5b6736259615215d77ee8603d17b6ba",
+ [
+ null,
+ {}
+ ]
+ ],
+ "counter-containment-002.html": [
+ "04b4710ab28a2e01ea3765123dc0639f438e11e9",
+ [
+ null,
+ {}
+ ]
+ ],
"match-media-listener-relayout-contained-inline-subtree-print.html": [
"634cf5f4f5836ba9671312f1b761ba312ef4fb22",
[
@@ -5572,6 +5616,13 @@
]
],
"crashtests": {
+ "chrome-405422528-crash.html": [
+ "fcf7407b5f754aa236ddd053f67fb3a15fc6e1d9",
+ [
+ null,
+ {}
+ ]
+ ],
"viewport-unit-inline-style-crash.html": [
"4c38e18781bfdbcddce02c1cc5cd3336a7529e85",
[
@@ -5715,6 +5766,13 @@
},
"css-viewport": {
"zoom": {
+ "iframe-very-small-zoom-001-crash.html": [
+ "05369040456e06a0ab9769edefbe19aec6b77a93",
+ [
+ null,
+ {}
+ ]
+ ],
"perspective-small-effective-zoom-crash.html": [
"ab6f563d19ee8a826cf2ff9d0f04d105c7ba8d96",
[
@@ -5742,6 +5800,13 @@
null,
{}
]
+ ],
+ "zoom-revert-layer-crash.html": [
+ "c75b792e6de78a27a4c5961a0efcbf7593f02eb7",
+ [
+ null,
+ {}
+ ]
]
}
},
@@ -6737,6 +6802,13 @@
{}
]
],
+ "inserthorizontalrule-to-replace-selection-containing-comment.html": [
+ "5db139351cd1908e0483059f476717af11571edf",
+ [
+ null,
+ {}
+ ]
+ ],
"inserthorizontalrule-with-2-selection-ranges-and-one-is-outside-body.html": [
"d248c333d940fff01e2c2f183f5717970a89b61e",
[
@@ -7779,6 +7851,13 @@
{}
]
],
+ "form-controls-id-removal-crash.html": [
+ "2b1ef87774fc1c5393129fca8e65147c379ea7a9",
+ [
+ null,
+ {}
+ ]
+ ],
"form-controls-nested-id-crash.html": [
"ed6c7e6e2b961fd1cc2699da9e8e29f04ce2718c",
[
@@ -10109,7 +10188,7 @@
]
],
"description_test_case_557-manual.html": [
- "1294baf65718f218bac19406e5f6909c0193a7e8",
+ "e228f857ac446f7850dfb05f61614a7dbd4ea0bd",
[
null,
{}
@@ -123909,6 +123988,35 @@
}
]
],
+ "root-element-background-margin-opacity.html": [
+ "e1e7fed5a66b0993174617550e2775206a91930b",
+ [
+ null,
+ [
+ [
+ "/css/compositing/root-element-background-margin-opacity-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 10000
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"root-element-background-transparency.html": [
"910eb08e8d3004da7418f8f00f38d022841262f2",
[
@@ -125295,8 +125403,8 @@
{}
]
],
- "position-visibility-anchors-visible-both-position-fixed.tentative.html": [
- "c603288f0a70a1f43e7384b9dd26c474ce96bac5",
+ "position-visibility-anchors-visible-both-position-fixed.html": [
+ "c5e8e839ded4e81258aebf723af93b1119077596",
[
null,
[
@@ -125412,13 +125520,13 @@
{}
]
],
- "position-visibility-anchors-visible-position-fixed.tentative.html": [
- "9c3495a635d2eaeb77de9586f031dedec5d7af97",
+ "position-visibility-anchors-visible-position-fixed.html": [
+ "5107823efd9ef0fa9c3a4fc66cda8e016954eb33",
[
null,
[
[
- "/css/css-anchor-position/position-visibility-anchors-visible-position-fixed-ref.html",
+ "/css/css-anchor-position/position-visibility-anchors-visible-ref.html",
"=="
]
],
@@ -125452,12 +125560,12 @@
]
],
"position-visibility-anchors-visible-with-position.html": [
- "8ad3eb7e31053a6978a638e88003eadd150138ff",
+ "32eede4f08819a54e2f6b4c5bdad8a488805e972",
[
null,
[
[
- "/css/css-anchor-position/position-visibility-anchors-visible-ref.html",
+ "/css/css-anchor-position/position-visibility-anchors-visible-with-position-ref.html",
"=="
]
],
@@ -125557,6 +125665,19 @@
]
},
"css-animations": {
+ "animate-with-background-color-oklch-001.html": [
+ "37d10e07cdb467aee54d5826ce2a1604417829f8",
+ [
+ null,
+ [
+ [
+ "/css/css-animations/animate-with-background-color-oklch-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"animation-delay-008.html": [
"52883fa72ff5a4a57c6a8c2866805ceb5fa0a507",
[
@@ -136001,13 +136122,13 @@
]
},
"corner-shape": {
- "corner-shape-any.html": [
- "9c256eb89778f8060906b7d943d08a01a3cfe300",
+ "corner-shape-bevel-overflow-composite.html": [
+ "985b5efdc9b9c868465d658e5486cd1e7eae5fd5",
[
- "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
+ null,
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-composite-ref.html",
"=="
]
],
@@ -136018,11 +136139,127 @@
[
[
0,
- 180
+ 100
],
[
0,
- 520
+ 255
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-bevel-overflow.html": [
+ "5a18e11af61b9aa9176802dac24d7064a4aab58d",
+ [
+ null,
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 32
+ ],
+ [
+ 0,
+ 256
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-fill.html": [
+ "b8c8bc0ad2e3d9a6eb18422925660b79de9d2a9b",
+ [
+ null,
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-fill-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 32
+ ],
+ [
+ 0,
+ 256
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-notch.html": [
+ "79f64070bd8389e5cdcf01566bb0da117d1f313a",
+ [
+ null,
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-notch-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 64
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-render-fuzzy.html": [
+ "5c276b6d5ac1190cf3c1332f7ec7449286b6bea1",
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=scoop&border-radius=20%&border-width=20px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=scoop&border-radius=20%&border-width=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
]
]
]
@@ -136030,10 +136267,10 @@
}
],
[
- "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-render-fuzzy.html?corner-shape=scoop&border-radius=20%&border-width=20px&border-top-color=rebeccapurple&border-bottom-color=blue",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=scoop&border-radius=20%&border-width=20px&border-top-color=rebeccapurple&border-bottom-color=blue",
"=="
]
],
@@ -136044,11 +136281,63 @@
[
[
0,
- 180
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=25%&border-width=20px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-radius=25%&border-width=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=25%&box-shadow=10px 10px 0 10px black",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-radius=25%&box-shadow=10px 10px 0 10px black",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
],
[
0,
- 520
+ 550
]
]
]
@@ -136056,7 +136345,7 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-radius=50%",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=50%",
[
[
"/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-radius=50%",
@@ -136070,11 +136359,11 @@
[
[
0,
- 180
+ 200
],
[
0,
- 520
+ 550
]
]
]
@@ -136082,10 +136371,299 @@
}
],
[
- "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-render-fuzzy.html?corner-shape=superellipse(0.05)&border-radius=20%&border-width=20px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-left-radius=30%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(0.05)&border-radius=20%&border-width=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=superellipse(0.25)&border-radius=20%&border-width=20px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(0.25)&border-radius=20%&border-width=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=superellipse(1.8)&border-radius=40px&border-width=10px&border-left-color=purple",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(1.8)&border-radius=40px&border-width=10px&border-left-color=purple",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=superellipse(40)&border-radius=20%&border-width=20px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(40)&border-radius=20%&border-width=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40px&border-width=10px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40px&border-width=10px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=notch&border-radius=40px&border-width=10px&border-color=blue&border-left-color=yellow",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=notch&border-radius=40px&border-width=10px&border-color=blue&border-left-color=yellow",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-right-shape=scoop&border-radius=20%&border-width=10px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=scoop&border-radius=20%&border-width=10px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 200
+ ],
+ [
+ 0,
+ 550
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-render-precise.html": [
+ "81cb56d341fafc714c318ad337807c428312b60b",
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
"=="
]
],
@@ -136100,7 +136678,7 @@
],
[
0,
- 520
+ 350
]
]
]
@@ -136108,10 +136686,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-render-precise.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-right-radius=30px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px",
"=="
]
],
@@ -136126,7 +136704,7 @@
],
[
0,
- 520
+ 350
]
]
]
@@ -136134,10 +136712,10 @@
}
],
[
- "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-render-precise.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=straight&border-bottom-leftradius=5px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px",
"=="
]
],
@@ -136152,7 +136730,7 @@
],
[
0,
- 520
+ 350
]
]
]
@@ -136160,10 +136738,10 @@
}
],
[
- "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-render-precise.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(5.2)&border-radius=40%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel",
"=="
]
],
@@ -136178,7 +136756,7 @@
],
[
0,
- 520
+ 350
]
]
]
@@ -136186,10 +136764,10 @@
}
],
[
- "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-render-precise.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(8)&border-top-right-radius=33px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%",
"=="
]
],
@@ -136204,7 +136782,7 @@
],
[
0,
- 520
+ 350
]
]
]
@@ -136212,10 +136790,10 @@
}
],
[
- "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-render-precise.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px",
"=="
]
],
@@ -136230,7 +136808,7 @@
],
[
0,
- 520
+ 350
]
]
]
@@ -136238,10 +136816,10 @@
}
],
[
- "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-render-precise.html?corner-shape=squircle&border-top-left-radius=30%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-left-radius=30%",
"=="
]
],
@@ -136256,21 +136834,18 @@
],
[
0,
- 520
+ 350
]
]
]
]
}
- ]
- ],
- "corner-shape-bevel-overflow-composite.html": [
- "985b5efdc9b9c868465d658e5486cd1e7eae5fd5",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-shape=squircle&border-top-right-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-shape=squircle&border-top-right-radius=30px",
"=="
]
],
@@ -136281,25 +136856,22 @@
[
[
0,
- 100
+ 180
],
[
0,
- 255
+ 350
]
]
]
]
}
- ]
- ],
- "corner-shape-bevel-overflow.html": [
- "df604db8d13888a2c59488e374ee27ebe6878001",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-shape=straight&border-bottom-left-radius=5px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=straight&border-bottom-left-radius=5px",
"=="
]
],
@@ -136310,25 +136882,22 @@
[
[
0,
- 32
+ 180
],
[
0,
- 32
+ 350
]
]
]
]
}
- ]
- ],
- "corner-shape-fill.html": [
- "6e5df8364c5fa57398644a72d40ca0e3dc8b2b65",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-shape=superellipse(5.2)&border-radius=40%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(5.2)&border-radius=40%",
"=="
]
],
@@ -136339,25 +136908,22 @@
[
[
0,
- 32
+ 180
],
[
0,
- 32
+ 350
]
]
]
]
}
- ]
- ],
- "corner-shape-notch.html": [
- "79f64070bd8389e5cdcf01566bb0da117d1f313a",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-shape=superellipse(8)&border-radius=10px&box-shadow=10px 10px 0 10px black",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-notch-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(8)&border-radius=10px&box-shadow=10px 10px 0 10px black",
"=="
]
],
@@ -136368,25 +136934,22 @@
[
[
0,
- 64
+ 180
],
[
0,
- 64
+ 350
]
]
]
]
}
- ]
- ],
- "corner-shape-render.html": [
- "6b9acb3447f7745757ca4f749057cd5177e8d59e",
+ ],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-left-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-shape=superellipse(8)&border-top-right-radius=33px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-bottom-left-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=superellipse(8)&border-top-right-radius=33px",
"=="
]
],
@@ -136397,11 +136960,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136409,10 +136972,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-right-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-left-shape=bevel&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-bottom-right-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-radius=40px",
"=="
]
],
@@ -136423,11 +136986,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136435,10 +136998,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-left-shape=bevel&border-width=10px&border-color=black",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-width=10px&border-color=black",
"=="
]
],
@@ -136449,11 +137012,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136461,10 +137024,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-left-shape=scoop&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&border-radius=40px",
"=="
]
],
@@ -136475,11 +137038,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136487,10 +137050,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-left-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-left-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px",
"=="
]
],
@@ -136501,11 +137064,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136513,10 +137076,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-left-shape=bevel&border-radius=40px",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-left-shape=bevel&border-radius=40px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px",
"=="
]
],
@@ -136527,11 +137090,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136539,10 +137102,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px",
"=="
]
],
@@ -136553,11 +137116,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136565,10 +137128,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-right-shape=bevel&border-width=10px&border-color=black",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=bevel&border-width=10px&border-color=black",
"=="
]
],
@@ -136579,11 +137142,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -136591,10 +137154,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px",
+ "css/css-borders/tentative/corner-shape/corner-shape-render-precise.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px",
"=="
]
],
@@ -136605,11 +137168,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 350
]
]
]
@@ -154389,6 +154952,32 @@
{}
]
],
+ "at-supports-selector-details-content-before.html": [
+ "731b2c4d6d2f6f871f41ffb4cf6a2e700d992f64",
+ [
+ null,
+ [
+ [
+ "/css/css-conditional/at-supports-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "at-supports-selector-details-content.html": [
+ "89e7606de5b27d586468a9ef98788c2988d8adf6",
+ [
+ null,
+ [
+ [
+ "/css/css-conditional/at-supports-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"at-supports-selector-detecting-invalid-in-logical-combinations.html": [
"ff4c09195a9de215117241abc0601a4f79f5cad1",
[
@@ -184975,6 +185564,136 @@
],
{}
]
+ ],
+ "grid-gap-decorations-006.html": [
+ "7b1187c4e44bed68af665462107fa34d7a2cfc4a",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-007.html": [
+ "adc98e4bc03dd1305402ab33ed1c146f7f4c5718",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-008.html": [
+ "f8dc0df36e2d7a4a30576e60180647bf7b2edb94",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-009.html": [
+ "0756b9294be1daae5af190bf27235fdc23f9c5f8",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-010.html": [
+ "d9201b51cea33053cdab2d55ddb10b06acc7f629",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-011.html": [
+ "c0540398d0533e66d2f86a3aa15cf4998a4e74f4",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-012.html": [
+ "26ba45a14ff9b1526bfe44e480171e0f95a0e8a7",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-013.html": [
+ "4a056134089e58169ae0769633c30ed1ca160478",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-014.html": [
+ "97ad626e1f24cd489a4470c84118d1161b4c46e2",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "grid-gap-decorations-015.html": [
+ "e575c134353b2c97e16a1440e25fc5d6a28cadc9",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
}
}
@@ -189049,6 +189768,19 @@
]
]
},
+ "grid-flex-spanning-items-001.html": [
+ "f9358b65db96d2e7c184ccabd79c5a95765de90c",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/grid-flex-spanning-items-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"grid-in-table-cell-with-img.html": [
"492a5866b71cf503ea41c9cb4d862e96c4ee4d18",
[
@@ -192332,7 +193064,7 @@
]
],
"masonry-grid-item-self-baseline-002a.html": [
- "6708e58332808b1bba0f20db46cfa062270956b8",
+ "4ece8d754d3d686e4691f5140af9b7f14503e036",
[
null,
[
@@ -192345,7 +193077,7 @@
]
],
"masonry-grid-item-self-baseline-002b.html": [
- "34911b7c9fa632da919b769e015148e2b8c4c488",
+ "cc0eaaa9cc27dc3e54f660314d63f155a838212e",
[
null,
[
@@ -193005,7 +193737,7 @@
]
],
"masonry-item-placement-004.html": [
- "52867cd4a213530e8cb9640b20371a7f35bbaac8",
+ "92741f4b1153ff7487a84e4f053c1288bcd2fa0f",
[
null,
[
@@ -193018,7 +193750,7 @@
]
],
"masonry-item-placement-005.html": [
- "7d4993fb3a61a015af6098e1f79d7e5f94d1b17e",
+ "f879ddce562b40133ac6e5522b86c4bd177c85ef",
[
null,
[
@@ -193031,7 +193763,7 @@
]
],
"masonry-item-placement-006.html": [
- "467e313d339776a90d994459991724b75210e1b9",
+ "0f963762af5a71a73ddbbaa1a6f01ab0396d875a",
[
null,
[
@@ -193044,7 +193776,7 @@
]
],
"masonry-item-placement-007.html": [
- "4c8053ba666b5c6ddc3b61f74a2233151414e4ff",
+ "ebbed114a1171a3218be7e1378c199cb82c0fe97",
[
null,
[
@@ -193069,19 +193801,6 @@
{}
]
],
- "masonry-rows-item-placement-auto-flow-next-001.html": [
- "c425490d2d8f464e9fae0a1777c4c8366cb283af",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"masonry-rows-with-grid-width-changed.html": [
"3a1c4cfa9c065425d8de17dba157663f6024711c",
[
@@ -193135,19 +193854,6 @@
],
{}
]
- ],
- "masonry-order-002.html": [
- "5ebdec27193a454e98fb54ea48508c2b26b3cfa8",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html",
- "=="
- ]
- ],
- {}
- ]
]
},
"subgrid": {
@@ -196663,6 +197369,19 @@
{}
]
],
+ "conic-gradient-001.html": [
+ "37e41094fb28a03d3dbbcd6e88c0c36e1e520b62",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/conic-gradient-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css-color-4-colors-default-to-oklab-gradient.html": [
"2b1edca0da1e168c3fa921202c54346b911f354a",
[
@@ -196731,6 +197450,19 @@
{}
]
],
+ "gradient-analogous-missing-components-004.html": [
+ "286caa0226a529082daf4b63c60a846344d5f826",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"gradient-decreasing-hue-hsl.html": [
"973974417ea306380adc4f3fc3e75b6daa0b9af9",
[
@@ -196877,7 +197609,7 @@
]
],
"gradient-eval-004.html": [
- "ada406fd2a0ec8bea1af74daeafc95563174ac1f",
+ "1a9c43610f41cb8cab10543ffcc3fd7ee378dd07",
[
null,
[
@@ -196897,7 +197629,7 @@
],
[
0,
- 10000
+ 2000
]
]
]
@@ -197680,6 +198412,90 @@
}
]
],
+ "gradient-powerless-hue-hsl.html": [
+ "7b37596bfacada02dbf7c8ffa5e2fe74a2a74d1c",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-powerless-hue-hsl-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gradient-powerless-hue-hwb.html": [
+ "e04e5f1bffcae04cbb7ae49e718633dc1e9b123f",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-powerless-hue-hwb-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "gradient-powerless-hue-lch.html": [
+ "b0485869d1d1e5e3e84c0399b27bf86359630388",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-powerless-hue-lch-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "gradient-powerless-hue-oklch.html": [
+ "68c4e120279b3190b281aae548df0209a3ec8908",
+ [
+ null,
+ [
+ [
+ "/css/css-images/gradient/gradient-powerless-hue-oklch-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"gradient-single-stop-001.html": [
"1e89b3ffc67766552529f7dd09c8590b2c55c27c",
[
@@ -200420,7 +201236,7 @@
]
],
"object-fit-containcontainintrinsicsize-png-001c.tentative.html": [
- "b17f59f887f216f11a386077c41156388624ee27",
+ "dd1bf249a5555aaeec924de5d944442b55452e2f",
[
null,
[
@@ -200472,7 +201288,7 @@
]
],
"object-fit-containsize-png-001c.tentative.html": [
- "43a50adcedcf2bcdf81d86f717ec52e6a96e0f1a",
+ "733b7592f3ba8f748300c7ee681b765ba66cb559",
[
null,
[
@@ -209279,6 +210095,19 @@
{}
]
],
+ "clip-path-animation-geometry-box-delay.html": [
+ "a6040d445a90c35f811ba31a70622b1b88351af1",
+ [
+ null,
+ [
+ [
+ "/css/css-masking/clip-path/animations/clip-path-animation-non-shape-delay-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"clip-path-animation-incompatible-shapes1.html": [
"88c6862aa9ede58f0d2d0b384f2454ed6130c86f",
[
@@ -209515,6 +210344,19 @@
{}
]
],
+ "clip-path-animation-reference-delay.html": [
+ "4afecbbf9870560718be1ec454d40261326928b5",
+ [
+ null,
+ [
+ [
+ "/css/css-masking/clip-path/animations/clip-path-animation-non-shape-delay-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"clip-path-animation-revert-layer.html": [
"cc23c96e2ee76f75cb30280320da3ee9e4cbdb1b",
[
@@ -216388,6 +217230,123 @@
{}
]
],
+ "column-height-001.html": [
+ "cb7cb6323f5a77fe0d461cd687fa589dd66a038a",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-002.html": [
+ "902076a65a8d224059cb4e9ad57ad024bf888c00",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-003.html": [
+ "879358c1803c49374f98092aaa7301c03ed30ddb",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-004.html": [
+ "07107f3c3695038030e09395b49831d000d58eef",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-005.html": [
+ "e131d62ee5dbeb8f13e68427983f0bc85d2c99c0",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-006.html": [
+ "773f25edd5c7b6015c8d2185c0f6dca8a189aeb0",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-007.html": [
+ "4e7308dbd12025ea9d0b9b2b930595a974fb8ee7",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-008.html": [
+ "f8ef2b1477f4be36a2300bc7b45d2393a4abb56d",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "column-height-009.html": [
+ "1e08242e0f9c9dc415854af29ce04a6e7ee2ef9e",
+ [
+ null,
+ [
+ [
+ "/css/css-multicol/column-height-009-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"column-pseudo-background-color.html": [
"f321b1076eb58fcc00add55ab9f7dacd9daa2fba",
[
@@ -222207,6 +223166,32 @@
{}
]
],
+ "block-ellipsis-011.tentative.html": [
+ "9ee252082399c2967cb70c4dbf0ca7fdd9a28028",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/line-clamp/reference/block-ellipsis-011-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "block-ellipsis-012.tentative.html": [
+ "54dd4df51417f31e68dbfa956aa8024a75df49a2",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/line-clamp/reference/block-ellipsis-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"line-clamp-001.html": [
"c8cfcb1066de1a1d5c98e147c8e47499069046be",
[
@@ -225077,6 +226062,19 @@
{}
]
],
+ "root-scroll-marker.html": [
+ "48f3a81338a8f0c0445ab1365349d047493e92fc",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/root-scroll-marker-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"rounded-overflow-clip-visible.html": [
"65e7f055a3907da79701f1f8d68f6527d7c69181",
[
@@ -225441,6 +226439,110 @@
{}
]
],
+ "scroll-marker-contain-001.tentative.html": [
+ "93d7df72508d19d89ac6c2d775e24a1937b660aa",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-002.tentative.html": [
+ "af2a5e668be4673ae5d976fa901fd5106dc8ad1c",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-002-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-003.tentative.html": [
+ "59daa5cf5ced7c57248cfbbf4fef637ad91728be",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-003-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-004.tentative.html": [
+ "2ec6f6bde76fb3c16b04628f49415edda014985e",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-005.tentative.html": [
+ "3d435bf74cbe204857b62974bcd0f12ee1ec8430",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-006.tentative.html": [
+ "234b57e5bbea2b29a1beb2671fb1b6a1ec1de976",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-007.tentative.html": [
+ "5f15c85819a3d00ca9d3088425345bbc9be60cb3",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scroll-marker-contain-008.tentative.html": [
+ "80801854a0f05abb47243873ae084a1564e5cd30",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scroll-marker-contain-008-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"scroll-marker-counters.html": [
"25e4fdfd24f849128c711cdc5a8610abba5e1d8f",
[
@@ -230475,6 +231577,19 @@
{}
]
],
+ "position-sticky-table-pixel-rounding.html": [
+ "3bda20efc9d7381f5967810711d552fe4a2a57b8",
+ [
+ null,
+ [
+ [
+ "/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"position-sticky-table-td-bottom.html": [
"7cd3b8d695e00a68e58c9016aa2990eaf78ba846",
[
@@ -236551,6 +237666,19 @@
{}
]
],
+ "host-has-internal-004.html": [
+ "fe51186f59f88bdfcf5ed8641938b7491024bfda",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"host-is-001.html": [
"16d0dd76691362ee963e386a2fd238783c096243",
[
@@ -244515,7 +245643,7 @@
]
],
"replaced-element-013.html": [
- "bcbf653d68af4c1f908a59ca6e66e5752a09c833",
+ "564858e360eee6aaa676224fe342409d06486f1b",
[
null,
[
@@ -244528,7 +245656,7 @@
]
],
"replaced-element-014.html": [
- "4c1ad16ce8624295251b73d1a14f53b9c9905610",
+ "8b7bdafc10770d3f3371c5ec7a699f4189c982cb",
[
null,
[
@@ -244852,6 +245980,32 @@
{}
]
],
+ "replaced-element-045.html": [
+ "3339de4cb7dfc7aaf7cb8f27de542515626a0563",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "replaced-element-046.html": [
+ "13a9fd99513aa622bf1338a497d5810822de1aaf",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"replaced-element-dynamic-aspect-ratio.html": [
"d4b83d3673cbfba940baec1c88f3e6630c760eb4",
[
@@ -265252,7 +266406,7 @@
]
],
"text-wrap-balance-before-after-001.html": [
- "9f5741e23492875670f1406e934a1306bdd51973",
+ "7176768b8df4fe19d63188097cd8be96c43ae1cb",
[
null,
[
@@ -265265,7 +266419,7 @@
]
],
"text-wrap-balance-before-after-002.html": [
- "e9d08953fac0963ba2a9639ac9aabb6f3f59764b",
+ "60e3a777df33b008284669c35c64742ea19d6ba0",
[
null,
[
@@ -301870,7 +303024,7 @@
]
],
"auto-name-from-id.html": [
- "9a04d431dfdc2225670e6bb2f87e6ac7a4fcd486",
+ "d3430c93a1d2043146e7205c2734a2b8b19af2e0",
[
null,
[
@@ -303985,6 +305139,19 @@
],
{}
]
+ ],
+ "at-rule-types-shared-elements.html": [
+ "50dc5ba1f43b95927f1c2a7559d68ce2bf2b10d7",
+ [
+ null,
+ [
+ [
+ "/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
}
},
@@ -304540,6 +305707,35 @@
}
]
],
+ "nested-root-capture-with-clip.html": [
+ "eb728182865eb5388053b0039e22d9f75f5da8f6",
+ [
+ null,
+ [
+ [
+ "/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 40
+ ],
+ [
+ 0,
+ 400
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"normal-goes-up.tentative.html": [
"f68c93d474425d958b46c3dcd2d29197f797fbdd",
[
@@ -306022,7 +307218,7 @@
]
],
"pseudo-with-classes-mismatch-ident.html": [
- "107f388b388f42a51c311198cd911b54008a21d7",
+ "493127b86b3d159c9d137704d991ab878568ba4d",
[
null,
[
@@ -306035,7 +307231,7 @@
]
],
"pseudo-with-classes-mismatch-partial.html": [
- "ddb9b2535f26aa77e6c485e99043dd9496ef3dab",
+ "d4a6e0a4f15d358492d95bbca7807cda814072e3",
[
null,
[
@@ -306048,7 +307244,7 @@
]
],
"pseudo-with-classes-mismatch-wildcard.html": [
- "1e27dc2c05ce97b54f4b362f6d21b94bf6e32d61",
+ "bdf5116144767b8214e3d775158b16be993008f6",
[
null,
[
@@ -306074,7 +307270,7 @@
]
],
"pseudo-with-classes-new-with-class-old-without.html": [
- "225ed1cb7f32194b67808207f899fc1034d33171",
+ "5adb88f143f8f7f307838f83652a3885d4f4424b",
[
null,
[
@@ -306087,7 +307283,7 @@
]
],
"pseudo-with-classes-old-with-class-new-without.html": [
- "f9ef100ef7edf9f279594af18cb970ea7b1dab80",
+ "17d03f8fcfc58443f60a20143c13036624a7b90b",
[
null,
[
@@ -307190,6 +308386,19 @@
{}
]
],
+ "font-size-keyword-specified.html": [
+ "fc724307f46bc5c77f8599f07e4cca1411d6d0e3",
+ [
+ null,
+ [
+ [
+ "/css/css-viewport/zoom/font-size-keyword-specified-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"font-size.html": [
"e572806be41f21297b6b864f9b74378de35a28c6",
[
@@ -322109,6 +323318,32 @@
{}
]
],
+ "text-orientation-020.html": [
+ "84f4e62e5736def73afbef6024880182bd5793ee",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/text-orientation-020-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "text-orientation-021.html": [
+ "27fae03dddcd9e27b0f50d84cc10605b4830b013",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/text-orientation-021-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"text-orientation-initial.html": [
"434e14ccb88f8fde666c7ab646bf882a15bea294",
[
@@ -325293,6 +326528,32 @@
{}
]
],
+ "feComposite-intersection-feTile-input-svg.html": [
+ "7c9fd6a6f4d64b71e0116e1662221af20d7b67a5",
+ [
+ null,
+ [
+ [
+ "/css/filter-effects/feComposite-intersection-feTile-input-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "feComposite-intersection-feTile-input.html": [
+ "1bf1f4b8fba8ca37705e276d8c72888f01db4954",
+ [
+ null,
+ [
+ [
+ "/css/filter-effects/feComposite-intersection-feTile-input-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"fecolormatrix-negative.html": [
"eddec862154fc9929a9f7ad8f9cbb0a7d182ef18",
[
@@ -337797,7 +339058,7 @@
]
],
"canvas.2d.lang.dynamic.html": [
- "225fcaa7ba19ddb4311d994760e262892a8f98fe",
+ "02fb530baefe6517b4eba71ab7415b9ab1d06fa9",
[
null,
[
@@ -337810,7 +339071,7 @@
]
],
"canvas.2d.lang.empty.canvas.html": [
- "099081de379890e28efd18b29f395cf780e3ce37",
+ "9c5eb3f96b216d2866dbd5d8a82ce35b67037c00",
[
null,
[
@@ -337823,7 +339084,7 @@
]
],
"canvas.2d.lang.html": [
- "b8fca4dd5e72b95c6a47d61b2bb3d895cc4ddb8d",
+ "e078eaa123561951f8ed54b6d6e51b177420812e",
[
null,
[
@@ -337836,7 +339097,7 @@
]
],
"canvas.2d.lang.inherit.disconnected.canvas.html": [
- "0af5f20d6f5d21a0e79122d4ef76c0535a75654a",
+ "83854b9b3773ed9f1da1920fa56bfe5786bba108",
[
null,
[
@@ -337849,7 +339110,7 @@
]
],
"canvas.2d.lang.inherit.disconnected.canvas.no.lang.html": [
- "6b06ae5df960c0ffe240894dce5c50461db65fc9",
+ "87fc358af9eb38b378d3ddccdac3df795688b4cc",
[
null,
[
@@ -337862,7 +339123,7 @@
]
],
"canvas.2d.lang.inherit.html": [
- "845880f20d86c45983caf0cd839583d07082cedf",
+ "06e97745ddbd0cff3e1a3d311e21b19f440393ae",
[
null,
[
@@ -341462,7 +342723,7 @@
]
],
"canvas.2d.offscreen.lang.html": [
- "c3c6b36901d39d18689930171fdef69947870bd0",
+ "d1d9bc0998d0f6f8a1b6cf56d93fea2bb158d1c4",
[
null,
[
@@ -341475,7 +342736,7 @@
]
],
"canvas.2d.offscreen.lang.inherit.html": [
- "63b6854cd780b9a93f3bdcab8b7418b96e3f0422",
+ "05849f419ff3836499f93e0e8b5b39b913f65ad8",
[
null,
[
@@ -341514,7 +342775,7 @@
]
],
"canvas.2d.offscreen.transferred.lang.html": [
- "06c0db121d0b213d23a8f03b3aae6c39e168de0b",
+ "a6a908b1d184a8b9eef311e10be34d13c5d428df",
[
null,
[
@@ -341527,7 +342788,7 @@
]
],
"canvas.2d.offscreen.transferred.lang.inherit.document.html": [
- "a7561ddd855649790f437922daed20d22bac9a08",
+ "3146d078ebacfdb97dde719937648b292446b670",
[
null,
[
@@ -341540,7 +342801,7 @@
]
],
"canvas.2d.offscreen.transferred.lang.inherit.html": [
- "72aab773a5e9dc85e32625a4b66dd227d1a292ef",
+ "1a9b7ec63e12059efa6e35e5aa533757a4aa382f",
[
null,
[
@@ -341579,7 +342840,7 @@
]
],
"canvas.2d.offscreen.worker.lang.html": [
- "8ed884a177539048d8670383c8d586ea4b34173f",
+ "3cd2ec4f42cfc5d4a3a4d6dd595212044155dc43",
[
null,
[
@@ -341592,7 +342853,7 @@
]
],
"canvas.2d.offscreen.worker.lang.inherit.html": [
- "43157d54d2b8403011ccb668536439f33453f1d7",
+ "ce437887bc42ad566cc1b6930afdeb53e1a441e7",
[
null,
[
@@ -344257,7 +345518,7 @@
]
],
"hidden-until-found-001.html": [
- "3c87b985dcc885208017f38229fdf853ed748a67",
+ "0fa46f523cd8161879093a78af3a84632e58c91f",
[
null,
[
@@ -344270,7 +345531,7 @@
]
],
"hidden-until-found-004.html": [
- "3ca6feb7a3dd41ab5067b952372962a6446cfda8",
+ "2c0c643c307479b40e3ff4a18a8e97b05117c9fc",
[
null,
[
@@ -344283,7 +345544,7 @@
]
],
"hidden-until-found-005.html": [
- "fabf636ec94850c7eea86b4e4bafafb1f795fd66",
+ "2c4df955aee922c7f53db4b8d432cbe751a7a14a",
[
null,
[
@@ -344296,7 +345557,7 @@
]
],
"hidden-until-found-007.html": [
- "7b11a92cc93940d99769804951ad3fb6c3929094",
+ "64c39c4153a58f2049f50c265dae7346e6b313ee",
[
null,
[
@@ -346611,6 +347872,19 @@
]
},
"the-option-element": {
+ "option-label-whitespace-2.html": [
+ "95b3a3c73db92ee641384fb54c599c9765bf9004",
+ [
+ null,
+ [
+ [
+ "/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
"option-label-whitespace.html": [
"aad1039d7b4f1c0078b622a94bc6364b992e60af",
[
@@ -347345,7 +348619,7 @@
]
],
"field-sizing-textarea-relayout.html": [
- "1e18bd2070377923ec1e29d012ddcf94ad7aa6a2",
+ "579462ca2f579b7360790c3ad3a63d0de45e4c41",
[
null,
[
@@ -347360,11 +348634,11 @@
null,
[
[
- 153,
+ 0,
153
],
[
- 2,
+ 0,
2
]
]
@@ -357613,6 +358887,34 @@
]
},
"scroll-animations": {
+ "animation-trigger": {
+ "animation-trigger-fill-mode-both.tentative.html": [
+ "237bbb996702d35e3992ce51afb42298398443c2",
+ [
+ null,
+ [
+ [
+ "/scroll-animations/animation-trigger/animation-trigger-fill-mode-both-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "animation-trigger-fill-mode-none.tentative.html": [
+ "81dae8a2f724845c35c50d1413af6796e62797a3",
+ [
+ null,
+ [
+ [
+ "/scroll-animations/animation-trigger/animation-trigger-fill-mode-none-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"css": {
"animation-fill-outside-range-test.html": [
"c63a5f07662dd04b9b97209b27ec575866680216",
@@ -358897,6 +360199,71 @@
]
},
"embedded": {
+ "image-embedding-nested-data-url-png.html": [
+ "ff54e38b1a48c1692a4e7cb3c7ab44a82e0e36bf",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "image-embedding-nested-data-url.html": [
+ "7e58c3e7e10b0b5679b02f77dde8cb2479bbf96e",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "image-embedding-nested-external-data-url-png.html": [
+ "0935507c045f71ff195ff7141b6171c9099ceb78",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "image-embedding-nested-http-url.sub.html": [
+ "f3d8a79b999ab50790c7c2cbbac29dc5ebbb4c9d",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "image-embedding-nesteder-data-url.html": [
+ "48fb4fa48b7439dde62fbe82a0ff20ff5d64e550",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"image-embedding-svg-nested-svg-in-foreignobject.html": [
"880305253c59fe4d7af9808894f82bd88a6aa760",
[
@@ -366935,31 +368302,31 @@
],
"workflows": {
"check-workflow-run.yml": [
- "0487f03a592fa354557ef109e0c3767017e0f856",
+ "7afc1678105236554081be440995cfae532e5340",
[]
],
"docker.yml": [
- "6d5c7c79a05faeaeb5e18040ceedaf99240020c4",
+ "66794b69aba0f2ee5984c269434cdab2ee9a6cfc",
[]
],
"documentation.yml": [
- "f7e9fb2e13505840666e5831f4b20a9d119c3cbf",
+ "6c92e435c69ae60a2ff73fe482dfc047bb2cb461",
[]
],
"epochs.yml": [
- "8b2081364e5d75066bf62414dfcf45636226f2c7",
+ "fa88b50ff3f5746b07f1a7acb9267d8f52399c82",
[]
],
"interfaces.yml": [
- "302e0a846d823e7bb5f37586c8b595307a2a3ac8",
+ "c3deb7c0b7d942113e380f2b2752fb0c441fc3ec",
[]
],
"manifest.yml": [
- "a27fc2258dea84679dd0e4b667d183526dea6208",
+ "4ac2c8b27005a5468482f34364c6387debd9c9cb",
[]
],
"regen_certs.yml": [
- "b66ba90065f9b142138f49d1a5ebf5b12d428f4e",
+ "d60c6b04b30800c6ffe2576cc81bb65d28d8d55c",
[]
],
"safari-wptrunner.yml": [
@@ -366975,11 +368342,11 @@
[]
],
"update-wasm-tests.yml": [
- "283e6e728786fd3ff64004c4a372be540929c2c4",
+ "d1aafdcb12445a77e4a395ac1aa509f54daf69c7",
[]
],
"wpt_fyi_notify.yml": [
- "c066136641836a903ae2330d7cb06fc72e28e37a",
+ "8e9a043f2c363e9bb661a9afa1a9fabebfe1fe98",
[]
]
}
@@ -367530,7 +368897,7 @@
},
"accname": {
"META.yml": [
- "7f538628e8c0b2134f9605106616b3a1d05eb7a7",
+ "775209284947114b6f50e5dfaf7695afd2ba7abf",
[]
],
"manual": {
@@ -370276,6 +371643,10 @@
[]
],
"support": {
+ "clear-cache-helper.sub.js": [
+ "2b2d35abfc571969f414d6f8f7d61f9ac189f284",
+ []
+ ],
"clear-site-data-cache.py": [
"38f131bdd52b51250204cca79972d93a62ace715",
[]
@@ -389874,6 +391245,22 @@
]
}
},
+ "container-timing": {
+ "META.yml": [
+ "b786960789921b08bdbb782ea4a57afc8c20f826",
+ []
+ ],
+ "resources": {
+ "container-timing-helpers.js": [
+ "a80ad964fef311f55062631d5548a6d8f0eecb3f",
+ []
+ ],
+ "square100.png": [
+ "567babb96d1ec3e1032d476f8f7ee1fcb2aa4875",
+ []
+ ]
+ }
+ },
"content-dpr": {
"content-dpr-various-elements-ref.html": [
"9a7e10e51b06ab6a4c2453b8f048cfd8709bd471",
@@ -392143,6 +393530,10 @@
"2d579c91bed92b69235c357dafb51ef98490dab6",
[]
],
+ "third-party-cookies-cross-site-embedder-opener.html": [
+ "f7458f8be166f66419d4f1950d3eb78a28b8e03b",
+ []
+ ],
"third-party-cookies-cross-site-embedder.html": [
"ec25902a915a1d2b93e1cd2028a5f42476476713",
[]
@@ -392164,7 +393555,7 @@
},
"core-aam": {
"META.yml": [
- "dfce961fa8a5152167da328a70618c7459fe8241",
+ "f150c4fe065b7569c673c4e4007882063d723bef",
[]
],
"README.md": [
@@ -409794,6 +411185,10 @@
"b07685d951735d521418a98e2b7bf283a068019b",
[]
],
+ "root-element-background-margin-opacity-ref.html": [
+ "afe543029d800f5b3c53c1c2179e981693c033ba",
+ []
+ ],
"root-element-background-transparency-ref.html": [
"4671d44c1c3f3e2ff16149cbaabebb0433aef3e5",
[]
@@ -410083,7 +411478,7 @@
[]
],
"position-visibility-anchors-visible-both-position-fixed-ref.html": [
- "7a9d69a9e3b3206fbc8a5865fb951ecec67b1bea",
+ "3af597aee65d3d679ae21e55d2f5859a3459e297",
[]
],
"position-visibility-anchors-visible-chained-004-ref.html": [
@@ -410106,14 +411501,14 @@
"3b6532e27b02a21037926adda9c4204c3ac6c017",
[]
],
- "position-visibility-anchors-visible-position-fixed-ref.html": [
- "e24992fd5ea44d66f01c275049436d15349f7a2b",
- []
- ],
"position-visibility-anchors-visible-ref.html": [
"17798173804b41258690ed22f1169a529bca42fe",
[]
],
+ "position-visibility-anchors-visible-with-position-ref.html": [
+ "5a364aa7847a13e5c786708f5f97dd0dd718649d",
+ []
+ ],
"position-visibility-no-overflow-ref.html": [
"d6e64d0d107664532f657d8774df1aeda6e038f9",
[]
@@ -410232,6 +411627,10 @@
"398217c4587e0c5f5364b00b8b39b49885c7f27b",
[]
],
+ "animate-with-background-color-oklch-001-ref.html": [
+ "92b91077f3fe1cc66cca5b5202cd5d9a2d5f6b50",
+ []
+ ],
"animation-common-ref.html": [
"ddc7da67ddf5fed83e653d1130a65f5c1e3a6dec",
[]
@@ -412443,7 +413842,7 @@
"tentative": {
"corner-shape": {
"corner-shape-any-ref.html": [
- "688f01c8668554efce1ccde22ebf2b12a2ff61c8",
+ "36fc7a88825fea38ad5cfcdf544946e3644cc00b",
[]
],
"corner-shape-bevel-overflow-composite-ref.html": [
@@ -412458,12 +413857,12 @@
"4000833c31d1cad31076f52f33f0f4f95922bbd1",
[]
],
- "corner-shape-notch-ref.html": [
- "8963c0ca2939c4036d9505461c9772b803b586f2",
+ "corner-shape-gallery.manual.html": [
+ "1eb6cbd8df349f0a27b1575b8a77583c95b44a42",
[]
],
- "corner-shape-render-ref.html": [
- "1a9043cbc827f4ef4b1ba753e1fae278647de5f2",
+ "corner-shape-notch-ref.html": [
+ "8963c0ca2939c4036d9505461c9772b803b586f2",
[]
],
"corner-shape-straight-ref.html": [
@@ -412472,15 +413871,15 @@
],
"resources": {
"corner-shape.js": [
- "2aaaf5ed28987608fba8f4f8b756cd3062e82498",
+ "de471f95dfc4de0d58f8a0c63b510da92d90f476",
[]
],
"corner-utils.js": [
- "39203aefc67d57e9e0128112e60ac5b01e147d95",
+ "bacaaa8a6e4ae7f68bab460e8e98b292d103bb69",
[]
],
"resolve-corner-style.js": [
- "ea065f577e09c30b56cf1171685375b7aefeebc7",
+ "93e5112ea40cfd43ae2c19dbf8cfdf38e06c4c4e",
[]
]
}
@@ -420348,14 +421747,6 @@
"ea32e1787e58047763ca26ca575e5ff67325d110",
[]
],
- "Lato-Medium-Liga.ttf": [
- "3a0beaea38b8bc0cbf6fa656bf23e28cfdf18c6f",
- []
- ],
- "Lato-Medium.ttf": [
- "2c612da2ae589dc264deb683f90baf75c8e18e03",
- []
- ],
"LigatureSymbolsWithSpaces.woff": [
"1f0e7ca0076ae09f3fdea656052a1a08ab2b1111",
[]
@@ -426643,6 +428034,46 @@
"grid-gap-decorations-005-ref.html": [
"aebfba5a20e97e826e27e27c0ce962f6f675eba2",
[]
+ ],
+ "grid-gap-decorations-006-ref.html": [
+ "f77ec2a9d43899e971dea9ee1596595561fe2bf8",
+ []
+ ],
+ "grid-gap-decorations-007-ref.html": [
+ "9d74fa00f41fd5599f8c9d4c6d32b5b69363d42b",
+ []
+ ],
+ "grid-gap-decorations-008-ref.html": [
+ "200a2621a2181d52e1a16fc6919f944ee08f0b36",
+ []
+ ],
+ "grid-gap-decorations-009-ref.html": [
+ "11d8267235b8a24a9118b0b638a9a0519e69b784",
+ []
+ ],
+ "grid-gap-decorations-010-ref.html": [
+ "747391cfedc88bd46f3a13ca8895d5bc6101a6d2",
+ []
+ ],
+ "grid-gap-decorations-011-ref.html": [
+ "c49eb95f72eff1e8ed657fbead3243abd57af908",
+ []
+ ],
+ "grid-gap-decorations-012-ref.html": [
+ "ded98fa1c8d314be49ed7a2d3159fea2d7efe0d7",
+ []
+ ],
+ "grid-gap-decorations-013-ref.html": [
+ "bd8456f525ef3cc6406658db68b893baa0352301",
+ []
+ ],
+ "grid-gap-decorations-014-ref.html": [
+ "25a930a51af81d12ebc8e5fa4dcedff31510c0dc",
+ []
+ ],
+ "grid-gap-decorations-015-ref.html": [
+ "0937a62da6f153b1df1facb3ad8b472d57339784",
+ []
]
}
}
@@ -427100,7 +428531,7 @@
[]
],
"grid-item-aspect-ratio-stretch-4-ref.html": [
- "8d7fc870fae1ad7f969b7a9de4035da783c1dae4",
+ "8c251a9d9f002041354bb252baf12e694b6a2207",
[]
],
"grid-item-content-baseline-001-ref.html": [
@@ -427416,6 +428847,10 @@
]
}
},
+ "grid-flex-spanning-items-001-ref.html": [
+ "ec65437e8f385b016dff2f28ac3f82d3500ff91f",
+ []
+ ],
"grid-fragmentation-between-rows-001-print-ref.tentative.html": [
"78464712c5cb698fd26a7a12b6c522d4bda946d6",
[]
@@ -427802,7 +429237,7 @@
[]
],
"masonry-intrinsic-sizing-rows-003-fr-ref.html": [
- "ca2aaef482dc6207913d66db1d38fba4e21f43b0",
+ "41a032712a21a28b2710630425391f7f63d15402",
[]
],
"masonry-intrinsic-sizing-rows-003-mix1-ref.html": [
@@ -427826,7 +429261,7 @@
[]
],
"masonry-intrinsic-sizing-rows-004-mix2-ref.html": [
- "97e6b3ea2922b8810d5bc940caad3eb48b3ac371",
+ "4d1470896c8e828f3aa52d6e6dc701f76fbd31a0",
[]
],
"masonry-intrinsic-sizing-rows-005-ref.html": [
@@ -427858,29 +429293,25 @@
[]
],
"masonry-item-placement-004-ref.html": [
- "75d6b741c2f04de618708486dfbd0e066b4fc738",
+ "ba9c72f292553fe9ad54c6c218741b0126ba7bde",
[]
],
"masonry-item-placement-005-ref.html": [
- "806f314300dd1c9127a8f59ba9e1bb09c6d99265",
+ "bd5d55262a3c0579fa208b85aab10c74b9a071d1",
[]
],
"masonry-item-placement-006-ref.html": [
- "a6e9b75d0e61ce1404229781f5d55da34c4d2a68",
+ "a54476a6ba806d5b003b74a8c8fd12dfca1dfc0e",
[]
],
"masonry-item-placement-007-ref.html": [
- "50236046fb0610dcac5723f212ab69a9155847b1",
+ "5c1fd18b3d14664e3908d98f2af3fbce0da1b580",
[]
],
"masonry-item-placement-008-ref.html": [
"f3503bf071131f396111956dcc0ebddf5e9bd051",
[]
],
- "masonry-rows-item-placement-auto-flow-next-001-ref.html": [
- "cbb3e825a4b76d28dc6e93b53eeeea1b5e40a118",
- []
- ],
"masonry-rows-with-grid-width-changed-ref.html": [
"71c081f2cac1b1f358b484834ab0c5f8df68625c",
[]
@@ -427894,10 +429325,6 @@
"masonry-order-001-ref.html": [
"6f20bd05838efed10a0915b30941ff7bcbb73b6a",
[]
- ],
- "masonry-order-002-ref.html": [
- "15be3fde83710c6a7876a5befa8d91dc9f26f8e7",
- []
]
},
"subgrid": {
@@ -428665,6 +430092,10 @@
"28d57bc19c779250d792eafc2d5e4461baece0d5",
[]
],
+ "conic-gradient-001-ref.html": [
+ "2f12c01bb5fe1aee2f1eedd2461133ed257f3bf9",
+ []
+ ],
"gradient-analogous-missing-components-001-ref.html": [
"5e89048bf00d924bc63fce23301c59c0a4a3c417",
[]
@@ -428677,6 +430108,10 @@
"134388315a03691bdd20e77cf7d54ba959e9b7fb",
[]
],
+ "gradient-analogous-missing-components-004-ref.html": [
+ "09f168115bee8485e27da66a686d888cfcc3259b",
+ []
+ ],
"gradient-decreasing-hue-hsl-ref.html": [
"df6dc90ac033e4d00fca3e8f5f6e7ad998aa4c6c",
[]
@@ -428698,7 +430133,7 @@
[]
],
"gradient-eval-004-ref.html": [
- "f197386bcfb4af5bc084fd262cc29a73f2329ffe",
+ "f28b30137cdc176fa6c9134ffecbb981e87da557",
[]
],
"gradient-eval-005-ref.html": [
@@ -428845,6 +430280,22 @@
"154112fe612979103ad5f7c3c8fa528c1d434a5b",
[]
],
+ "gradient-powerless-hue-hsl-ref.html": [
+ "b6ce2a32d1d39b76c9e8279e491b29ebbc1d215e",
+ []
+ ],
+ "gradient-powerless-hue-hwb-ref.html": [
+ "6bb79ddf4199c482b3ea253ac7db621de6918ce5",
+ []
+ ],
+ "gradient-powerless-hue-lch-ref.html": [
+ "ca383a9857d9e853a15ee545779566ed7ffd3a69",
+ []
+ ],
+ "gradient-powerless-hue-oklch-ref.html": [
+ "4e25773f280b8d3fb61a370c32d056ff25356c72",
+ []
+ ],
"gradient-single-stop-longer-hue-hsl-002-ref.html": [
"a05f99e986dfc405f9037877cf0141c76dbc9b08",
[]
@@ -429520,7 +430971,7 @@
],
"parsing": {
"WEB_FEATURES.yml": [
- "023eb5f6e051bdb858b88e1d70bdbb1f07efe816",
+ "d60ed3efd4ce9e1c4703439b0976b3e625e3bfab",
[]
]
},
@@ -431144,6 +432595,10 @@
"d351f80a26fa93866afaed00f872a7800078d6c7",
[]
],
+ "clip-path-animation-non-shape-delay-ref.html": [
+ "1bd7107cbbd2083b779bb0e82a8341d4576afbbd",
+ []
+ ],
"clip-path-animation-none-ref.html": [
"f47e9f31b07c993aac8e065a699d5db2bc3cd9a0",
[]
@@ -432020,6 +433475,10 @@
"f0ee4df8c9de3a77fb39b40942dbf0743312494f",
[]
],
+ "column-height-009-ref.html": [
+ "034440ebd5c81be43f0d871d3adb276b2a735768",
+ []
+ ],
"column-pseudo-background-color-ref.html": [
"8a6d741542939fda5e165f56129a44fdd2e950a9",
[]
@@ -433178,6 +434637,14 @@
"b5f15ca3dcdf00d68fd2c11611aa69853cc07414",
[]
],
+ "block-ellipsis-011-ref.html": [
+ "379cf974f649e4a7e96e19289509982a0ac5c514",
+ []
+ ],
+ "block-ellipsis-012-ref.html": [
+ "7f9c44293e8e6bdc768a1ab0bc5ac50564f519ff",
+ []
+ ],
"line-clamp-010-ref.html": [
"46ca731c5446db88ba4e5fc8a3d6b8b43c4fc056",
[]
@@ -433804,6 +435271,10 @@
[]
]
},
+ "root-scroll-marker-ref.html": [
+ "24d3fab4ef1e109a62006799a55b344fd0178759",
+ []
+ ],
"rounded-overflow-clip-visible-ref.html": [
"3a25b794d8d4136c2a7c8c94e5d9eb80daceedc7",
[]
@@ -433872,6 +435343,22 @@
"dca775fcecadf26d115e3961da6affb519b0fdba",
[]
],
+ "scroll-marker-contain-001-ref.tentative.html": [
+ "69e9167cc33a2ec61e47ea9c2199141c028424b2",
+ []
+ ],
+ "scroll-marker-contain-002-ref.tentative.html": [
+ "3fa777f7863f1f5e395e3304f6fbd763a9cf206e",
+ []
+ ],
+ "scroll-marker-contain-003-ref.tentative.html": [
+ "09bb93d4ebcefa99f22ae932626bf21c0b6ba528",
+ []
+ ],
+ "scroll-marker-contain-008-ref.tentative.html": [
+ "d74777d3bbf0b230048a17320afa6040a6b8eb62",
+ []
+ ],
"scroll-marker-counters-ref.html": [
"7113a5c5d23a97cf83f173a72ef96b57ecf09263",
[]
@@ -435559,6 +437046,10 @@
"9ba42e18b2bc6d37ac1d98af14d30f9894d4e2bc",
[]
],
+ "position-sticky-table-pixel-rounding-ref.html": [
+ "83313e0ad109ffee6bc313d9814aa26866e839f7",
+ []
+ ],
"position-sticky-table-td-bottom-ref.html": [
"e851315641e0212bcbc2453b56e831422b6d6c32",
[]
@@ -435713,7 +437204,7 @@
[]
],
"WEB_FEATURES.yml": [
- "ac89c2b73139a5c5c475fdfa06794088cd406236",
+ "c197d348edf390027106ab541eedba8d83a8ed56",
[]
],
"active-selection-051-ref.html": [
@@ -445748,7 +447239,7 @@
[]
],
"properties.js": [
- "81cf9d46d5ff575e16b955ec2d64f579699fd441",
+ "e450208389086aa559b576eeea723800c3acf933",
[]
],
"ruler-h-50%.png": [
@@ -448296,8 +449787,12 @@
"bf5a73c73ee014ecf5777f77b9282d8f947f58af",
[]
],
+ "at-rule-types-shared-elements.html": [
+ "c9cff7f473410e36bad847c37eb3dbdd1369f9ae",
+ []
+ ],
"auto-name-from-id.html": [
- "f1fd1e48a68e6d7d63184f092bb1b607b6d6967d",
+ "71ea52a273e3fca98440cdefc50c77c722663a21",
[]
],
"chromium-paint-holding-timeout.html": [
@@ -448313,7 +449808,7 @@
[]
],
"navigate-after-hide.html": [
- "0b6a3d669e89e07b6b6476dcdaafef3157fdaa77",
+ "9bed19eda2a0187a18583f05a151ca0ebb1247a2",
[]
],
"opt-in-style.css": [
@@ -448384,7 +449879,13 @@
"transition-to-prerender-ref.html": [
"7df899fdca151dd273063323733c0c20fedb3bb3",
[]
- ]
+ ],
+ "with-types": {
+ "at-rule-types-shared-elements-ref.html": [
+ "2fc574c0f793c57645d9c2e058b1f525b512d401",
+ []
+ ]
+ }
},
"nested": {
"nested-opacity-ref.html": [
@@ -448399,6 +449900,10 @@
"d189a460c7cb5147b04367d4e56aac0ae751c6d5",
[]
],
+ "nested-root-capture-with-clip-ref.html": [
+ "0e2c7d025431898870762711a18e38150448985a",
+ []
+ ],
"resources": {
"compute-common.css": [
"20337ccce5f3387e7e70e6fb219544369b74aa06",
@@ -448815,6 +450320,10 @@
"d1b9a0d68dd5cf15d035896a6e4deac59b950310",
[]
],
+ "font-size-keyword-specified-ref.html": [
+ "3395465c5d59422520d62002618e406e97e63423",
+ []
+ ],
"font-size-ref.html": [
"30eaa4aeb9fcae4e42ca2061358bd976e9144eee",
[]
@@ -450067,6 +451576,14 @@
"aeda4e4f9556bb2b54ce6c32b763c11827a5812c",
[]
],
+ "text-orientation-020-ref.html": [
+ "c5f83ef92a3481b209e568903dedc0f1a46fa255",
+ []
+ ],
+ "text-orientation-021-ref.html": [
+ "3ff53e3da4a514ef05276b91002dd07da23cef4d",
+ []
+ ],
"text-shadow-orientation-upright-001-ref.html": [
"54c1f74259e1fb689d2ffd3dbbd43478c62638c5",
[]
@@ -451455,7 +452972,7 @@
[]
],
"wm-propagation-body-044-ref.html": [
- "9cf46c0b214652ca0bd7f28fe88c7943f6ccef8c",
+ "f61f97c9a1de34e246f1edb056cab56cc6db62b7",
[]
],
"wm-propagation-body-047-ref.html": [
@@ -451509,7 +453026,7 @@
[]
],
"WEB_FEATURES.yml": [
- "def314c45c7988cd00180f6687d6fc296ded7aad",
+ "cabaad6760c90e88d5e3384c2569f5e900e64a5e",
[]
],
"insertRule-from-script-ref.html": [
@@ -451833,6 +453350,10 @@
"b0dbb071d5b05d1c574cd5c9a660f1e3d62c573b",
[]
],
+ "action-utils.js": [
+ "c3ab5272da666146564deae7fc6ab9ffbec3a9e4",
+ []
+ ],
"b-green.css": [
"a0473f5ca26652c1229290bbf1f81eabc1e37280",
[]
@@ -452234,6 +453755,10 @@
"21c33ea1cd44fa23f6f92c3881e6ef22d33587d2",
[]
],
+ "feComposite-intersection-feTile-input-ref.html": [
+ "4345e3d8ac143dfffef9638d75481bfe40630163",
+ []
+ ],
"fecolormatrix-negative-ref.html": [
"95a0051c18a1219012e48ad91e58ecc213ba24b6",
[]
@@ -452865,7 +454390,7 @@
[]
],
"WEB_FEATURES.yml": [
- "cc952ac20098092f75ff503d4bdded9c9ee2ed99",
+ "b090111be0ad9c6be864fa0710948f9dc7a6fb7b",
[]
],
"prefers-color-scheme-svg-as-image-ref.html": [
@@ -454463,6 +455988,10 @@
[]
]
},
+ "fetch-verify-authenticated.https.html": [
+ "d9e3df9f5c6e6030ed642dc302d600a3c974f110",
+ []
+ ],
"helper.js": [
"58b7a5fe7a2da56b9c6555f6e21510abd1c81473",
[]
@@ -456958,10 +458487,6 @@
"8861444591bbd8ec5c5e1e86ccad2d5c45adab39",
[]
],
- "edge-persistent-usage-record.js": [
- "7f86f0c05895a2f82ec4ac80252cf4eb4a33d5e2",
- []
- ],
"firefox-polyfill.js": [
"ce241af362a873af0ba490013790a5be365b9fac",
[]
@@ -456987,14 +458512,6 @@
"drm-retrieve-persistent-license.html": [
"bf554248f43e2bfbc82d5de38cbe9b8de9c4f6cb",
[]
- ],
- "drm-retrieve-persistent-usage-record.html": [
- "d1b3e0c6949091aa208481bc55b85561e74da1a5",
- []
- ],
- "retrieve-persistent-usage-record.html": [
- "c09134b54695b979ee586105710e025073f3b049",
- []
]
},
"scripts": {
@@ -457062,22 +458579,10 @@
"c7e56e3aeaf30c809ea3563548f6198925e0c2c2",
[]
],
- "playback-persistent-usage-record-events.js": [
- "e8e1e54790b6c7a90ed48ee12be8d795dcab290c",
- []
- ],
- "playback-persistent-usage-record.js": [
- "1772b4bd5f361163603598143c4be74ad8883a53",
- []
- ],
"playback-retrieve-persistent-license.js": [
"83cba34028e92a38b2079bcf78460a4b2fa29e31",
[]
],
- "playback-retrieve-persistent-usage-record.js": [
- "a04f97d2ca9baed1734c49701d237d08842f00a4",
- []
- ],
"playback-temporary-encrypted-clear-segmented-sources.js": [
"8f5af2cd6bd762f22a26f1e863a180e63123d9b2",
[]
@@ -457279,6 +458784,10 @@
"e38d492da0a2c22c30bdc799b6b06c224bfec136",
[]
],
+ "WEB_FEATURES.yml": [
+ "b20102ff2a34622e493481126f59717660d9d2fd",
+ []
+ ],
"resources": {
"crossiframe-childframe.html": [
"6a8bc6b64240636dbc576aaa15b9c86b799dae8e",
@@ -459395,6 +460904,10 @@
}
},
"zstd": {
+ "WEB_FEATURES.yml": [
+ "b5d970fdb14ac3fd01ac25c0f9c809460e5e561f",
+ []
+ ],
"resources": {
"bad-zstd-body.py": [
"496f26881dc9574f8e8f3fcc04c49fa4145c8a20",
@@ -460247,7 +461760,7 @@
[]
],
"README.md": [
- "a69aab487239021088f944b0a8cee2dad4b3d111",
+ "cbb5b85b74d1347b93c7f0e480cf978262da6b03",
[]
],
"resources": {
@@ -460471,6 +461984,10 @@
"b007264cea5db3c1ad6f2825ae44b149445dcaec",
[]
],
+ "WEB_FEATURES.yml": [
+ "45e40acba1dcb6b4abe11d1478c682264a4c1e90",
+ []
+ ],
"resources": {
"data": {
"testfile.txt": [
@@ -460514,7 +462031,7 @@
[]
],
"ba-fledge-util.sub.js": [
- "3371813feee6e11dedd71126ca1b354e64021d73",
+ "8fa4eb1e3514274e9ca179253fdae56150ccf07b",
[]
],
"ba-public-keys": [
@@ -460542,7 +462059,7 @@
[]
],
"fledge-util.sub.js": [
- "ebd2b44b9928a9c72e93112f226e51cfa54d4094",
+ "e0d5d99bb6553e441de6e4a8213cf114002666f0",
[]
],
"fledge_http_server_util.py": [
@@ -460574,7 +462091,7 @@
[]
],
"service-worker-helper.js": [
- "cc00181359740b51f83c3289cfc215252123b67e",
+ "2b94dc60e0175996ac27dfcc8df93ef573978a56",
[]
],
"service-worker-helper.js.headers": [
@@ -461233,6 +462750,14 @@
"2d3bf3ed873e8b1d361afbd8aacaee3f3d0b6251",
[]
],
+ "Lato-Medium-Liga.ttf": [
+ "3a0beaea38b8bc0cbf6fa656bf23e28cfdf18c6f",
+ []
+ ],
+ "Lato-Medium.ttf": [
+ "2c612da2ae589dc264deb683f90baf75c8e18e03",
+ []
+ ],
"META.yml": [
"5b04a86e6ef33a371a3e4199fff4cd8d2fc6e25b",
[]
@@ -462282,7 +463807,7 @@
},
"graphics-aam": {
"META.yml": [
- "197263836e7695882d4d1fb533c1e043a70ff234",
+ "c51c6e1b186e7bf9c026905ea2f07531035964d6",
[]
]
},
@@ -465840,19 +467365,19 @@
[]
],
"canvas.2d.lang-ref.html": [
- "6bb9238a74a287c88dd7846aa98cbfdd3e2d611f",
+ "f20533fc4710db7be7cdc94bf7d8a0d360ffd6d6",
[]
],
"canvas.2d.lang.dynamic-ref.html": [
- "177bddb1794ef440663d90f75b204360e05dc100",
+ "0262f588978ac0db86dc8c1e9570faef73d2217b",
[]
],
"canvas.2d.lang.empty-ref.html": [
- "258ebf6298e164ad4edf9f6171f1ff17ac1991d2",
+ "7fa4dacd6e4ead887420d9ba2ecf32e9d6ef9fa2",
[]
],
"canvas.2d.unknown.lang-ref.html": [
- "9d12ba0d695b39bca17b3fec88b1eb2d14c890c1",
+ "d48f9286da5592e0e38c648296bdd6d6bc5e69f7",
[]
],
"canvas_text_font_001-ref.htm": [
@@ -466880,7 +468405,7 @@
[]
],
"canvas.2d.offscreen.lang-ref.html": [
- "51eff356b8e6fd2742cc4da82ba015383f8f0a1a",
+ "d3a4a4089e0c1f1c36660ddea131b498cbf42b1a",
[]
],
"canvas.2d.offscreen.worker.direction-ref.html": [
@@ -466888,7 +468413,7 @@
[]
],
"canvas.2d.offscreen.worker.lang-ref.html": [
- "35c87f8c69e2ad0983e8838fdcf00b2b13ca9da7",
+ "1c2228a7acc341e1025673df937d0e5ab96ee353",
[]
],
"text-direction-worker-inherit.js": [
@@ -467058,11 +468583,11 @@
[]
],
"canvas-promise-test-worker.js": [
- "f5410efca5b92d3b1272f94a9049027972698996",
+ "2cb50c322f7978c12bbc10faed1d8302ad58d79a",
[]
],
"canvas-promise-test.js": [
- "1b2e2b3a584a1740c01e6911f6e5c72b0a5aafda",
+ "09e01633ace2fc9157ae8b98f47fed3edc7a90d9",
[]
],
"canvas-spec.css": [
@@ -467227,7 +468752,7 @@
[]
],
"text.yaml": [
- "48a0429f267d281927fad8d59dd6a791e6f029ac",
+ "900431860e27fa1c41276cc43bc961ea3da45270",
[]
],
"the-canvas-state.yaml": [
@@ -472012,11 +473537,11 @@
[]
],
"hidden-until-found-005-ref.html": [
- "0ca77849a4696c741333c59ca6ab3d5e17c055ae",
+ "e128e1e71395b138e96ac078b8f4616ebf8c6531",
[]
],
"hidden-until-found-006-ref.html": [
- "e14ba82c278e2c1fc4ecb864871bd6a961c28622",
+ "d8b9761694c396cdab6dfd2b382989c1c3604ab0",
[]
],
"resources": {
@@ -472033,7 +473558,7 @@
[]
],
"container-ref.html": [
- "e2df59014b06c6f44a506b6e4fd7d56537ae5fa4",
+ "53986abdd1fce970445f7310ab4dfafa59b068d9",
[]
],
"hidden-until-found-text-fragment.html": [
@@ -472041,7 +473566,7 @@
[]
],
"spacer-and-container-ref.html": [
- "816a6c9a9d800688217a581e7ec0c2164c1f9ec7",
+ "474da70708383ed52e99549b136adfd4a829d0c6",
[]
]
}
@@ -473246,6 +474771,10 @@
]
},
"the-option-element": {
+ "option-label-whitespace-2-ref.html": [
+ "b0567c2b4e33f48efe31b62620f243b0089f0589",
+ []
+ ],
"option-label-whitespace-ref.html": [
"acb4f9ee2478898eb648c00ea6b9f6ed0e71c7a7",
[]
@@ -479400,7 +480929,7 @@
},
"html-aam": {
"META.yml": [
- "212cae7fa52e95b820d11e7ca8e2eed7d36bf112",
+ "bfca09eadfa361255d89f89bee31af839c3dda0d",
[]
]
},
@@ -480438,6 +481967,12 @@
[]
]
}
+ },
+ "window": {
+ "minimize-1.html.ini": [
+ "2e3ac5190f397acff96227d8b80042b62e1869ae",
+ []
+ ]
}
},
"update_properties.json": [
@@ -481158,7 +482693,7 @@
[]
],
"fedcm.idl": [
- "f7038a6fee1063734193f00341de6ceaf5f792b0",
+ "c26e2b14c73ec27cacc6b9126de125e96d3d93d6",
[]
],
"fenced-frame.idl": [
@@ -481766,7 +483301,7 @@
[]
],
"webaudio.idl": [
- "3b351f4d9e99452f4e81ba401bf283f1c49dd85b",
+ "286aeba40693992ede1cdd233d449fe4f6b59e6c",
[]
],
"webauthn.idl": [
@@ -481822,7 +483357,7 @@
[]
],
"webgpu.idl": [
- "d91a6a710b102d0d9dae24638b2d5e40c8eaa38a",
+ "de1f7c1e52bc401fed112469595f281736213027",
[]
],
"webhid.idl": [
@@ -481922,7 +483457,7 @@
[]
],
"webxr.idl": [
- "dea448d744078292c08e620f4651e5ea5140616e",
+ "1098000d6c2edae1a36f8e6a035f0c53432207c8",
[]
],
"webxrlayers.idl": [
@@ -482239,6 +483774,10 @@
"e11810cc10fa16774924fe8a8080ab5aae161ac7",
[]
],
+ "WEB_FEATURES.yml": [
+ "fbd4cc58df949323199f8832a72592f6e00d8b5f",
+ []
+ ],
"resources": {
"iframe-stores-entry.html": [
"cd600254805570deab8447ea843657d7f268b7c5",
@@ -482331,7 +483870,7 @@
]
},
"lint.ignore": [
- "65e22dccbc1d9cce01a6c570fe739e68d112df3e",
+ "c8b98fb5890027a93dc73bf94023e26bdc4a7211",
[]
],
"loading": {
@@ -484548,7 +486087,7 @@
},
"mediacapture-record": {
"META.yml": [
- "d59e5e30845eaef12bab6419e348a01779313c56",
+ "6a5b5839b61443a25ff642b0d9bb3ce77b9e4427",
[]
],
"support": {
@@ -485103,14 +486642,6 @@
"3516e9555e60a6cb1b038d978eb7b36a8f34d79a",
[]
],
- "commit-behavior": {
- "resources": {
- "after-transition-commit-helpers.js": [
- "2be6a03bac8d6a4526e36d70f1b7a7a9d4badc3b",
- []
- ]
- }
- },
"focus-reset": {
"resources": {
"helpers.mjs": [
@@ -485255,6 +486786,14 @@
]
}
},
+ "precommit-handler": {
+ "resources": {
+ "precommitHandler-helpers.js": [
+ "1338617681feb373a47052a7f605f44d3eca2a16",
+ []
+ ]
+ }
+ },
"state": {
"resources": {
"helpers.js": [
@@ -488958,6 +490497,10 @@
[]
],
"resources": {
+ "child.html": [
+ "4d6895125a2acaad00cc2bc849e026a2632dd88e",
+ []
+ ],
"post_name_on_load.html": [
"4679a6e6ec73ea4c2dae646b0f027dd7f2ce6823",
[]
@@ -490120,7 +491663,7 @@
[]
],
"testdriver.js": [
- "05301bf55895eef71dc7e949871388f8f9cd7a49",
+ "15f3a4b7cc7412ea32c9ff8d337975039c3be2be",
[]
],
"testdriver.js.headers": [
@@ -490279,7 +491822,7 @@
[]
],
"sandboxed-iframe-locking.html": [
- "436c67f5b53b1f88ef1537072be3b0011724d7b3",
+ "f4773535dbc3d21319f8dd7a398ff7731d19a240",
[]
]
}
@@ -490321,6 +491864,22 @@
"adf4bf2ac173e8bff0978fa19b24e535f4229c2e",
[]
],
+ "animation-trigger": {
+ "animation-trigger-fill-mode-both-ref.html": [
+ "62b74fb778f1acb5e481ad8135b9b34a06a69d24",
+ []
+ ],
+ "animation-trigger-fill-mode-none-ref.html": [
+ "229a31dec909a69aad6e7d86d4d009948db2df74",
+ []
+ ],
+ "support": {
+ "support.js": [
+ "f5aa18e82f19f7fa56b2853e2c46b21342b7d970",
+ []
+ ]
+ }
+ },
"css": {
"animation-fill-outside-range-ref.html": [
"998576b3a4f2257006232506ee32306bc716895c",
@@ -493448,7 +495007,7 @@
[]
],
"WEB_FEATURES.yml": [
- "dcb21f387167f46062bc66d2bf5d0f3fc8c58417",
+ "9bdf694256ba93268d6ee24cf249bf4bb25e92f0",
[]
],
"declarative": {
@@ -494739,6 +496298,14 @@
"8cfe09a41fe2ac32e734073329681bb74962eb03",
[]
],
+ "protocol-handler-service-worker.js": [
+ "cb6142db0e3c4b00fecfde154b77f06a3517ef9d",
+ []
+ ],
+ "protocol-handler.html": [
+ "210b23aae21a5ab25d48262b9f0bd31f489a7de8",
+ []
+ ],
"push.https.html": [
"30eb563ab75532d47dfc5706b81686059d19a8a0",
[]
@@ -494815,8 +496382,12 @@
"06688e3bd4cf6e8d251ef694ffba40b8dab95248",
[]
],
+ "shared-storage-worklet.js": [
+ "92a1a7325bb7ac7c169cc1745241d08e5717d5f4",
+ []
+ ],
"shared-storage.https.html": [
- "53edf109698d013e21c001525e00a74e9a3a5350",
+ "408168e4c4c7599eaa81654289b234e16b9de8a5",
[]
],
"shared-worker.py": [
@@ -495127,6 +496698,12 @@
"9ab6e1284ad50d2982ea1f6fc78d7a519e796460",
[]
],
+ "readable-byte-streams": {
+ "WEB_FEATURES.yml": [
+ "a35508fc0dc65d5fcbf785289c5bd05674de7b32",
+ []
+ ]
+ },
"readable-streams": {
"crashtests": {
"empty.js": [
@@ -495158,6 +496735,10 @@
]
},
"transferable": {
+ "WEB_FEATURES.yml": [
+ "4ecacf5edbc7daca0cc2f94e71c3b8daf8ee52d4",
+ []
+ ],
"resources": {
"create-wasm-module.js": [
"37064af95c55c00e27d5f73b8fc3b0603ac63077",
@@ -495266,7 +496847,7 @@
],
"tentative": {
"helper.js": [
- "e5e00ec7b5318d5bbe5c8542458e61b4105c5c93",
+ "c5b7de607470780a4b38a3c557452f6639bb2c38",
[]
]
}
@@ -495365,6 +496946,12 @@
"120941444a4898197d6b6001f9908a6cd48b62ba",
[]
]
+ },
+ "support": {
+ "external-with-data-url.svg": [
+ "e5f707c79809cfcc2eabc3361b291cdae8114ad0",
+ []
+ ]
}
},
"extensibility": {
@@ -496590,7 +498177,7 @@
},
"svg-aam": {
"META.yml": [
- "b0a59c18030bd44644bde1df16b0c08e74ff6abd",
+ "c55d09e15c2ee6917e46e66135c1d977d4128ec3",
[]
]
},
@@ -496793,7 +498380,7 @@
[]
],
"requirements_build.txt": [
- "e74e4e5302de95611631ab3193f8ae38f643f7dc",
+ "60c09170a98e2d16fd3e499962f59b0df8089fd3",
[]
],
"requirements_macos_color_profile.txt": [
@@ -508075,7 +509662,7 @@
[]
],
"chrome.py": [
- "76bc652075eef3e4738ec4b276e1b19bcd55579e",
+ "b3f1fe2af8ff37e2c9b8884a4b897a88bf8ae74d",
[]
],
"chrome_android.py": [
@@ -508103,11 +509690,11 @@
[]
],
"firefox.py": [
- "42311d9f4d6a0c12e5d163f47a0025613e79d1ca",
+ "b4262ace8c9571474b627c62374c0326442946be",
[]
],
"firefox_android.py": [
- "5ad270ef114ff3117eebcc44a06ca63e3d01b9c2",
+ "32a82d7ccc474e7a0d69ef03862dc04cb8dcda84",
[]
],
"headless_shell.py": [
@@ -508175,7 +509762,7 @@
[]
],
"actions.py": [
- "859ce8f4fa604481a029b0af624d4cddaeafd429",
+ "06d58e7e87b6dc9bad8c8eddadcdb2597779b24e",
[]
],
"asyncactions.py": [
@@ -508195,7 +509782,7 @@
[]
],
"executormarionette.py": [
- "ebc4a4a565667d66af7da73332802da72fadf580",
+ "67f11aefa006996ed7a445bf87bfaf30ae4a3a0a",
[]
],
"executorselenium.py": [
@@ -508211,7 +509798,7 @@
[]
],
"executorwebdriver.py": [
- "95667480afe7bd67a54f235428f12a45879bac5a",
+ "d0c1f9e64a416a166b0b5e09377e6a576bc607b8",
[]
],
"executorwktr.py": [
@@ -508227,7 +509814,7 @@
[]
],
"protocol.py": [
- "0940e87cdbdea9b78397a067240553f3034eb0f6",
+ "53a7b4378483e183d10532c50d26be1586a95dbe",
[]
],
"pytestrunner": {
@@ -508342,7 +509929,7 @@
[]
],
"testdriver-extra.js": [
- "9ddbe2e8df53886c5c3c89e5f21b62c5da760a2d",
+ "71c1be2732f3e62f156c2d1017eee8e8111ac254",
[]
],
"testdriver-vendor.js": [
@@ -509069,6 +510656,14 @@
[]
]
},
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-003.html.headers": [
+ "b48df2b0ccc70404c91bc6e0311b62f70db5573d",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-005.html.headers": [
+ "7e28a4dbc8e80bb47e340df23428a51fabd09aaa",
+ []
+ ],
"support": {
"DOMWindowTimers-setTimeout-setInterval-worker.js": [
"a31ababde928db87f7c20e822814a02830954c11",
@@ -509155,7 +510750,7 @@
[]
],
"csp-violations.js": [
- "49649f45cd6e263bff984f0afcb5ecafbbb8a0a5",
+ "46c2ca1b30f33bec538b2245ed8e9a8c1a1b7c6d",
[]
],
"event-handler-attributes.mjs": [
@@ -509202,10 +510797,182 @@
"45053d43e362e223e0ce5e6dffb4da09c0ce3f34",
[]
],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js": [
+ "ff0e26bbc3a9a44c3d79d41714852b5f280d39f1",
+ []
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js.headers": [
+ "b48df2b0ccc70404c91bc6e0311b62f70db5573d",
+ []
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js": [
+ "4979b7fc51ef34fb26a278ca93537e002dd3bd49",
+ []
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js.headers": [
+ "c17d57d19ae4ef9d3e584d10fc39065823cb2f73",
+ []
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-location.js": [
+ "8568b960aa3a7124c37036a9b47b8162b6bce3df",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js": [
+ "59d9711f1225a9ebbe91afe8f0cc12888cf183bc",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js.headers": [
+ "9fa44d4200b670da44b6b98699aeef3a5f5392de",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js": [
+ "fc4773f923809e96bf44b8af4e34c92ee7bd0ceb",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js.headers": [
+ "7e28a4dbc8e80bb47e340df23428a51fabd09aaa",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js": [
+ "74d4429c3949863c209492d093d26e103f165153",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js.headers": [
+ "5edaafc1ff6769a5e1c6a5d7d20e1d79aa44ded9",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js": [
+ "8d0ba3da646a5c8e3cfc5031094b240d865125e4",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js.headers": [
+ "7e28a4dbc8e80bb47e340df23428a51fabd09aaa",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js": [
+ "ed3524005eafdc3d8f9fdfcbc4f0b91008eeabba",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js.headers": [
+ "673b327086267519e887ea7753da73901d757d13",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js": [
+ "d34bd04eaeb4c9256e67391fe9ac22b6899f6caf",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js.headers": [
+ "55cf94e10e624d47acfd0283e8fa35529a1e9185",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js": [
+ "985ee43e833b7e7ac00072e3eb92f51534b8cec6",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js.headers": [
+ "96b79d71c5d506851a6f708b7b67b98e1a9a2813",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js": [
+ "004530def32d301d56235c0b45b420d10656feb2",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js.headers": [
+ "b93b85d4a352ddfb355a4e708e3b4f50111326f9",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-location.js": [
+ "11390a6318497968e40fd9393fa6a6bf9266a163",
+ []
+ ],
+ "trusted-types-reporting-check-report-create-policy-worker.js": [
+ "6bb346e3195f613bc45d806b63496c7c9a0b6903",
+ []
+ ],
+ "trusted-types-reporting-check-report-create-policy-worker.js.sub.headers": [
+ "58beda2418334357fedf554f2dfda27aaff10040",
+ []
+ ],
+ "trusted-types-reporting-check-report-create-policy.js": [
+ "5d96829727b7df77c3d37c2a4f1b56f689c0742e",
+ []
+ ],
+ "trusted-types-reporting-check-report-sink-mismatch-worker.js": [
+ "85910e2e92622c3550e455aa61fde11a31c69a50",
+ []
+ ],
+ "trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers": [
+ "5fcdf6ccbfcc9121834a2b3e04650fd185232a90",
+ []
+ ],
+ "trusted-types-reporting-check-report-sink-mismatch.js": [
+ "96ad9c116b4035c8787fc8bf64b776de5fc28640",
+ []
+ ],
"trusted-types-reporting-for-DOMWindowTimers-setTimeout-setInterval.js": [
"15a18304496c21f074354a8e7e0a7671cceed738",
[]
],
+ "trusted-types-reporting-for-DedicatedWorker-constructor-worker.js": [
+ "e5b09eb3707ef22b96160f7b4143b35f07728118",
+ []
+ ],
+ "trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers": [
+ "54d8b1d4c1285d05cbabf7b35b0facea96284bad",
+ []
+ ],
+ "trusted-types-reporting-for-DedicatedWorker-constructor.js": [
+ "cb5ae4c8e2cd1b2cc20e7e1d9928cc2078106ac7",
+ []
+ ],
+ "trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js": [
+ "cce29cb2f7b946d9aa0171a54b26b541204076c4",
+ []
+ ],
+ "trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers": [
+ "54d8b1d4c1285d05cbabf7b35b0facea96284bad",
+ []
+ ],
+ "trusted-types-reporting-for-ServiceWorkerContainer-register.https.js": [
+ "f59799d4776d33534d610c2fc6e83bf7c9a1deb1",
+ []
+ ],
+ "trusted-types-reporting-for-SharedWorker-constructor.js": [
+ "a65731a2f9c5e569e2653d46ca0740dda7c31c15",
+ []
+ ],
+ "trusted-types-reporting-for-eval-worker.js": [
+ "2a4780dcbaddfc8cab4dc2e3d895db94ba7f4edf",
+ []
+ ],
+ "trusted-types-reporting-for-eval-worker.js.headers": [
+ "54d8b1d4c1285d05cbabf7b35b0facea96284bad",
+ []
+ ],
+ "trusted-types-reporting-for-eval.js": [
+ "0f8120a7a1fb901b0e7836a1ba04b644228e9a28",
+ []
+ ],
+ "trusted-types-reporting-for-function-constructor-worker.js": [
+ "ce73b9136897416dfef0d229bd5c87ceea1e5305",
+ []
+ ],
+ "trusted-types-reporting-for-function-constructor-worker.js.headers": [
+ "54d8b1d4c1285d05cbabf7b35b0facea96284bad",
+ []
+ ],
+ "trusted-types-reporting-for-function-constructor.js": [
+ "51d04b661f4e4a0d3ad11ea90a9bb09a624a1183",
+ []
+ ],
+ "trusted-types-reporting-for-importScripts.js": [
+ "c03c29a4e9ed19c14c2962aad60b70cc8bc08267",
+ []
+ ],
+ "trusted-types-reporting-for-importScripts.js.headers": [
+ "54d8b1d4c1285d05cbabf7b35b0facea96284bad",
+ []
+ ],
"trusted-types-reporting-for-setTimeout-setInterval-worker.js": [
"7c65802c9ef09696f0f74fa386629948847c1783",
[]
@@ -509214,6 +510981,14 @@
"54d8b1d4c1285d05cbabf7b35b0facea96284bad",
[]
],
+ "trusted-types-sandbox-no-allow-scripts.html": [
+ "11967a4d97f80d0ce5344cb2dc309070c2ab57da",
+ []
+ ],
+ "trusted-types-sandbox-no-allow-scripts.html.headers": [
+ "da0823c6bc5d9682dd643ee9d6a64b4f3be47bae",
+ []
+ ],
"worker.https.js": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
@@ -509227,28 +511002,28 @@
"b6608515aa85a08dbb56531c46c097e179c76200",
[]
],
- "trusted-types-eval-reporting-no-unsafe-eval.html.headers": [
- "72cebc03552da9db7a51cf88a4f709f950d5b5c9",
- []
- ],
"trusted-types-eval-reporting-report-only.html.headers": [
"9ab275fe6f1d4988717f004be774f84374df276f",
[]
],
- "trusted-types-eval-reporting.html.headers": [
- "1e57f8bf5851bc42b282a554e4d5211281850f8d",
+ "trusted-types-report-only.html.headers": [
+ "096c0b401953f847a278792d810402e6ccc633c7",
[]
],
- "trusted-types-report-only.html.headers": [
- "602186027d0d759b9cc224f29de584bb9c71c198",
+ "trusted-types-reporting-check-report-Window-create-policy.html.sub.headers": [
+ "4653c9d7031864065b600f460dd604de64886f7e",
[]
],
- "trusted-types-reporting-check-report.html.sub.headers": [
- "c055bdc6563685adabeffb8141a83376a0cea1f2",
+ "trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers": [
+ "62a0c13f0a38df5b092cdab116f4fdc556a126ec",
[]
],
"trusted-types-reporting.html.headers": [
- "7076f4106f73488aad64064213fda18b4c43392b",
+ "5809a919913781a50db9612d0173e529eac7a826",
+ []
+ ],
+ "trusted-types-sandbox-allow-scripts.html.headers": [
+ "6bd66164613016269ebcee6416ed41cdf312a42a",
[]
]
},
@@ -509945,7 +511720,7 @@
[]
],
"urlpatterntestdata.json": [
- "f92ab76b71df5ab42b729ebe366e381bd9e939af",
+ "a613b6a74b5a900e51185f63bfe597e38f8557b6",
[]
],
"urlpatterntests.js": [
@@ -511128,7 +512903,7 @@
"animation-model": {
"animation-types": {
"property-list.js": [
- "f31ee8e4ccf05471e94417971da6ca31b288719e",
+ "9cfd90d17f2e95986cd3db5999447faef9a64df6",
[]
],
"property-types.js": [
@@ -512512,7 +514287,7 @@
[]
],
"video-encoder-utils.js": [
- "916f995156e51d7fed083d9ab175cc44d974dc6b",
+ "5c8d17e5bfe65ff382cc8ae617350873f7cabd4d",
[]
],
"videoDecoder-codec-specific-setup.js": [
@@ -512568,7 +514343,7 @@
[]
],
"__init__.py": [
- "8e45c0f72651ed7b825458682fc04bc2e1a7be5a",
+ "b0562d22b56d0656b76d0641f6628c57dfa47a35",
[]
],
"browser": {
@@ -512603,7 +514378,7 @@
},
"browsing_context": {
"__init__.py": [
- "606ac071ed7b1def5316d84a5c29ca00d7187da5",
+ "8987e12a967162cfad502cf81429e4e4d74c3023",
[]
],
"activate": {
@@ -512648,6 +514423,12 @@
[]
]
},
+ "download_will_begin": {
+ "__init__.py": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ []
+ ]
+ },
"fragment_navigated": {
"__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
@@ -512885,7 +514666,7 @@
},
"network": {
"__init__.py": [
- "840b8086d1373852dad9c2468736b98a76044b49",
+ "46146d52eb9cd986d8712aac7965e6a19ce4dbd6",
[]
],
"add_intercept": {
@@ -513682,7 +515463,7 @@
[]
],
"fixtures.py": [
- "a8f1f2959d4acb02776fc7cc2440fc00f408f50c",
+ "21dbfcc25bcf33e7933f32e657d7b731fc15da99",
[]
],
"fixtures_bidi.py": [
@@ -513694,7 +515475,7 @@
[]
],
"helpers.py": [
- "8baa895adf2ebace57f8b37ba444be66aaf4eb0b",
+ "0bd27a39acd5d8c2b6bba106bc24e17f4945a8d2",
[]
],
"html": {
@@ -514085,7 +515866,7 @@
},
"resources": {
"utils.js": [
- "7cecf29061fe35408b0875ba3cf2638ea5eb0605",
+ "f5802aa11375a28e54ff693057b4f9c15112fe7f",
[]
],
"utils_validation.js": [
@@ -514255,6 +516036,10 @@
"06fa607635a68aa0e866cbb83b47dc0b0ddf6f86",
[]
],
+ "WEB_FEATURES.yml": [
+ "0df5a2c40ef70132caa3ee324837f3d5fd4496f9",
+ []
+ ],
"helper.js": [
"d4cec39ffce0f58b76da653c78dc384f22ffa43d",
[]
@@ -518785,7 +520570,7 @@
[]
],
"redirect.py": [
- "3839b635e022a347a7877e9022d9820d55831588",
+ "e2786b45031b3d6493eeff9bbe8d7eaf7a46c566",
[]
],
"requri.py": [
@@ -545049,7 +546834,7 @@
"ai": {
"language_detection": {
"detector.https.tentative.any.js": [
- "337f11d338d495a46a6926308970768f99ac2526",
+ "d54d0110be05b65c4f97270e53f797bdcff3f50a",
[
"ai/language_detection/detector.https.tentative.any.html",
{
@@ -545129,10 +546914,10 @@
]
},
"translator": {
- "ai_translator_bad_input.tentative.https.any.js": [
- "980d3c0f6976d5710d42ec55a37abe8d2a5248fb",
+ "translator_bad_input.tentative.https.any.js": [
+ "2879543f29a1239e912b52ed4833db9de4ff5021",
[
- "ai/translator/ai_translator_bad_input.tentative.https.any.html",
+ "ai/translator/translator_bad_input.tentative.https.any.html",
{
"script_metadata": [
[
@@ -545152,7 +546937,7 @@
}
],
[
- "ai/translator/ai_translator_bad_input.tentative.https.any.serviceworker.html",
+ "ai/translator/translator_bad_input.tentative.https.any.serviceworker.html",
{
"script_metadata": [
[
@@ -545172,7 +546957,7 @@
}
],
[
- "ai/translator/ai_translator_bad_input.tentative.https.any.sharedworker.html",
+ "ai/translator/translator_bad_input.tentative.https.any.sharedworker.html",
{
"script_metadata": [
[
@@ -545192,7 +546977,7 @@
}
],
[
- "ai/translator/ai_translator_bad_input.tentative.https.any.worker.html",
+ "ai/translator/translator_bad_input.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -545212,10 +546997,10 @@
}
]
],
- "ai_translator_translate.tentative.https.any.js": [
- "729cb04fb76e94d9bf8eb40e463b840931b0e3a7",
+ "translator_translate.tentative.https.any.js": [
+ "5a800c00c696ca3565b3de3bf60f407b1f4ca05c",
[
- "ai/translator/ai_translator_translate.tentative.https.any.html",
+ "ai/translator/translator_translate.tentative.https.any.html",
{
"script_metadata": [
[
@@ -553109,8 +554894,8 @@
]
},
"clear-site-data": {
- "clear-cache-partitioning.sub.https.html": [
- "b3841450b5a3fcfbe79857cebd7da8855754597a",
+ "clear-cache-partitioning.https.html": [
+ "2deadeef2d0853d08a559a9af8050646fb8e3163",
[
null,
{
@@ -553119,7 +554904,7 @@
]
],
"clear-cache.https.html": [
- "e356001d0c89e39273e3070dec43e3a66cd44171",
+ "c75c2e16becf994dccfc7d05aa6147ba1022d72b",
[
null,
{
@@ -559564,6 +561349,73 @@
]
]
},
+ "container-timing": {
+ "tentative": {
+ "containertiming-body-with-child-img.html": [
+ "53e9bc550745067be9a573ed5505063438a075e3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "containertiming-img-itself.html": [
+ "6d55532a419bbdc6f8c353298b4b74bc738c7d87",
+ [
+ null,
+ {}
+ ]
+ ],
+ "containertiming-observe-no-paint.html": [
+ "f2384248255283e48bf5b5263dc0eaee1c7b259a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "containertiming-text-itself.html": [
+ "bead4d1724b10b8d664eec62222bbcfc41da2d17",
+ [
+ null,
+ {}
+ ]
+ ],
+ "containertiming-two-overlapping-imgs.html": [
+ "1a36c6f253211c3838b2586feff6660b6b53a379",
+ [
+ null,
+ {}
+ ]
+ ],
+ "containertiming-with-child-img.html": [
+ "03f0e113902d0d4117a38870dfd22defe99c4653",
+ [
+ null,
+ {}
+ ]
+ ],
+ "containertiming-with-child-text.html": [
+ "1efc189c34e42eb616f56f4e0c259e5be55a079c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "img-not-child-of-container-timing.html": [
+ "751342a7ceb1eaa2a98d1c07dc4000c34d14e4fd",
+ [
+ null,
+ {}
+ ]
+ ],
+ "nested-containertiming-child-img.html": [
+ "3f830fe786307c5d8400544911f27eaf9fb39df7",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
+ },
"content-dpr": {
"image-with-dpr-header.html": [
"bfa1509d46455945acb9b31d6789726b2f860c84",
@@ -566437,8 +568289,26 @@
]
},
"cookie-store": {
+ "change_eventhandler_for_already_expired.https.window.js": [
+ "89d84b13d1b53ec4d424b363ace9b26ed9685685",
+ [
+ "cookie-store/change_eventhandler_for_already_expired.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Cookie Store API: Test that setting an already-expired cookie does not trigger an event."
+ ],
+ [
+ "script",
+ "resources/cookie-test-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
"change_eventhandler_for_document_cookie.https.window.js": [
- "0a8b1bd21efc9b0ac69468ad81c306757e5b18ff",
+ "82b0f2baa2bb72f51d944e2138ad56f7a170ba7a",
[
"cookie-store/change_eventhandler_for_document_cookie.https.window.html",
{
@@ -566456,7 +568326,7 @@
]
],
"change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js": [
- "2028df5b4bf4611f565e223579b6673a0d368483",
+ "8f5ef1cabbe7a742115ba81328e40ee789496edd",
[
"cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.html",
{
@@ -567436,7 +569306,7 @@
]
],
"serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.js": [
- "cd0657c0bcdf5fc5a2133fb0598778aa237c384c",
+ "ef7cadf4c9e6553192c84610dd1d1692dd7248f6",
[
"cookie-store/serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.serviceworker.html",
{
@@ -567454,7 +569324,7 @@
]
],
"serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js": [
- "1f433aeb9476983cabccead67032ddb88d3ebc32",
+ "f8b1c1b7aa96f13ec40df6dfdfef2c605c447468",
[
"cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.serviceworker.html",
{
@@ -568152,10 +570022,11 @@
]
],
"third-party-cookies.tentative.https.html": [
- "018849c82791b1702a9a938bc119b737de99e59d",
+ "decf64192817b46b012442b11ef1d8a8ecbd0081",
[
null,
{
+ "testdriver": true,
"timeout": "long"
}
]
@@ -570785,14 +572656,14 @@
]
],
"anchor-center-htb-htb.html": [
- "50fc09061073a7bcd16d9669b3fd6ad85234e783",
+ "88e01619cafad8a51e5dcea6bbb565e8cdae14e2",
[
null,
{}
]
],
"anchor-center-htb-vrl.html": [
- "eba72d649133da882a9fa095f0433f426b54bf8e",
+ "f777a2caf8803f77283d9fe667ca29c7ecdf4fa0",
[
null,
{}
@@ -570806,14 +572677,14 @@
]
],
"anchor-center-vrl-htb.html": [
- "8f7af0414edd4eb606e7be3437f81468696522b9",
+ "595f7ea1ecdc6fb52e86624fa6dccc7861563aa7",
[
null,
{}
]
],
"anchor-center-vrl-vrl.html": [
- "d8e90057dc3372c5ccca659132e708c678678a56",
+ "e22391a8192e1c0909a7983b08c450f9bff219e3",
[
null,
{}
@@ -571043,6 +572914,13 @@
{}
]
],
+ "anchor-position-flip-sibling-index.html": [
+ "5fa17dc057a62d7b07c83c8203c30cab8bb668ff",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-position-grid-001.html": [
"92fb4d275b8988641ed0736969e918703e4d649d",
[
@@ -571155,6 +573033,13 @@
{}
]
],
+ "anchor-position-sibling-index.html": [
+ "ade6b4a0e01469119d451082ff31f4743e2cb245",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-position-top-layer-007.html": [
"944911f70085b9412e2865a90d52889cc6d37cc0",
[
@@ -571699,21 +573584,21 @@
]
],
"position-area-anchor-outside.html": [
- "d8fb5dbc98fa90513e339487b6e8284ca2db92bc",
+ "9b0c74170aa0f44821b28c7899011128c18c896e",
[
null,
{}
]
],
"position-area-anchor-partially-outside.html": [
- "e23cea474787b1f613a87fdddf306aec40fb93b1",
+ "3dd537d26e09fb43bbf0fd3cd3dd30efd8b55e94",
[
null,
{}
]
],
"position-area-basic.html": [
- "6cbaf8e50145b19a3e761f91abb7adcdb30d400d",
+ "2a568cc80281489fb54da4c48e55400d816718ab",
[
null,
{}
@@ -572227,6 +574112,13 @@
{}
]
],
+ "animate-with-background-color-oklch-002.html": [
+ "ee6847c11bf1257c59bdcf5b53a61245403d7cfa",
+ [
+ null,
+ {}
+ ]
+ ],
"animate-with-color-mix.html": [
"0b6d9bb4ab3ae911e7291e1da5e2259c0afbd0fc",
[
@@ -575833,7 +577725,7 @@
]
],
"color-computed-relative-color.html": [
- "23ee07d177ac525c2ce2b4e60cd1861a33cc23c5",
+ "9bb87459623ac3c50b2154432269adef114fe811",
[
null,
{}
@@ -577422,6 +579314,13 @@
{}
]
],
+ "CSS-supports-details-content-pseudo-parsing.html": [
+ "67a46fe82a2ffaa4d5a9bd0729831c6e4415ab54",
+ [
+ null,
+ {}
+ ]
+ ],
"CSS-supports-selector-detecting-invalid-in-logical-combinations.html": [
"3adcd7ae2e62bd76130b3ecf2b903e1401b23c77",
[
@@ -577904,7 +579803,7 @@
]
],
"content-visibility-auto-text-fragment.html": [
- "d5184d72a4ebc9192c1d15a4334fe603048e91b8",
+ "923c5af04f438a690a1048b6729fe51abc7a2932",
[
null,
{
@@ -579667,6 +581566,13 @@
{}
]
],
+ "flex-shorthand-calc.html": [
+ "6498988dd53b3e6f7e48f643094551121fdc28f4",
+ [
+ null,
+ {}
+ ]
+ ],
"flex-shorthand-flex-basis-middle.html": [
"284aac275b87b59a2703e3aaaf78e2369d77a95a",
[
@@ -580674,7 +582580,7 @@
]
],
"flex-computed.html": [
- "ea1f4f6fa4568e8a3b4913aea52d89d5ec1e1870",
+ "074d0f7395c1ce53fb37e2875d389ddf8c352c7e",
[
null,
{}
@@ -580751,7 +582657,7 @@
]
],
"flex-invalid.html": [
- "ae010d7b4b4540f6591c1ad42f1c89753a71afc6",
+ "d47f8b6793074c5aa27881eaf58809e69a76812d",
[
null,
{}
@@ -580786,7 +582692,7 @@
]
],
"flex-valid.html": [
- "f3eaf118da61d2eb9cd6f30e7f703a0de8053305",
+ "4c57fe4e25361f9223fade0794bb3a1869c89caa",
[
null,
{}
@@ -580842,6 +582748,13 @@
]
]
},
+ "percent-height-flex-items-cross-sizes-with-mutations.html": [
+ "87f20000f1f2e1718e31dddb9c92d0edf10b6cb3",
+ [
+ null,
+ {}
+ ]
+ ],
"percentage-heights-000.html": [
"cf501031448c8d3d020061d29a2c7e6991deea92",
[
@@ -581400,6 +583313,13 @@
{}
]
],
+ "font-variation-settings-calc.html": [
+ "e3f5178952e0df7aa8f6f185edc6148144975a9d",
+ [
+ null,
+ {}
+ ]
+ ],
"font-variation-settings-serialization-001.html": [
"88764fd652f453f2def184a26f922783aa6d0121",
[
@@ -585626,7 +587546,7 @@
],
"parsing": {
"masonry-parsing.html": [
- "2204c06f72b8bd15c9662def13c3d89fb64048b4",
+ "64af83b316c912fcc4eeac9a13f52ed089d0f358",
[
null,
{}
@@ -585637,7 +587557,7 @@
},
"parsing": {
"grid-area-computed.html": [
- "d1ae78c7023c9cbd9ea4040e63692c24b1323a74",
+ "9b31e2b23c6fbe99bc712a116a57e0384a5396e0",
[
null,
{}
@@ -589259,6 +591179,33 @@
}
]
],
+ "column-scroll-marker-focus-002.html": [
+ "cd26b8aca85fe6d4e9ac643f4675d8ca1a3b83bd",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "column-scroll-marker-focus-003.html": [
+ "bb3868066e3d19a54c8701797b1cb73fba4dfd88",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "column-scroll-marker-focus-004.html": [
+ "fa6adbb15d00b795c5607f52d80924197204fccb",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"column-updates-computed-style.html": [
"d741b8cf915a189e13a7f7c2738bb2880aa4e852",
[
@@ -589596,6 +591543,15 @@
}
]
],
+ "root-scroll-marker-activation-and-scroll-tracking.html": [
+ "524e5399022a106133491edd9b926550439c7961",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"scroll-button-activation-content-hit-test.html": [
"26702bb65f8f3ee190acfb1b313ca663c7374f7d",
[
@@ -589675,6 +591631,13 @@
}
]
],
+ "scroll-marker-15.html": [
+ "764e56b55436ad461df39ec44e25d660c1d99bc6",
+ [
+ null,
+ {}
+ ]
+ ],
"scroll-marker-activation-retains-focus.html": [
"cf38ed354c73d3c5840258f87912a76c50ccebed",
[
@@ -590122,7 +592085,7 @@
]
],
"overscroll-behavior-root.html": [
- "18c172b40a13b5bac3bcfeb08f23d59fd94ee17e",
+ "a116ead01b71db7b72bfd483b10b35b2e83ea1b8",
[
null,
{
@@ -591792,6 +593755,15 @@
{}
]
],
+ "focus-visible-originating-element.html": [
+ "05fc82324917c49ce3fab8e667dd3a9df51825d8",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"highlight-cascade": {
"highlight-cascade-007.html": [
"df79d8dff51ae23a75a7a4ef593f673ea596f36d",
@@ -593151,7 +595123,7 @@
]
],
"snap-area-overflow-boundary-viewport-covering.tentative.html": [
- "1c6caf224acf4ffa75d7d85013239dc0fa861cf2",
+ "5c03c049a010faf6e76efb9c68bbb0c4428e31d3",
[
null,
{
@@ -593681,7 +595653,7 @@
]
],
"scroll-start-overflow-toggled.tentative.html": [
- "8829519024a3ce7e98e8bb1321c6f3f1509c40cd",
+ "8c0f2a45177eafd01816d2d8ab9a95cd6392c4e8",
[
null,
{}
@@ -593973,6 +595945,13 @@
{}
]
],
+ "resnap-on-oveflow-hidden-container.html": [
+ "41e454b2789cb90f1c72edf9f3dab8b3960b400d",
+ [
+ null,
+ {}
+ ]
+ ],
"resnap-on-reconstructing-frame.html": [
"d046608815aff119e443a17594a4947bea2ce587",
[
@@ -595737,7 +597716,7 @@
],
"parsing": {
"text-size-adjust-computed.html": [
- "2d80b86172364343b785129b239e66a7b6b2e53e",
+ "5646f149d80810af473173690dbee590a58c6a53",
[
null,
{}
@@ -595751,7 +597730,7 @@
]
],
"text-size-adjust-valid.html": [
- "bd58ae5f699790fe90cc125fef75cd8fcc52f2bd",
+ "a9835da3ab42d420df5959cd122544e0d5463fe9",
[
null,
{}
@@ -596141,7 +598120,7 @@
]
],
"contain-intrinsic-size-028.html": [
- "15e8e0e89108b112bc113d6090946307379f53e7",
+ "da31a1efeadea5bf6f32b6aee6ec9e452a30917c",
[
null,
{}
@@ -596183,7 +598162,7 @@
]
],
"contain-intrinsic-size-logical-003.html": [
- "48fedb11483342fd6f6fd580bab4f16b0b0fa334",
+ "9ee60268d60482ddbfe4c7263d2ce7b85e3c3c55",
[
null,
{}
@@ -601905,7 +603884,7 @@
]
],
"transition-timing-function-computed.html": [
- "cb110549d0b072311d6f00e23bb5452170b0f43c",
+ "3bf1e818e7769c8f4f048f53fc1f4a2220d78441",
[
null,
{}
@@ -601919,7 +603898,7 @@
]
],
"transition-timing-function-valid.html": [
- "658ef76bbe84d47864570be49726d36e75b1b555",
+ "5c7214e4041dcec617dc83ebca2c99c6b9bcd302",
[
null,
{}
@@ -602932,7 +604911,7 @@
},
"inline": {
"append.tentative.html": [
- "f80875622366939f48a7471513fb6319f75be718",
+ "fa23071c4f22468fd46015b9767c91d6ef81e232",
[
null,
{}
@@ -603388,6 +605367,13 @@
{}
]
],
+ "column-height.html": [
+ "f9986221f4886a756584258e8e3d4ad01c39c81c",
+ [
+ null,
+ {}
+ ]
+ ],
"column-rule-color.html": [
"3d35b856d71f2de9c87e83aa1ace57b3b4d8cf5d",
[
@@ -604889,6 +606875,13 @@
{}
]
],
+ "cursor-calc-hotspot.html": [
+ "84f9ca35b79878972d61e132857640a9f5e86fa7",
+ [
+ null,
+ {}
+ ]
+ ],
"historical": {
"moz-user-modify-01.html": [
"595df9440e523fc371cf55975e4042d569163136",
@@ -605576,6 +607569,13 @@
{}
]
],
+ "calc-complex-unresolved-serialize.html": [
+ "64bccd216abe357a3594d27f1b016d473c44f7a0",
+ [
+ null,
+ {}
+ ]
+ ],
"calc-in-color-001.html": [
"7db087def7552af2662524e26813aa51daae0cb1",
[
@@ -606089,7 +608089,7 @@
]
],
"hypot-pow-sqrt-invalid.html": [
- "edecfceb13afe79ad0b13b6b5d29a9924f5fad9b",
+ "3e29889588399a53ddb7b1dbce84a9f2c0c36f7c",
[
null,
{}
@@ -606109,7 +608109,7 @@
{}
]
],
- "if-cycle.tentative.html": [
+ "if-cycle.html": [
"74d56dc9ed7c382ee8427feaefacc2198b94216f",
[
null,
@@ -606361,21 +608361,21 @@
{}
]
],
- "progress-computed.tentative.html": [
+ "progress-computed.html": [
"8eb4e2b6757e2559b76c6a641dca40f1df32e0b7",
[
null,
{}
]
],
- "progress-invalid.tentative.html": [
+ "progress-invalid.html": [
"f135487e1c4dd0cef9d99652c7c10a8ebe44070a",
[
null,
{}
]
],
- "progress-serialize.tentative.html": [
+ "progress-serialize.html": [
"49c3a3c3d56596d529ee40df71373dca1290b16b",
[
null,
@@ -607281,7 +609281,7 @@
]
],
"pageswap-in-hidden-doc-should-skip-transition.html": [
- "aceced0dded84f88782356a99d96fec5febd40c3",
+ "2fddb7e17a4c7bdd006a255cb8e7d713c2c29660",
[
null,
{
@@ -607766,6 +609766,13 @@
{}
]
],
+ "zoom-iframe-dynamic.html": [
+ "1836408fb33f4111be2e1f8e389defa7741cd5ca",
+ [
+ null,
+ {}
+ ]
+ ],
"zoom-with-sign-function.html": [
"d3df186199bc8b4e28f7becdad555210d063a225",
[
@@ -610823,8 +612830,26 @@
{}
]
],
- "visual-scrollIntoView.html": [
- "78a3203c58587b6cf9d78faa607105dc8751179d",
+ "visual-scrollIntoView-001.html": [
+ "825556be9691c2438be783df203e54d6b1c8d189",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "visual-scrollIntoView-002.html": [
+ "7f9170654e3220807b7980bfb9c2e16c1821ce7b",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "visual-scrollIntoView-003.html": [
+ "c0592098a90e7550781242a042c810d655b4c356",
[
null,
{
@@ -611104,7 +613129,7 @@
]
],
"flood-opacity-computed.svg": [
- "a395eda22e377757afc1583016e8d14da13268cc",
+ "9024aaa4f3f2ba3b08d4eb65933553db44e5ed3f",
[
null,
{}
@@ -611118,7 +613143,7 @@
]
],
"flood-opacity-valid.svg": [
- "67eb37fad5ec15e01f9f54ea016e74606dec9f03",
+ "7c11b26bc9226c2a9ba83d50fe488a9642f72974",
[
null,
{}
@@ -615017,6 +617042,13 @@
{}
]
],
+ "fetch-no-credentials.https.html": [
+ "4cac685727ad29cd96be041753623cbc4fdd1be6",
+ [
+ null,
+ {}
+ ]
+ ],
"include-site.https.html": [
"6eaf522c73ba6d6378c60f8460fb3497cd8df424",
[
@@ -617220,9 +619252,37 @@
]
],
"scrollend-event-fired-for-scrollIntoView.html": [
- "40aa77f4764b6c4301b8aba7221e1e42e768505d",
+ "e3e63f2820158623851bc83ec6b49d6da9adc0c2",
[
- null,
+ "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=nested-scrollIntoView",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=root-inline-end-block-end-behavior-auto",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=root-inline-start-block-start-behavior-smooth",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=subframe-inline-end-block-end-behavior-auto",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html?include=subframe-inline-start-block-start-behavior-smooth",
{
"testdriver": true,
"timeout": "long"
@@ -619583,6 +621643,13 @@
{}
]
],
+ "focus-preserve.html": [
+ "a00e8b77880697a51d4418fc15637b1dcef6914b",
+ [
+ null,
+ {}
+ ]
+ ],
"focus-within.html": [
"18d8c93b9982dd96a14c5548257292ad7b76c315",
[
@@ -619747,15 +621814,6 @@
{}
]
],
- "tentative": {
- "focus-preserve.html": [
- "a00e8b77880697a51d4418fc15637b1dcef6914b",
- [
- null,
- {}
- ]
- ]
- },
"throws-exception.html": [
"34123c72dfd1bf8617f716cf755bd4d9e34e0272",
[
@@ -621006,7 +623064,7 @@
},
"ecmascript": {
"locale-compat.html": [
- "74806987879e74befd087489285b6610d8107089",
+ "1f863b21ecb3b74287f9f5464303dec45c116c16",
[
null,
{}
@@ -625745,6 +627803,33 @@
}
]
],
+ "delete-word-around-span.html": [
+ "6250e9aec21620334d0d74e6d7642a21480ec0a1",
+ [
+ "editing/whitespaces/delete-word-around-span.html?white-space=normal",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "editing/whitespaces/delete-word-around-span.html?white-space=pre",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "editing/whitespaces/delete-word-around-span.html?white-space=pre-line",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "editing/whitespaces/delete-word-around-span.html?white-space=pre-wrap",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"forwarddelete-chars-following-collapsible-white-space.html": [
"2bf42ed18e521cfd0916307e14a3db98d6b2c439",
[
@@ -625755,6 +627840,33 @@
}
]
],
+ "forwarddelete-word-around-span.html": [
+ "ac7cbaee18654d43a657beb568bf0bd5ea426b69",
+ [
+ "editing/whitespaces/forwarddelete-word-around-span.html?white-space=normal",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "editing/whitespaces/forwarddelete-word-around-span.html?white-space=pre",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "editing/whitespaces/forwarddelete-word-around-span.html?white-space=pre-line",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "editing/whitespaces/forwarddelete-word-around-span.html?white-space=pre-wrap",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"inserttext-at-end-of-block-when-br-always-block.html": [
"922b8bd1c86230c1284fc0f14ce2031ab345c1ee",
[
@@ -638446,20 +640558,6 @@
{}
]
],
- "clearkey-mp4-playback-persistent-usage-record-events.https.html": [
- "11b3e8f15ce9450bc46a4ca9c4f81fb8a01a16ac",
- [
- null,
- {}
- ]
- ],
- "clearkey-mp4-playback-persistent-usage-record.https.html": [
- "3f0d55e413861d48cce462d1715b2b6cfca647b3",
- [
- null,
- {}
- ]
- ],
"clearkey-mp4-playback-retrieve-destroy-persistent-license.https.html": [
"c8838d2b7dc5f09553df38d01368d3db3927f5c3",
[
@@ -638474,13 +640572,6 @@
{}
]
],
- "clearkey-mp4-playback-retrieve-persistent-usage-record.https.html": [
- "63e792c2987558a83b81e59620f1bff4e8b159d9",
- [
- null,
- {}
- ]
- ],
"clearkey-mp4-playback-temporary-clear-encrypted-segmented.https.html": [
"e402688aacfcd47945278ffc65d721e21361285d",
[
@@ -638834,24 +640925,6 @@
}
]
],
- "drm-mp4-playback-persistent-usage-record-events.https.html": [
- "5cbb8021b0782eba074b8e04591c523f03a7891d",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "drm-mp4-playback-persistent-usage-record.https.html": [
- "69876be989278caf422c2db047b66bc1c9f4fdcb",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
"drm-mp4-playback-retrieve-destroy-persistent-license.https.html": [
"9bba71f89aa7047dafcdae9c15d9cd827d355c37",
[
@@ -638870,15 +640943,6 @@
}
]
],
- "drm-mp4-playback-retrieve-persistent-usage-record.https.html": [
- "4059bff0cfc551b2b1e39c0209121f8d10769f96",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
"drm-mp4-playback-temporary-clear-encrypted.https.html": [
"6b6e1ce62169fc246de6991f3c75010ff22fb657",
[
@@ -639555,7 +641619,7 @@
]
],
"interactionid-keyboard-event-simulated-click-button-space.html": [
- "d3ab5437f8e533a32fad8d327e5e1dd58d210574",
+ "b7a7675f3244835a4074827868f5a1423c1f0b24",
[
null,
{
@@ -639564,7 +641628,7 @@
]
],
"interactionid-keyboard-event-simulated-click-checkbox-space.html": [
- "3dd8e21e784d7d8970e2fdfba4d4e146ce32f968",
+ "e2582259e1557106cfa587ab7d12465773561519",
[
null,
{
@@ -639573,7 +641637,7 @@
]
],
"interactionid-keyboard-event-simulated-click-link-enter.html": [
- "6945d2ff771976ea1a17ba66f427e51d840268d5",
+ "9e1f4ee3761d2f7808ccb7221e426af7ab240a4a",
[
null,
{
@@ -659033,7 +661097,7 @@
"fledge": {
"tentative": {
"abort.https.window.js": [
- "db6aae4604575fd0f096efeec45c86fe94e11e3d",
+ "e4a3189a30c823b9c7135c1733b0021ea8728684",
[
"fledge/tentative/abort.https.window.html",
{
@@ -659064,7 +661128,7 @@
]
],
"additional-bids.https.window.js": [
- "edacb05512e968fb98668a4b40ec92c68c9a1410",
+ "384a9e620307bd05ba4594bb4494fd3382126333",
[
"fledge/tentative/additional-bids.https.window.html?1-last",
{
@@ -659103,7 +661167,7 @@
]
],
"auction-config-passed-to-worklets.https.window.js": [
- "dec49b80a96967e86d318f9e31995c1786e95654",
+ "1fb59972b58768227e3e1e2e272ee3e8969d86dd",
[
"fledge/tentative/auction-config-passed-to-worklets.https.window.html?1-5",
{
@@ -659526,7 +661590,7 @@
]
],
"auction-config.https.window.js": [
- "50b9cb9e9e6b071604522268fc1113a7f1a8a662",
+ "e32d8b31773295aa498db9109f20128109def8da",
[
"fledge/tentative/auction-config.https.window.html?1-5",
{
@@ -660761,7 +662825,7 @@
]
],
"clear-origin-joined-ad-interest-groups.https.window.js": [
- "097978a7858523c759a70ac9843baec8eee65dc4",
+ "9f0818da2c4b1600d9c1f3ba7668c2e434f14cbe",
[
"fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.html?1-4",
{
@@ -661346,7 +663410,7 @@
]
],
"cross-origin.https.window.js": [
- "9669f2790bcfa492a5419c9f7f16d39b12da0f2c",
+ "6c95f74c1f597332e2b74d9c5dd18f7808d34124",
[
"fledge/tentative/cross-origin.https.window.html?1-4",
{
@@ -661541,7 +663605,7 @@
]
],
"currency.https.window.js": [
- "f1b2bba87340340fdf04b5d4c065fe06707f53a1",
+ "b65dea5820ab69aad19839281dcda54ea7d0b1d1",
[
"fledge/tentative/currency.https.window.html?1-4",
{
@@ -662156,7 +664220,7 @@
]
],
"deprecated-render-url-replacements.https.window.js": [
- "75377ca7aa348486fad8ed589e7d947f2dcb3b64",
+ "51daaf277975043f065c39fc2dfc043c5301af8d",
[
"fledge/tentative/deprecated-render-url-replacements.https.window.html?1-5",
{
@@ -662351,7 +664415,7 @@
]
],
"direct-from-seller-signals.https.window.js": [
- "3f58b2c8ad541da98b1345bc7db3994d8ed5340e",
+ "a4e6911491d2c7b1f5df6f190139d0d7a15752e8",
[
"fledge/tentative/direct-from-seller-signals.https.window.html?1-4",
{
@@ -662980,7 +665044,7 @@
]
],
"generate-bid-browser-signals.https.window.js": [
- "00c4bfdcc315c02211792888b0e377302df2e36d",
+ "e472fccdc4da37c1a2cebb80921809cab5788b54",
[
"fledge/tentative/generate-bid-browser-signals.https.window.html?1-4",
{
@@ -663495,7 +665559,7 @@
]
],
"get-interest-group-auction-data.https.window.js": [
- "855e6b5a075cfbbba74772dc222e8a487fb3a118",
+ "de749e1e60a2d5f010c07dd98829ede5c7da21ea",
[
"fledge/tentative/get-interest-group-auction-data.https.window.html?1-4",
{
@@ -663805,7 +665869,7 @@
]
],
"interest-group-passed-to-generate-bid.https.window.js": [
- "172cbab466440b4f2d8ffe3a1f937e9b4520461d",
+ "6b5602158ffcfe5930feeb653e0a85e3ab599b60",
[
"fledge/tentative/interest-group-passed-to-generate-bid.https.window.html?1-5",
{
@@ -665508,7 +667572,7 @@
]
],
"interest-group-update.https.window.js": [
- "ceac2c79a6e93635f5f4ebb9e7e26256cb695a7b",
+ "041100547446369dd7566d2ab010319edc434135",
[
"fledge/tentative/interest-group-update.https.window.html?1-4",
{
@@ -665771,7 +667835,7 @@
]
],
"join-leave-ad-interest-group-in-fenced-frame.https.window.js": [
- "1e2824666cc7c2b8c1fd8c19e2414bdea07f9714",
+ "2939d3847841357187e1999e4ad214510bac60cc",
[
"fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.html?1-4",
{
@@ -665906,7 +667970,7 @@
]
],
"join-leave-ad-interest-group.https.window.js": [
- "68a4e9d09c941493b8dd8c85c5a535a5d962d761",
+ "5e004ed1dc5dbb71216eb0f2f5e44cea41e722b5",
[
"fledge/tentative/join-leave-ad-interest-group.https.window.html?1-10",
{
@@ -666521,7 +668585,7 @@
]
],
"kanon-status-below-threshold.https.window.js": [
- "6f3c2f572a198469607a27b51328c9ff8364d7a0",
+ "419b94bd7814756059a2029562510915a1c648ef",
[
"fledge/tentative/kanon-status-below-threshold.https.window.html",
{
@@ -666551,7 +668615,7 @@
]
],
"kanon-status-not-calculated.https.window.js": [
- "87a66c106fbff5388e05905539840556ceb41e35",
+ "965082d8ffd0a2f4cbdedea298f19abddab1afa9",
[
"fledge/tentative/kanon-status-not-calculated.https.window.html",
{
@@ -666776,7 +668840,7 @@
]
],
"no-winner.https.window.js": [
- "2632a95deeeb85eb9bc7be26194260af218c59ad",
+ "cfa0704dbc400248d48ed8bbfa771af86fc73dc6",
[
"fledge/tentative/no-winner.https.window.html?1-5",
{
@@ -667499,7 +669563,7 @@
]
],
"private-aggregation.https.window.js": [
- "a1c261b6291495ffb778753f1444dac5f414b910",
+ "474bf4ced76c2214d9abc82e0e5b69fe7b787b82",
[
"fledge/tentative/private-aggregation.https.window.html?1-5",
{
@@ -667710,7 +669774,7 @@
]
],
"real-time-reporting.https.window.js": [
- "5ebd20d19aec35f8c5fa14c314621f8724493126",
+ "84dce53844f44c9dc468ad63f168588bd973841d",
[
"fledge/tentative/real-time-reporting.https.window.html?1-5",
{
@@ -667801,7 +669865,7 @@
]
],
"register-ad-beacon.https.window.js": [
- "d74f0dab5e56601c808d7cd28dc6dea78aa5b628",
+ "98b6a75c42f33bf5d8a900d817c5a20e718718da",
[
"fledge/tentative/register-ad-beacon.https.window.html?1-5",
{
@@ -667936,7 +670000,7 @@
]
],
"reporting-arguments.https.window.js": [
- "a3b546f596476d95d36e6d0a6c7dd858c2a62e27",
+ "04af8ebc64354d6fe987c310352f08eb2d8a289f",
[
"fledge/tentative/reporting-arguments.https.window.html?1-5",
{
@@ -668131,7 +670195,7 @@
]
],
"reporting-ids.https.window.js": [
- "43c78987f1e8610c5aff66f72ec37d2e58330dca",
+ "0019393008bc565c10aa8af9cd7ab28f82d102d1",
[
"fledge/tentative/reporting-ids.https.window.html?1-5",
{
@@ -668214,7 +670278,7 @@
]
],
"round-a-value.https.window.js": [
- "2195b45ea5f81893699a6732f102d492f3d12bec",
+ "21bbf29572659789651de645f38a89d759f62dc0",
[
"fledge/tentative/round-a-value.https.window.html",
{
@@ -668245,7 +670309,7 @@
]
],
"score-ad-browser-signals.https.window.js": [
- "23fee313af53b5431928f6d4c5cd406c3ccb915c",
+ "9acf994cf9fd9b0355561af7ca3b97ea5eb5ddc1",
[
"fledge/tentative/score-ad-browser-signals.https.window.html?1-last",
{
@@ -668284,7 +670348,7 @@
]
],
"send-report-to.https.window.js": [
- "163443cb76d450e5a559fefcbd48ac26266e33dc",
+ "fa0f01ccfe8b403fcd6ceded435688481b37f467",
[
"fledge/tentative/send-report-to.https.window.html?1-5",
{
@@ -668367,7 +670431,7 @@
]
],
"server-response-for-debugging-only.https.window.js": [
- "1b4edc66a89ce0577f14ef76b79d655492629a19",
+ "e6787e8a2d9bda86c78b289e26ac1361f1652c35",
[
"fledge/tentative/server-response-for-debugging-only.https.window.html?1-last",
{
@@ -668418,7 +670482,7 @@
]
],
"server-response-private-aggregation.https.window.js": [
- "d7f21e16cf08506ec277985dec74ae81e350a2e6",
+ "6d9a8a887706eeb75506a95884271a754e4ee05e",
[
"fledge/tentative/server-response-private-aggregation.https.window.html?1-6",
{
@@ -668525,7 +670589,7 @@
]
],
"server-response.https.window.js": [
- "d4eaf0d25123298a696f0116cb54c6fe144038d4",
+ "4241cc8e1c9025bfae29d72a1567fcf63be3242e",
[
"fledge/tentative/server-response.https.window.html?1-6",
{
@@ -670364,7 +672428,7 @@
]
],
"service-worker-request-visibility.https.window.js": [
- "8b8618420e56e30d2a9e4428f24f22cc7d9053b9",
+ "41ebf839600bb2cd52bbb9f01b7a8118dc1eee13",
[
"fledge/tentative/service-worker-request-visibility.https.window.html?1-last",
{
@@ -670403,7 +672467,7 @@
]
],
"tie.https.window.js": [
- "f528df8fb020382907a63d372452010217bf2b55",
+ "21be690c92ef4386d7100d1e600a1c3524f48809",
[
"fledge/tentative/tie.https.window.html",
{
@@ -672936,7 +675000,7 @@
]
],
"utf8-helpers.https.window.js": [
- "4a712bf6269ea1fc2b9e7eb832a2b3cdcf2a9e07",
+ "9d8d0836419fd7f7223707be99d700b28ee39aca",
[
"fledge/tentative/utf8-helpers.https.window.html?1-5",
{
@@ -684154,7 +686218,7 @@
]
},
"regression-1399759.https.sub.html": [
- "d0b09f335db6c9292417fdf64f4148db1a7abbc7",
+ "a960fb87020061887a4aef20dfe37a27bcb2b5f6",
[
"html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html?pipe=header(Origin-Agent-Cluster,%3F0)",
{}
@@ -684890,6 +686954,13 @@
"timeout": "long"
}
]
+ ],
+ "open_initial_size.html": [
+ "a3a82d7646891edc92008073c1bb66fab7d36fa6",
+ [
+ null,
+ {}
+ ]
]
},
"proxy-getOwnPropertyDescriptor.html": [
@@ -692954,6 +695025,20 @@
{}
]
],
+ "2d.text.measure.lang.html": [
+ "a11e838799c635a33b35c2233bcf92f8d0b71b7d",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.text.measure.lang.inherit.html": [
+ "565308a895bc2442c98087f0e5341cd7ac530697",
+ [
+ null,
+ {}
+ ]
+ ],
"2d.text.measure.selection-rects-baselines.tentative.html": [
"8ef5e83199c395d1de79b7730b47c2c9342d074e",
[
@@ -706851,6 +708936,27 @@
{}
]
],
+ "2d.text.measure.lang.html": [
+ "22183f9434296c0d6f99266fa06659a40194719f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.text.measure.lang.inherit.html": [
+ "8b630794e1d6daeb0c48953d71f07ee86adb24d1",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.text.measure.lang.worker.js": [
+ "5bbb2317f243b09f6030b86895f3622993cd2f32",
+ [
+ "html/canvas/offscreen/text/2d.text.measure.lang.worker.html",
+ {}
+ ]
+ ],
"2d.text.measure.selection-rects-baselines.tentative.html": [
"fc1683bcce17a948e3580a64357da5a7927ce289",
[
@@ -712783,14 +714889,14 @@
]
],
"nameditem-01.html": [
- "2b428aa65bd7d6cda28fee7e83ef2528a1b751f5",
+ "2caeed7dd000a7ca7951980ac59c724f251ee0f4",
[
null,
{}
]
],
"nameditem-02.html": [
- "8c3155e7e4cabc69a58315d620ace5b20fa91b4c",
+ "84cf64c1ffc685164bda1f3e5493c2fe9db0bda8",
[
null,
{}
@@ -712804,28 +714910,28 @@
]
],
"nameditem-04.html": [
- "b7c3ef8e9bb1697d57f451021672b5491a21e090",
+ "2b4a3c55b71d16660c680bc86e799b43565586ee",
[
null,
{}
]
],
"nameditem-05.html": [
- "843ce357962e5990ed8e72674b46def587b2badc",
+ "b38872498b60fa728d7617243d4bdf206146609c",
[
null,
{}
]
],
"nameditem-06.html": [
- "15a72b5f6bad01ca6a71eb432522acf905322340",
+ "592535f0d6a3172c711dd5b85919336616743921",
[
null,
{}
]
],
"nameditem-07.html": [
- "fc3f06c01b9ec6f0c8ea51c0474da9adaa7c9d70",
+ "69a3bb0f09ac6311c3fc08a1a04f2e337341b6f0",
[
null,
{}
@@ -713851,6 +715957,20 @@
{}
]
],
+ "element-render-blocking-040.html": [
+ "3ef1fefc4f85bc6accb6b5d81c2f58bef821578e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "element-render-blocking-041.html": [
+ "c6d87710f7e56fd3e80b60f21c79ac4a28431330",
+ [
+ null,
+ {}
+ ]
+ ],
"non-render-blocking-scripts.optional.html": [
"a4c32ea037b7b47490c54ddd7616b88bfebcdc76",
[
@@ -714452,14 +716572,14 @@
},
"the-hidden-attribute": {
"beforematch-element-fragment-navigation.html": [
- "812a55f3187f60bda3ae702142de47168b1d8abd",
+ "9be5f9baa6d0453a50e4e287e007685ffa9a42bf",
[
null,
{}
]
],
"beforematch-scroll-to-text-fragment.html": [
- "dddab4c6ba8621fb27e63835311930f2b53f41df",
+ "618493addeac829e672c4da5844ae03521704562",
[
null,
{
@@ -714482,7 +716602,7 @@
]
],
"hidden-until-found-002.html": [
- "a454e3a0091d1f5913b7656114bc1e7650c14949",
+ "e947274bedb89ad4cb162082f5e42c10e5365dad",
[
null,
{
@@ -714498,7 +716618,7 @@
]
],
"hidden-until-found-text-fragment.html": [
- "05220f7ce11b5c4d59d20904d2c6303c2107f25c",
+ "aa8a989509f5f68c7bf589d4ee2e399f1a7a0f6e",
[
null,
{
@@ -717124,8 +719244,15 @@
{}
]
],
+ "lists-styles-quirks.html": [
+ "ba3d8241f0f309aafe0805dc370747db6d3e5816",
+ [
+ null,
+ {}
+ ]
+ ],
"lists-styles.html": [
- "a5f011cecc1dbd6d199d4af5e0cd09113ca90735",
+ "6c2500b7eeda6d182977701771d7ca2405877416",
[
null,
{}
@@ -717318,6 +719445,27 @@
{}
]
],
+ "fieldset-multicol-column-height.html": [
+ "afd2425221f86878ec407064c8c87c528fdc6e78",
+ [
+ null,
+ {}
+ ]
+ ],
+ "fieldset-multicol-only-column-count.html": [
+ "9f794007a47e517a357818e007333277c486e47f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "fieldset-multicol-only-column-width.html": [
+ "e3fd552439af219ca7b6f329e5719218c9365a51",
+ [
+ null,
+ {}
+ ]
+ ],
"fieldset-multicol.html": [
"bdb2c2fd94686b502ed5a663b1026180283af22f",
[
@@ -717777,7 +719925,7 @@
},
"the-details-element": {
"auto-expand-details-text-fragment.html": [
- "321d82c02d0e1b04d2dd3cafb1d47a6776f36db7",
+ "7cc3cc22964a07a3448464bcc9ffaae8086397c8",
[
null,
{
@@ -725907,8 +728055,8 @@
}
]
],
- "option-computed-style.tentative.html": [
- "ba2861a5c6181b72c3b8abc3e077a9f414f2cd99",
+ "option-color-inheritance.html": [
+ "d96124d008c50be1f62a7b2f4c3ddf153c62bdd6",
[
null,
{}
@@ -727116,7 +729264,7 @@
]
],
"focus-after-close.html": [
- "93baf65cf60c17d9292525e110faff15bcbd52b9",
+ "7137edcd1a18080c96d627e5f40da13b1d36437f",
[
null,
{
@@ -729846,8 +731994,15 @@
}
]
],
+ "parse-error-location.tentative.html": [
+ "5c8dda80cd5ad692fac1e233864519af769307ce",
+ [
+ null,
+ {}
+ ]
+ ],
"parse-error.html": [
- "88fb23a00d963b97e789deb5750e8a6ad62b533a",
+ "3c079f0654b16c476693afa7e56358afad30d748",
[
null,
{}
@@ -738700,7 +740855,7 @@
]
],
"roles-contextual.html": [
- "793bdf1f4130912fe679e91f04c39e0af513ae4b",
+ "e1f343cd07459d7ac9b0ae6e637646b8022edafe",
[
null,
{
@@ -740777,6 +742932,26 @@
]
]
}
+ },
+ "window": {
+ "minimize-1.html": [
+ "3b6d46874b3e51f0391d7de0728b42c795c91cad",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "minimize-2.html": [
+ "279f01b7b73abc434c2daa640c1aa292f419ea53",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
}
},
"input-device-capabilities": {
@@ -746898,7 +749073,7 @@
},
"media-capabilities": {
"decodingInfo-webrtc.any.js": [
- "0f3a4fa0f2d282a694a9e0a0d5c2abfe0697cde1",
+ "b38c8e67f9c0fe2564198ae7e4a35cd4a9ad71d5",
[
"media-capabilities/decodingInfo-webrtc.any.html",
{
@@ -746925,7 +749100,7 @@
]
],
"decodingInfo.any.js": [
- "2fd3743b442cf8f3143ee2d4c3ccb02571036b15",
+ "510a59d9d781d8b400ad429bbeccd94b319ae3d5",
[
"media-capabilities/decodingInfo.any.html",
{
@@ -746959,7 +749134,7 @@
]
],
"decodingInfoEncryptedMedia.https.html": [
- "7ac914de89ddc0f7bee0169a7c7cee04ab261f2b",
+ "2d671b3ce831893528ef07c9f28fd064df627e41",
[
null,
{
@@ -746968,7 +749143,7 @@
]
],
"encodingInfo-webrtc.any.js": [
- "635801c9f1a4163269d719aa12e5e5396b9e6562",
+ "1369941a0a5d52bdcbcc3ffe6ba0feaddce8329c",
[
"media-capabilities/encodingInfo-webrtc.any.html",
{
@@ -746995,7 +749170,7 @@
]
],
"encodingInfo.any.js": [
- "14612238e60cdb45cf716a6bd0d7037e1e2506a6",
+ "97b6c196f09d3c4fc3d46f92a916e4020c39d646",
[
"media-capabilities/encodingInfo.any.html",
{}
@@ -748233,7 +750408,7 @@
]
],
"MediaRecorder-canvas-media-source.https.html": [
- "0c5f47f0ef83efe6d8e36d76a1ff88534b51c6ab",
+ "0339c18df424df1081b4ab2275d83d607301637b",
[
"mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=''",
{
@@ -748875,6 +751050,123 @@
}
]
],
+ "legacy": {
+ "MediaRecorder-canvas-media-source-legacy.https.html": [
+ "bcfc2af2737716810d22826ff8441b5a0bc668a0",
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=''",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=av01,mp4a.40.2",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=av01,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=avc1.64003E,mp4a.40.2",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=avc3.64003E,mp4a.40.2",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,mp4a.40.2",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,mp4a.40.2",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/mp4;codecs=vp9,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/webm;codecs=av1,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/webm;codecs=vp8,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/webm;codecs=vp9,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/x-matroska;codecs=hev1.1.6.L186.B0,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ],
+ [
+ "mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html?mimeType=video/x-matroska;codecs=hvc1.1.6.L186.B0,opus",
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ]
+ },
"passthrough": {
"MediaRecorder-passthrough.https.html": [
"6a8ebf50dd59c87eeef411566998bd5bb79ff9a9",
@@ -751156,113 +753448,6 @@
]
},
"navigation-api": {
- "commit-behavior": {
- "after-transition-new-navigation-before-commit.html": [
- "2d09d40dc952f5f333f08ecc99cde7ae4adcd521",
- [
- null,
- {}
- ]
- ],
- "after-transition-push.html": [
- "34bdcf7cac733c78b1eeec4bbb1c3a5cc64dd045",
- [
- null,
- {}
- ]
- ],
- "after-transition-redirect-explicit-commit.html": [
- "7fa356760870c4d519e9d53f92bbebe6b4849a79",
- [
- null,
- {}
- ]
- ],
- "after-transition-redirect-push.html": [
- "79b46ea475087c0ba16783899d2af93addc5b033",
- [
- null,
- {}
- ]
- ],
- "after-transition-redirect-replace.html": [
- "e31f5884a2762630abfc2974c3a2dbcd3871b4d3",
- [
- null,
- {}
- ]
- ],
- "after-transition-reload.html": [
- "203150eb0516f2eea57f9e398f5bb50a972f0569",
- [
- null,
- {}
- ]
- ],
- "after-transition-replace.html": [
- "2fd48736a34368b6f16eca126f59f5f77243dd57",
- [
- null,
- {}
- ]
- ],
- "after-transition-traversal-commit-new-navigation-before-commit.html": [
- "9e74e10676de5db44655b80851ef8b0e1383986c",
- [
- null,
- {}
- ]
- ],
- "after-transition-traversal-window-stop-before-commit.html": [
- "282f806f4d38626c7afa08bdbf4f2eaf7704f385",
- [
- null,
- {}
- ]
- ],
- "after-transition-traverse.html": [
- "d348a218ac4a4b7efa0c54ac8e50b51783b1253a",
- [
- null,
- {}
- ]
- ],
- "after-transition-uncancelable.html": [
- "45bde9f0900b6835f754cfa09129c63dfd1f4e7b",
- [
- null,
- {}
- ]
- ],
- "after-transition-window-stop-before-commit.html": [
- "0f5e57d5b665e5d83fcaf7fc5b21e03b32fdc108",
- [
- null,
- {}
- ]
- ],
- "commit-throws.html": [
- "54abdbfd0fb19f68a9b87a183581d7a5462b2134",
- [
- null,
- {}
- ]
- ],
- "multiple-intercept.html": [
- "848af6a65d8954accaa0c9882224ba07d76f7958",
- [
- null,
- {}
- ]
- ],
- "redirect-throws.html": [
- "4bb6f9660711e853d35d9aef41eab04cf80a1a18",
- [
- null,
- {}
- ]
- ]
- },
"currententrychange-event": {
"anchor-click.html": [
"ce8fc69f5d4486c990284adfa5e4608af8fd198e",
@@ -751681,7 +753866,7 @@
]
],
"defaultPrevented-window-stop-after-dispatch.html": [
- "da5de10ddd8ba5753265f7a2b2448915e31cd257",
+ "889179603b8dfc3088fbf58a38c379cba0026ecb",
[
null,
{}
@@ -752169,13 +754354,6 @@
{}
]
],
- "replaceState-in-unload-then-remove-iframe.html": [
- "e97b72b15717325b49594382931635574c76f65c",
- [
- null,
- {}
- ]
- ],
"replaceState-inside-back-handler.html": [
"29409b5e2bc3e680cf99f54abea90bcdd5bfd1b2",
[
@@ -752233,7 +754411,7 @@
]
],
"signal-abort-window-stop.html": [
- "43e005e8b41180b058055ef30714e7dd49954861",
+ "cd3bb7431a381c5cc64902d00959f71193cd1b89",
[
null,
{}
@@ -753536,28 +755714,6 @@
{}
]
],
- "navigate-commit-after-transition-intercept-with-redirect.html": [
- "1d7c47b5e73f7306fbf68a21233caae8310f123e",
- [
- "navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept-with-redirect.html?currententrychange",
- {}
- ],
- [
- "navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept-with-redirect.html?no-currententrychange",
- {}
- ]
- ],
- "navigate-commit-after-transition-intercept.html": [
- "16c8796d6f45ce94f594280339596464e60b49cf",
- [
- "navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept.html?currententrychange",
- {}
- ],
- [
- "navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept.html?no-currententrychange",
- {}
- ]
- ],
"navigate-cross-document-double.html": [
"262809a0ad7216685cb0915c44bf1b6d591e123f",
[
@@ -753594,6 +755750,28 @@
{}
]
],
+ "navigate-intercept-precommitHandler-redirect.html": [
+ "90cf813d0587c2c6bf3c299360890060255ed275",
+ [
+ "navigation-api/ordering-and-transition/navigate-intercept-precommitHandler-redirect.html?currententrychange",
+ {}
+ ],
+ [
+ "navigation-api/ordering-and-transition/navigate-intercept-precommitHandler-redirect.html?no-currententrychange",
+ {}
+ ]
+ ],
+ "navigate-intercept-precommitHandler.html": [
+ "27e317cfc6759c8efc01ba40648a315304744e63",
+ [
+ "navigation-api/ordering-and-transition/navigate-intercept-precommitHandler.html?currententrychange",
+ {}
+ ],
+ [
+ "navigation-api/ordering-and-transition/navigate-intercept-precommitHandler.html?no-currententrychange",
+ {}
+ ]
+ ],
"navigate-intercept-stop.html": [
"189475d5de1edabd6d33032885b2f4aa9fdd1811",
[
@@ -753786,6 +755964,99 @@
]
]
},
+ "precommit-handler": {
+ "multiple-intercept.html": [
+ "b7fd9109bd56334b985212595e8f34f7c550ee6d",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-new-navigation-before-commit.html": [
+ "89e9895534f4583d3bf19b2c3d756c5cf58da487",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-push.html": [
+ "41856ed6c433e586b683e9fd1d0e4ca0c0e277cd",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-redirect-push.html": [
+ "de75198d9754a5510adb449f5845fa5daa7ea63b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-redirect-replace.html": [
+ "049909fefdead4c6a72b94d2a05423523733c50f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-redirect-throws.html": [
+ "353daa1a48bc9dac85453d32f56ec35bc6b59ddb",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-reload.html": [
+ "0fd5da33e4cf85566350f066ad9a60baa16171a3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-replace.html": [
+ "7c28c99af1e15c06dba2acdf4d3e6ce1381c18e4",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-traversal-commit-new-navigation-before-commit.html": [
+ "226f332e421687bf92430f9009b329e751adc7c0",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-traversal-window-stop-before-commit.html": [
+ "c45f8268f2a31a7440f74c8ed7336694bcfabea9",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-traverse.html": [
+ "f152129ce264b79bc7407f5308559701ef97210e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-uncancelable.html": [
+ "af320b4e32c920947212cc8edce1be23c7520221",
+ [
+ null,
+ {}
+ ]
+ ],
+ "precommitHandler-window-stop-before-commit.html": [
+ "857a21ed3a97dd695d553818b5d067fec6666534",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"scroll-behavior": {
"after-transition-basic.html": [
"8ee4cc395b6722affc8ac657ee35d7cb41761b9d",
@@ -753878,15 +756149,15 @@
{}
]
],
- "manual-scroll-before-after-transition-commit.html": [
- "3b32e72bb1118f4c81ad1da31d927dc1a2abe2a8",
+ "manual-scroll-fragment-does-not-exist.html": [
+ "1ca582787e2e27ae63fec6170ed658b7f1453b65",
[
null,
{}
]
],
- "manual-scroll-fragment-does-not-exist.html": [
- "1ca582787e2e27ae63fec6170ed658b7f1453b65",
+ "manual-scroll-in-precommit-handler.html": [
+ "3f92b5276a31c89613e2c78bf7445e9a8e7c17da",
[
null,
{}
@@ -755886,7 +758157,7 @@
]
],
"paint-timing-mixin.html": [
- "65c1062a05912dc87d142a29cd493d92ac52d2bf",
+ "c43b7668b5c9b376774672746b6f1e31e5feb3cb",
[
null,
{}
@@ -776111,6 +778382,13 @@
}
]
],
+ "callback-iframe-different-origin.html": [
+ "5e66b36d7123a26e9ee142fa792e305d8440f5e4",
+ [
+ null,
+ {}
+ ]
+ ],
"callback-iframe.html": [
"8ec08a804a6d3b2dfb1b4d6ba1dfcb70ee188944",
[
@@ -777543,7 +779821,7 @@
]
],
"sanitizer-config.tentative.html": [
- "438e1db7eadc0a5f6404c4f7f2ce39d7f37c3eac",
+ "4a7b7ecc517fb2ecfc0bc1f800d1e650dbde86b6",
[
null,
{}
@@ -779503,7 +781781,7 @@
]
],
"lock-sandboxed-iframe.html": [
- "ab954f04b4c5d9043d893e36892c4061ed446661",
+ "f78d7d72d538fd9384e9b5f7193d318a0ae69589",
[
null,
{
@@ -779779,6 +782057,50 @@
]
},
"scroll-animations": {
+ "animation-trigger": {
+ "animation-trigger-alternate.tentative.html": [
+ "aa92e32c5628392813cd576b64eb2bb32129e2ef",
+ [
+ null,
+ {}
+ ]
+ ],
+ "animation-trigger-once-play-state.tentative.html": [
+ "23c6aa8ce9f697cab4121e713556b544cb4202cf",
+ [
+ null,
+ {}
+ ]
+ ],
+ "animation-trigger-once.tentative.html": [
+ "e7603b458bc0793a9b5303d8bd72b8d6908ebf26",
+ [
+ null,
+ {}
+ ]
+ ],
+ "animation-trigger-repeat.tentative.html": [
+ "cfbe9d3c9334148789d4cebc7a01a2f9e848b22d",
+ [
+ null,
+ {}
+ ]
+ ],
+ "animation-trigger-state.tentative.html": [
+ "a9d58ae4c3268baa4c7b3ad61310b73cc00cf467",
+ [
+ null,
+ {}
+ ]
+ ],
+ "animation-trigger.html": [
+ "dd4820dfe5fe0a964044b0d27eea153b9fbbfb3e",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"css": {
"animation-duration-auto.tentative.html": [
"01982859137855c7f6c3c5011b013ea715c9c4ea",
@@ -781852,7 +784174,7 @@
]
],
"Selection-getComposedRanges-range-update.html": [
- "15f07305b0dfd507a4b22f7ad950f602a39f6c5a",
+ "2e54b328f02bbab03b4838cb9a86591d414e2c1a",
[
null,
{}
@@ -786199,6 +788521,15 @@
}
]
],
+ "text-selection-with-delegatesFocus-text-control.html": [
+ "6474729b8b4a8c496b33e40d5b056a12b7232418",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"text-selection-with-delegatesFocus.html": [
"7c92d35394f126d878780a1c04f2bdb49550ba86",
[
@@ -786760,6 +789091,15 @@
}
]
],
+ "form.html": [
+ "a4a5f37283848efcdb99b50b3aebb23df3235fe5",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"interesttarget.tentative.html": [
"e8d7c814d865fa95df4a75fc59a119211fe8caf0",
[
@@ -786797,7 +789137,7 @@
]
],
"property-reflection.html": [
- "a44baeaf4a37b5472f9d8e5590f8805613390688",
+ "6e8b77fb785eade354de4d849fa004016aa027c9",
[
null,
{
@@ -788912,8 +791252,8 @@
}
]
],
- "navigation-api-after-transition-commit.tentative.html": [
- "ae17db7d59f4c5cf2bf01af2b7224fa6aa8232df",
+ "navigation-api-back.tentative.html": [
+ "cb96d9caf95ba7987adb065a150b2182ec784b9a",
[
null,
{
@@ -788921,8 +791261,8 @@
}
]
],
- "navigation-api-back.tentative.html": [
- "cb96d9caf95ba7987adb065a150b2182ec784b9a",
+ "navigation-api-forward.tentative.html": [
+ "f483ad376b6ae247d0358363fda3c01cd71ac06f",
[
null,
{
@@ -788930,8 +791270,8 @@
}
]
],
- "navigation-api-forward.tentative.html": [
- "f483ad376b6ae247d0358363fda3c01cd71ac06f",
+ "navigation-api-hash.tentative.html": [
+ "e20578ea79ed7a6564a2d960cc1148b520c55ef2",
[
null,
{
@@ -788939,8 +791279,8 @@
}
]
],
- "navigation-api-hash.tentative.html": [
- "e20578ea79ed7a6564a2d960cc1148b520c55ef2",
+ "navigation-api-precommit.tentative.html": [
+ "b5d6077e13d7ef56ccdb9559d446c64e5a3edd02",
[
null,
{
@@ -790787,6 +793127,35 @@
}
]
],
+ "protocol-handler-register.https.html": [
+ "af2df0f12abac3d7f8908e01a987e0cbd5e2fe25",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
+ "protocol-handler-unregister.https.html": [
+ "586ce43385445f85ee0a9d52105a77a447c1294c",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
+ "protocol-handler-validation.https.html": [
+ "613b9bfad087e1ca10c79c4481f99e841d1a56a3",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"referrer-policy-from-rules.html": [
"7e3b65fe6127c9ecd6f5448d0d31be8962ff8db2",
[
@@ -791547,6 +793916,15 @@
}
]
],
+ "restrictions_shared_storage_worklet.https.html": [
+ "72a46c3137ff9595147901a5d48297613d1033dd",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"sandbox-iframe.html": [
"469b8aadc31137d412faad400523af61922c6c0b",
[
@@ -805027,7 +807405,7 @@
]
],
"accept-signature.window.js": [
- "efcbf0cdad6cb2816b47e989701835a30b777639",
+ "97e817e328c279149ac9668ed5014a30f811006d",
[
"subresource-integrity/signatures/tentative/accept-signature.window.html",
{
@@ -805055,7 +807433,7 @@
]
],
"client-initiated.cross-origin.window.js": [
- "ce7b817f7e863d4502494e9946955cbefb145b0a",
+ "26e1a3090eb447602beb5fc1cf3ae2ab3b86c71b",
[
"subresource-integrity/signatures/tentative/client-initiated.cross-origin.window.html",
{
@@ -805139,6 +807517,24 @@
}
]
],
+ "scheme.window.js": [
+ "69ff21de3c7976c2124a3607bd21b6dca6508084",
+ [
+ "subresource-integrity/signatures/tentative/scheme.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
"script.window.js": [
"d4c4e57b270ad807bb46306509121469b6627001",
[
@@ -805154,7 +807550,7 @@
]
],
"server-initiated.window.js": [
- "e2b3e78ac1163fff9ff470fb958f5844168d56a4",
+ "8dec3daaded618997ed43747475a3316574efc42",
[
"subresource-integrity/signatures/tentative/server-initiated.window.html",
{
@@ -805184,6 +807580,20 @@
]
}
]
+ ],
+ "unknown-parameter.window.js": [
+ "2b4df54c6ed62ff9898e640790a1126b950f1915",
+ [
+ "subresource-integrity/signatures/tentative/unknown-parameter.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "helper.js"
+ ]
+ ]
+ }
+ ]
]
}
},
@@ -807115,6 +809525,29 @@
]
}
},
+ "fonts": {
+ "zero-font-size-adjust-no-glyphs-font.html": [
+ "b1783af474c0e866694b619ca9c4d89a29bfb829",
+ [
+ null,
+ {}
+ ]
+ ],
+ "zero-font-size-adjust-no-glyphs-zero-height-font.html": [
+ "25839e0ef5f386700be0edbbd3658ea8f47e7434",
+ [
+ null,
+ {}
+ ]
+ ],
+ "zero-font-size-adjust.html": [
+ "7e7a226c6b35cb6b7469d7400f72225ee7dd13b0",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"geometry": {
"inheritance.svg": [
"760328ac31818d86a9410fd7c412d803e30416a2",
@@ -808974,6 +811407,13 @@
{}
]
],
+ "SVGGraphicsElement-padding.svg": [
+ "7bf47767a525a4950cf4be9f7da970ec9c8fdbe0",
+ [
+ null,
+ {}
+ ]
+ ],
"SVGGraphicsElement.getBBox-01.html": [
"773b06e5043d8d942b793a03d967a8acc925d5b1",
[
@@ -809648,10 +812088,12 @@
]
],
"ServiceWorkerContainer-register-from-ServiceWorker.https.html": [
- "7bc1ee7469db2660699f265bac57ce15c7a6778a",
+ "23020096383ff1bdce32f7880d0ff2baf0e72435",
[
null,
- {}
+ {
+ "timeout": "long"
+ }
]
],
"ServiceWorkerContainer-register-from-SharedWorker.https.html": [
@@ -810272,7 +812714,25 @@
]
],
"should-sink-type-mismatch-violation-be-blocked-by-csp-001.html": [
- "5662c64ac4ed531d2dee12356e8ab2c117a01c5f",
+ "add14466e57d6c7ead8690a7f19d89565eaca7e6",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html": [
+ "55e4c57bdebe994fbe938d2e34d121e34d1e77bf",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-003.html": [
+ "d5bbf704443874717812c08080a7e61b835f45a5",
[
null,
{
@@ -810281,7 +812741,7 @@
]
],
"should-trusted-type-policy-creation-be-blocked-by-csp-001.html": [
- "6e51bd5ef198a7419539e63b835b4f07becfcea3",
+ "1816a34746fe0f101594f027b68f49646cc4cf2c",
[
null,
{
@@ -810290,7 +812750,7 @@
]
],
"should-trusted-type-policy-creation-be-blocked-by-csp-002.html": [
- "ef1a4bde3782b5dfb5a3e1471f6b9e38217d6f1f",
+ "fc1906a7c99fdb82e9c2e6a7870471cf6ad3f6f0",
[
null,
{
@@ -810299,7 +812759,25 @@
]
],
"should-trusted-type-policy-creation-be-blocked-by-csp-003.html": [
- "55f1479e3db0e88684a171cfee5a948e5cae8fe9",
+ "052fbb8cbfb94023cadb003e858647de0d2b139e",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html": [
+ "5726db94bf374996de8049af62036b69150b7608",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-005.html": [
+ "8d10bcb30132755e9301913b0eebeee48c754f01",
[
null,
{
@@ -810343,21 +812821,14 @@
]
],
"trusted-types-eval-reporting-no-unsafe-eval.html": [
- "69b5bf3c1d1e901227a37d841f4bafae0401e362",
+ "27bd4644496e34bf6a253a80ffeff059a317770c",
[
null,
{}
]
],
"trusted-types-eval-reporting-report-only.html": [
- "a9e14f09e4ab322d6dcb6935b83cc819aa55f412",
- [
- null,
- {}
- ]
- ],
- "trusted-types-eval-reporting.html": [
- "d037c058d9b2b495a8b90954b17b89075b98ccf2",
+ "09b2f1c258574087b7de48d5a568a77dbdd2c2a9",
[
null,
{}
@@ -810385,14 +812856,35 @@
]
],
"trusted-types-report-only.html": [
- "f4386f832f43f57b82c52edc5e7dbe16308b6255",
+ "7b1a9c7e302c9da93b65b420e316c7cc94823a99",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-check-report-DedicatedWorker-create-policy.html": [
+ "71576c4ecc121a1005237773ed7d17b871ee7fd0",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html": [
+ "72354a99eed9d2d26f4b01ab811a6ab41b788551",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-check-report-Window-create-policy.html": [
+ "4c9506c5b435d41241d0aa905a357db0c739f211",
[
null,
{}
]
],
- "trusted-types-reporting-check-report.html": [
- "ae5ac25052d34be4d64bada3fb23283c783978ee",
+ "trusted-types-reporting-check-report-Window-sink-mismatch.html": [
+ "ad855dfb2f15a85548c423fe587592925e9a962d",
[
null,
{}
@@ -810405,6 +812897,41 @@
{}
]
],
+ "trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html": [
+ "b70a074fc7fd2c07428a3aca281ec263825a6883",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html": [
+ "9db187a2f91600b83883226aedca2b339f01e77f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-DedicatedWorker-eval.html": [
+ "184bc8ad333b855745c29ca3709bf55696a5fd8f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-DedicatedWorker-function-constructor.html": [
+ "26d4e54634a218d504adc136eb10f4813e38a973",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-DedicatedWorker-importScripts.html": [
+ "5db284f715cfc67847cd61e8028c2887d4a20fe4",
+ [
+ null,
+ {}
+ ]
+ ],
"trusted-types-reporting-for-DedicatedWorker-setTimeout-setInterval.html": [
"7e44a12fd2df50ee5beaf478470c4c828ab9c2b8",
[
@@ -810503,6 +813030,41 @@
{}
]
],
+ "trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html": [
+ "ac853cd8f6e71245d561bdc0abf2342b6afb22d9",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-ServiceWorker-eval.https.html": [
+ "2d0b6315fb9dc160e03167d567845e82fafbcae8",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-ServiceWorker-function-constructor.https.html": [
+ "791663dfc792179e9c145bc33442fa0b81966f7a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-ServiceWorker-importScripts.https.html": [
+ "865409aca1b55958a0c7ca3751b289820c8b8123",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html": [
+ "34b962df085e29da2301156ba495b336866a4554",
+ [
+ null,
+ {}
+ ]
+ ],
"trusted-types-reporting-for-ShadowRoot-innerHTML.html": [
"9aaf2d8aa4f50dd4712efb1f6f47bbe05b0dd2c9",
[
@@ -810517,6 +813079,41 @@
{}
]
],
+ "trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html": [
+ "3b382d8774a0c8bff47847118cfa5df5f5f09688",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html": [
+ "00e9a75dfb0443edbf789d42be9759db670b8930",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-SharedWorker-eval.html": [
+ "6ae0f60351f30ccb339c0e7af757fd9f991b1ec0",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-SharedWorker-function-constructor.html": [
+ "dc77be79640b692a618a853cea67cc9159e7eab4",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-SharedWorker-importScripts.html": [
+ "fb01333dd463c4860aa3f7fc25e1bbf1568a06ab",
+ [
+ null,
+ {}
+ ]
+ ],
"trusted-types-reporting-for-SharedWorker-setTimeout-setInterval.html": [
"7c97f644873f4ad4888c72d07e0ffbb4698cde05",
[
@@ -810524,6 +813121,41 @@
{}
]
],
+ "trusted-types-reporting-for-Window-DedicatedWorker-constructor.html": [
+ "3d2a91d74ca45fec8ecba500c6da50d02cb68cdb",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html": [
+ "482b9c333e3a9ea16de19d8e53fc8125b7250396",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-Window-SharedWorker-constructor.html": [
+ "a03dd21be9779b113eca42a46444d554faaf1d63",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-Window-eval.html": [
+ "7f4772aed149ee0ce2458d1f8df13500d2418f65",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-reporting-for-Window-function-constructor.html": [
+ "9b9617a9b5df7be69271bf7fe7a184b542c56491",
+ [
+ null,
+ {}
+ ]
+ ],
"trusted-types-reporting-for-Window-setTimeout-setInterval.html": [
"87e26060ab74a44db8ae902ff178642b1aa6081f",
[
@@ -810532,7 +813164,7 @@
]
],
"trusted-types-reporting.html": [
- "5e7930382ad16c3def4ae4055148595cf64a2325",
+ "7432d3bded8c45b64e12eca00cc6c477349d4869",
[
null,
{
@@ -810540,6 +813172,20 @@
}
]
],
+ "trusted-types-sandbox-allow-scripts.html": [
+ "b89cb56710266c91fd06bb7462d953a3efd695ea",
+ [
+ null,
+ {}
+ ]
+ ],
+ "trusted-types-sandbox-no-allow-scripts.html": [
+ "c4e4683934ec2d59a521e5cb7f99e2d0799723fa",
+ [
+ null,
+ {}
+ ]
+ ],
"trusted-types-source-file-path.html": [
"105a04247f630ddb49a2813cfa2345226eac91aa",
[
@@ -825963,7 +828609,7 @@
]
],
"style-change-events.html": [
- "d1c1c96f7b03e8f8cd6596f1ae24772d292e77b4",
+ "c64400e869df5e844e276facb7d975827027f68a",
[
null,
{}
@@ -835472,7 +838118,7 @@
]
],
"video-decoder-no-size-in-configure.https.any.js": [
- "3481b465f9eb431ce3dc799f4f1e625fbe3d7c0c",
+ "2ad7040e08b72617ac77b19fb47efc967c95bea8",
[
"webcodecs/video-decoder-no-size-in-configure.https.any.html?av1",
{
@@ -836734,8 +839380,57 @@
}
]
],
+ "video-encoder-orientation.https.any.js": [
+ "de687f114987bc0172f0fc2fe5e343e268d72a45",
+ [
+ "webcodecs/video-encoder-orientation.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "/common/media.js"
+ ],
+ [
+ "script",
+ "/webcodecs/utils.js"
+ ],
+ [
+ "script",
+ "/webcodecs/video-encoder-utils.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "webcodecs/video-encoder-orientation.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "/common/media.js"
+ ],
+ [
+ "script",
+ "/webcodecs/utils.js"
+ ],
+ [
+ "script",
+ "/webcodecs/video-encoder-utils.js"
+ ]
+ ]
+ }
+ ]
+ ],
"video-encoder-rescaling.https.any.js": [
- "70bafa04964cba77acc1c86b3f7d6f4b8ce4b728",
+ "a7f89da67bc7b10a294f5f8465b0175e623376d5",
[
"webcodecs/video-encoder-rescaling.https.any.html?av1",
{
@@ -841828,7 +844523,7 @@
]
],
"batch_normalization.https.any.js": [
- "b8fa3f026bcf75afc4dcaef375861b438216446b",
+ "1da85777342c9cead346f2cfd96eaf965544a088",
[
"webnn/conformance_tests/batch_normalization.https.any.html?cpu",
{
@@ -842644,7 +845339,7 @@
]
],
"clamp.https.any.js": [
- "d6fa68eb19d7c7c1a28f5ce9cfade0e73e4f4e8a",
+ "b3ccdcddca306b018f64011210da3036ee66cf6f",
[
"webnn/conformance_tests/clamp.https.any.html?cpu",
{
@@ -842865,6 +845560,117 @@
}
]
],
+ "constant-reshape-optimization.https.any.js": [
+ "eaa232b7413ebd132509ae9a605d3f5e49dc8d17",
+ [
+ "webnn/conformance_tests/constant-reshape-optimization.https.any.html?cpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test constant reshape optimization"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?cpu"
+ ],
+ [
+ "variant",
+ "?gpu"
+ ],
+ [
+ "variant",
+ "?npu"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/conformance_tests/constant-reshape-optimization.https.any.html?gpu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test constant reshape optimization"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?cpu"
+ ],
+ [
+ "variant",
+ "?gpu"
+ ],
+ [
+ "variant",
+ "?npu"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/conformance_tests/constant-reshape-optimization.https.any.html?npu",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test constant reshape optimization"
+ ],
+ [
+ "global",
+ "window"
+ ],
+ [
+ "variant",
+ "?cpu"
+ ],
+ [
+ "variant",
+ "?gpu"
+ ],
+ [
+ "variant",
+ "?npu"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"conv2d.https.any.js": [
"9fe246c9395c6cacf7e2f5245dac420e295707be",
[
@@ -843310,7 +846116,7 @@
]
],
"dequantizeLinear.https.any.js": [
- "8642a9647528c3ba3268d076fb2c92b9751d56d7",
+ "310dd03fcb5e46c9209951f6243e988f85c8e810",
[
"webnn/conformance_tests/dequantizeLinear.https.any.html?cpu",
{
@@ -843532,7 +846338,7 @@
]
],
"elu.https.any.js": [
- "6b789e6308c3f289b3f290e95cb7f05f8eb3e664",
+ "09cb0a99115f4089aa82ea6bcb978e9ff6c3c853",
[
"webnn/conformance_tests/elu.https.any.html?cpu",
{
@@ -845197,7 +848003,7 @@
]
],
"hard_sigmoid.https.any.js": [
- "cfa033ba4b024abbde8bfa154d8ba81180c0b501",
+ "b5f6fd0c97aa71d8bb75b466dd72526724681060",
[
"webnn/conformance_tests/hard_sigmoid.https.any.html?cpu",
{
@@ -845308,7 +848114,7 @@
]
],
"hard_swish.https.any.js": [
- "6bd054b326e8fbd86856fdd9913db37db41f3416",
+ "e49ea6fd719f17aea3c58c7ed78c0bbad3685399",
[
"webnn/conformance_tests/hard_swish.https.any.html?cpu",
{
@@ -846289,7 +849095,7 @@
]
],
"instance_normalization.https.any.js": [
- "26e0cd0aa935d473a7bdb84da59e46f534544066",
+ "2766f914b3dd66ef5f8120642bfaf30dc3a052fa",
[
"webnn/conformance_tests/instance_normalization.https.any.html?cpu",
{
@@ -846400,7 +849206,7 @@
]
],
"layer_normalization.https.any.js": [
- "2d5e98ea09d492732dd3e70b7e02902e6be5d390",
+ "f22d0444cfa79285cc9860b7b5a75a7cdfb0f18e",
[
"webnn/conformance_tests/layer_normalization.https.any.html?cpu",
{
@@ -846511,7 +849317,7 @@
]
],
"leaky_relu.https.any.js": [
- "fe950c0ed4d88cb6ca0e84d59106a22713008be3",
+ "03c8985c6c64e12b8aca59caf071493c7daefa61",
[
"webnn/conformance_tests/leaky_relu.https.any.html?cpu",
{
@@ -849166,7 +851972,7 @@
]
],
"prelu.https.any.js": [
- "a3612715805db9f55fee1ee36dde77318900d75b",
+ "b89de832d3e4c583b13d12a29c92a62f0c01a95e",
[
"webnn/conformance_tests/prelu.https.any.html?cpu",
{
@@ -849277,7 +852083,7 @@
]
],
"quantizeLinear.https.any.js": [
- "c25bdbaac60fca0525e8cbcf080c1319a5ab0c26",
+ "5c4989fdf31f2c94d028cd8a74fe935c49f09986",
[
"webnn/conformance_tests/quantizeLinear.https.any.html?cpu",
{
@@ -849499,7 +852305,7 @@
]
],
"reduce_l1.https.any.js": [
- "63a6ab727cb5f0c64034c533ccab031fe89f7ef0",
+ "1e6b163cff340a6ceb9b161e6f2920b5d833e22c",
[
"webnn/conformance_tests/reduce_l1.https.any.html?cpu",
{
@@ -849610,7 +852416,7 @@
]
],
"reduce_l2.https.any.js": [
- "7358ee8a15c82b839590a99654db3bf235eed702",
+ "0670a1d25c1c6d6abe8c2a585a4fa6421573e9bf",
[
"webnn/conformance_tests/reduce_l2.https.any.html?cpu",
{
@@ -849721,7 +852527,7 @@
]
],
"reduce_log_sum.https.any.js": [
- "31e21dbd50ae51d57097bde5e0f09f24a195dfff",
+ "9d30accb2cb39262f70b8dd2756c5ceaeca846e1",
[
"webnn/conformance_tests/reduce_log_sum.https.any.html?cpu",
{
@@ -849832,7 +852638,7 @@
]
],
"reduce_log_sum_exp.https.any.js": [
- "e60d6cfc892cb2ccda3593023c6d6e69fcd37cd6",
+ "e8026435017b67ee118741eac5d17487d46a5e21",
[
"webnn/conformance_tests/reduce_log_sum_exp.https.any.html?cpu",
{
@@ -849943,7 +852749,7 @@
]
],
"reduce_max.https.any.js": [
- "03458a30470ea09aae07624bd212b7fda14b5ceb",
+ "784db3101b66104ad8ac1208e2d15b5c4982b5ed",
[
"webnn/conformance_tests/reduce_max.https.any.html?cpu",
{
@@ -850054,7 +852860,7 @@
]
],
"reduce_mean.https.any.js": [
- "e9c9475088aa9b01f7b59769287ec3b52f9f1c67",
+ "63566b011c0bfc6ea0a212bec80db3aaa7c31c96",
[
"webnn/conformance_tests/reduce_mean.https.any.html?cpu",
{
@@ -850165,7 +852971,7 @@
]
],
"reduce_min.https.any.js": [
- "aca474d74ff7dc993cd63a9ca3b2e865633f39ac",
+ "64cf8b7ee98cdbe89ff06f7e6c6f11b4eefa2596",
[
"webnn/conformance_tests/reduce_min.https.any.html?cpu",
{
@@ -850276,7 +853082,7 @@
]
],
"reduce_product.https.any.js": [
- "9534c5b92e54ab4f02a1e5c18b78dcc7371d2573",
+ "6b4c1242d7f8f19c4357a91bec38eeec8e3f8e25",
[
"webnn/conformance_tests/reduce_product.https.any.html?cpu",
{
@@ -850387,7 +853193,7 @@
]
],
"reduce_sum.https.any.js": [
- "687f8e5e7ee66847e00525f284581b5ffdbf9a9d",
+ "d333f9fb5ad92b902b17aa55b8a9cb73a0912b7e",
[
"webnn/conformance_tests/reduce_sum.https.any.html?cpu",
{
@@ -850609,7 +853415,7 @@
]
],
"relu.https.any.js": [
- "30b797637db06896df52f95e2f735b792e41316f",
+ "16cc2a3fa67b4ffa77f2555b94e91d8d398e87ff",
[
"webnn/conformance_tests/relu.https.any.html?cpu",
{
@@ -850831,7 +853637,7 @@
]
],
"reshape.https.any.js": [
- "fe758193730c0c8a43ba226bd3c50cccb3224b70",
+ "05b8ea21e674796818f4c6143044a1beaaa3fb59",
[
"webnn/conformance_tests/reshape.https.any.html?cpu",
{
@@ -852073,7 +854879,7 @@
]
],
"sigmoid.https.any.js": [
- "a925f0c611076884905531ef9a3d4e52c4b118e5",
+ "287568a390ab8d49ccf0a1422c551ab79b57c1cd",
[
"webnn/conformance_tests/sigmoid.https.any.html?cpu",
{
@@ -852517,7 +855323,7 @@
]
],
"softmax.https.any.js": [
- "f289f081b16ac90241af68566630199057fdbd4f",
+ "33c2e1db9efd23499a0ea12826916b8a8b8a69b7",
[
"webnn/conformance_tests/softmax.https.any.html?cpu",
{
@@ -852628,7 +855434,7 @@
]
],
"softplus.https.any.js": [
- "52fce910dfebe5ac0bb9d27d8eb6303f7ed4db10",
+ "36386c03378eabe3dd2baecb2cf6c46d92cadcc1",
[
"webnn/conformance_tests/softplus.https.any.html?cpu",
{
@@ -852739,7 +855545,7 @@
]
],
"softsign.https.any.js": [
- "21eeb6c5d817bcaf695e06f05d0ebaa65d54e554",
+ "cf06bbc4fdb8c5e57d247955ba53a5dca7597941",
[
"webnn/conformance_tests/softsign.https.any.html?cpu",
{
@@ -853183,7 +855989,7 @@
]
],
"subgraph.https.any.js": [
- "9b21d6e4f9453fb72c3f7a6850c5690cc9ed87cf",
+ "a494a8b7a95d7ff9b4a4be717d7f876a1b061b26",
[
"webnn/conformance_tests/subgraph.https.any.html?cpu",
{
@@ -853729,7 +856535,7 @@
]
],
"tanh.https.any.js": [
- "1b38d7707e859a2f8f1fdb90093dc0235a7d3e31",
+ "63b8668644a10c0f13ab8b3c19cb9a9edf29be2b",
[
"webnn/conformance_tests/tanh.https.any.html?cpu",
{
@@ -870174,7 +872980,7 @@
]
],
"RTCIceCandidate-constructor.html": [
- "b760c7b05a565c97c9c75287d11ca8cc83258d1f",
+ "05c0849f7a040b08dabd6201e08825328bdc7a8b",
[
null,
{}
@@ -870190,7 +872996,7 @@
]
],
"RTCIceTransport.html": [
- "31504481f4ba36e2bf57f3b968bb8b58c394a209",
+ "f00af08e97c32408fcaf8e6efd0d1c134128335b",
[
null,
{
@@ -870240,7 +873046,7 @@
]
],
"RTCPeerConnection-addIceCandidate.html": [
- "618ef7e33c69735338ec4e05f2e15cd40d34c063",
+ "4517554bc0bcd5fe0275a358b4c51e5dca7dfaa5",
[
null,
{}
@@ -870803,7 +873609,7 @@
]
],
"RTCRtpReceiver-getSynchronizationSources.https.html": [
- "cb5336f3f3523d0684e48de42f2666a6e6a3aa50",
+ "de9ad184af0d7619a725bb302b0814bf57b70c62",
[
null,
{
@@ -871263,6 +874069,13 @@
}
]
],
+ "av1-profile-asymmetry.https.html": [
+ "f7d14ad6d8613c70c1bbecdda84281ca4d3620df",
+ [
+ null,
+ {}
+ ]
+ ],
"bundle.https.html": [
"73ea477e0473e698bec25ca01a3b21f1579b8b35",
[
@@ -871352,6 +874165,15 @@
{}
]
],
+ "h265-loopback.https.html": [
+ "c3a394ef8f4ce5fa03ff8b272eacbd1b61e6ff07",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"handover-datachannel.html": [
"8f224f822a76bb48924bc13e59d53f8a24d99f64",
[
@@ -895711,7 +898533,7 @@
]
],
"send-redirect.htm": [
- "7d73f0f64cc4d7506e607f75d3bba37b9d3d74a9",
+ "de3899f5e5d3ccef28ac54dfa05a7dbf8af98bd9",
[
null,
{}
@@ -895859,7 +898681,7 @@
]
],
"setrequestheader-case-insensitive.htm": [
- "1aed30d1c2a13fcb35e90a31e599a6cc963c6491",
+ "ce10482cad8d47f8f3933a55f321b44f88f663aa",
[
null,
{}
@@ -917206,7 +920028,7 @@
},
"context_created": {
"context_created.py": [
- "152bcdb018b120f9d4bc9164168f78905f0e6fd7",
+ "2982f78d99188ba77f4bf243cb7dd363644ed6a2",
[
null,
{}
@@ -917222,7 +920044,7 @@
},
"context_destroyed": {
"context_destroyed.py": [
- "254708c725a6394b1e094290c30c613e20104932",
+ "8492a4c1a96a4d32f9835006039a10d9c2043be4",
[
null,
{}
@@ -917282,6 +920104,15 @@
]
]
},
+ "download_will_begin": {
+ "download_will_begin.py": [
+ "7e402783aada70ee561401fada6afed927645120",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"fragment_navigated": {
"fragment_navigated.py": [
"45a65cacdf03503325bc5357e6971e747a13d2fd",
@@ -917293,7 +920124,7 @@
},
"get_tree": {
"frames.py": [
- "4fd220ed8fc4426f540bf9eedad9e1d8ac399a05",
+ "df4ff899e90356bf9e84e36dc00ab9aba9230896",
[
null,
{}
@@ -917307,7 +920138,7 @@
]
],
"max_depth.py": [
- "b855b8e7eba06b56a63ee2dd4f64b0e88d8a7513",
+ "9f7130f59c94a91582cd0daa32b5bc5ec9166a34",
[
null,
{}
@@ -917321,7 +920152,7 @@
]
],
"root.py": [
- "40e9f8ac93b81b5c499133db9682798683725131",
+ "171cc0eb607e50493c29eb54de71c3c0e922afd3",
[
null,
{}
@@ -918379,14 +921210,14 @@
},
"response_completed": {
"response_completed.py": [
- "127416d8de41740b2b7199c93d1256f110c28ecb",
+ "6f53572a341aa5db214714a77e921dd4ce8fcb78",
[
null,
{}
]
],
"response_completed_cached.py": [
- "5b1e3592e09e4dda83ddcd49bdc692f3f9c6c941",
+ "3f5cbad1047df2bca9038b7ce069ced79c0a2473",
[
null,
{}
@@ -918395,7 +921226,7 @@
},
"response_started": {
"response_started.py": [
- "6ab3e1c3cace1069705f2bf979e843315ec39ca9",
+ "324105197f048622428d30492c95b78957272983",
[
null,
{}
diff --git a/tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini b/tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini
new file mode 100644
index 00000000000..bc87205da82
--- /dev/null
+++ b/tests/wpt/meta/css/compositing/root-element-background-margin-opacity.html.ini
@@ -0,0 +1,2 @@
+[root-element-background-margin-opacity.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini
new file mode 100644
index 00000000000..18f732010f3
--- /dev/null
+++ b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-001.html.ini
@@ -0,0 +1,2 @@
+[animate-with-background-color-oklch-001.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini
new file mode 100644
index 00000000000..6a465429bf8
--- /dev/null
+++ b/tests/wpt/meta/css/css-animations/animate-with-background-color-oklch-002.html.ini
@@ -0,0 +1,6 @@
+[animate-with-background-color-oklch-002.html]
+ [Animate from legacy rgb to oklch]
+ expected: FAIL
+
+ [Animate from legacy rgb to color-mix oklch]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini b/tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini
new file mode 100644
index 00000000000..d99d36b7a59
--- /dev/null
+++ b/tests/wpt/meta/css/css-animations/crashtests/chrome-bug-404743651.html.ini
@@ -0,0 +1,2 @@
+[chrome-bug-404743651.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini
deleted file mode 100644
index f1903acb386..00000000000
--- a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-any.html.ini
+++ /dev/null
@@ -1,29 +0,0 @@
-[corner-shape-any.html?corner-shape=superellipse(5.2)&border-radius=40%]
- expected: FAIL
-
-[corner-shape-any.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%]
- expected: FAIL
-
-[corner-shape-any.html?corner-shape=squircle&border-radius=50%]
- expected: FAIL
-
-[corner-shape-any.html?corner-shape=straight&border-bottom-leftradius=5px]
- expected: FAIL
-
-[corner-shape-any.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px]
- expected: FAIL
-
-[corner-shape-any.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%]
- expected: FAIL
-
-[corner-shape-any.html?corner-shape=squircle&border-top-left-radius=30%]
- expected: FAIL
-
-[corner-shape-any.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px]
- expected: FAIL
-
-[corner-shape-any.html?corner-shape=superellipse(8)&border-top-right-radius=33px]
- expected: FAIL
-
-[corner-shape-any.html?corner-shape=squircle&border-top-right-radius=30px]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini
new file mode 100644
index 00000000000..19f68f62748
--- /dev/null
+++ b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini
@@ -0,0 +1,47 @@
+[corner-shape-render-fuzzy.html?corner-shape=scoop&border-radius=20%&border-width=20px&border-top-color=rebeccapurple&border-bottom-color=blue]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=superellipse(40)&border-radius=20%&border-width=20px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-left-shape=notch&border-radius=40px&border-width=10px&border-color=blue&border-left-color=yellow]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=superellipse(0.25)&border-radius=20%&border-width=20px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=scoop&border-radius=20%&border-width=20px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=25%&border-width=20px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=50%]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40px&border-width=10px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-right-shape=scoop&border-radius=20%&border-width=10px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=superellipse(1.8)&border-radius=40px&border-width=10px&border-left-color=purple]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=superellipse(0.05)&border-radius=20%&border-width=20px]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=25%&box-shadow=10px 10px 0 10px black]
+ expected: FAIL
+
+[corner-shape-render-fuzzy.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini
new file mode 100644
index 00000000000..a3cc011438a
--- /dev/null
+++ b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html.ini
@@ -0,0 +1,59 @@
+[corner-shape-render-precise.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=squircle&border-top-right-radius=30px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=squircle&border-top-left-radius=30%]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=superellipse(5.2)&border-radius=40%]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-left-shape=scoop&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=straight&border-bottom-left-radius=5px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=superellipse(8)&border-top-right-radius=33px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-left-shape=bevel&border-width=10px&border-color=black]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-shape=superellipse(8)&border-radius=10px&box-shadow=10px 10px 0 10px black]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-right-shape=bevel&border-width=10px&border-color=black]
+ expected: FAIL
+
+[corner-shape-render-precise.html?corner-top-left-shape=bevel&border-radius=40px]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini b/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini
deleted file mode 100644
index cdeb8243f40..00000000000
--- a/tests/wpt/meta/css/css-borders/tentative/corner-shape/corner-shape-render.html.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-[corner-shape-render.html?corner-bottom-left-shape=bevel]
- expected: FAIL
-
-[corner-shape-render.html?corner-top-left-shape=bevel]
- expected: FAIL
-
-[corner-shape-render.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel]
- expected: FAIL
-
-[corner-shape-render.html?corner-bottom-right-shape=bevel]
- expected: FAIL
-
-[corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px]
- expected: FAIL
-
-[corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px]
- expected: FAIL
-
-[corner-shape-render.html?corner-top-left-shape=bevel&border-radius=40px]
- expected: FAIL
-
-[corner-shape-render.html?corner-shape=bevel]
- expected: FAIL
-
-[corner-shape-render.html?corner-top-right-shape=bevel]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini
new file mode 100644
index 00000000000..dfbeb3e7278
--- /dev/null
+++ b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content-before.html.ini
@@ -0,0 +1,2 @@
+[at-supports-selector-details-content-before.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini
new file mode 100644
index 00000000000..6e22bf2f1b6
--- /dev/null
+++ b/tests/wpt/meta/css/css-conditional/at-supports-selector-details-content.html.ini
@@ -0,0 +1,2 @@
+[at-supports-selector-details-content.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini b/tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini
new file mode 100644
index 00000000000..ac733ce1164
--- /dev/null
+++ b/tests/wpt/meta/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html.ini
@@ -0,0 +1,15 @@
+[CSS-supports-details-content-pseudo-parsing.html]
+ [selector() function accepts ::details-content]
+ expected: FAIL
+
+ [selector() function accepts ::details-content followed by ::before]
+ expected: FAIL
+
+ [selector() function accepts ::details-content followed by ::first-line]
+ expected: FAIL
+
+ [selector() function accepts ::details-content followed by a state pseudo-class]
+ expected: FAIL
+
+ [selector() function accepts ::details-content followed by :lang()]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini b/tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini
new file mode 100644
index 00000000000..4f43d0e7e64
--- /dev/null
+++ b/tests/wpt/meta/css/css-flexbox/flex-shorthand-calc.html.ini
@@ -0,0 +1,12 @@
+[flex-shorthand-calc.html]
+ [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should set flex-basis]
+ expected: FAIL
+
+ [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should set flex-grow]
+ expected: FAIL
+
+ [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should set flex-shrink]
+ expected: FAIL
+
+ [e.style['flex'\] = "sign(1em - 1px) sibling-index()" should not set unrelated longhands]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini b/tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini
new file mode 100644
index 00000000000..961cc35e1fd
--- /dev/null
+++ b/tests/wpt/meta/css/css-flexbox/parsing/flex-computed.html.ini
@@ -0,0 +1,6 @@
+[flex-computed.html]
+ [Property flex value 'calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px']
+ expected: FAIL
+
+ [Property flex value '1 1 calc(10px + (sign(20cqw - 10px) * 5px))']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini b/tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini
new file mode 100644
index 00000000000..b41d365170c
--- /dev/null
+++ b/tests/wpt/meta/css/css-flexbox/parsing/flex-valid.html.ini
@@ -0,0 +1,6 @@
+[flex-valid.html]
+ [e.style['flex'\] = "calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px" should set the property value]
+ expected: FAIL
+
+ [e.style['flex'\] = "1 1 calc(10px + (sign(20cqw - 10px) * 5px))" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini
deleted file mode 100644
index 20db075c10c..00000000000
--- a/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[font-synthesis-08.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini b/tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini
new file mode 100644
index 00000000000..1d2d3f28119
--- /dev/null
+++ b/tests/wpt/meta/css/css-fonts/font-variation-settings-calc.html.ini
@@ -0,0 +1,12 @@
+[font-variation-settings-calc.html]
+ [e.style['font-variation-settings'\] = "\\"wght\\" sign(1em - 1px)" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"wght\\" sibling-index()" should set the property value]
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" sign(1em - 1px)']
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" sibling-index()']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini
new file mode 100644
index 00000000000..c7b6f64746b
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-006.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-006.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini
new file mode 100644
index 00000000000..78c144577df
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-007.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-007.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini
new file mode 100644
index 00000000000..0d707b027b1
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-008.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-008.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini
new file mode 100644
index 00000000000..47829d9a1f4
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-009.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-009.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini
new file mode 100644
index 00000000000..3604969e91b
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-010.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-010.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini
new file mode 100644
index 00000000000..a19940da849
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-011.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-011.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini
new file mode 100644
index 00000000000..9d4c60da0ee
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-012.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-012.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini
new file mode 100644
index 00000000000..e8909f26d4b
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-013.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-013.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini
new file mode 100644
index 00000000000..c6bb632ecd6
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-014.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-014.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini
new file mode 100644
index 00000000000..82c738da9f5
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/grid/grid-gap-decorations-015.html.ini
@@ -0,0 +1,2 @@
+[grid-gap-decorations-015.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
new file mode 100644
index 00000000000..efff2a2620a
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
@@ -0,0 +1,3 @@
+[grid-content-alignment-with-abspos-001.html]
+ [.grid 1]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/grid-flex-spanning-items-001.html.ini b/tests/wpt/meta/css/css-grid/grid-flex-spanning-items-001.html.ini
new file mode 100644
index 00000000000..7a85a63d258
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/grid-flex-spanning-items-001.html.ini
@@ -0,0 +1,2 @@
+[grid-flex-spanning-items-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini b/tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini
deleted file mode 100644
index 93e7786887e..00000000000
--- a/tests/wpt/meta/css/css-grid/masonry/tentative/order/masonry-order-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[masonry-order-002.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini b/tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini
new file mode 100644
index 00000000000..f4149d38b90
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/parsing/grid-area-computed.html.ini
@@ -0,0 +1,3 @@
+[grid-area-computed.html]
+ [Property grid-row-start value 'calc(10 + (sign(2cqw - 10px) * 5)) -a-']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini b/tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini
new file mode 100644
index 00000000000..baebe61217c
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/gradient/conic-gradient-001.html.ini
@@ -0,0 +1,2 @@
+[conic-gradient-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini b/tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini
new file mode 100644
index 00000000000..5378b6b6110
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/gradient/gradient-analogous-missing-components-004.html.ini
@@ -0,0 +1,2 @@
+[gradient-analogous-missing-components-004.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html.ini b/tests/wpt/meta/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html.ini
new file mode 100644
index 00000000000..1e8d1662575
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html.ini
@@ -0,0 +1,2 @@
+[block-ellipsis-012.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/root-scroll-marker.html.ini b/tests/wpt/meta/css/css-overflow/root-scroll-marker.html.ini
new file mode 100644
index 00000000000..96283113085
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/root-scroll-marker.html.ini
@@ -0,0 +1,2 @@
+[root-scroll-marker.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini
new file mode 100644
index 00000000000..02bf8170bc2
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-15.html.ini
@@ -0,0 +1,6 @@
+[scroll-marker-15.html]
+ [::scroll-marker is not activated when its originating element is not scrolled into the view]
+ expected: FAIL
+
+ [::scroll-marker is activated when its originating element is scrolled into the view]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini
new file mode 100644
index 00000000000..0d5590a9293
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-001.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-001.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini
new file mode 100644
index 00000000000..fd0d2f5788e
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-002.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-002.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini
new file mode 100644
index 00000000000..04e56713889
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-003.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-003.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini
new file mode 100644
index 00000000000..908e3e40d04
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-004.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-004.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-005.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-005.tentative.html.ini
new file mode 100644
index 00000000000..47c67ec0661
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-005.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-005.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-006.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-006.tentative.html.ini
new file mode 100644
index 00000000000..d23cf1f17aa
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-006.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-006.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-overflow/scroll-marker-contain-007.tentative.html.ini b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-007.tentative.html.ini
new file mode 100644
index 00000000000..8d4a789ac8c
--- /dev/null
+++ b/tests/wpt/meta/css/css-overflow/scroll-marker-contain-007.tentative.html.ini
@@ -0,0 +1,2 @@
+[scroll-marker-contain-007.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini b/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini
deleted file mode 100644
index e31d7aaca38..00000000000
--- a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-013.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[replaced-element-013.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini b/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini
deleted file mode 100644
index 330d09977bd..00000000000
--- a/tests/wpt/meta/css/css-sizing/aspect-ratio/replaced-element-014.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[replaced-element-014.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-computed.html.ini b/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-computed.html.ini
index bf542ffd182..d86408bb1a1 100644
--- a/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-computed.html.ini
+++ b/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-computed.html.ini
@@ -11,3 +11,14 @@
[Property transition-timing-function value 'steps(2, jump-none)']
expected: FAIL
+ [Property transition-timing-function value 'steps(calc(2 * sibling-index()), jump-none)']
+ expected: FAIL
+
+ [Property transition-timing-function value 'steps(sibling-index(), jump-none)']
+ expected: FAIL
+
+ [Property transition-timing-function value 'steps(calc(2 * sign(1em - 1000px)), jump-none)']
+ expected: FAIL
+
+ [Property transition-timing-function value 'steps(calc(2 * sign(1em - 1000px)), start)']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-valid.html.ini b/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-valid.html.ini
index ea8b877a25d..fbbded799a4 100644
--- a/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-valid.html.ini
+++ b/tests/wpt/meta/css/css-transitions/parsing/transition-timing-function-valid.html.ini
@@ -10,3 +10,6 @@
[e.style['transition-timing-function'\] = "steps(2, jump-start)" should set the property value]
expected: FAIL
+
+ [e.style['transition-timing-function'\] = "steps(sibling-index(), jump-none)" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini b/tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini
new file mode 100644
index 00000000000..2c6132a8ab9
--- /dev/null
+++ b/tests/wpt/meta/css/css-ui/cursor-calc-hotspot.html.ini
@@ -0,0 +1,6 @@
+[cursor-calc-hotspot.html]
+ [cursor hotspot with sign() depending on font relative units]
+ expected: FAIL
+
+ [cursor hotspot depending on sibling-index()]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini b/tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini
new file mode 100644
index 00000000000..519f4a685c9
--- /dev/null
+++ b/tests/wpt/meta/css/css-values/calc-complex-unresolved-serialize.html.ini
@@ -0,0 +1,27 @@
+[calc-complex-unresolved-serialize.html]
+ ['calc(pow(2, sign(1em - 18px)))' as a computed value should serialize as '2'.]
+ expected: FAIL
+
+ ['calc(pow(sign(1em - 18px), 2))' as a computed value should serialize as '1'.]
+ expected: FAIL
+
+ ['calc(pow(sign(1em - 18px), sign(1em - 18px)))' as a computed value should serialize as '1'.]
+ expected: FAIL
+
+ ['calc(pow(2, sibling-index())' as a specified value should serialize as 'calc(pow(2, sibling-index()))'.]
+ expected: FAIL
+
+ ['calc(pow(2, sibling-index())' as a computed value should serialize as '2'.]
+ expected: FAIL
+
+ ['calc(pow(sibling-index(), 2)' as a specified value should serialize as 'calc(pow(sibling-index(), 2))'.]
+ expected: FAIL
+
+ ['calc(pow(sibling-index(), 2)' as a computed value should serialize as '1'.]
+ expected: FAIL
+
+ ['calc(pow(sibling-index(), sibling-index())' as a specified value should serialize as 'calc(pow(sibling-index(), sibling-index()))'.]
+ expected: FAIL
+
+ ['calc(pow(sibling-index(), sibling-index())' as a computed value should serialize as '1'.]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/if-cycle.tentative.html.ini b/tests/wpt/meta/css/css-values/if-cycle.html.ini
index d466b92f414..174666bb97c 100644
--- a/tests/wpt/meta/css/css-values/if-cycle.tentative.html.ini
+++ b/tests/wpt/meta/css/css-values/if-cycle.html.ini
@@ -1,4 +1,4 @@
-[if-cycle.tentative.html]
+[if-cycle.html]
[CSS Values and Units Test: CSS if() function cycles 2]
expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/progress-computed.html.ini b/tests/wpt/meta/css/css-values/progress-computed.html.ini
new file mode 100644
index 00000000000..02ddc38e82a
--- /dev/null
+++ b/tests/wpt/meta/css/css-values/progress-computed.html.ini
@@ -0,0 +1,60 @@
+[progress-computed.html]
+ [progress(1, 0, 1) should be used-value-equivalent to 1]
+ expected: FAIL
+
+ [progress(progress(1, 0, 1), progress(0px, 0px, 1px), progress(1deg, 0deg, 1deg)) should be used-value-equivalent to 1]
+ expected: FAIL
+
+ [progress(sign(-10px) * 10px, (10px - 10px), 10px * progress(1deg, 0deg, 1deg)) should be used-value-equivalent to -1]
+ expected: FAIL
+
+ [calc(progress(100px, 0px, 50px) * 10px + 100px) should be used-value-equivalent to 120px]
+ expected: FAIL
+
+ [calc(progress(100, 0, sign(50px))) should be used-value-equivalent to 100]
+ expected: FAIL
+
+ [calc(progress(abs(5%), hypot(3%, 4%), 10%)) should be used-value-equivalent to 0]
+ expected: FAIL
+
+ [progress(1000em, 10em, 110em) should be used-value-equivalent to 9.9]
+ expected: FAIL
+
+ [scale(progress(1000em, 10rem, 110em)) should be used-value-equivalent to scale(9.9)]
+ expected: FAIL
+
+ [scale(progress(0em, 0rem, 0em)) should be used-value-equivalent to scale(0)]
+ expected: FAIL
+
+ [scale(progress(sign(1em - 1rem) * 1ex, 0rem, 0em)) should be used-value-equivalent to scale(0)]
+ expected: FAIL
+
+ [calc(progress(1, 0, 1) * 10px) should be used-value-equivalent to 10px]
+ expected: FAIL
+
+ [calc(progress(1, 0, 1) * 1s) should be used-value-equivalent to 1s]
+ expected: FAIL
+
+ [calc(progress(1, 0, 1) * 1deg) should be used-value-equivalent to 1deg]
+ expected: FAIL
+
+ [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 10em, 2rem, 12em) / 2) should be used-value-equivalent to 0.4]
+ expected: FAIL
+
+ [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 10) should be used-value-equivalent to 18]
+ expected: FAIL
+
+ [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 30) should be used-value-equivalent to 54]
+ expected: FAIL
+
+ [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) / 4) should be used-value-equivalent to 0.45]
+ expected: FAIL
+
+ [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 4) should be used-value-equivalent to 7]
+ expected: FAIL
+
+ [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 2) should be used-value-equivalent to 3.6]
+ expected: FAIL
+
+ [rotate3d(progress(21em, 1rem, 11em), progress(21em, 1rem, 11em), progress(21em, 1rem, 11em), calc(progress(11em, 1rem, 11em) * 2deg)) should be used-value-equivalent to rotate3d(2, 2, 2, 2deg)]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini b/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini
deleted file mode 100644
index 1c42528bac9..00000000000
--- a/tests/wpt/meta/css/css-values/progress-computed.tentative.html.ini
+++ /dev/null
@@ -1,147 +0,0 @@
-[progress-computed.tentative.html]
- [progress(1 from 0 to 1) should be used-value-equivalent to 1]
- expected: FAIL
-
- [progress(progress(1 from 0 to 1) from progress(0px from 0px to 1px) to progress(1deg from 0deg to 1deg)) should be used-value-equivalent to 1]
- expected: FAIL
-
- [progress(sign(-10px) * 10px from (10px - 10px) to 10px * progress(1deg from 0deg to 1deg)) should be used-value-equivalent to -1]
- expected: FAIL
-
- [calc(progress(100px from 0px to 50px) * 10px + 100px) should be used-value-equivalent to 120px]
- expected: FAIL
-
- [calc(progress(100 from 0 to sign(50px))) should be used-value-equivalent to 100]
- expected: FAIL
-
- [calc(progress(abs(5%) from hypot(3%, 4%) to 10%)) should be used-value-equivalent to 1]
- expected: FAIL
-
- [calc(progress(1 from 0 to 1) * 10px) should be used-value-equivalent to 10px]
- expected: FAIL
-
- [calc(progress(1 from 0 to 1) * 1s) should be used-value-equivalent to 1s]
- expected: FAIL
-
- [calc(progress(1 from 0 to 1) * 1deg) should be used-value-equivalent to 1deg]
- expected: FAIL
-
- [progress(1000em from 10em to 110em) should be used-value-equivalent to 10]
- expected: FAIL
-
- [scale(progress(1000em from 10rem to 110em)) should be used-value-equivalent to scale(10)]
- expected: FAIL
-
- [scale(progress(0em from 0rem to 0em)) should be used-value-equivalent to scale(0)]
- expected: FAIL
-
- [scale(progress(sign(1em - 1rem) * 1ex from 0rem to 0em)) should be used-value-equivalent to scale(0)]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 10em from 2rem to 12em) / 2) should be used-value-equivalent to 0.5]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 10) should be used-value-equivalent to 20]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 30) should be used-value-equivalent to 60]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) / 4) should be used-value-equivalent to 0.5]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 4) should be used-value-equivalent to 8]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 2) should be used-value-equivalent to 4]
- expected: FAIL
-
- [calc(progress(abs(5%) from hypot(3%, 4%) to 10%)) should be used-value-equivalent to 0]
- expected: FAIL
-
- [progress(1000em from 10em to 110em) should be used-value-equivalent to 9.9]
- expected: FAIL
-
- [scale(progress(1000em from 10rem to 110em)) should be used-value-equivalent to scale(9.9)]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 10em from 2rem to 12em) / 2) should be used-value-equivalent to 0.4]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 10) should be used-value-equivalent to 18]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 30) should be used-value-equivalent to 54]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) / 4) should be used-value-equivalent to 0.45]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 4) should be used-value-equivalent to 7]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px from 2rex to 10ex)) * 20em from 2rem to 12em) * 2) should be used-value-equivalent to 3.6]
- expected: FAIL
-
- [rotate3d(progress(21em from 1rem to 11em), progress(21em from 1rem to 11em), progress(21em from 1rem to 11em), calc(progress(11em from 1rem to 11em) * 2deg)) should be used-value-equivalent to rotate3d(2, 2, 2, 2deg)]
- expected: FAIL
-
- [progress(1, 0, 1) should be used-value-equivalent to 1]
- expected: FAIL
-
- [progress(progress(1, 0, 1), progress(0px, 0px, 1px), progress(1deg, 0deg, 1deg)) should be used-value-equivalent to 1]
- expected: FAIL
-
- [progress(sign(-10px) * 10px, (10px - 10px), 10px * progress(1deg, 0deg, 1deg)) should be used-value-equivalent to -1]
- expected: FAIL
-
- [calc(progress(100px, 0px, 50px) * 10px + 100px) should be used-value-equivalent to 120px]
- expected: FAIL
-
- [calc(progress(100, 0, sign(50px))) should be used-value-equivalent to 100]
- expected: FAIL
-
- [calc(progress(abs(5%), hypot(3%, 4%), 10%)) should be used-value-equivalent to 0]
- expected: FAIL
-
- [progress(1000em, 10em, 110em) should be used-value-equivalent to 9.9]
- expected: FAIL
-
- [scale(progress(1000em, 10rem, 110em)) should be used-value-equivalent to scale(9.9)]
- expected: FAIL
-
- [scale(progress(0em, 0rem, 0em)) should be used-value-equivalent to scale(0)]
- expected: FAIL
-
- [scale(progress(sign(1em - 1rem) * 1ex, 0rem, 0em)) should be used-value-equivalent to scale(0)]
- expected: FAIL
-
- [calc(progress(1, 0, 1) * 10px) should be used-value-equivalent to 10px]
- expected: FAIL
-
- [calc(progress(1, 0, 1) * 1s) should be used-value-equivalent to 1s]
- expected: FAIL
-
- [calc(progress(1, 0, 1) * 1deg) should be used-value-equivalent to 1deg]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 10em, 2rem, 12em) / 2) should be used-value-equivalent to 0.4]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 10) should be used-value-equivalent to 18]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 30) should be used-value-equivalent to 54]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) / 4) should be used-value-equivalent to 0.45]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 4) should be used-value-equivalent to 7]
- expected: FAIL
-
- [calc(progress(sign(1001em - 10lh * progress(100px, 2rex, 10ex)) * 20em, 2rem, 12em) * 2) should be used-value-equivalent to 3.6]
- expected: FAIL
-
- [rotate3d(progress(21em, 1rem, 11em), progress(21em, 1rem, 11em), progress(21em, 1rem, 11em), calc(progress(11em, 1rem, 11em) * 2deg)) should be used-value-equivalent to rotate3d(2, 2, 2, 2deg)]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/progress-serialize.html.ini b/tests/wpt/meta/css/css-values/progress-serialize.html.ini
new file mode 100644
index 00000000000..d94efb7fb44
--- /dev/null
+++ b/tests/wpt/meta/css/css-values/progress-serialize.html.ini
@@ -0,0 +1,66 @@
+[progress-serialize.html]
+ ['progress(100px, 0px, 100px)' as a specified value should serialize as 'calc(1)'.]
+ expected: FAIL
+
+ ['scale(progress(100px, 0px, 100px))' as a specified value should serialize as 'scale(calc(1))'.]
+ expected: FAIL
+
+ ['scale(progress(100px, 0px, 100px))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
+ expected: FAIL
+
+ ['progress(10em, 0px, 10em)' as a specified value should serialize as 'progress(10em, 0px, 10em)'.]
+ expected: FAIL
+
+ ['scale(progress(10em, 0px, 10em))' as a specified value should serialize as 'scale(progress(10em, 0px, 10em))'.]
+ expected: FAIL
+
+ ['scale(progress(10em, 0px, 10em))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
+ expected: FAIL
+
+ ['progress(10em, 0px, 10rem)' as a specified value should serialize as 'progress(10em, 0px, 10rem)'.]
+ expected: FAIL
+
+ ['scale(progress(10em, 0px, 10rem))' as a specified value should serialize as 'scale(progress(10em, 0px, 10rem))'.]
+ expected: FAIL
+
+ ['scale(progress(10em, 0px, 10rem))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
+ expected: FAIL
+
+ ['progress(100px, (10px - 10px), 100px)' as a specified value should serialize as 'calc(1)'.]
+ expected: FAIL
+
+ ['scale(progress(100px, (10px - 10px), 100px))' as a specified value should serialize as 'scale(calc(1))'.]
+ expected: FAIL
+
+ ['scale(progress(100px, (10px - 10px), 100px))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
+ expected: FAIL
+
+ ['progress(1%, (10% - 10%), 100%)' as a specified value should serialize as 'calc(0.01)'.]
+ expected: FAIL
+
+ ['scale(progress(1%, (10% - 10%), 100%))' as a specified value should serialize as 'scale(calc(0.01))'.]
+ expected: FAIL
+
+ ['progress(1%, (10% - 10%), 100%)' as a computed value should serialize as '0.01'.]
+ expected: FAIL
+
+ ['scale(progress(1%, (10% - 10%), 100%))' as a computed value should serialize as 'matrix(0.01, 0, 0, 0.01, 0, 0)'.]
+ expected: FAIL
+
+ ['calc(0.5 * progress(100px, 0px, 100px))' as a specified value should serialize as 'calc(0.5)'.]
+ expected: FAIL
+
+ ['scale(calc(0.5 * progress(100px, 0px, 100px)))' as a specified value should serialize as 'scale(calc(0.5))'.]
+ expected: FAIL
+
+ ['calc(0.5 * progress(100px, 0px, 100px))' as a computed value should serialize as '0.5'.]
+ expected: FAIL
+
+ ['scale(calc(0.5 * progress(100px, 0px, 100px)))' as a computed value should serialize as 'matrix(0.5, 0, 0, 0.5, 0, 0)'.]
+ expected: FAIL
+
+ ['calc(50px * progress(100px, 0px, 100px))' as a specified value should serialize as 'calc(50px)'.]
+ expected: FAIL
+
+ ['calc(1px * progress(abs(10%), (10% - 10%), 100% / 10))' as a computed value should serialize as '1px'.]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/progress-serialize.tentative.html.ini b/tests/wpt/meta/css/css-values/progress-serialize.tentative.html.ini
deleted file mode 100644
index 0adfe56c5b8..00000000000
--- a/tests/wpt/meta/css/css-values/progress-serialize.tentative.html.ini
+++ /dev/null
@@ -1,144 +0,0 @@
-[progress-serialize.tentative.html]
- ['progress(100px from 0px to 100px)' as a specified value should serialize as 'calc(1)'.]
- expected: FAIL
-
- ['scale(progress(100px from 0px to 100px))' as a specified value should serialize as 'scale(calc(1))'.]
- expected: FAIL
-
- ['scale(progress(100px from 0px to 100px))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(10em from 0px to 10em)' as a specified value should serialize as 'calc(progress(10em from 0px to 10em))'.]
- expected: FAIL
-
- ['scale(progress(10em from 0px to 10em))' as a specified value should serialize as 'scale(calc(progress(10em from 0px to 10em)))'.]
- expected: FAIL
-
- ['scale(progress(10em from 0px to 10em))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(10em from 0px to 10rem)' as a specified value should serialize as 'calc(progress(10em from 0px to 10rem))'.]
- expected: FAIL
-
- ['scale(progress(10em from 0px to 10rem))' as a specified value should serialize as 'scale(calc(progress(10em from 0px to 10rem)))'.]
- expected: FAIL
-
- ['scale(progress(10em from 0px to 10rem))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(100px from (10px - 10px) to 100px)' as a specified value should serialize as 'calc(1)'.]
- expected: FAIL
-
- ['scale(progress(100px from (10px - 10px) to 100px))' as a specified value should serialize as 'scale(calc(1))'.]
- expected: FAIL
-
- ['scale(progress(100px from (10px - 10px) to 100px))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(1% from (10% - 10%) to 100%)' as a specified value should serialize as 'calc(0.01)'.]
- expected: FAIL
-
- ['scale(progress(1% from (10% - 10%) to 100%))' as a specified value should serialize as 'scale(calc(0.01))'.]
- expected: FAIL
-
- ['progress(1% from (10% - 10%) to 100%)' as a computed value should serialize as '0.01'.]
- expected: FAIL
-
- ['scale(progress(1% from (10% - 10%) to 100%))' as a computed value should serialize as 'matrix(0.01, 0, 0, 0.01, 0, 0)'.]
- expected: FAIL
-
- ['calc(0.5 * progress(100px from 0px to 100px))' as a specified value should serialize as 'calc(0.5)'.]
- expected: FAIL
-
- ['scale(calc(0.5 * progress(100px from 0px to 100px)))' as a specified value should serialize as 'scale(calc(0.5))'.]
- expected: FAIL
-
- ['calc(0.5 * progress(100px from 0px to 100px))' as a computed value should serialize as '0.5'.]
- expected: FAIL
-
- ['scale(calc(0.5 * progress(100px from 0px to 100px)))' as a computed value should serialize as 'matrix(0.5, 0, 0, 0.5, 0, 0)'.]
- expected: FAIL
-
- ['calc(50px * progress(100px from 0px to 100px))' as a specified value should serialize as 'calc(50px)'.]
- expected: FAIL
-
- ['calc(1px * progress(abs(10%) from (10% - 10%) to 100% / 10))' as a computed value should serialize as '1px'.]
- expected: FAIL
-
- ['progress(10em from 0px to 10em)' as a specified value should serialize as 'progress(10em from 0px to 10em)'.]
- expected: FAIL
-
- ['scale(progress(10em from 0px to 10em))' as a specified value should serialize as 'scale(progress(10em from 0px to 10em))'.]
- expected: FAIL
-
- ['progress(10em from 0px to 10rem)' as a specified value should serialize as 'progress(10em from 0px to 10rem)'.]
- expected: FAIL
-
- ['scale(progress(10em from 0px to 10rem))' as a specified value should serialize as 'scale(progress(10em from 0px to 10rem))'.]
- expected: FAIL
-
- ['progress(100px, 0px, 100px)' as a specified value should serialize as 'calc(1)'.]
- expected: FAIL
-
- ['scale(progress(100px, 0px, 100px))' as a specified value should serialize as 'scale(calc(1))'.]
- expected: FAIL
-
- ['scale(progress(100px, 0px, 100px))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(10em, 0px, 10em)' as a specified value should serialize as 'progress(10em, 0px, 10em)'.]
- expected: FAIL
-
- ['scale(progress(10em, 0px, 10em))' as a specified value should serialize as 'scale(progress(10em, 0px, 10em))'.]
- expected: FAIL
-
- ['scale(progress(10em, 0px, 10em))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(10em, 0px, 10rem)' as a specified value should serialize as 'progress(10em, 0px, 10rem)'.]
- expected: FAIL
-
- ['scale(progress(10em, 0px, 10rem))' as a specified value should serialize as 'scale(progress(10em, 0px, 10rem))'.]
- expected: FAIL
-
- ['scale(progress(10em, 0px, 10rem))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(100px, (10px - 10px), 100px)' as a specified value should serialize as 'calc(1)'.]
- expected: FAIL
-
- ['scale(progress(100px, (10px - 10px), 100px))' as a specified value should serialize as 'scale(calc(1))'.]
- expected: FAIL
-
- ['scale(progress(100px, (10px - 10px), 100px))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.]
- expected: FAIL
-
- ['progress(1%, (10% - 10%), 100%)' as a specified value should serialize as 'calc(0.01)'.]
- expected: FAIL
-
- ['scale(progress(1%, (10% - 10%), 100%))' as a specified value should serialize as 'scale(calc(0.01))'.]
- expected: FAIL
-
- ['progress(1%, (10% - 10%), 100%)' as a computed value should serialize as '0.01'.]
- expected: FAIL
-
- ['scale(progress(1%, (10% - 10%), 100%))' as a computed value should serialize as 'matrix(0.01, 0, 0, 0.01, 0, 0)'.]
- expected: FAIL
-
- ['calc(0.5 * progress(100px, 0px, 100px))' as a specified value should serialize as 'calc(0.5)'.]
- expected: FAIL
-
- ['scale(calc(0.5 * progress(100px, 0px, 100px)))' as a specified value should serialize as 'scale(calc(0.5))'.]
- expected: FAIL
-
- ['calc(0.5 * progress(100px, 0px, 100px))' as a computed value should serialize as '0.5'.]
- expected: FAIL
-
- ['scale(calc(0.5 * progress(100px, 0px, 100px)))' as a computed value should serialize as 'matrix(0.5, 0, 0, 0.5, 0, 0)'.]
- expected: FAIL
-
- ['calc(50px * progress(100px, 0px, 100px))' as a specified value should serialize as 'calc(50px)'.]
- expected: FAIL
-
- ['calc(1px * progress(abs(10%), (10% - 10%), 100% / 10))' as a computed value should serialize as '1px'.]
- expected: FAIL
diff --git a/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input-svg.html.ini b/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input-svg.html.ini
new file mode 100644
index 00000000000..4d79845c12c
--- /dev/null
+++ b/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input-svg.html.ini
@@ -0,0 +1,2 @@
+[feComposite-intersection-feTile-input-svg.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini b/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini
new file mode 100644
index 00000000000..6fff47b1875
--- /dev/null
+++ b/tests/wpt/meta/css/filter-effects/feComposite-intersection-feTile-input.html.ini
@@ -0,0 +1,2 @@
+[feComposite-intersection-feTile-input.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/nodes/moveBefore/tentative/focus-preserve.html.ini b/tests/wpt/meta/dom/nodes/moveBefore/focus-preserve.html.ini
index f51e042347f..f51e042347f 100644
--- a/tests/wpt/meta/dom/nodes/moveBefore/tentative/focus-preserve.html.ini
+++ b/tests/wpt/meta/dom/nodes/moveBefore/focus-preserve.html.ini
diff --git a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini
index d471ef76873..a02fcf871ab 100644
--- a/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini
+++ b/tests/wpt/meta/fetch/metadata/generated/css-font-face.https.sub.tentative.html.ini
@@ -44,9 +44,6 @@
[sec-fetch-mode]
expected: FAIL
- [sec-fetch-user]
- expected: FAIL
-
[sec-fetch-dest]
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
index 277436ffad2..1bca09f21d6 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
@@ -1,3 +1,9 @@
[iframe-src-aboutblank-navigate-immediately.html]
[Navigating to a different document with window.open]
expected: FAIL
+
+ [Navigating to a different document with link click]
+ expected: FAIL
+
+ [Navigating to a different document with form submission]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
new file mode 100644
index 00000000000..5cdcce07c65
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.disconnected.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini
new file mode 100644
index 00000000000..069e5f18a03
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.html.ini
@@ -0,0 +1,3 @@
+[2d.text.measure.lang.html]
+ [Testing the lang attribute]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini
new file mode 100644
index 00000000000..22dc67b5974
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/text/2d.text.measure.lang.inherit.html.ini
@@ -0,0 +1,3 @@
+[2d.text.measure.lang.inherit.html]
+ [Testing the lang attribute]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini
new file mode 100644
index 00000000000..1d927b88e05
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.offscreen.lang.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini
new file mode 100644
index 00000000000..b89123e21a2
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.lang.inherit.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.offscreen.lang.inherit.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini
new file mode 100644
index 00000000000..2303d27219f
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.offscreen.transferred.lang.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini
new file mode 100644
index 00000000000..14cb2ad57df
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.document.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.offscreen.transferred.lang.inherit.document.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini
new file mode 100644
index 00000000000..3c2d2b828f8
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/manual/text/canvas.2d.offscreen.transferred.lang.inherit.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.offscreen.transferred.lang.inherit.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini
new file mode 100644
index 00000000000..069e5f18a03
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.html.ini
@@ -0,0 +1,3 @@
+[2d.text.measure.lang.html]
+ [Testing the lang attribute]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini
new file mode 100644
index 00000000000..22dc67b5974
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html.ini
@@ -0,0 +1,3 @@
+[2d.text.measure.lang.inherit.html]
+ [Testing the lang attribute]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini
new file mode 100644
index 00000000000..39980cbd9b7
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/text/2d.text.measure.lang.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.text.measure.lang.worker.html]
+ [Testing the lang attribute]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini
new file mode 100644
index 00000000000..50950d2751b
--- /dev/null
+++ b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-01.html.ini
@@ -0,0 +1,9 @@
+[nameditem-01.html]
+ [img elements that have a name and id attribute with same value.]
+ expected: FAIL
+
+ [Dynamically updating the name attribute from img elements, should be accessible by values.]
+ expected: FAIL
+
+ [Dynamically updating the id attribute from img elements, should be accessible by values.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini
index 704c73f2085..bc9680580ee 100644
--- a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini
+++ b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-05.html.ini
@@ -13,3 +13,15 @@
[An id shouldn't affect getting an embed by name]
expected: FAIL
+
+ [Dynamically removing the name attribute from embed elements, should not be accessible.]
+ expected: FAIL
+
+ [Dynamically updating the name attribute from embed elements, should be accessible by its name.]
+ expected: FAIL
+
+ [Dynamically updating the id attribute from embed elements, should be accessible only by its name.]
+ expected: FAIL
+
+ [embed elements that is removed, should not be accessible.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini
index 2829186d845..b23c03a5a9b 100644
--- a/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini
+++ b/tests/wpt/meta/html/dom/documents/dom-tree-accessors/nameditem-07.html.ini
@@ -22,3 +22,18 @@
[An id shouldn't affect getting an object by name]
expected: FAIL
+
+ [Dynamically removing the name attribute from object elements, should not be accessible.]
+ expected: FAIL
+
+ [Dynamically removing the id attribute from object elements, should not be accessible.]
+ expected: FAIL
+
+ [Dynamically updating the name attribute from object elements, should be accessible by its name and id.]
+ expected: FAIL
+
+ [Dynamically updating the id attribute from object elements, should be accessible by its name and id.]
+ expected: FAIL
+
+ [object elements that is removed, should not be accessible.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini
new file mode 100644
index 00000000000..0193f3ac3ab
--- /dev/null
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-040.html.ini
@@ -0,0 +1,3 @@
+[element-render-blocking-040.html]
+ [blocking defers frames until full parsing]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini
new file mode 100644
index 00000000000..34e1dea6d54
--- /dev/null
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-041.html.ini
@@ -0,0 +1,3 @@
+[element-render-blocking-041.html]
+ [blocking defers frames until full parsing]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini b/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini
deleted file mode 100644
index c8a80140995..00000000000
--- a/tests/wpt/meta/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[structured-cloning-error-stack-optional.sub.window.html]
- [web API-created TypeError (structuredClone())]
- expected: FAIL
-
- [web API-created TypeError (worker)]
- expected: FAIL
-
- [web API-created TypeError (cross-site iframe)]
- expected: FAIL
-
- [web API-created TypeError (same-origin iframe)]
- expected: FAIL
diff --git a/tests/wpt/meta/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html.ini b/tests/wpt/meta/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html.ini
new file mode 100644
index 00000000000..9ac1f15f243
--- /dev/null
+++ b/tests/wpt/meta/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html.ini
@@ -0,0 +1,2 @@
+[lists-styles-quirks.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini b/tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini
new file mode 100644
index 00000000000..d0b62d151b9
--- /dev/null
+++ b/tests/wpt/meta/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html.ini
@@ -0,0 +1,2 @@
+[option-label-whitespace-2.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.html.ini b/tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.html.ini
deleted file mode 100644
index 02d9bcc43ae..00000000000
--- a/tests/wpt/meta/html/rendering/widgets/field-sizing-textarea-relayout.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[field-sizing-textarea-relayout.html]
- expected: FAIL
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 24903b5f66f..d7d0d3ef89d 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,4 +1,4 @@
[iframe_sandbox_popups_escaping-1.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/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
index d5fd800f09d..ff6467094b8 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -1,4 +1,3 @@
[iframe_sandbox_popups_nonescaping-3.html]
- expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-loading-lazy-subframe-detached-crash.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-loading-lazy-subframe-detached-crash.html.ini
deleted file mode 100644
index 396e716c857..00000000000
--- a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/image-loading-lazy-subframe-detached-crash.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[image-loading-lazy-subframe-detached-crash.html]
- expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html.ini
deleted file mode 100644
index 05aa7ddc17f..00000000000
--- a/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[option-computed-style.tentative.html]
- [appearance:base-select options should have a checkmark with empty alt text.]
- expected: FAIL
diff --git a/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini b/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini
index 20d32f43049..8f5647c3490 100644
--- a/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini
+++ b/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini
@@ -16,3 +16,6 @@
[Reload fetchStart > Original fetchStart]
expected: FAIL
+
+ [Reload domContentLoadedEventEnd > Original domContentLoadedEventEnd]
+ expected: FAIL
diff --git a/tests/wpt/meta/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html.ini b/tests/wpt/meta/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html.ini
index 842fc01b392..08b5cda5aed 100644
--- a/tests/wpt/meta/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html.ini
+++ b/tests/wpt/meta/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html.ini
@@ -7,3 +7,27 @@
[modify createRange() range added to selection before setStart/setEnd calls.]
expected: FAIL
+
+ [modify getRangeAt() range: setStart() to disconnected node will collapse and remove the live range from the selection.]
+ expected: FAIL
+
+ [modify getRangeAt() range: setEnd() crosses shadow boundary into the shadow DOM and after start, which collapses live range. Composed selection range is not collapsed.]
+ expected: FAIL
+
+ [modify getRangeAt() range: setStart() crosses shadow boundary into the shadow DOM and before end, which collapses live range. Composed selection range is not collapsed.]
+ expected: FAIL
+
+ [modify getRangeAt() range: setStart() crosses shadow boundary into the shadow DOM and after end, which collapses both live range and composed selection range.]
+ expected: FAIL
+
+ [modify getRangeAt() range: selectNode() innerHost for all ranges.]
+ expected: FAIL
+
+ [modify getRangeAt() range: collapse() collapses all ranges.]
+ expected: FAIL
+
+ [modify createRange() range: adding to selection sets the selection]
+ expected: FAIL
+
+ [modify createRange() range: added to selection before setStart/setEnd calls.]
+ expected: FAIL
diff --git a/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini b/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini
index 68b6e50ddde..5e485daa4cb 100644
--- a/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini
+++ b/tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini
@@ -10,3 +10,12 @@
[ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE= malformed-thing ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=]
expected: FAIL
+
+ [ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=]
+ expected: FAIL
+
+ [ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE=]
+ expected: FAIL
+
+ [ed25519-JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs= malformed-thing ed25519-xDnP380zcL4rJ76rXYjeHlfMyPZEOqpJYjsjEppbuXE=]
+ expected: FAIL
diff --git a/tests/wpt/meta/subresource-integrity/signatures/tentative/scheme.window.js.ini b/tests/wpt/meta/subresource-integrity/signatures/tentative/scheme.window.js.ini
new file mode 100644
index 00000000000..23ca991ab0f
--- /dev/null
+++ b/tests/wpt/meta/subresource-integrity/signatures/tentative/scheme.window.js.ini
@@ -0,0 +1,12 @@
+[scheme.window.html]
+ [`fetch()`: Valid signature (signature=:WZp87p7X3ELfgIKL/qxsY/CT6XArMvZRaxcJ3uy1QklEcLf0c8tol2+W2pvaXX4jnd7hGevFVkzWE77rCOIzAA==:), matching integrity check: loads.]
+ expected: FAIL
+
+ [`fetch()`: Valid signature (signature=:WZp87p7X3ELfgIKL/qxsY/CT6XArMvZRaxcJ3uy1QklEcLf0c8tol2+W2pvaXX4jnd7hGevFVkzWE77rCOIzAA==:), mismatched integrity check: blocked.]
+ expected: FAIL
+
+ [`fetch()`: Valid signature (signature=:lMzR8lIXYG0Iz0MmTXcRTcBfNw6TgBAPfaNLAU1LzsxWC5dlez8SNe7aCW7avHTWKgaqTGBCMW1LgxkHlijgDA==:), matching integrity check: loads.]
+ expected: FAIL
+
+ [`fetch()`: Valid signature (signature=:lMzR8lIXYG0Iz0MmTXcRTcBfNw6TgBAPfaNLAU1LzsxWC5dlez8SNe7aCW7avHTWKgaqTGBCMW1LgxkHlijgDA==:), mismatched integrity check: blocked.]
+ expected: FAIL
diff --git a/tests/wpt/meta/subresource-integrity/signatures/tentative/unknown-parameter.window.js.ini b/tests/wpt/meta/subresource-integrity/signatures/tentative/unknown-parameter.window.js.ini
new file mode 100644
index 00000000000..8da42df9bbb
--- /dev/null
+++ b/tests/wpt/meta/subresource-integrity/signatures/tentative/unknown-parameter.window.js.ini
@@ -0,0 +1,18 @@
+[unknown-parameter.window.html]
+ [`fetch()`: Valid signature (signature=:eZ2DGIHUsTNMxFReOMkbOrTmn+CqDckCZ5/635x1Apl2ws0nA+qZcHqZFMdjBvcGw0WElh3zYD0ynkQ+cHiWCA==:), matching integrity check: loads.]
+ expected: FAIL
+
+ [`fetch()`: Valid signature (signature=:eZ2DGIHUsTNMxFReOMkbOrTmn+CqDckCZ5/635x1Apl2ws0nA+qZcHqZFMdjBvcGw0WElh3zYD0ynkQ+cHiWCA==:), mismatched integrity check: blocked.]
+ expected: FAIL
+
+ [`<script>`: Valid signature (signature=:eZ2DGIHUsTNMxFReOMkbOrTmn+CqDckCZ5/635x1Apl2ws0nA+qZcHqZFMdjBvcGw0WElh3zYD0ynkQ+cHiWCA==:), mismatched integrity check: blocked.]
+ expected: FAIL
+
+ [`fetch()`: Valid signature (signature=:YXQH8lkKBcGOMNSFbS56j3d5nK3j15HbFPIdsljzQVGFFd93T6FmXb2cLsoINYQbnMUOQBSROIzFZpgUQTBTBA==:), matching integrity check: loads.]
+ expected: FAIL
+
+ [`fetch()`: Valid signature (signature=:YXQH8lkKBcGOMNSFbS56j3d5nK3j15HbFPIdsljzQVGFFd93T6FmXb2cLsoINYQbnMUOQBSROIzFZpgUQTBTBA==:), mismatched integrity check: blocked.]
+ expected: FAIL
+
+ [`<script>`: Valid signature (signature=:YXQH8lkKBcGOMNSFbS56j3d5nK3j15HbFPIdsljzQVGFFd93T6FmXb2cLsoINYQbnMUOQBSROIzFZpgUQTBTBA==:), mismatched integrity check: blocked.]
+ expected: FAIL
diff --git a/tests/wpt/meta/urlpattern/urlpattern.any.js.ini b/tests/wpt/meta/urlpattern/urlpattern.any.js.ini
index 3b0e472f943..be36ea30ecd 100644
--- a/tests/wpt/meta/urlpattern/urlpattern.any.js.ini
+++ b/tests/wpt/meta/urlpattern/urlpattern.any.js.ini
@@ -1001,6 +1001,21 @@
[Pattern: [{"pathname":"/([\\\\d&&[0-1\]\])"}\] Inputs: [{"pathname":"/3"}\]]
expected: FAIL
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"8\\t0"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80?x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80\\\\x"}\]]
+ expected: FAIL
+
+ [Pattern: ["https://{sub.}?example{.com/}foo"\] Inputs: ["https://example.com/foo"\]]
+ expected: FAIL
+
[urlpattern.any.sharedworker.html]
expected: ERROR
@@ -2008,6 +2023,21 @@
[Pattern: [{"pathname":"/([\\\\d&&[0-1\]\])"}\] Inputs: [{"pathname":"/3"}\]]
expected: FAIL
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"8\\t0"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80?x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80\\\\x"}\]]
+ expected: FAIL
+
+ [Pattern: ["https://{sub.}?example{.com/}foo"\] Inputs: ["https://example.com/foo"\]]
+ expected: FAIL
+
[urlpattern.any.serviceworker.html]
expected: ERROR
diff --git a/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini b/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini
index 50c6b25ba0b..af6b939ea68 100644
--- a/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini
+++ b/tests/wpt/meta/urlpattern/urlpattern.https.any.js.ini
@@ -1004,6 +1004,21 @@
[Pattern: [{"pathname":"/([\\\\d&&[0-1\]\])"}\] Inputs: [{"pathname":"/3"}\]]
expected: FAIL
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"8\\t0"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80?x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80\\\\x"}\]]
+ expected: FAIL
+
+ [Pattern: ["https://{sub.}?example{.com/}foo"\] Inputs: ["https://example.com/foo"\]]
+ expected: FAIL
+
[urlpattern.https.any.worker.html]
[Pattern: [{"pathname":"/foo/bar"}\] Inputs: [{"pathname":"/foo/bar"}\]]
@@ -2008,6 +2023,21 @@
[Pattern: [{"pathname":"/([\\\\d&&[0-1\]\])"}\] Inputs: [{"pathname":"/3"}\]]
expected: FAIL
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"8\\t0"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80?x"}\]]
+ expected: FAIL
+
+ [Pattern: [{"port":"80"}\] Inputs: [{"port":"80\\\\x"}\]]
+ expected: FAIL
+
+ [Pattern: ["https://{sub.}?example{.com/}foo"\] Inputs: ["https://example.com/foo"\]]
+ expected: FAIL
+
[urlpattern.https.any.serviceworker.html]
expected: ERROR
diff --git a/tests/wpt/meta/webxr/idlharness.https.window.js.ini b/tests/wpt/meta/webxr/idlharness.https.window.js.ini
index 4ca151762fe..e8e048ea6ab 100644
--- a/tests/wpt/meta/webxr/idlharness.https.window.js.ini
+++ b/tests/wpt/meta/webxr/idlharness.https.window.js.ini
@@ -235,3 +235,9 @@
[XRSession interface: xrSession must inherit property "trackedSources" with the proper type]
expected: FAIL
+
+ [XRRenderState interface: attribute passthroughFullyObscured]
+ expected: FAIL
+
+ [XRRenderState interface: xrRenderState must inherit property "passthroughFullyObscured" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/meta/workers/constructors/Worker/Worker-constructor.html.ini
deleted file mode 100644
index 80f9a4f15b8..00000000000
--- a/tests/wpt/meta/workers/constructors/Worker/Worker-constructor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[Worker-constructor.html]
- expected: ERROR
diff --git a/tests/wpt/tests/.github/workflows/check-workflow-run.yml b/tests/wpt/tests/.github/workflows/check-workflow-run.yml
index 0487f03a592..7afc1678105 100644
--- a/tests/wpt/tests/.github/workflows/check-workflow-run.yml
+++ b/tests/wpt/tests/.github/workflows/check-workflow-run.yml
@@ -16,8 +16,7 @@ jobs:
check-workflow-run:
name: "Check for appropriate epochs"
if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' }}
- runs-on:
- - ubuntu-22.04
+ runs-on: ubuntu-24.04
permissions:
actions: read
outputs:
@@ -49,7 +48,6 @@ jobs:
check-workflow-run-noop:
name: "Check for appropriate epochs (noop)"
if: ${{ github.event_name != 'workflow_run' }}
- runs-on:
- - ubuntu-22.04
+ runs-on: ubuntu-24.04
steps:
- run: exit 0
diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml
index 6d5c7c79a05..66794b69aba 100644
--- a/tests/wpt/tests/.github/workflows/docker.yml
+++ b/tests/wpt/tests/.github/workflows/docker.yml
@@ -14,7 +14,7 @@ on:
jobs:
docker-publish:
name: Publish Docker image
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
permissions:
contents: read
packages: write
@@ -26,7 +26,7 @@ jobs:
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
# Based on https://docs.github.com/en/actions/publishing-packages/publishing-docker-images.
- name: Log in to the Container registry
- uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0
+ uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
diff --git a/tests/wpt/tests/.github/workflows/documentation.yml b/tests/wpt/tests/.github/workflows/documentation.yml
index f7e9fb2e135..6c92e435c69 100644
--- a/tests/wpt/tests/.github/workflows/documentation.yml
+++ b/tests/wpt/tests/.github/workflows/documentation.yml
@@ -2,11 +2,7 @@ name: documentation
on:
push:
branches:
- - master
- paths:
- - 'docs/**'
- - 'resources/**'
- - 'tools/**'
+ - ubuntu-24.04
pull_request:
paths:
- 'docs/**'
@@ -14,7 +10,7 @@ on:
- 'tools/**'
jobs:
build-and-publish:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
if: github.repository == 'web-platform-tests/wpt'
steps:
- name: Set up Python
@@ -34,4 +30,4 @@ jobs:
- name: Run website_build.sh
run: ./tools/ci/website_build.sh
env:
- DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
+ DEPLOY_TOKEN: dummy
diff --git a/tests/wpt/tests/.github/workflows/epochs.yml b/tests/wpt/tests/.github/workflows/epochs.yml
index 8b2081364e5..fa88b50ff3f 100644
--- a/tests/wpt/tests/.github/workflows/epochs.yml
+++ b/tests/wpt/tests/.github/workflows/epochs.yml
@@ -6,7 +6,7 @@ on:
- cron: 10 */3 * * *
jobs:
update:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
if: github.repository == 'web-platform-tests/wpt'
steps:
- name: Checkout
diff --git a/tests/wpt/tests/.github/workflows/interfaces.yml b/tests/wpt/tests/.github/workflows/interfaces.yml
index 302e0a846d8..c3deb7c0b7d 100644
--- a/tests/wpt/tests/.github/workflows/interfaces.yml
+++ b/tests/wpt/tests/.github/workflows/interfaces.yml
@@ -6,7 +6,7 @@ on:
workflow_dispatch:
jobs:
update:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
if: github.repository == 'web-platform-tests/wpt'
steps:
- name: Checkout
diff --git a/tests/wpt/tests/.github/workflows/manifest.yml b/tests/wpt/tests/.github/workflows/manifest.yml
index a27fc2258de..4ac2c8b2700 100644
--- a/tests/wpt/tests/.github/workflows/manifest.yml
+++ b/tests/wpt/tests/.github/workflows/manifest.yml
@@ -8,7 +8,7 @@ on:
- 'tools/**'
jobs:
build-and-tag:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
if: github.repository == 'web-platform-tests/wpt'
steps:
- name: Set up Python
diff --git a/tests/wpt/tests/.github/workflows/regen_certs.yml b/tests/wpt/tests/.github/workflows/regen_certs.yml
index b66ba90065f..d60c6b04b30 100644
--- a/tests/wpt/tests/.github/workflows/regen_certs.yml
+++ b/tests/wpt/tests/.github/workflows/regen_certs.yml
@@ -7,7 +7,7 @@ on:
workflow_dispatch:
jobs:
update:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
if: github.repository == 'web-platform-tests/wpt'
steps:
- name: Set up Python
diff --git a/tests/wpt/tests/.github/workflows/update-wasm-tests.yml b/tests/wpt/tests/.github/workflows/update-wasm-tests.yml
index 283e6e72878..d1aafdcb124 100644
--- a/tests/wpt/tests/.github/workflows/update-wasm-tests.yml
+++ b/tests/wpt/tests/.github/workflows/update-wasm-tests.yml
@@ -8,7 +8,7 @@ on:
jobs:
build-wpt:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-24.04
steps:
- name: Checkout WPT repo
uses: actions/checkout@v4
diff --git a/tests/wpt/tests/.github/workflows/wpt_fyi_notify.yml b/tests/wpt/tests/.github/workflows/wpt_fyi_notify.yml
index c0661366418..8e9a043f2c3 100644
--- a/tests/wpt/tests/.github/workflows/wpt_fyi_notify.yml
+++ b/tests/wpt/tests/.github/workflows/wpt_fyi_notify.yml
@@ -8,8 +8,7 @@ on:
jobs:
wpt-fyi-notify:
name: "Notify wpt.fyi"
- runs-on:
- - ubuntu-22.04
+ runs-on: ubuntu-24.04
steps:
- name: "wpt.fyi"
uses: fjogeleit/http-request-action@v1
diff --git a/tests/wpt/tests/accname/META.yml b/tests/wpt/tests/accname/META.yml
index 7f538628e8c..77520928494 100644
--- a/tests/wpt/tests/accname/META.yml
+++ b/tests/wpt/tests/accname/META.yml
@@ -4,3 +4,4 @@ suggested_reviewers:
- spectranaut
- jnurthen
- melsumner
+ - sideshowbarker
diff --git a/tests/wpt/tests/accname/manual/description_test_case_557-manual.html b/tests/wpt/tests/accname/manual/description_test_case_557-manual.html
index 1294baf6571..e228f857ac4 100644
--- a/tests/wpt/tests/accname/manual/description_test_case_557-manual.html
+++ b/tests/wpt/tests/accname/manual/description_test_case_557-manual.html
@@ -2,7 +2,7 @@
<html>
<head>
<title>Description test case 557</title>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <meta charset="utf-8">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html b/tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html
index 8dd685d990a..5f76d59eb35 100644
--- a/tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html
+++ b/tests/wpt/tests/ai/language_detection/availability-detached-crash.tentative.https.html
@@ -5,7 +5,7 @@
<body>
<iframe src="about:blank"></iframe>
<script>
-const factory = frames[0].ai.languageDetector;
+const factory = frames[0].LanguageDetector;
const detector = factory.create();
document.getElementsByTagName("iframe")[0].remove();
detector.availability();
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 337f11d338d..d54d0110be0 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
@@ -6,13 +6,13 @@
promise_test(async t => {
// Language detection is available after call to `create()`.
- await ai.languageDetector.create();
- const availability = await ai.languageDetector.availability();
+ await LanguageDetector.create();
+ const availability = await LanguageDetector.availability();
assert_equals(availability, 'available');
-}, 'Simple AILanguageDetector.availability() call');
+}, 'Simple LanguageDetector.availability() call');
promise_test(async t => {
- const detector = await ai.languageDetector.create();
+ const detector = await LanguageDetector.create();
const results = await detector.detect('this string is in English');
// "en" should be highest confidence.
assert_equals(results[0].detectedLanguage, 'en');
@@ -20,31 +20,73 @@ promise_test(async t => {
for (let i = 0; i < results.length - 1; i++) {
assert_greater_than_equal(results[i].confidence, results[i + 1].confidence);
}
-}, 'Simple AILanguageDetector.detect() call');
+}, 'Simple LanguageDetector.detect() call');
promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const createPromise = ai.languageDetector.create({signal: controller.signal});
+ const createPromise = LanguageDetector.create({signal: controller.signal});
await promise_rejects_dom(t, 'AbortError', createPromise);
-}, 'AILanguageDetectorFactory.create() call with an aborted signal.');
+}, 'LanguageDetector.create() call with an aborted signal.');
+
+promise_test(async t => {
+ await testAbortPromise(t, signal => {
+ return LanguageDetector.create({signal});
+ });
+}, 'Aborting LanguageDetector.create().');
promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const detector = await ai.languageDetector.create();
+ const detector = await LanguageDetector.create();
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.');
+}, 'LanguageDetector.detect() call with an aborted signal.');
promise_test(async t => {
- const detector = await ai.languageDetector.create();
+ const detector = await LanguageDetector.create();
await testAbortPromise(t, signal => {
return detector.detect('this string is in English', {signal});
});
-}, 'Aborting AILanguageDetector.detect().');
+}, 'Aborting LanguageDetector.detect().');
+
+promise_test(async t => {
+ const detector = await LanguageDetector.create();
+
+ const text = 'this string is in English';
+ const inputUsage = await detector.measureInputUsage(text);
+
+ assert_greater_than_equal(detector.inputQuota, 0);
+ assert_greater_than_equal(inputUsage, 0);
+
+ const detectPromise = detector.detect(text);
+
+ if (inputUsage < detector.inputQuota) {
+ assert_equals((await detectPromise)[0].detectedLanguage, 'en');
+ } else {
+ await promise_rejects_dom(t, 'QuotaExceededError', detectPromise);
+ }
+}, 'LanguageDetector.measureInputUsage() and inputQuota basic usage.');
+
+promise_test(async t => {
+ const controller = new AbortController();
+ controller.abort();
+
+ const detector = await LanguageDetector.create();
+ const measureInputUsagePromise =
+ detector.measureInputUsage('hello', {signal: controller.signal});
+
+ await promise_rejects_dom(t, 'AbortError', measureInputUsagePromise);
+}, 'Translator.measureInputUsage() call with an aborted signal.');
+
+promise_test(async t => {
+ const detector = await LanguageDetector.create();
+ await testAbortPromise(t, signal => {
+ return detector.measureInputUsage('hello', {signal});
+ });
+}, 'Aborting Translator.measureInputUsage().');
diff --git a/tests/wpt/tests/ai/translator/ai_translator_bad_input.tentative.https.any.js b/tests/wpt/tests/ai/translator/ai_translator_bad_input.tentative.https.any.js
deleted file mode 100644
index 980d3c0f697..00000000000
--- a/tests/wpt/tests/ai/translator/ai_translator_bad_input.tentative.https.any.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// META: title=translator.create without options do not crash
-// META: global=window,worker
-// META: timeout=long
-//
-// Setting `timeout=long` as this test may require downloading the translation
-// library and the language models.
-
-'use strict';
-
-promise_test(async t => {
- await promise_rejects_js(
- t, TypeError, ai.translator.create(/*empty options*/));
-}, 'AITranslatorFactory.create rejects with TypeError if no options are passed.');
-
-promise_test(async t => {
- await promise_rejects_js(
- t, TypeError, ai.translator.create({sourceLanguage: 'en'}));
-}, 'AITranslatorFactory.create rejects with TypeError targetLanguage is not provided.');
-
-promise_test(async t => {
- await promise_rejects_js(
- t, TypeError, ai.translator.create({targetLanguage: 'en'}));
-}, 'AITranslatorFactory.create rejects with TypeError sourceLanguage is not provided.');
diff --git a/tests/wpt/tests/ai/translator/translator_bad_input.tentative.https.any.js b/tests/wpt/tests/ai/translator/translator_bad_input.tentative.https.any.js
new file mode 100644
index 00000000000..2879543f29a
--- /dev/null
+++ b/tests/wpt/tests/ai/translator/translator_bad_input.tentative.https.any.js
@@ -0,0 +1,23 @@
+// META: title=translator.create without options do not crash
+// META: global=window,worker
+// META: timeout=long
+//
+// Setting `timeout=long` as this test may require downloading the translation
+// library and the language models.
+
+'use strict';
+
+promise_test(async t => {
+ await promise_rejects_js(
+ t, TypeError, Translator.create(/*empty options*/));
+}, 'Translator.create rejects with TypeError if no options are passed.');
+
+promise_test(async t => {
+ await promise_rejects_js(
+ t, TypeError, Translator.create({sourceLanguage: 'en'}));
+}, 'Translator.create rejects with TypeError targetLanguage is not provided.');
+
+promise_test(async t => {
+ await promise_rejects_js(
+ t, TypeError, Translator.create({targetLanguage: 'en'}));
+}, 'Translator.create rejects with TypeError sourceLanguage is not provided.');
diff --git a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js b/tests/wpt/tests/ai/translator/translator_translate.tentative.https.any.js
index 729cb04fb76..5a800c00c69 100644
--- a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
+++ b/tests/wpt/tests/ai/translator/translator_translate.tentative.https.any.js
@@ -12,7 +12,7 @@
async function createTranslator(options) {
return await test_driver.bless('Create translator', async () => {
- return await ai.translator.create(options);
+ return await Translator.create(options);
});
}
@@ -21,25 +21,25 @@ promise_test(async t => {
// Creating the translator without user activation rejects with
// NotAllowedError.
- const createPromise = ai.translator.create(languagePair);
+ const createPromise = Translator.create(languagePair);
await promise_rejects_dom(t, 'NotAllowedError', createPromise);
// Creating the translator with user activation succeeds.
await createTranslator(languagePair);
// Creating it should have switched it to available.
- const availability = await ai.translator.availability(languagePair);
+ const availability = await Translator.availability(languagePair);
assert_equals(availability, 'available');
// 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.');
+ await Translator.create(languagePair);
+}, 'Translator.create() requires user activation when availability is "downloadable.');
promise_test(async t => {
const translator =
await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'});
assert_equals(await translator.translate('hello'), 'こんにちは');
-}, 'Simple AITranslator.translate() call');
+}, 'Simple Translator.translate() call');
promise_test(async () => {
const translator =
@@ -53,14 +53,14 @@ promise_test(async () => {
result += chunk;
}
assert_equals(await translator.translate('hello'), 'こんにちは');
-}, 'Simple AITranslator.translateStreaming() call');
+}, 'Simple Translator.translateStreaming() call');
promise_test(async t => {
const translator =
await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'});
assert_equals(translator.sourceLanguage, 'en');
assert_equals(translator.targetLanguage, 'ja');
-}, 'AITranslator: sourceLanguage and targetLanguage are equal to their respective option passed in to AITranslatorFactory.create.')
+}, 'Translator: sourceLanguage and targetLanguage are equal to their respective option passed in to Translator.create.');
promise_test(async (t) => {
const translator =
@@ -68,7 +68,7 @@ promise_test(async (t) => {
translator.destroy();
await promise_rejects_dom(
t, 'InvalidStateError', translator.translate('hello'));
-}, 'AITranslator.translate() fails after destroyed');
+}, 'Translator.translate() fails after destroyed');
promise_test(async t => {
const controller = new AbortController();
@@ -78,14 +78,14 @@ promise_test(async t => {
{signal: controller.signal, sourceLanguage: 'en', targetLanguage: 'ja'});
await promise_rejects_dom(t, 'AbortError', createPromise);
-}, 'AITranslatorFactory.create() call with an aborted signal.');
+}, 'Translator.create() call with an aborted signal.');
promise_test(async t => {
await testAbortPromise(t, signal => {
return createTranslator(
{signal, sourceLanguage: 'en', targetLanguage: 'ja'});
});
-}, 'Aborting AITranslatorFactory.create().');
+}, 'Aborting Translator.create().');
promise_test(async t => {
const controller = new AbortController();
@@ -97,7 +97,7 @@ promise_test(async t => {
translator.translate('hello', {signal: controller.signal});
await promise_rejects_dom(t, 'AbortError', translatePromise);
-}, 'AITranslator.translate() call with an aborted signal.');
+}, 'Translator.translate() call with an aborted signal.');
promise_test(async t => {
const translator =
@@ -105,20 +105,26 @@ promise_test(async t => {
await testAbortPromise(t, signal => {
return translator.translate('hello', {signal});
});
-}, 'Aborting AITranslator.translate().');
+}, 'Aborting Translator.translate().');
promise_test(async t => {
let monitorCalled = false;
+ let createdTranslator = false;
const progressEvents = [];
function monitor(m) {
monitorCalled = true;
m.addEventListener('downloadprogress', e => {
+ // No progress events should have been fired after we've created the
+ // translator.
+ assert_false(createdTranslator);
+
progressEvents.push(e);
});
}
await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja', monitor});
+ createdTranslator = true;
// Monitor callback must be called.
assert_true(monitorCalled);
@@ -134,11 +140,11 @@ promise_test(async t => {
for (const progressEvent of progressEvents) {
assert_equals(progressEvent.total, 1);
}
-}, 'AITranslatorFactory.create() monitor option is called correctly.');
+}, 'Translator.create() monitor option is called correctly.');
promise_test(async t => {
const translator =
- await ai.translator.create({sourceLanguage: 'en', targetLanguage: 'ja'});
+ await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'});
// Strings containing only white space are not translatable.
const nonTranslatableStrings = ['', ' ', ' ', ' \r\n\t\f'];
@@ -165,4 +171,42 @@ promise_test(async t => {
for (let i = 0; i < translatableStrings.length; i++) {
assert_not_equals(translatedTranslatableString[i], translatableStrings[i]);
}
-}, 'AITranslator.translate() echos non-translatable content');
+}, 'Translator.translate() echos non-translatable content');
+
+promise_test(async t => {
+ const translator =
+ await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'});
+
+ const text = 'hello';
+ const inputUsage = await translator.measureInputUsage(text);
+
+ assert_greater_than_equal(translator.inputQuota, 0);
+ assert_greater_than_equal(inputUsage, 0);
+
+ if (inputUsage < translator.inputQuota) {
+ assert_equals(await translator.translate(text), 'こんにちは');
+ } else {
+ await promise_rejects_dom(
+ t, 'QuotaExceededError', translator.translate(text));
+ }
+}, 'Translator.measureInputUsage() and inputQuota basic usage.');
+
+promise_test(async t => {
+ const controller = new AbortController();
+ controller.abort();
+
+ const translator =
+ await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'});
+ const measureInputUsagePromise =
+ translator.measureInputUsage('hello', {signal: controller.signal});
+
+ await promise_rejects_dom(t, 'AbortError', measureInputUsagePromise);
+}, 'Translator.measureInputUsage() call with an aborted signal.');
+
+promise_test(async t => {
+ const translator =
+ await createTranslator({sourceLanguage: 'en', targetLanguage: 'ja'});
+ await testAbortPromise(t, signal => {
+ return translator.measureInputUsage('hello', {signal});
+ });
+}, 'Aborting Translator.measureInputUsage().');
diff --git a/tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html b/tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html
new file mode 100644
index 00000000000..2deadeef2d0
--- /dev/null
+++ b/tests/wpt/tests/clear-site-data/clear-cache-partitioning.https.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<body>
+<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="support/clear-cache-helper.sub.js"></script>
+<script>
+"use strict";
+
+const CLEAR_ORIGIN_CACHE = {
+ clear: "cache",
+}
+
+promise_test(test => {
+ const TEST_SITE = {
+ iframe: {
+ cache: true,
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_not_equals);
+}, "same site data also gets cleared in iframe");
+
+promise_test(test => {
+ const TEST_SITE = {
+ iframe: {
+ cache: true,
+ secondOrigin: true,
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
+}, "cross origin iframe data doesn't get cleared");
+
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ }
+ const CLEAR_ORIGIN_CACHE = {
+ iframe: {
+ clear: "cache",
+ secondOrigin: true,
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
+}, "clear in cross origin iframe doesn't affect embedder");
+
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ subdomain: true,
+ }
+ return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
+}, "clearing cache doesn't affect subdomain");
+
+promise_test(test => {
+ const TEST_SITE = {
+ iframe: {
+ secondOrigin: true,
+ cache: true,
+ }
+ }
+ const TEST_SITE_CLEAR_IFRAME = {
+ iframe: {
+ secondOrigin: true,
+ clear: "all",
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_not_equals);
+}, "clear in cross origin iframe clears data from that iframe");
+
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true
+ };
+ const TEST_SITE_CLEAR_IFRAME = {
+ secondOrigin: true,
+ iframe: {
+ clear: "cache",
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals);
+}, "clear in cross origin iframe doesn't clear unpartitioned data from that cross origin");
+
+promise_test(test => {
+ const TEST_SITE = {
+ secondOrigin: true,
+ iframe: {
+ cache: true,
+ }
+ }
+
+ const TEST_SITE_CLEAR_IFRAME = {
+ clear: "cache"
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals);
+}, "clear in unpartitioned context doesn't clear partitioned data");
+
+promise_test(test => {
+ const TEST_SITE = {
+ iframe: {
+ secondOrigin: true,
+ iframe: {
+ cache: true,
+ }
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
+}, "clear in unpartitioned context doesn't clear double partitioned data with intermediate cross origin");
+
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ };
+
+ const TEST_CLEAR_IFRAME_IFRAME = {
+ iframe: {
+ secondOrigin: true,
+ iframe: {
+ clear: "cache",
+ }
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_equals);
+}, "clear in double partitioned with intermediate cross origin context doesn't clear unpartitioned data");
+
+promise_test(test => {
+ const TEST_SITE = {
+ iframe: {
+ secondOrigin: true,
+ iframe: {
+ cache: true,
+ }
+ }
+ }
+
+ const TEST_CLEAR_IFRAME_IFRAME = {
+ iframe: {
+ secondOrigin: true,
+ iframe: {
+ clear: "cache",
+ }
+ }
+ }
+ return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_not_equals);
+}, "clear double partitioned context with intermediate cross origin clears that partitioned data");
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/clear-site-data/clear-cache.https.html b/tests/wpt/tests/clear-site-data/clear-cache.https.html
index e356001d0c8..c75c2e16bec 100644
--- a/tests/wpt/tests/clear-site-data/clear-cache.https.html
+++ b/tests/wpt/tests/clear-site-data/clear-cache.https.html
@@ -4,100 +4,111 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="support/clear-cache-helper.sub.js"></script>
<script>
-// Here's the set-up for this test:
-// Step 1 (main window) Open first window with first url putting some resource
-// into the cache and maybe receiving clear-site-data header
-// Step 2 (first window) Message main window with uuid
-// Step 3 (main window) Open second window with second url
-// Step 4 (second window) Message main window with uuid (either cached or non-cached)
-// Optional Step 5 (main window) Open third window with third url
-// Optional Step 6 (third window) Message main window with uuid (either cached or non-cached)
-// Step 7 (main window): Assert first and last uuid not equal due to `clear-site-data: "cache"` header
-function test_cache_clear(test, params1, params2, params3) {
- let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
- let firstUrl = "/clear-site-data/support/clear-site-data-cache.py?" + cache_helper + params1
- let secondUrl = "/clear-site-data/support/clear-site-data-cache.py?" + cache_helper + params2;
- let thirdUrl = params3 ? "/clear-site-data/support/clear-site-data-cache.py?" + cache_helper + params3 : null;
-
- return new Promise(resolve => {
- window.addEventListener("message", test.step_func(e => {
- // Result Step 2
- let firstUuid = e.data;
-
- window.addEventListener("message", test.step_func(e => {
- // Result Step 4
- let secondUuid = e.data;
-
- if (thirdUrl === null) {
- // Step 7, skipping the optional step 5 and 6
- assert_not_equals(firstUuid, secondUuid);
- resolve();
- } else {
- window.addEventListener("message", test.step_func(e => {
- // Result Step 6
- let thirdUuid = e.data;
-
- // Step 7
- assert_not_equals(firstUuid, thirdUuid);
- resolve();
-
- }), {once: true});
-
- // Step 5
- window.open(thirdUrl);
- }
-
- }), {once: true});
-
- // Step 3
- window.open(secondUrl);
- }), {once: true});
-
- // Step 1
- window.open(firstUrl);
- });
-}
-
-promise_test(t => {
- return test_cache_clear(t, "response=single_html&cache&clear_first=cache", "response=single_html&cache&clear_first=cache");
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ clearFirst: "cache",
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE], assert_not_equals);
}, "clear cache: Document with clear-cache header doesn't get cached");
-promise_test(t => {
- return test_cache_clear(t, "response=single_html&cache&clear_first=all", "response=single_html&cache&clear_first=all");
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ clearFirst: "all",
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE], assert_not_equals);
}, "clear all: Document with clear-cache header doesn't get cached");
-promise_test(t => {
- return test_cache_clear(t, "response=html_embed_json&clear=cache", "response=html_embed_json&clear=cache");
-}, "clear cache: Fetch on docment with clear-cache header doesn't get cached");
-
-promise_test(t => {
- return test_cache_clear(t, "response=html_embed_json&clear=all", "response=html_embed_json&clear=all");
-}, "clear all: Fetch on docment with clear-cache header doesn't get cached");
-
-promise_test(t => {
- return test_cache_clear(t, "response=html_embed_json", "response=html_embed_json&clear=cache");
+promise_test(test => {
+ const TEST_SITE_INITAL = {
+ response: "html_embed_json",
+ clear: "cache",
+ };
+ const TEST_SITE_FINAL = {
+ response: "html_embed_json",
+ };
+ // Clear-Cache header doesn't affect fetch on document due to clear-cache
+ // being initiated in a point of time. The fetch happens later and stays
+ // in the cache.
+ return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_equals);
+}, "clear cache: Fetch on docment with clear-cache header is unaffected");
+
+promise_test(test => {
+ const TEST_SITE_INITAL = {
+ response: "html_embed_json",
+ clear: "all",
+ };
+ const TEST_SITE_FINAL = {
+ response: "html_embed_json",
+ };
+ // same as above
+ return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_equals);
+}, "clear all: Fetch on docment with clear-cache header is unaffected");
+
+promise_test(test => {
+ const TEST_SITE_INITAL = {
+ response: "html_embed_json",
+ };
+ const TEST_SITE_FINAL = {
+ response: "html_embed_json",
+ clear: "cache",
+ };
+ return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_not_equals);
}, "clear cache: Previously cached fetch gets cleared");
-promise_test(t => {
- return test_cache_clear(t, "response=html_embed_json", "response=html_embed_json&clear=all");
+promise_test(test => {
+ const TEST_SITE_INITAL = {
+ response: "html_embed_json",
+ };
+ const TEST_SITE_FINAL = {
+ response: "html_embed_json",
+ clear: "all",
+ };
+ return testCacheClear(test, [TEST_SITE_INITAL, TEST_SITE_FINAL], assert_not_equals);
}, "clear all: Previously cached fetch gets cleared");
-promise_test(t => {
- return test_cache_clear(t, "response=html_embed_json", "response=single_html&clear=cache", "response=html_embed_json");
+promise_test(test => {
+ const TEST_SITE = {
+ response: "html_embed_json",
+ };
+ const TEST_SITE_CLEAR = {
+ clear: "cache",
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals);
}, "clear cache: Clear fetch on intermediate navigation");
-promise_test(t => {
- return test_cache_clear(t, "response=html_embed_json", "response=single_html&clear=all", "response=html_embed_json");
+promise_test(test => {
+ const TEST_SITE = {
+ response: "html_embed_json",
+ };
+ const TEST_SITE_CLEAR = {
+ clear: "all",
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals);
}, "clear all: Clear fetch on intermediate navigation");
-promise_test(t => {
- return test_cache_clear(t, "response=single_html&cache", "response=single_html&clear=cache", "response=single_html&cache");
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ };
+ const TEST_SITE_CLEAR = {
+ clear: "cache",
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals);
}, "clear cache: Clear document in intermediate load");
-promise_test(t => {
- return test_cache_clear(t, "response=single_html&cache", "response=single_html&clear=all", "response=single_html&cache");
+promise_test(test => {
+ const TEST_SITE = {
+ cache: true,
+ };
+ const TEST_SITE_CLEAR = {
+ clear: "all",
+ };
+ return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR, TEST_SITE], assert_not_equals);
}, "clear all: Clear document in intermediate load");
</script>
diff --git a/tests/wpt/tests/clear-site-data/clear-cache-partitioning.sub.https.html b/tests/wpt/tests/clear-site-data/support/clear-cache-helper.sub.js
index b3841450b5a..2b2d35abfc5 100644
--- a/tests/wpt/tests/clear-site-data/clear-cache-partitioning.sub.https.html
+++ b/tests/wpt/tests/clear-site-data/support/clear-cache-helper.sub.js
@@ -1,10 +1,7 @@
-<!DOCTYPE html>
-<body>
-<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>
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict"
/**
* Constructs a url for an intermediate "bounce" hop which represents a tracker.
@@ -18,7 +15,10 @@
* Clear-Site-Data header.
* @param {(null|'cache'|'all')} [options.clear_first] - whether to send the
* Clear-Site-Data header on first response
- * @param {*} [options.iframe] - iframe same parameters as options (recursive)
+ * @param {string} [response] - which response to elict - defaults to "single_html". Other
+ * options can be found in "clear-site-data-cache.py" server helper.
+ * @param {*} [options.iframe] - iframe same parameters as options (recursive). Only works on
+ * "single_html" variation of response
*/
function getUrl(cacheHelper, {
subdomain = false,
@@ -26,6 +26,7 @@ function getUrl(cacheHelper, {
cache = false,
clear = null,
clearFirst = null,
+ response = "single_html",
iframe = null,
}) {
let url = "https://";
@@ -43,7 +44,7 @@ function getUrl(cacheHelper, {
url = new URL(url);
let params = new URLSearchParams();
params.append("cache_helper", cacheHelper);
- params.append("response", "single_html")
+ params.append("response", response)
if (clear !== null) {
params.append("clear", clear);
}
@@ -130,142 +131,3 @@ function testCacheClear(test, params, assert) {
});
}
-const CLEAR_ORIGIN_CACHE = {
- clear: "cache",
-}
-
-promise_test(test => {
- const TEST_SITE = {
- iframe: {
- cache: true,
- }
- }
- return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_not_equals);
-}, "same site data also gets cleared in iframe");
-
-promise_test(test => {
- const TEST_SITE = {
- iframe: {
- cache: true,
- secondOrigin: true,
- }
- }
- return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
-}, "cross origin iframe data doesn't get cleared");
-
-promise_test(test => {
- const TEST_SITE = {
- cache: true,
- }
- const CLEAR_ORIGIN_CACHE = {
- iframe: {
- clear: "cache",
- secondOrigin: true,
- }
- }
- return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
-}, "clear in cross origin iframe doesn't affect embedder");
-
-promise_test(test => {
- const TEST_SITE = {
- cache: true,
- subdomain: true,
- }
- return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
-}, "clearing cache doesn't affect subdomain");
-
-promise_test(test => {
- const TEST_SITE = {
- iframe: {
- secondOrigin: true,
- cache: true,
- }
- }
- const TEST_SITE_CLEAR_IFRAME = {
- iframe: {
- secondOrigin: true,
- clear: "all",
- }
- }
- return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_not_equals);
-}, "clear in cross origin iframe clears data from that iframe");
-
-promise_test(test => {
- const TEST_SITE = {
- cache: true
- };
- const TEST_SITE_CLEAR_IFRAME = {
- secondOrigin: true,
- iframe: {
- clear: "cache",
- }
- }
- return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals);
-}, "clear in cross origin iframe doesn't clear unpartitioned data from that cross origin");
-
-promise_test(test => {
- const TEST_SITE = {
- secondOrigin: true,
- iframe: {
- cache: true,
- }
- }
-
- const TEST_SITE_CLEAR_IFRAME = {
- clear: "cache"
- };
- return testCacheClear(test, [TEST_SITE, TEST_SITE_CLEAR_IFRAME, TEST_SITE], assert_equals);
-}, "clear in unpartitioned context doesn't clear partitioned data");
-
-promise_test(test => {
- const TEST_SITE = {
- iframe: {
- secondOrigin: true,
- iframe: {
- cache: true,
- }
- }
- }
- return testCacheClear(test, [TEST_SITE, CLEAR_ORIGIN_CACHE, TEST_SITE], assert_equals);
-}, "clear in unpartitioned context doesn't clear double partitioned data with intermediate cross origin");
-
-promise_test(test => {
- const TEST_SITE = {
- cache: true,
- };
-
- const TEST_CLEAR_IFRAME_IFRAME = {
- iframe: {
- secondOrigin: true,
- iframe: {
- clear: "cache",
- }
- }
- }
- return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_equals);
-}, "clear in double partitioned with intermediate cross origin context doesn't clear unpartitioned data");
-
-promise_test(test => {
- const TEST_SITE = {
- iframe: {
- secondOrigin: true,
- iframe: {
- cache: true,
- }
- }
- }
-
- const TEST_CLEAR_IFRAME_IFRAME = {
- iframe: {
- secondOrigin: true,
- iframe: {
- clear: "cache",
- }
- }
- }
- return testCacheClear(test, [TEST_SITE, TEST_CLEAR_IFRAME_IFRAME, TEST_SITE], assert_not_equals);
-}, "clear double partitioned context with intermediate cross origin clears that partitioned data");
-
-</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/container-timing/META.yml b/tests/wpt/tests/container-timing/META.yml
new file mode 100644
index 00000000000..b7869607899
--- /dev/null
+++ b/tests/wpt/tests/container-timing/META.yml
@@ -0,0 +1,2 @@
+spec: https://github.com/bloomberg/container-timing/
+
diff --git a/tests/wpt/tests/container-timing/resources/container-timing-helpers.js b/tests/wpt/tests/container-timing/resources/container-timing-helpers.js
new file mode 100644
index 00000000000..a80ad964fef
--- /dev/null
+++ b/tests/wpt/tests/container-timing/resources/container-timing-helpers.js
@@ -0,0 +1,22 @@
+function checkContainerEntry(entry, identifier, last_element_id, beforeRender) {
+ assert_equals(entry.entryType, 'container');
+ assert_equals(entry.name, 'container-paints');
+ assert_equals(entry.identifier, identifier, 'identifier does not match');
+ if (last_element_id != null) {
+ assert_equals(entry.lastPaintedElement.id, last_element_id);
+ }
+
+ assert_equals(entry.duration, 0, 'duration should be 0');
+ assert_greater_than_equal(
+ entry.firstRenderTime, beforeRender,
+ 'firstRenderTime greater than beforeRender');
+ assert_greater_than_equal(
+ entry.startTime, entry.firstRenderTime,
+ 'startTime greater than beforeRender');
+ assert_greater_than_equal(
+ performance.now(), entry.startTime, 'startTime bound by now()')
+}
+
+function checkContainerSize(entry, size) {
+ assert_equals(entry.size, size);
+}
diff --git a/tests/wpt/tests/container-timing/resources/square100.png b/tests/wpt/tests/container-timing/resources/square100.png
new file mode 100644
index 00000000000..567babb96d1
--- /dev/null
+++ b/tests/wpt/tests/container-timing/resources/square100.png
Binary files differ
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-body-with-child-img.html b/tests/wpt/tests/container-timing/tentative/containertiming-body-with-child-img.html
new file mode 100644
index 00000000000..53e9bc55074
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-body-with-child-img.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe with body node with containertiming and image children</title>
+<body containertiming='body_ct'>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ let img;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'body_ct', 'img_id', beforeRender)
+ checkRect(entry, [0, 100, 0, 100])
+ checkContainerSize(entry, 10000);
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add image of width equal to 100 and height equal to 100.
+ const img = document.createElement('img');
+ img.src = '/container-timing/resources/square100.png';
+ img.setAttribute('id', 'img_id');
+ document.body.appendChild(img);
+ beforeRender = performance.now();
+ };
+ }, 'Body with containertiming observed reports children image paints.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-img-itself.html b/tests/wpt/tests/container-timing/tentative/containertiming-img-itself.html
new file mode 100644
index 00000000000..6d55532a419
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-img-itself.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe an image with containertiming attribute</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'image_ct', 'my_id', beforeRender);
+ checkRect(entry, [0, 100, 0, 100])
+ checkContainerSize(entry, 10000);
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add image of width equal to 100 and height equal to 100.
+ const img = document.createElement('img');
+ img.src = '/container-timing/resources/square100.png';
+ img.setAttribute('containertiming', 'image_ct');
+ img.setAttribute('id', 'my_id');
+ document.body.appendChild(img);
+ beforeRender = performance.now();
+ };
+ }, 'Element with containertiming attribute is observable and reports the image paint.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-observe-no-paint.html b/tests/wpt/tests/container-timing/tentative/containertiming-observe-no-paint.html
new file mode 100644
index 00000000000..f2384248255
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-observe-no-paint.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: if no paint happens, observer is not called</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ function(entryList) {
+ assert_unreached("No entry is expected with nothing to paint");
+ }
+ );
+ observer.observe({entryTypes: ['container']});
+ t.step_timeout(() => {
+ t.done();
+ }, 2000);
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ const div = document.createElement('div');
+ div.setAttribute('containertiming', 'div_ct');
+ document.body.appendChild(div);
+ beforeRender = performance.now();
+ };
+ }, 'Container timing did not report paints when there was nothing to paint.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-text-itself.html b/tests/wpt/tests/container-timing/tentative/containertiming-text-itself.html
new file mode 100644
index 00000000000..bead4d1724b
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-text-itself.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe a paragraph with containertiming attribute</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'p_ct', 'my_id', beforeRender);
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the text during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ const p = document.createElement('p');
+ p.setAttribute('containertiming', 'p_ct');
+ p.id = 'my_id';
+ p.innerText = "This is a text";
+ document.body.appendChild(p);
+ beforeRender = performance.now();
+ };
+ }, 'Element with containertiming attribute is observable and reports the text paint.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-two-overlapping-imgs.html b/tests/wpt/tests/container-timing/tentative/containertiming-two-overlapping-imgs.html
new file mode 100644
index 00000000000..1a36c6f2532
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-two-overlapping-imgs.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe containertiming in a containertiming tree overlapping image children</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'div_ct', null, beforeRender)
+ checkRect(entry, [0, 150, 0, 150])
+ // size is the total area that has been painted, so the more intersection, the less area painted.
+ checkContainerSize(entry, 17500);
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add a div that is the container timing root
+ const div = document.createElement('div');
+ div.setAttribute('containertiming', 'div_ct');
+ document.body.appendChild(div);
+
+ // Add two overlapping images
+ const img1 = document.createElement('img');
+ img1.src = '/container-timing/resources/square100.png';
+ img1.setAttribute('id', 'img1_id');
+ img1.style.position = 'absolute';
+ div.appendChild(img1);
+
+ const img2 = document.createElement('img');
+ img2.src = '/container-timing/resources/square100.png';
+ img2.setAttribute('id', 'img2_id');
+ img2.style.marginLeft = '50px';
+ img2.style.marginTop = '50px';
+ img2.style.position = 'absolute';
+ div.appendChild(img2);
+
+ beforeRender = performance.now();
+ };
+ }, 'Overlapping images report to containertiming.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-with-child-img.html b/tests/wpt/tests/container-timing/tentative/containertiming-with-child-img.html
new file mode 100644
index 00000000000..03f0e113902
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-with-child-img.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe with a node with containertiming and an image child</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'div_ct', 'img_id', beforeRender)
+ checkRect(entry, [0, 100, 0, 100])
+ checkContainerSize(entry, 10000);
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add a div that is the container timing root
+ const div = document.createElement('div');
+ div.setAttribute('containertiming', 'div_ct');
+ document.body.appendChild(div);
+ // Add image of width equal to 100 and height equal to 100.
+ const img = document.createElement('img');
+ img.src = '/container-timing/resources/square100.png';
+ img.setAttribute('id', 'img_id');
+ div.appendChild(img);
+ beforeRender = performance.now();
+ };
+ }, 'Paint of the image child of container timing is reported.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/containertiming-with-child-text.html b/tests/wpt/tests/container-timing/tentative/containertiming-with-child-text.html
new file mode 100644
index 00000000000..1efc189c34e
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/containertiming-with-child-text.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe with a node with containertiming and a text child</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'div_ct', 'p_id', beforeRender)
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the text during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add a div that is the container timing root
+ const div = document.createElement('div');
+ div.setAttribute('containertiming', 'div_ct');
+ document.body.appendChild(div);
+
+ const p = document.createElement('p');
+ p.id = 'p_id';
+ p.innerText = "This is a text";
+ div.appendChild(p);
+ beforeRender = performance.now();
+ };
+ }, 'Paint of the text child of container timing is reported.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/img-not-child-of-container-timing.html b/tests/wpt/tests/container-timing/tentative/img-not-child-of-container-timing.html
new file mode 100644
index 00000000000..751342a7ceb
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/img-not-child-of-container-timing.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: observe containertiming attribute with an image that is not its child</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ function(entryList) {
+ assert_unreached("No entry is expected with nothing to paint");
+ }
+ );
+ observer.observe({entryTypes: ['container']});
+
+ // Wait 2 seconds for observations, then finish successfully
+ t.step_timeout(() => {
+ t.done();
+ }, 2000);
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add a div that is the container timing root
+ const div = document.createElement('div');
+ div.setAttribute('containertiming', 'div_ct');
+ document.body.appendChild(div);
+ // Add image of width equal to 100 and height equal to 100.
+ const img = document.createElement('img');
+ img.src = '/container-timing/resources/square100.png';
+ img.setAttribute('id', 'img_id');
+ document.body.appendChild(img);
+ };
+ }, 'Containertiming observed without paintable contents and an image outside does not report observations.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html
new file mode 100644
index 00000000000..3f830fe7863
--- /dev/null
+++ b/tests/wpt/tests/container-timing/tentative/nested-containertiming-child-img.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Container Timing: two nested containertiming nodes, with a child img inside of the inner</title>
+<body>
+<style>
+body {
+ margin: 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/container-timing/resources/container-timing-helpers.js"></script>
+<script src="/element-timing/resources/element-timing-helpers.js"></script>
+<script>
+ let beforeRender;
+ async_test(function (t) {
+ assert_implements(window.PerformanceContainerTiming, "PerformanceContainerTiming is not implemented");
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ assert_equals(entryList.getEntries().length, 1, 'one entry expected for the image, for the inner containertiming');
+ const entry = entryList.getEntries()[0];
+ checkContainerEntry(entry, 'div2_ct', 'img_id', beforeRender)
+ checkRect(entry, [0, 100, 0, 100])
+ checkContainerSize(entry, 10000);
+ })
+ );
+ observer.observe({entryTypes: ['container']});
+ // Add the image during onload to be sure that the observer is registered
+ // in time.
+ window.onload = () => {
+ // Add a div that is the container timing root
+ const div1 = document.createElement('div');
+ div1.setAttribute('containertiming', 'div1_ct');
+ document.body.appendChild(div1);
+
+ // Add another div, child of the first, that is also a container root
+ const div2 = document.createElement('div');
+ div2.setAttribute('containertiming', 'div2_ct');
+ div1.appendChild(div2);
+
+ // Add image of width equal to 100 and height equal to 100.
+ img = document.createElement('img');
+ img.src = '/container-timing/resources/square100.png';
+ img.setAttribute('id', 'img_id');
+ div2.appendChild(img);
+ beforeRender = performance.now();
+ };
+ }, 'A parent containertiming root does not get paints from children containertiming roots.');
+</script>
+
+</body>
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
new file mode 100644
index 00000000000..89d84b13d1b
--- /dev/null
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
@@ -0,0 +1,22 @@
+// META: title=Cookie Store API: Test that setting an already-expired cookie does not trigger an event.
+// META: script=resources/cookie-test-helpers.js
+
+'use strict';
+
+cookie_test(async t => {
+ const eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'ALREADY-EXPIRED',
+ expires: new Date(new Date() - 10_000),
+ });
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ assert_equals(
+ await getCookieString(),
+ 'alt-cookie=IGNORE',
+ 'Already-expired cookie not included in CookieStore');
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Deletion not observed after document.cookie sets already-expired cookie');
+}, 'CookieStore setting already-expired cookie should not be observed');
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
index 0a8b1bd21ef..82b0f2baa2b 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
@@ -63,6 +63,22 @@ cookie_test(async t => {
' using max-age=0');
}, 'document.cookie set/overwrite/delete observed by CookieStore');
+
+cookie_test(async t => {
+ const eventPromise = observeNextCookieChangeEvent();
+ await setCookieStringDocument('DOCUMENT-cookie=ALREADY-EXPIRED; path=/; max-age=0');
+ await setCookieStringDocument('DOCUMENT-alt-cookie=IGNORE; path=/; max-age=10');
+ assert_equals(
+ await getCookieStringDocument(),
+ 'DOCUMENT-alt-cookie=IGNORE',
+ 'Already-expired cookie not included in document.cookie');
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {deleted: [], changed: [{name: 'DOCUMENT-alt-cookie', value: 'IGNORE'}]},
+ 'Deletion not observed after document.cookie sets already-expired cookie');
+}, 'document.cookie set already-expired cookie should not be observed by CookieStore');
+
+
cookie_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
await cookieStore.set('DOCUMENT-cookie', 'value');
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
index 2028df5b4bf..8f5ef1cabbe 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
@@ -49,6 +49,21 @@ cookie_test(async t => {
cookie_test(async t => {
+ const eventPromise = observeNextCookieChangeEvent();
+ await setCookieStringHttp('HTTP-cookie=ALREADY-EXPIRED; path=/; max-age=0');
+ await setCookieStringHttp('HTTP-alt-cookie=IGNORE; path=/; max-age=10');
+ assert_equals(
+ await getCookieStringHttp(),
+ 'HTTP-alt-cookie=IGNORE',
+ 'Already-expired cookie not included in HTTP');
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {deleted: [], changed: [{name: 'HTTP-alt-cookie', value: 'IGNORE'}]},
+ 'Deletion not observed after HTTP sets already-expired cookie');
+}, 'HTTP set already-expired cookie should not be observed by CookieStore');
+
+
+cookie_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
await setCookieStringHttp('HTTP-🍪=🔵; path=/');
assert_equals(
diff --git a/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.js b/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.js
index cd0657c0bcd..ef7cadf4c9e 100644
--- a/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.js
+++ b/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_multiple_subscriptions.https.any.js
@@ -15,7 +15,6 @@ let g_cookie_changes = [];
// Resolved when a cookiechange event is received. Rearmed by
// RearmCookieChangeReceivedPromise().
-let g_cookie_change_received_promise = null;
let g_cookie_change_received_promise_resolver = null;
self.addEventListener('cookiechange', (event) => {
g_cookie_changes.push(event);
@@ -24,11 +23,10 @@ self.addEventListener('cookiechange', (event) => {
}
});
function RearmCookieChangeReceivedPromise() {
- g_cookie_change_received_promise = new Promise((resolve) => {
+ return new Promise((resolve) => {
g_cookie_change_received_promise_resolver = resolve;
});
}
-RearmCookieChangeReceivedPromise();
promise_test(async testCase => {
await kServiceWorkerActivatedPromise;
@@ -47,14 +45,15 @@ promise_test(async testCase => {
testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions));
}
+ const cookie_change_received_promise = RearmCookieChangeReceivedPromise();
+
await cookieStore.set('cookie-name', 'cookie-value');
testCase.add_cleanup(async () => {
await cookieStore.delete('cookie-name');
});
testCase.add_cleanup(() => { g_cookie_changes = []; });
- await g_cookie_change_received_promise;
- testCase.add_cleanup(() => RearmCookieChangeReceivedPromise());
+ await cookie_change_received_promise;
assert_equals(g_cookie_changes.length, 1);
const event = g_cookie_changes[0];
diff --git a/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js b/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js
index 1f433aeb947..f8b1c1b7aa9 100644
--- a/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js
+++ b/tests/wpt/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js
@@ -15,21 +15,18 @@ let g_cookie_changes = [];
// Resolved when a cookiechange event is received. Rearmed by
// RearmCookieChangeReceivedPromise().
-let g_cookie_change_received_promise = null;
let g_cookie_change_received_promise_resolver = null;
self.addEventListener('cookiechange', (event) => {
g_cookie_changes.push(event);
if (g_cookie_change_received_promise_resolver) {
g_cookie_change_received_promise_resolver();
- RearmCookieChangeReceivedPromise();
}
});
function RearmCookieChangeReceivedPromise() {
- g_cookie_change_received_promise = new Promise((resolve) => {
+ return new Promise((resolve) => {
g_cookie_change_received_promise_resolver = resolve;
});
}
-RearmCookieChangeReceivedPromise();
promise_test(async testCase => {
await kServiceWorkerActivatedPromise;
@@ -41,14 +38,16 @@ promise_test(async testCase => {
await registration.cookies.subscribe(subscriptions);
testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions));
+ let cookie_change_received_promise = RearmCookieChangeReceivedPromise();
+
await cookieStore.set('cookie-name', 'cookie-value');
testCase.add_cleanup(async () => {
await cookieStore.delete('cookie-name');
});
testCase.add_cleanup(() => { g_cookie_changes = []; });
- await g_cookie_change_received_promise;
- testCase.add_cleanup(() => RearmCookieChangeReceivedPromise());
+ await cookie_change_received_promise;
+ cookie_change_received_promise = RearmCookieChangeReceivedPromise();
// To ensure that we are accounting for all events dispatched by the first
// cookie change, we initiate and listen for a final cookie change that we
@@ -59,8 +58,7 @@ promise_test(async testCase => {
});
testCase.add_cleanup(() => { g_cookie_changes = []; });
- await g_cookie_change_received_promise;
- testCase.add_cleanup(() => RearmCookieChangeReceivedPromise());
+ await cookie_change_received_promise;
assert_equals(g_cookie_changes.length, 2);
{
diff --git a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-embedder-opener.html b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-embedder-opener.html
new file mode 100644
index 00000000000..f7458f8be16
--- /dev/null
+++ b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-embedder-opener.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<meta name="timeout" content="long">
+<title>Test third-party cookies</title>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/cookies/resources/cookie-helper.sub.js"></script>
+<script src="/cookies/third-party-cookies/resources/test-helpers.js"></script>
+
+<body>
+ <script>
+
+ document.body.onload = async () => {
+ // Set SameSite=None cookie in a 1P context using HTTP.
+ const attributes = "Secure;Path=/;SameSite=None";
+ const httpCookieName = "1P_http";
+ await credFetch(
+ `${self.origin}/cookies/resources/set.py?${httpCookieName}=foobar;${attributes}`);
+
+ // Set another cookie using document.cookie.
+ const domCookieName = "1P_dom";
+ document.cookie = `${domCookieName}=foobar;${attributes}`;
+
+ const cookieNames = [httpCookieName, domCookieName];
+
+ // Set another cookie using the CookieStore API, if supported.
+ if (window.cookieStore) {
+ const cookieStoreCookieName = "1P_cs";
+ await cookieStore.set({
+ name: cookieStoreCookieName,
+ value: "foobar",
+ path: "/",
+ sameSite: "none",
+ });
+ cookieNames.push(cookieStoreCookieName);
+ }
+
+ // Test that the cookie is available in a first-party context via HTTP.
+ testHttpCookies({
+ desc: get_host_info().HTTPS_ORIGIN + " " + get_host_info().HTTPS_REMOTE_ORIGIN + " " + get_host_info().HTTPS_NOTSAMESITE_ORIGIN + " " + get_host_info().HTTPS_AUTHENTICATED_ORIGIN,
+ origin: self.origin,
+ cookieNames,
+ expectsCookie: true,
+ });
+
+ // // Verify that the cookies are available to the DOM as well.
+ testDomCookies({
+ desc: "1P window",
+ cookieNames,
+ expectsCookie: true,
+ });
+ testCookieStoreCookies({
+ desc: "1P window",
+ cookieNames,
+ expectsCookie: true,
+ });
+
+ // Open a cross-site window which will embed the current origin in a
+ // third-party context.
+ const crossSiteUrl = new URL(
+ `/cookies/third-party-cookies/resources/third-party-cookies-cross-site-embedder.html?origin=${encodeURIComponent(self.origin)}`,
+ get_host_info().HTTPS_ORIGIN + self.location.pathname);
+ const popup = window.open(crossSiteUrl);
+ fetch_tests_from_window(popup);
+ };
+
+ </script>
+</body>
diff --git a/tests/wpt/tests/cookies/third-party-cookies/third-party-cookies.tentative.https.html b/tests/wpt/tests/cookies/third-party-cookies/third-party-cookies.tentative.https.html
index 018849c8279..decf6419281 100644
--- a/tests/wpt/tests/cookies/third-party-cookies/third-party-cookies.tentative.https.html
+++ b/tests/wpt/tests/cookies/third-party-cookies/third-party-cookies.tentative.https.html
@@ -2,7 +2,8 @@
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<title>Test third-party cookies</title>
-<title>Test partitioned cookies</title>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
@@ -13,57 +14,10 @@
<script>
document.body.onload = async () => {
- // Set SameSite=None cookie in a 1P context using HTTP.
- const attributes = "Secure;Path=/;SameSite=None";
- const httpCookieName = "1P_http";
- await credFetch(
- `${self.origin}/cookies/resources/set.py?${httpCookieName}=foobar;${
- attributes}`);
-
- // Set another cookie using document.cookie.
- const domCookieName = "1P_dom";
- document.cookie = `${domCookieName}=foobar;${attributes}`;
-
- const cookieNames = [httpCookieName, domCookieName];
-
- // Set another cookie using the CookieStore API, if supported.
- if (window.cookieStore) {
- const cookieStoreCookieName = "1P_cs";
- await cookieStore.set({
- name: cookieStoreCookieName,
- value: "foobar",
- path: "/",
- sameSite: "none",
- });
- cookieNames.push(cookieStoreCookieName);
- }
-
- // Test that the cookie is available in a first-party context via HTTP.
- testHttpCookies({
- desc: "1P window",
- origin: self.origin,
- cookieNames,
- expectsCookie: true,
- });
-
- // // Verify that the cookies are available to the DOM as well.
- testDomCookies({
- desc: "1P window",
- cookieNames,
- expectsCookie: true,
- });
- testCookieStoreCookies({
- desc: "1P window",
- cookieNames,
- expectsCookie: true,
- });
-
- // Open a cross-site window which will embed the current origin in a
- // third-party context.
+ // Open a cross-site window.
const crossSiteUrl = new URL(
- `./resources/third-party-cookies-cross-site-embedder.html?origin=${
- encodeURIComponent(self.origin)}`,
- get_host_info().HTTPS_NOTSAMESITE_ORIGIN + self.location.pathname);
+ `./resources/third-party-cookies-cross-site-embedder-opener.html`,
+ get_host_info().HTTPS_NOTSAMESITE_ORIGIN + self.location.pathname);
const popup = window.open(crossSiteUrl);
fetch_tests_from_window(popup);
};
diff --git a/tests/wpt/tests/core-aam/META.yml b/tests/wpt/tests/core-aam/META.yml
index dfce961fa8a..f150c4fe065 100644
--- a/tests/wpt/tests/core-aam/META.yml
+++ b/tests/wpt/tests/core-aam/META.yml
@@ -3,3 +3,4 @@ suggested_reviewers:
- jnurthen
- michael-n-cooper
- spectranaut
+ - sideshowbarker
diff --git a/tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html
new file mode 100644
index 00000000000..afe543029d8
--- /dev/null
+++ b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity-ref.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<div style="position: absolute; top: 100px; left: 100px; width: 100px; height: 100px;
+ background: green; opacity: 0.5"></div>
diff --git a/tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html
new file mode 100644
index 00000000000..e1e7fed5a66
--- /dev/null
+++ b/tests/wpt/tests/css/compositing/root-element-background-margin-opacity.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/compositing-1/#pagebackdrop">
+<link rel="help" href="https://crbug.com/40904650">
+<link rel="match" href="root-element-background-margin-opacity-ref.html">
+<meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-10000">
+<style>
+html {
+ margin: 100px;
+ width: 100px;
+ height: 100px;
+ background: linear-gradient(green, green) top left no-repeat;
+ opacity: 0.5;
+}
+</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html
index 50fc0906107..88e01619caf 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html
@@ -59,7 +59,7 @@
<div class="container">
<div class="anchor"></div>
- <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="20"></div>
+ <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="0"></div>
</div>
<div class="container">
@@ -80,7 +80,7 @@
<!-- both insets -->
<div class="container">
<div class="anchor"></div>
- <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="30"></div>
+ <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="10"></div>
</div>
<div class="container">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html
index eba72d64913..f777a2caf88 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html
@@ -60,7 +60,7 @@
<div class="container">
<div class="anchor"></div>
- <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="20"></div>
+ <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="0"></div>
</div>
<div class="container">
@@ -81,7 +81,7 @@
<!-- both insets -->
<div class="container">
<div class="anchor"></div>
- <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="30"></div>
+ <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="10"></div>
</div>
<div class="container">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html
index 8f7af0414ed..595f7ea1ecd 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html
@@ -61,7 +61,7 @@
<div class="container">
<div class="anchor"></div>
- <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="20"></div>
+ <div class="target" style="right: 20px;" data-expected-width="80" data-offset-x="0"></div>
</div>
<div class="container">
@@ -82,7 +82,7 @@
<!-- both insets -->
<div class="container">
<div class="anchor"></div>
- <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="30"></div>
+ <div class="target" style="left: 10px; right: 20px;" data-expected-width="70" data-offset-x="10"></div>
</div>
<div class="container">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html
index d8e90057dc3..e22391a8192 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html
@@ -60,7 +60,7 @@
<div class="container">
<div class="anchor"></div>
- <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="20"></div>
+ <div class="target" style="bottom: 20px;" data-expected-height="80" data-offset-y="0"></div>
</div>
<div class="container">
@@ -81,7 +81,7 @@
<!-- both insets -->
<div class="container">
<div class="anchor"></div>
- <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="30"></div>
+ <div class="target" style="top: 10px; bottom: 20px;" data-expected-height="70" data-offset-y="10"></div>
</div>
<div class="container">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-display-none-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-display-none-crash.html
new file mode 100644
index 00000000000..bf513e39147
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-display-none-crash.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/406054648">
+<html class="reftest-wait">
+ <style>
+ @position-try --pf {
+ position-anchor: --b;
+ }
+ </style>
+ <div id="elm" style="anchor-name:--a;"></div>
+ <div style="anchor-name:--b; width:40%;"></div>
+ <div style="position:absolute; left:anchor(right); width:40%; position-anchor:--a; position-try-fallbacks:--pf;"></div>
+ <script>
+ requestAnimationFrame(()=> {
+ requestAnimationFrame(()=> {
+ elm.style.display = "none";
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ });
+ </script>
+</html>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-flip-sibling-index.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-flip-sibling-index.html
new file mode 100644
index 00000000000..5fa17dc057a
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-flip-sibling-index.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning Test: flip anchor function with sibling-index()</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-fallbacks-try-tactic">
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#funcdef-sibling-index">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ body { margin: 0; }
+ #anchor {
+ anchor-name: --a;
+ width: 100px;
+ height: 100px;
+ }
+ #abs {
+ position-anchor: --a;
+ position-try-fallbacks: flip-block;
+ position: absolute;
+ bottom: anchor(calc(20% * sibling-index()));
+ width: 100px;
+ height: 100px;
+ background: teal;
+ }
+</style>
+<div>
+ <div id="anchor"></div>
+ <div id="abs"></div>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(abs).top, "60px", "100% - (20% multiplied by 2 (sibling-index())) of 100px")
+ }, "Percentage based top anchor() position with sibling-index() flipped to bottom");
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-sibling-index.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-sibling-index.html
new file mode 100644
index 00000000000..ade6b4a0e01
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-sibling-index.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning Test: anchor function with sibling-index()</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#anchor-pos">
+<link rel="help" href="https://drafts.csswg.org/css-values-5/#funcdef-sibling-index">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ body { margin: 0; }
+ #anchor {
+ anchor-name: --a;
+ width: 100px;
+ height: 100px;
+ }
+ #abs {
+ position-anchor: --a;
+ position: absolute;
+ top: anchor(calc(25% * sibling-index()));
+ width: 100px;
+ height: 100px;
+ background: teal;
+ }
+</style>
+<div>
+ <div id="anchor"></div>
+ <div id="abs"></div>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(abs).top, "50px", "25% multiplied by 2 (sibling-index()) of 100px")
+ }, "Percentage based anchor() position with sibling-index()");
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html
index d8fb5dbc98f..9b0c74170aa 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-outside.html
@@ -8,6 +8,9 @@
position: relative;
width: 400px;
height: 400px;
+ margin: 0 auto;
+ border: 2px solid;
+ background: #eee;
}
#anchor {
position: absolute;
@@ -16,12 +19,15 @@
width: 100px;
height: 100px;
anchor-name: --anchor;
+ background: blue;
}
#anchored {
position: absolute;
align-self: stretch;
justify-self: stretch;
position-anchor: --anchor;
+ background: #FA08;
+ outline: 1px solid orange;
}
</style>
<div id="container">
@@ -40,17 +46,17 @@
}, "Offsets for position-area: " + position_area);
}
- test_position_area("span-all", {left:0, top:0, width:400, height:400});
+ test_position_area("span-all", {left:-200, top:0, width:600, height:600});
- test_position_area("left span-all", {left:-200, top:0, width:0, height:400});
- test_position_area("span-left span-all", {left:-100, top:0, width:0, height:400});
- test_position_area("span-all center", {left:-200, top:0, width:100, height:400});
- test_position_area("span-right span-all", {left:-200, top:0, width:600, height:400});
- test_position_area("right span-all", {left:-100, top:0, width:500, height:400});
+ test_position_area("left span-all", {left:-200, top:0, width:0, height:600});
+ test_position_area("span-left span-all", {left:-200, top:0, width:100, height:600});
+ test_position_area("span-all center", {left:-200, top:0, width:100, height:600});
+ test_position_area("span-right span-all", {left:-200, top:0, width:600, height:600});
+ test_position_area("right span-all", {left:-100, top:0, width:500, height:600});
- test_position_area("top span-all", {left:0, top:0, width:400, height:500});
- test_position_area("span-top span-all", {left:0, top:0, width:400, height:600});
- test_position_area("center span-all", {left:0, top:500, width:400, height:100});
- test_position_area("span-bottom span-all", {left:0, top:500, width:400, height:0});
- test_position_area("bottom span-all", {left:0, top:600, width:400, height:0});
+ test_position_area("top span-all", {left:-200, top:0, width:600, height:500});
+ test_position_area("span-top span-all", {left:-200, top:0, width:600, height:600});
+ test_position_area("center span-all", {left:-200, top:500, width:600, height:100});
+ test_position_area("span-bottom span-all", {left:-200, top:500, width:600, height:100});
+ test_position_area("bottom span-all", {left:-200, top:600, width:600, height:0});
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html
index e23cea47478..3dd537d26e0 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-area-anchor-partially-outside.html
@@ -8,6 +8,9 @@
position: relative;
width: 400px;
height: 400px;
+ margin: 100px auto;
+ border: 2px solid;
+ background: #eee;
}
#anchor {
position: absolute;
@@ -16,12 +19,15 @@
width: 100px;
height: 100px;
anchor-name: --anchor;
+ background: blue;
}
#anchored {
position: absolute;
align-self: stretch;
justify-self: stretch;
position-anchor: --anchor;
+ background: #FA08;
+ outline: 1px solid orange;
}
</style>
<div id="container">
@@ -40,17 +46,17 @@
}, "Offsets for position-area: " + position_area);
}
- test_position_area("span-all", {left:0, top:0, width:400, height:400});
+ test_position_area("span-all", {left:0, top:-50, width:450, height:450});
- test_position_area("left span-all", {left:0, top:0, width:350, height:400});
- test_position_area("span-left span-all", {left:0, top:0, width:450, height:400});
- test_position_area("span-all center", {left:350, top:0, width:100, height:400});
- test_position_area("span-right span-all", {left:350, top:0, width:50, height:400});
- test_position_area("right span-all", {left:450, top:0, width:0, height:400});
+ test_position_area("left span-all", {left:0, top:-50, width:350, height:450});
+ test_position_area("span-left span-all", {left:0, top:-50, width:450, height:450});
+ test_position_area("span-all center", {left:350, top:-50, width:100, height:450});
+ test_position_area("span-right span-all", {left:350, top:-50, width:100, height:450});
+ test_position_area("right span-all", {left:450, top:-50, width:0, height:450});
- test_position_area("top span-all", {left:0, top:-50, width:400, height:0});
- test_position_area("span-top span-all", {left:0, top:0, width:400, height:50});
- test_position_area("center span-all", {left:0, top:-50, width:400, height:100});
- test_position_area("span-bottom span-all", {left:0, top:-50, width:400, height:450});
- test_position_area("bottom span-all", {left:0, top:50, width:400, height:350});
+ test_position_area("top span-all", {left:0, top:-50, width:450, height:0});
+ test_position_area("span-top span-all", {left:0, top:-50, width:450, height:100});
+ test_position_area("center span-all", {left:0, top:-50, width:450, height:100});
+ test_position_area("span-bottom span-all", {left:0, top:-50, width:450, height:450});
+ test_position_area("bottom span-all", {left:0, top:50, width:450, height:350});
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-area-basic.html b/tests/wpt/tests/css/css-anchor-position/position-area-basic.html
index 6cbaf8e5014..2a568cc8028 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-area-basic.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-area-basic.html
@@ -26,12 +26,17 @@
position: absolute;
width: 400px;
height: 400px;
+ margin: 0 auto;
+ border: 2px solid;
+ background: #eee;
}
#anchored {
position: absolute;
align-self: stretch;
justify-self: stretch;
position-anchor: --anchor;
+ background: #FA08;
+ outline: 1px solid orange;
}
#anchor {
margin-top: 150px;
@@ -39,6 +44,7 @@
width: 150px;
height: 75px;
anchor-name: --anchor;
+ background: blue;
}
</style>
<div id="container">
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed-ref.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed-ref.html
index 7a9d69a9e3b..3af597aee65 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed-ref.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed-ref.html
@@ -1,5 +1,18 @@
<!DOCTYPE html>
<meta charset="utf-8">
+<style>
+ #target {
+ width: 100px;
+ height: 100px;
+ background: green;
+ position: fixed;
+ top: 0;
+ left: 100px;
+ }
-<!-- This test passes if both the anchor and anchored elements are hidden. -->
-<div style="height: 200vh;"></div>
+ #spacer {
+ height: 200vh;
+ }
+</style>
+<div id="target">target</div>
+<div id="spacer"></div>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed.tentative.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed.html
index c603288f0a7..c5e8e839ded 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed.tentative.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-both-position-fixed.html
@@ -21,7 +21,7 @@
position-area: bottom right;
width: 100px;
height: 100px;
- background: red;
+ background: green;
position: fixed;
top: 0;
left: 0;
@@ -32,7 +32,7 @@
}
</style>
-<!-- Test passes if #target is not visible, due to #anchor being off-screen. -->
+<!-- Test passes if #target is visible because there are no intervening clips. -->
<div id="anchor">anchor</div>
<div id="target">target</div>
<div id="spacer"></div>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed-ref.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed-ref.html
deleted file mode 100644
index e24992fd5ea..00000000000
--- a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed-ref.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-
-<!-- This test passes if both the anchor and anchored elements are hidden. -->
-<div style="height: 200vh;"></div>
-
-<script>
- window.scrollTo(0, 100);
-</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.html
new file mode 100644
index 00000000000..5107823efd9
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="assert" content="Position-visibility: anchors-visible should hide an element with a fixed-position anchored element." />
+<title>CSS Anchor Positioning Test: position-visibility: anchors-visible</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#position-visibility">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7758">
+<link rel="match" href="position-visibility-anchors-visible-ref.html">
+<style>
+ #scroll-container {
+ overflow: hidden scroll;
+ width: 300px;
+ height: 100px;
+ }
+
+ #anchor {
+ anchor-name: --a1;
+ width: 100px;
+ height: 100px;
+ background: orange;
+ }
+
+ #spacer {
+ height: 100px;
+ }
+
+ #target {
+ position-anchor: --a1;
+ position-visibility: anchors-visible;
+ position-area: bottom right;
+ width: 100px;
+ height: 100px;
+ background: red;
+ position: fixed;
+ top: 0;
+ left: 0;
+ }
+</style>
+
+<!-- Test passes if #target is not visible, due to #anchor being off-screen. -->
+<div id="scroll-container">
+ <div id="anchor">anchor</div>
+ <div id="spacer"></div>
+ <div id="target">target</div>
+</div>
+
+<script>
+ const scroller = document.getElementById('scroll-container');
+ scroller.scrollTop = 100;
+ // #target should not be visible because #anchor is scrolled out of view.
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.tentative.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.tentative.html
deleted file mode 100644
index 9c3495a635d..00000000000
--- a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-position-fixed.tentative.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<meta name="assert" content="position-visibility: anchors-visible should work with a fixed-position anchored element." />
-<title>CSS Anchor Positioning Test: position-visibility: anchors-visible</title>
-<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7758">
-<link rel="match" href="position-visibility-anchors-visible-position-fixed-ref.html">
-<style>
- #anchor {
- anchor-name: --a1;
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 100px;
- background: orange;
- }
-
- #target {
- position-anchor: --a1;
- position-visibility: anchors-visible;
- position-area: bottom right;
- width: 100px;
- height: 100px;
- background: red;
- position: fixed;
- top: 0;
- left: 0;
- }
-
- #spacer {
- height: 200vh;
- }
-</style>
-
-<!-- Test passes if #target is not visible, due to #anchor being off-screen. -->
-<div id="anchor">anchor</div>
-<div id="target">target</div>
-<div id="spacer"></div>
-
-<script>
- window.scrollTo(0, 100);
-</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position-ref.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position-ref.html
new file mode 100644
index 00000000000..5a364aa7847
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+ #scroll-container {
+ overflow: hidden scroll;
+ width: 300px;
+ height: 100px;
+ }
+
+ #spacer {
+ height: 100px;
+ }
+
+ #target {
+ position: relative;
+ width: 100px;
+ height: 100px;
+ left: 100px;
+ background: green;
+ }
+</style>
+
+<div id="scroll-container">
+ <div id="spacer"></div>
+ <div id="target">target</div>
+</div>
+
+<script>
+ const scroller = document.getElementById('scroll-container');
+ scroller.scrollTop = 100;
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position.html b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position.html
index 8ad3eb7e310..32eede4f088 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-visibility-anchors-visible-with-position.html
@@ -1,9 +1,9 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<meta name="assert" content="Position-visibility: anchors-visible should hide an element with an out-of-view anchor and a relpos scroller." />
+<meta name="assert" content="Position-visibility: anchors-visible should not hide an element with an out-of-view anchor and a relpos scroller." />
<title>CSS Anchor Positioning Test: position-visibility: anchors-visible</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#position-visibility">
-<link rel="match" href="position-visibility-anchors-visible-ref.html">
+<link rel="match" href="position-visibility-anchors-visible-with-position-ref.html">
<style>
#scroll-container {
overflow: hidden scroll;
@@ -30,7 +30,7 @@
position-area: bottom right;
width: 100px;
height: 100px;
- background: red;
+ background: green;
position: absolute;
top: 0;
left: 0;
@@ -46,5 +46,5 @@
<script>
const scroller = document.getElementById('scroll-container');
scroller.scrollTop = 100;
- // #target should not be visible because #anchor is scrolled out of view.
+ // #target should be visible because there are no intervening clips.
</script>
diff --git a/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html
new file mode 100644
index 00000000000..92b91077f3f
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001-ref.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<html>
+<meta charset="utf-8">
+<title>CSS Animations Test: animation with background-color "oklch"</title>
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="help" href="https://www.w3.org/TR/css-animations-2/">
+<meta name="assert" content="Check that the background-color is animated with oklch correctly">
+<style>
+#box {
+ block-size: 200px;
+ inline-size: 200px;
+ background-color: oklch(45% 0.2 264);
+}
+</style>
+<div id="box"></div>
+</html>
diff --git a/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html
new file mode 100644
index 00000000000..37d10e07cdb
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-001.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Animations Test: animation with background-color "oklch"</title>
+<link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+<link rel="help" href="https://www.w3.org/TR/css-animations-2/">
+<link rel="match" href="animate-with-background-color-oklch-001-ref.html">
+<meta name="assert" content="Check that the background-color is animated with oklch correctly">
+<style>
+@keyframes bg-color-oklch {
+ to {
+ background-color: oklch(45% 0.2 264); /* blue */
+ }
+}
+#box {
+ block-size: 200px;
+ inline-size: 200px;
+ background-color: #ff0000;
+ animation: linear 1s forwards bg-color-oklch;
+}
+</style>
+<div id="box"></div>
+<script>
+window.onload = () => {
+ requestAnimationFrame(() => {
+ const anim = document.getAnimations()[0];
+ anim.finish();
+ requestAnimationFrame(() => {
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ });
+};
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html
new file mode 100644
index 00000000000..ee6847c11bf
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/animate-with-background-color-oklch-002.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>CSS animations with background-color from legacy rgb to oklch</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-animations-2/">
+</head>
+<style>
+ @keyframes bg-color-oklch {
+ to {
+ background-color: oklch(45% 0.2 264); /* blue */
+ }
+ }
+ @keyframes bg-mix-color-oklch {
+ to {
+ background-color: color-mix(in oklch, oklch(45% 0.2 264), oklch(45% 0.2 264));
+ }
+ }
+
+ #target {
+ background: #ff0000;
+ animation-duration: 1s;
+ animation-timing-function: linear;
+ animation-play-state: paused;
+ animation-fill-mode: forwards;
+ height: 100px;
+ width: 100px;
+ }
+ .bg-color-oklch {
+ animation-name: bg-color-oklch;
+ }
+ .bg-mix-color-oklch {
+ animation-name: bg-mix-color-oklch;
+ }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<script src="/css/support/color-testcommon.js"></script>
+
+<body>
+ <div id="target"></div>
+ <div id="test"></div>
+</body>
+<script>
+ 'use strict';
+
+ async function runAnimationTest(t, name, expected_colors) {
+ const target = document.getElementById('target');
+ target.classList.add(name);
+ t.add_cleanup(() => {
+ target.classList.remove(name);
+ });
+ const anim = document.getAnimations()[0];
+ await anim.ready;
+ expected_colors.forEach(data => {
+ anim.currentTime = 1000 * data.at;
+ const actual = getComputedStyle(target).backgroundColor;
+ const expected = data.value;
+ assert_equals(actual, expected, `Background color at ${100*data.at}% animation progress`);
+ });
+ }
+
+ const bg_color_legacy_rgb_to_oklch = [
+ { at: 0, value: 'rgb(255, 0, 0)' },
+ { at: 0.25, value: 'oklab(0.583475 0.163433 0.0446685)' },
+ { at: 0.5, value: 'oklab(0.538983 0.101987 -0.0365225)' },
+ { at: 0.75, value: 'oklab(0.494492 0.0405407 -0.117713)' },
+ { at: 1, value: 'oklab(0.45 -0.0209057 -0.198904)' }
+ ];
+
+ window.onload = async () => {
+ promise_test(t => {
+ return runAnimationTest(t, 'bg-color-oklch', bg_color_legacy_rgb_to_oklch);
+ }, 'Animate from legacy rgb to oklch');
+
+ promise_test(t => {
+ return runAnimationTest(t, 'bg-mix-color-oklch', bg_color_legacy_rgb_to_oklch);
+ }, 'Animate from legacy rgb to color-mix oklch');
+ };
+
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html
new file mode 100644
index 00000000000..23886237402
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-404743651.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>CSS Animations: Chrome crash for getKeyframes() when animating background-image</title>
+<link rel="help" href="https://crbug.com/404743651">
+<style>
+ @keyframes animate {
+ to { background-image: url(foo.jpg); }
+ }
+ #target {
+ animation: animate 100s;
+ }
+</style>
+<div id="target"></div>
+<script>
+ for (let anim of document.getAnimations()) {
+ anim.effect.getKeyframes();
+ }
+</script>
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
index 688f01c8668..36fc7a88825 100644
--- 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
@@ -5,6 +5,11 @@
<script src="resources/resolve-corner-style.js"></script>
<script src="resources/corner-utils.js"></script>
<script src="resources/corner-shape.js"></script>
+<style>
+ body {
+ margin: 0;
+ }
+</style>
<script>
const canvas = document.getElementById("target");
const params = new URLSearchParams(location.search);
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
deleted file mode 100644
index 9c256eb8977..00000000000
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-any.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!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-bevel-overflow.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow.html
index df604db8d13..5a18e11af61 100644
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow.html
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<title>CSS Borders and Box Decorations 4: 'corner-shape' rendering with overflow</title>
<link rel="match" href="corner-shape-bevel-overflow-ref.html">
-<meta name="fuzzy" content="maxDifference=0-32;totalPixels=0-32">
+<meta name="fuzzy" content="maxDifference=0-32;totalPixels=0-256">
<style>
.bevel {
background: red;
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill.html
index 6e5df8364c5..b8c8bc0ad2e 100644
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill.html
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-fill.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<head>
<link rel="match" href="corner-shape-fill-ref.html">
-<meta name="fuzzy" content="maxDifference=0-32;totalPixels=0-32">
+<meta name="fuzzy" content="maxDifference=0-32;totalPixels=0-256">
<style>
.target {
background: green;
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-gallery.manual.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-gallery.manual.html
new file mode 100644
index 00000000000..1eb6cbd8df3
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-gallery.manual.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>Displays all the corner-shape-any.html variants side by side</title>
+<style>
+section {
+ display: flex;
+ flex-direction: column;
+ padding: 10px;
+ margin: 10px;
+ border: 2px solid grey;
+ border-radius: 2px;
+ background: lightgray;
+}
+
+label {
+ overflow-y: auto;
+ max-width: 250px;
+ max-height: 40px;
+ font-size: 10px;
+}
+
+iframe {
+ overflow: clip;
+ width: 250px;
+ height: 150px;
+ border: none;
+}
+
+main {
+ display: flex;
+ flex-wrap: wrap;
+}
+</style>
+<template id="scenario">
+ <section>
+ <label class="variant"></label>
+ Test:
+ <iframe class="test" frameborder="0" scrolling="no"></iframe>
+ Ref:
+ <iframe class="ref" frameborder="0" scrolling="no"></iframe>
+ </section>
+</template>
+<script>
+ addEventListener("DOMContentLoaded", async () => {
+ const test_files = ["corner-shape-render-precise.html", "corner-shape-render-fuzzy.html"]
+ const dom_parser = new DOMParser();
+ for (const test_file of test_files) {
+ const test_html = await (await fetch(test_file)).text();
+ const test_doc = dom_parser.parseFromString(test_html, "text/html");
+ const variants = Array.from(test_doc.querySelectorAll("meta[name=variant]")).map(m => m.content);
+ for (const variant of variants) {
+ const scenario = document.getElementById("scenario").content.cloneNode(true);
+ scenario.querySelector(".variant").innerText = variant;
+ scenario.querySelector(".test").src = `${test_file}${variant}`;
+ scenario.querySelector(".ref").src = `corner-shape-any-ref.html${variant}`;
+ document.querySelector("main").append(scenario);
+ }
+ }
+ });
+</script>
+<main></main>
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html
new file mode 100644
index 00000000000..5c276b6d5ac
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html
@@ -0,0 +1,44 @@
+<!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="fuzzy" content="maxDifference=0-200;totalPixels=0-550">
+<meta name="variant" content="?corner-shape=scoop&border-radius=20%&border-width=20px&border-top-color=rebeccapurple&border-bottom-color=blue">
+<meta name="variant" content="?corner-shape=scoop&border-radius=20%&border-width=20px">
+<meta name="variant" content="?corner-top-left-shape=notch&border-radius=40px&border-width=10px&border-color=blue&border-left-color=yellow">
+<meta name="variant" content="?corner-shape=superellipse(0.25)&border-radius=20%&border-width=20px">
+<meta name="variant" content="?corner-top-left-shape=bevel&border-radius=40px&border-width=10px">
+<meta name="variant" content="?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%">
+<meta name="variant" content="?corner-shape=squircle&border-radius=25%&border-width=20px">
+<meta name="variant" content="?corner-shape=squircle&border-radius=25%&box-shadow=10px 10px 0 10px black">
+<meta name="variant" content="?corner-shape=squircle&border-radius=50%">
+<meta name="variant" content="?corner-shape=superellipse(0.05)&border-radius=20%&border-width=20px">
+<meta name="variant" content="?corner-shape=superellipse(40)&border-radius=20%&border-width=20px">
+<meta name="variant" content="?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40px&border-width=10px">
+<meta name="variant" content="?corner-top-left-shape=superellipse(0.3)&border-radius=40%">
+<meta name="variant" content="?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px">
+<meta name="variant" content="?corner-top-right-shape=scoop&border-radius=20%&border-width=10px">
+<meta name="variant" content="?corner-shape=superellipse(1.8)&border-radius=40px&border-width=10px&border-left-color=purple">
+<style>
+ body {
+ margin: 0;
+ }
+ #target {
+ width: 200px;
+ height: 100px;
+ box-sizing: border-box;
+ background: green;
+ border-style: solid;
+ border-color: black;
+ border-width: 0;
+ }
+</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-render-precise.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html
new file mode 100644
index 00000000000..81cb56d341f
--- /dev/null
+++ b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-precise.html
@@ -0,0 +1,48 @@
+<!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="fuzzy" content="maxDifference=0-180;totalPixels=0-350">
+<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-left-radius=5px">
+<meta name="variant" content="?corner-shape=superellipse(5.2)&border-radius=40%">
+<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-right-shape=superellipse(1.9)&border-bottom-right-radius=50%">
+<meta name="variant" content="?corner-top-left-shape=bevel&border-radius=40px">
+<meta name="variant" content="?corner-top-left-shape=scoop&border-radius=40px">
+<meta name="variant" content="?corner-top-left-shape=superellipse(0.2)&border-radius=40px">
+<meta name="variant" content="?corner-top-left-shape=superellipse(1.2)&border-radius=40px">
+<meta name="variant" content="?corner-top-left-shape=superellipse(0.8)&border-radius=40px">
+<meta name="variant" content="?corner-shape=superellipse(8)&border-radius=10px&box-shadow=10px 10px 0 10px black">
+<meta name="variant" content="?corner-shape=squircle&border-top-left-radius=25%&border-width=10px">
+<meta name="variant" content="?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px">
+<meta name="variant" content="?corner-top-left-shape=bevel&border-width=10px&border-color=black">
+<meta name="variant" content="?corner-top-right-shape=bevel&border-width=10px&border-color=black">
+<meta name="variant" content="?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px">
+<meta name="variant" content="?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px">
+<meta name="variant" content="?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel">
+<style>
+ body {
+ margin: 0;
+ }
+ #target {
+ width: 200px;
+ height: 100px;
+ box-sizing: border-box;
+ background: green;
+ border-style: solid;
+ border-color: black;
+ border-width: 0;
+ }
+</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-render-ref.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html
deleted file mode 100644
index 1a9043cbc82..00000000000
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html
+++ /dev/null
@@ -1,172 +0,0 @@
-<!DOCTYPE html>
-<head>
-<meta charset="utf-8">
-<title>CSS Borders and Box Decorations 4: 'corner-shape' rendering</title>
-</head>
-<body>
-<canvas width="200" height="200" id="canvas"></canvas>
-<style>
- canvas {
- width: 200px;
- height: 200px;
- }
-</style>
-<script>
-const canvas = document.getElementById("canvas");
-const params = new URLSearchParams(location.search);
-const style = Object.fromEntries(params.entries());
-const { width, height } = canvas;
-
-// Populate defaults and constraints.
-for (const vSide of ["top", "bottom"]) {
- for (const hSide of ["left", "right"]) {
- let shape =
- style[`corner-${vSide}-${hSide}-shape`] ||
- style["corner-shape"] ||
- "round";
- const hWidth = parseFloat(
- style[`border-${hSide}-width`] || style["border-width"] || "10px"
- );
- const vWidth = parseFloat(
- style[`border-${vSide}-width`] || style["border-width"] || "10px"
- );
- let radius = (
- style[`border-${vSide}-${hSide}-radius`] ||
- style["border-radius"] ||
- "20px"
- ).match(/[0-9]*(\.[0-9]+)?/)?.[0];
-
- radius = [
- Math.min(parseFloat(radius), width / 2),
- Math.min(parseFloat(radius), height / 2)
- ];
- style[`corner-${vSide}-${hSide}-shape`] = shape;
- style[`border-${vSide}-${hSide}-radius`] = radius;
- style[`border-${hSide}-width`] = hWidth;
- style[`border-${vSide}-width`] = vWidth;
- }
-}
-
-const ctx = canvas.getContext("2d");
-const keywords = {bevel: 1, round: 2};
-// Adjust outer width for curvature
-const outer_width = ["top", "bottom"].flatMap((vSide) =>
- ["left", "right"].map((hSide) => {
- const corner = `${vSide}-${hSide}`;
- let shape = style[`corner-${corner}-shape`];
- shape = keywords[shape] || shape;
- const radius = style[`border-${corner}-radius`];
- const hWidth = style[`border-${hSide}-width`];
- const vWidth = style[`border-${vSide}-width`];
- if (shape >= 2.)
- return radius;
- if (shape <= 0.5)
- return [radius[0] - vWidth, radius[1] - hWidth];
- const offset = Math.sqrt(2. / shape) - 1;
- return [radius[0] - vWidth * offset, radius[1] - hWidth * offset];
- })
-);
-let cursor = [];
-function lineTo(x, y) {
- ctx.lineTo(x, y);
- cursor = [x, y];
-}
-function moveTo(x, y) {
- ctx.moveTo(x, y);
- cursor = [x, y];
-}
-
-function cornerTo(x, y, corner) {
- if (x == cursor[0] && y === cursor[1]) return;
- const shape = style[`corner-${corner}-shape`];
-
- // TODO: add other curves.
- if (shape === "bevel")
- lineTo(x, y);
- else {
- ctx.arcTo(
- corner === "top-left" || corner === "bottom-right" ? cursor[0] : x,
- corner === "top-left" || corner === "bottom-right" ? y : cursor[1],
- x,
- y,
- Math.abs(x - cursor[0])
- );
- cursor = [x, y];
- }
-}
-
-ctx.clearRect(0, 0, width, height);
-ctx.beginPath();
-
-
-moveTo(width - outer_width[1][0], 0);
-cornerTo(width, outer_width[1][1], "top-right");
-lineTo(width, height - outer_width[3][1]);
-cornerTo(width - outer_width[3][0], height, "bottom-right");
-lineTo(outer_width[2][0], height);
-cornerTo(0, height - outer_width[2][1], "bottom-left");
-lineTo(0, outer_width[0][1]);
-cornerTo(outer_width[0][0], 0, "top-left");
-lineTo(width - outer_width[1][0], 0);
-
-// Inner path
-moveTo(
- Math.max(style["border-top-left-radius"][0], style["border-left-width"]),
- style["border-top-width"]
-);
-
-lineTo(width - style["border-top-right-radius"][0], style["border-top-width"]);
-cornerTo(
- width - style["border-right-width"],
- Math.max(style["border-top-width"], style["border-top-right-radius"][1]),
- "top-right"
-);
-
-lineTo(
- width - style["border-right-width"],
- height -
- Math.max(
- style["border-bottom-width"],
- style["border-bottom-right-radius"][1]
- )
-);
-
-cornerTo(
- width -
- Math.max(
- style["border-right-width"],
- style["border-bottom-right-radius"][0]
- ),
- height - style["border-bottom-width"],
- "bottom-right"
-);
-
-lineTo(
- Math.max(style["border-left-width"], style["border-bottom-left-radius"][0]),
- height - style["border-bottom-width"]
-);
-
-cornerTo(
- style["border-left-width"],
- height -
- Math.max(style["border-top-width"], style["border-bottom-left-radius"][1]),
- "bottom-left"
-);
-
-lineTo(
- style["border-left-width"],
- Math.max(style["border-top-width"], style["border-top-left-radius"][1])
-);
-cornerTo(
- Math.max(style["border-left-width"], style["border-top-left-radius"][0]),
- style["border-top-width"],
- "top-left"
-);
-
-if ("background-color" in style) {
- ctx.fillStyle = style["background-color"];
- ctx.fill("nonzero");
-}
-ctx.fillStyle = "black";
-ctx.fill("evenodd");
-</script>
diff --git a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html b/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html
deleted file mode 100644
index 6b9acb3447f..00000000000
--- a/tests/wpt/tests/css/css-borders/tentative/corner-shape/corner-shape-render.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<head>
-<meta charset="utf-8">
-<title>CSS Borders and Box Decorations 4: 'corner-shape' rendering</title>
-<link rel="help" href="https://drafts.csswg.org/css-borders-4/#corner-shaping">
-<link rel="match" href="corner-shape-render-ref.html">
-<meta name="variant" content="?corner-shape=bevel">
-<meta name="variant" content="?corner-top-left-shape=bevel">
-<meta name="variant" content="?corner-top-right-shape=bevel">
-<meta name="variant" content="?corner-bottom-left-shape=bevel">
-<meta name="variant" content="?corner-bottom-right-shape=bevel">
-<meta name="variant" content="?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel">
-<meta name="variant" content="?corner-top-left-shape=bevel&border-radius=40px">
-<meta name="variant" content="?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px">
-<meta name="variant" content="?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-bottom-right-radius=80px&border-width=32px">
-<meta name="fuzzy" content="maxDifference=0-82;totalPixels=0-800">
-</head>
-<body>
- <style>
- #target {
- width: 200px;
- height: 200px;
- border-width: 10px;
- border-radius: 20px;
- border-style: solid;
- box-sizing: border-box;
- }
- </style>
-<div id="target"></div>
-<script>
- const target = document.getElementById("target");
- const params = new URLSearchParams(location.search);
- for (const [key, value] of params.entries()) {
- target.style[key] = value;
- }
-</script>
-</body> \ No newline at end of file
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
index 2aaaf5ed289..de471f95dfc 100644
--- 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
@@ -95,6 +95,7 @@ function add_corner(ctx, ax, ay, bx, by, curvature) {
* 'border-right-width': number,
* 'border-bottom-width': number,
* 'border-left-width': number,
+ * 'shadow': { blur: number, offset: [number, number], spread: number, color: string }
* }} style
* @param {CanvasRenderingContext2D} ctx
* @param {number} width
@@ -103,27 +104,58 @@ function add_corner(ctx, ax, ay, bx, by, curvature) {
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) {
+ function draw_outer_corner(corner) {
const params = corner_params[corner];
- add_corner(ctx, ...params.outer_rect, params.shape, phase, direction);
+ add_corner(ctx, ...params.outer_rect, params.shape);
}
- function draw_inner_corner_from_params(params, phase = "both", direction) {
- add_corner(ctx, ...params.inner_rect, params.shape, phase, direction);
+ function draw_inner_corner_from_params(params) {
+ add_corner(ctx, ...params.inner_rect, params.inner_shape);
}
- function draw_inner_corner(corner, phase = "both", direction) {
- draw_inner_corner_from_params(corner_params[corner], phase, direction);
+ function draw_inner_corner(corner) {
+ draw_inner_corner_from_params(corner_params[corner]);
}
- ctx.beginPath();
+ function draw_shadow() {
+ if (!style.shadow || !style.shadow.length) {
+ return;
+ }
- 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");
+ for (const {spread, offset, color} of style.shadow) {
+ const params = resolve_corner_params(style, width, height, spread);
+ ctx.save();
+ ctx.translate(...offset);
+ ctx.beginPath();
+ ctx.lineTo(params['top-right'].inner_rect[0], -spread);
+ draw_inner_corner_from_params(params['top-right']);
+ ctx.lineTo(params['top-right'].inner_rect[2], params['top-right'].inner_rect[3])
+ ctx.lineTo(params['bottom-right'].inner_rect[0], params['bottom-right'].inner_rect[1])
+ draw_inner_corner_from_params(params['bottom-right']);
+ ctx.lineTo(params['bottom-right'].inner_rect[2], params['bottom-right'].inner_rect[3]);
+ ctx.lineTo(params['bottom-left'].inner_rect[0], params['bottom-left'].inner_rect[1]);
+ draw_inner_corner_from_params(params['bottom-left']);
+ ctx.lineTo(params['bottom-left'].inner_rect[2], params['bottom-left'].inner_rect[3])
+ ctx.lineTo(params['top-left'].inner_rect[0], params['top-left'].inner_rect[1])
+ draw_inner_corner_from_params(params['top-left']);
+ ctx.lineTo(params['top-left'].inner_rect[2], params['top-left'].inner_rect[3]);
+ ctx.lineTo(params['top-right'].inner_rect[0], params['top-right'].inner_rect[1]);
+ ctx.fillStyle = color;
+ ctx.closePath();
+ ctx.fill("nonzero");
+ ctx.restore();
+ }
+ }
+
+ function draw_outer_path() {
+ 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.fill("nonzero");
+ }
const inner_rect = [
style["border-left-width"],
@@ -131,6 +163,72 @@ function render_rect_with_corner_shapes(style, ctx, width, height) {
width - style["border-right-width"],
height - style["border-bottom-width"],
];
+
+ draw_shadow();
+ {
+ ctx.save();
+ ctx.beginPath();
+ ctx.moveTo(0, 0);
+ ctx.lineTo(corner_params['top-left'].inner_rect[2], corner_params['top-left'].inner_rect[1])
+ ctx.lineTo(corner_params['top-left'].inner_rect[2], inner_rect[1]);
+ ctx.lineTo(corner_params['top-right'].inner_rect[0], inner_rect[1]);
+ ctx.lineTo(corner_params['top-right'].inner_rect[0], corner_params['top-right'].inner_rect[3]);
+ ctx.lineTo(width, 0);
+ ctx.closePath();
+ ctx.clip();
+ ctx.fillStyle = style['border-top-color'];
+ draw_outer_path();
+ ctx.restore();
+ }
+
+ {
+ ctx.save();
+ ctx.beginPath();
+ ctx.moveTo(width, 0);
+ ctx.lineTo(corner_params['top-right'].inner_rect[0], corner_params['top-right'].inner_rect[3]);
+ ctx.lineTo(inner_rect[2], corner_params['top-right'].inner_rect[3]);
+ ctx.lineTo(inner_rect[2], corner_params['bottom-right'].inner_rect[1]);
+ ctx.lineTo(corner_params['bottom-right'].inner_rect[2], corner_params['bottom-right'].inner_rect[1]);
+ ctx.lineTo(width, height);
+ ctx.closePath();
+ ctx.clip();
+ ctx.fillStyle = style['border-right-color'];
+ draw_outer_path();
+ ctx.restore();
+ }
+
+ {
+ ctx.save();
+ ctx.beginPath();
+ ctx.lineTo(width, height);
+ ctx.lineTo(corner_params['bottom-right'].inner_rect[2], corner_params['bottom-right'].inner_rect[1]);
+ ctx.lineTo(corner_params['bottom-right'].inner_rect[2], inner_rect[3]);
+ ctx.lineTo(corner_params['bottom-left'].inner_rect[0], inner_rect[3]);
+ ctx.lineTo(corner_params['bottom-left'].inner_rect[0], corner_params['bottom-left'].inner_rect[3]);
+ ctx.lineTo(0, height);
+ ctx.closePath();
+ ctx.clip();
+ ctx.fillStyle = style['border-bottom-color'];
+ draw_outer_path();
+ ctx.restore();
+ }
+
+ {
+ ctx.save();
+ ctx.beginPath();
+ ctx.lineTo(0, height);
+ ctx.lineTo(corner_params['bottom-left'].inner_rect[0], corner_params['bottom-left'].inner_rect[3]);
+ ctx.lineTo(inner_rect[0], corner_params['bottom-left'].inner_rect[3]);
+ ctx.lineTo(inner_rect[0], corner_params['top-left'].inner_rect[1]);
+ ctx.lineTo(corner_params['top-left'].inner_rect[2], corner_params['top-left'].inner_rect[1])
+ ctx.lineTo(0, 0);
+ ctx.closePath();
+ ctx.clip();
+ ctx.fillStyle = style['border-left-color'];
+ draw_outer_path();
+ ctx.restore();
+ }
+
ctx.save();
ctx.beginPath();
draw_inner_corner("top-right");
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
index 39203aefc67..bacaaa8a6e4 100644
--- 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
@@ -7,8 +7,9 @@ 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);
+ if (curvature <= 0.001)
+ return [1, -1];
+ const {x} = superellipse(Math.min(2, Math.max(0.5, curvature)));
const [a, b] = [x, 1 - x].map((m) => 2 * m - 0.5);
const magnitude = Math.hypot(a, b);
// Normalize a & b
@@ -17,6 +18,19 @@ function offset_for_curvature(curvature) {
return [norm_a, -norm_b];
}
+function compute_inner_curvature(curvature, outer_length, inner_length) {
+ if (curvature === 0)
+ return 0;
+ if (curvature < 1)
+ return 1 /
+ compute_inner_curvature(1 / curvature, outer_length, inner_length);
+ const target_length = (inner_length - outer_length) / Math.SQRT2;
+ return Math.log(0.5) /
+ Math.log(
+ (Math.pow(0.5, 1 / curvature) * outer_length + target_length) /
+ inner_length);
+}
+
/**
*
* @param {number} curvature
@@ -91,36 +105,49 @@ function resolve_corner_params(style, width, height, outset = null) {
};
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];
+ Object.entries(params).map(([corner, {outer, inset}]) => {
+ const outer_rect = outer;
+ 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 offset = offset_for_curvature(shape);
- if (Math.sign(inner_offset[0]) === Math.sign(inner_offset[1])) {
- offset.reverse();
- }
+ const inner_rect = [
+ outer_rect[0] + inner_offset[0] * offset[0],
+ outer_rect[1] + inner_offset[1] * offset[1],
+ outer_rect[2] + inner_offset[2] * offset[1],
+ outer_rect[3] + inner_offset[3] * offset[0],
+ ];
- 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],
- ];
+ let inner_shape = shape;
+ if (shape > 2 || shape < 0.5) {
+ const outer_length = Math.hypot(
+ outer_rect[2] - outer_rect[0], outer_rect[3] - outer_rect[1]);
+ const inner_length = Math.hypot(
+ inner_rect[2] - inner_rect[0], inner_rect[3] - inner_rect[1])
+ inner_shape =
+ compute_inner_curvature(shape, outer_length, inner_length);
+ }
- return [
- corner,
- {
- outer_rect: outer,
- shape,
- inset,
- inner_rect,
- inner_offset,
- },
- ];
- })
- );
+ return [
+ corner,
+ {
+ outer_rect,
+ shape,
+ inner_shape,
+ inset,
+ inner_rect,
+ inner_offset,
+ inner_shape
+ },
+ ];
+ }));
}
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 ea065f577e0..93e5112ea40 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
@@ -17,8 +17,8 @@ function resolve_corner_style(style, w, h) {
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 = parseFloat(style[`border-${hSide}-width`] || style['border-width'] || 0);
+ const vWidth = parseFloat(style[`border-${vSide}-width`] || style['border-width'] || 0);
let radius =
style[`border-${vSide}-${hSide}-radius`] || style['border-radius'] || 0;
if (!Array.isArray(radius))
@@ -34,6 +34,18 @@ function resolve_corner_style(style, w, h) {
style[`border-${vSide}-${hSide}-radius`] = radius;
style[`border-${hSide}-width`] = hWidth;
style[`border-${vSide}-width`] = vWidth;
+ style[`border-${hSide}-color`] = style[`border-${hSide}-color`] || style[`border-color`];
+ style[`border-${vSide}-color`] = style[`border-${vSide}-color`] || style[`border-color`];
+ if ('box-shadow' in style) {
+ const shadows = style['box-shadow'].split(",");
+ style.shadow = [];
+ const boxShadowRegex = /(?:(-?\d+(?:\.\d+)?)px)\s+(?:(-?\d+(?:\.\d+)?)px)\s+(?:(-?\d+(?:\.\d+)?)(?:px)?)?(?:\s+(?:(-?\d+(?:\.\d+)?)px))?\s+([^\$]*)/i;
+ for (const shadow of shadows.toReversed()) {
+ const parsed = shadow.match(boxShadowRegex)
+ if (parsed)
+ style.shadow.push({offset: [parseFloat(parsed[1]), parseFloat(parsed[2])], blur: parsed[3], spread: parsed[4], color: parsed[5] || "black" });
+ }
+ }
}));
return style;
}
diff --git a/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html b/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html
index 23ee07d177a..9bb87459623 100644
--- a/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html
+++ b/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html
@@ -527,6 +527,8 @@
fuzzy_test_computed_color(`lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `lch(0.7 45 30 / 0.4)`);
fuzzy_test_computed_color(`lch(from lch(50 5 10 / 0.8) calc(l + 1) calc(c + 1) calc(h + 1) / calc(alpha + 0.01))`, `lch(51 6 11 / 0.81)`);
fuzzy_test_computed_color(`lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))`, `lch(0.7 45 30)`);
+ fuzzy_test_computed_color(`lch(from red calc((49.44 - l) * infinity) 0 0)`, `lch(0 0 0)`);
+ fuzzy_test_computed_color(`lch(from blue calc((49.44 - l) * infinity) 0 0)`, `lch(100 0 0)`);
// Alpha is clamped to [0,1]
fuzzy_test_computed_color(`lch(from lch(from lch(0.7 45 30) l c h / calc(alpha + 0.5)) l c h / calc(alpha - 0.5))`, `lch(0.7 45 30 / 0.5)`);
diff --git a/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html
new file mode 100644
index 00000000000..731b2c4d6d2
--- /dev/null
+++ b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content-before.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+ <head>
+ <title>CSS Test (Conditional Rules): In @supports, ::details-content::before can be parsed successfully</title>
+ <link rel="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com">
+ <link rel="help" href="https://drafts.csswg.org/css-conditional-3/#at-supports">
+ <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#details-content-pseudo">
+ <link rel="match" href="at-supports-001-ref.html">
+ <style>
+ div {
+ background: red;
+ height: 100px;
+ width: 100px;
+ }
+ @supports selector(input::details-content::before) {
+ div { background-color:green; }
+ }
+ </style>
+ </head>
+ <body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html
new file mode 100644
index 00000000000..89e7606de5b
--- /dev/null
+++ b/tests/wpt/tests/css/css-conditional/at-supports-selector-details-content.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+ <head>
+ <title>CSS Test (Conditional Rules): In @supports, ::details-content can be parsed successfully</title>
+ <link rel="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com">
+ <link rel="help" href="https://drafts.csswg.org/css-conditional-3/#at-supports">
+ <link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#details-content-pseudo">
+ <link rel="match" href="at-supports-001-ref.html">
+ <style>
+ div {
+ background: red;
+ height: 100px;
+ width: 100px;
+ }
+ @supports selector(input::details-content) {
+ div { background-color:green; }
+ }
+ </style>
+ </head>
+ <body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div></div>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html b/tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html
new file mode 100644
index 00000000000..67a46fe82a2
--- /dev/null
+++ b/tests/wpt/tests/css/css-conditional/js/CSS-supports-details-content-pseudo-parsing.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS.supports() ::details-content parsing</title>
+<link rel="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/css-conditional-4/#the-css-namespace">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#element-like">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content)"), true);
+ }, "selector() function accepts ::details-content");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content::before)"), true);
+ }, "selector() function accepts ::details-content followed by ::before");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content::first-line)"), true);
+ }, "selector() function accepts ::details-content followed by ::first-line");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content:hover"), true);
+ }, "selector() function accepts ::details-content followed by a state pseudo-class");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content:lang(en)"), true);
+ }, "selector() function accepts ::details-content followed by :lang()");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content:nth-of-type(slot)"), false);
+ }, "selector() function doesn't accept ::details-content followed by a tree-structural pseudo-class");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content:has(a)"), false);
+ }, "selector() function doesn't accept ::details-content followed by :has()");
+
+ test(function() {
+ assert_equals(CSS.supports("selector(::details-content::part(a)"), false);
+ }, "selector() function doesn't accept ::details-content followed by a part");
+</script>
diff --git a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-auto-text-fragment.html b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-auto-text-fragment.html
index d5184d72a4e..923c5af04f4 100644
--- a/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-auto-text-fragment.html
+++ b/tests/wpt/tests/css/css-contain/content-visibility/content-visibility-auto-text-fragment.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>Content Visibility: navigating to a text fragment.</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://www.w3.org/TR/css-contain-2/#content-visibility">
<meta name="timeout" content="long">
<meta name="assert" content="content-visibility: auto subtrees are 'searchable' by text fragment links">
diff --git a/tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html b/tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html
new file mode 100644
index 00000000000..510b51716ce
--- /dev/null
+++ b/tests/wpt/tests/css/css-easing/linear-timing-functions-chrome-405004975-crash.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Chrome crash bug 405004975</title>
+<link rel="help" href="https://crbug.com/405004975">
+<style>
+ div {
+ transition-timing-function: linear(0, 0.25, sibling-index());
+ transition-timing-function: linear(0, 0.25, sign(2em - 20px));
+ }
+</style>
+<p>Passes if test does not fail any CHECKs or DCHECKs.</p>
diff --git a/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html b/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html
new file mode 100644
index 00000000000..6498988dd53
--- /dev/null
+++ b/tests/wpt/tests/css/css-flexbox/flex-shorthand-calc.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Flexbox Test: Allow complex calc expressions in flex shorthand</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/shorthand-testcommon.js"></script>
+<div>
+ <div id="target"></div>
+</div>
+<script>
+ test_shorthand_value('flex', 'sign(1em - 1px) sibling-index()', {
+ 'flex-grow': 'sign(1em - 1px)',
+ 'flex-shrink': 'sibling-index()',
+ 'flex-basis': 'auto'
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html b/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html
index ea1f4f6fa45..074d0f7395c 100644
--- a/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html
+++ b/tests/wpt/tests/css/css-flexbox/parsing/flex-computed.html
@@ -9,13 +9,19 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
<style>
+ #container {
+ container-type: inline-size;
+ width: 10px;
+ }
#target {
font-size: 40px;
}
</style>
</head>
<body>
-<div id="target"></div>
+<div id="container">
+ <div id="target"></div>
+</div>
<script>
test_computed_value("flex", "none", "0 0 auto");
test_computed_value("flex", "1", "1 1 0%");
@@ -25,6 +31,12 @@ test_computed_value("flex", "7% 8", "8 1 7%");
test_computed_value("flex", "8 auto", "8 1 auto");
test_computed_value("flex", "calc(10px + 0.5em)", "1 1 30px");
test_computed_value("flex", "calc(10px - 0.5em)", "1 1 0px");
+test_computed_value("flex", "1 1 calc(10em)", "1 1 400px");
+test_computed_value("flex", "1 1 calc(-10em)", "1 1 0px");
+test_computed_value("flex", "calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px", "5 5 1px");
+test_computed_value("flex", "1 1 calc(10px + (sign(20cqw - 10px) * 5px))", "1 1 5px");
+test_computed_value("flex", "calc(1) calc(2 + 1) calc(3px)", "1 3 3px");
+test_computed_value("flex", "calc(-1) calc(-1) 0", "0 0 0px");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html b/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html
index ae010d7b4b4..d47f8b67930 100644
--- a/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html
+++ b/tests/wpt/tests/css/css-flexbox/parsing/flex-invalid.html
@@ -16,6 +16,8 @@ test_invalid_value("flex", "none 1");
test_invalid_value("flex", "2 3 4");
test_invalid_value("flex", "5px 7%");
test_invalid_value("flex", "9 none");
+test_invalid_value("flex", "1 2 calc(0)");
+test_invalid_value("flex", "1 2 calc(3 - 3)");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html b/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html
index f3eaf118da6..4c57fe4e253 100644
--- a/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html
+++ b/tests/wpt/tests/css/css-flexbox/parsing/flex-valid.html
@@ -9,15 +9,37 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
+<style>
+ #container {
+ container-type: inline-size;
+ width: 10px;
+ }
+ #target {
+ font-size: 40px;
+ }
+</style>
</head>
<body>
+<div id="container">
+ <div id="target"></div>
+</div>
<script>
test_valid_value("flex", "none", "0 0 auto");
test_valid_value("flex", "1", "1 1 0%");
test_valid_value("flex", "2 3", "2 3 0%");
test_valid_value("flex", "4 5 6px");
+test_valid_value("flex", "6px 4 5", "4 5 6px");
+test_valid_value("flex", "6px 4", "4 1 6px");
+test_valid_value("flex", "6px", "1 1 6px");
test_valid_value("flex", "7% 8", "8 1 7%");
test_valid_value("flex", "8 auto", "8 1 auto");
+test_valid_value("flex", "1 1 10em", "1 1 10em");
+test_valid_value("flex", "1 1 calc(10em)", "1 1 calc(10em)");
+test_valid_value("flex", "1 1 calc(-10em)", "1 1 calc(-10em)");
+test_valid_value("flex", "calc(10 + (sign(20cqw - 10px) * 5)) calc(10 + (sign(20cqw - 10px) * 5)) 1px", "calc(10 + (5 * sign(20cqw - 10px))) calc(10 + (5 * sign(20cqw - 10px))) 1px");
+test_valid_value("flex", "1 1 calc(10px + (sign(20cqw - 10px) * 5px))", "1 1 calc(10px + (5px * sign(20cqw - 10px)))");
+test_valid_value("flex", "calc(1) calc(2 + 1) calc(3px)", "calc(1) calc(3) calc(3px)");
+test_valid_value("flex", "calc(-1) calc(-1) 0", "calc(-1) calc(-1) 0px");
// The following is not yet supported by browsers:
// test_valid_value("flex", "content");
diff --git a/tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html b/tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html
new file mode 100644
index 00000000000..87f20000f1f
--- /dev/null
+++ b/tests/wpt/tests/css/css-flexbox/percent-height-flex-items-cross-sizes-with-mutations.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#layout-algorithm">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<meta name="assert" content="Tests that the cross size of flexboxes and flex items with % height are computed correctly with various mutations.">
+<style>
+.flexbox {
+ display: flex;
+ font: 10px/1 Ahem;
+ outline: 1px solid black;
+}
+.grid {
+ display: grid;
+ outline: 1px solid magenta;
+}
+.flexbox > div {
+ width: min-content;
+ outline: 1px solid blue;
+}
+.percent-height {
+ min-height: 100%;
+}
+.fixed-height {
+ height: 100px;
+}
+.align-start {
+ align-items: start;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+function mutateContent() {
+ document.querySelectorAll("#one, #two, #three").forEach((element) => {
+ element.innerHTML += " a";
+ });
+
+ document.querySelector("#four").style.width = "auto";
+ document.querySelector("#five").style.height = "auto";
+ document.querySelector("#six").style.height = "100px";
+
+ document.querySelectorAll("#seven, #eight").forEach((element) => {
+ element.style.alignItems = "start";
+ });
+}
+</script>
+</head>
+<body>
+
+<!-- Non-percent height flex item is mutated and percent height flex item should be
+ stretched up. -->
+<div class="flexbox test" data-expected-height="40">
+ <div id="one" class="test" data-expected-height="40">a a a</div>
+ <div class="percent-height test" data-expected-height="40">a</div>
+</div>
+
+<!-- Non-percent height flex item content is mutated and should be stretched to percent
+ height flex item's size. -->
+<div class="flexbox test" data-expected-height="40">
+ <div id="two" class="min-content percent-height test" data-expected-height="40">a a a</div>
+ <div class="test" data-expected-height="40">a</div>
+</div>
+
+<!-- Percent height flex item content is mutated and increased flexbox's cross axis size. -->
+<div class="flexbox test" data-expected-height="30">
+ <div class="min-content percent-height test" data-expected-height="30">a a a</div>
+ <div id="three" data-expected-height="30">a</div>
+</div>
+
+<!-- Percent height flex item's main axis size changes from min-content to auto which
+ should result in different cross size. -->
+<div class="flexbox test" data-expected-height="10">
+ <div class="min-content percent-height test" id="four" data-expected-height="10">a a a</div>
+</div>
+
+<!-- Flexbox with align-items: flex-start changes from definite to indefinite cross size
+ which results in different hypothetical cross size for flex item.-->
+<div class="flexbox fixed-height align-start test" id="five" data-expected-height="30">
+ <div class="min-content percent-height test" data-expected-height="30">a a a</div>
+ <div class="test" data-expected-height="10">a</div>
+</div>
+
+
+<!-- Flexbox with align-items: flex-start changes from indefinite to definite cross size
+ which results in different hypothetical cross size for the flex item. -->
+<div class="flexbox align-start test" id="six" data-expected-height="100">
+ <div class="min-content percent-height test" data-expected-height="100">a a a</div>
+</div>
+
+<!-- Outer flexbox goes from stretching its content to no longer stretching with a
+ definite cross size. The inner flexbox is no longer stretching which affects the
+ hypothetical cross axis size of its flex item. -->
+<div class="flexbox fixed-height test" id="seven" data-expected-height="100"">
+ <div class="flexbox align-start test" data-expected-height="30">
+ <div class="min-content percent-height test" data-expected-height="30">a a a</div>
+ </div>
+</div>
+
+<!-- Grid goes from stretching its content to no longer stretching with a definite cross
+ size. The flexbox is no longer stretching which affects the hypothetical cross axis
+ size of tis flex item.-->
+<div class="grid fixed-height test" id="eight" data-expected-height="100">
+ <div class="flexbox align-start test" data-expected-height="30">
+ <div class="min-content percent-height test" data-expected-height="30">a a a</div>
+ </div>
+</div>
+
+</body>
+<script>
+document.body.offsetHeight;
+mutateContent();
+document.body.offsetHeight;
+
+let tests = document.querySelectorAll(".test");
+tests.forEach((element) => {
+ test(function() {
+ let expectedHeight = element.getAttribute("data-expected-height");
+ assert_equals(element.offsetHeight, Number(expectedHeight), "height");
+ });
+});
+</script>
+</html>
+
diff --git a/tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html b/tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html
new file mode 100644
index 00000000000..e3f5178952e
--- /dev/null
+++ b/tests/wpt/tests/css/css-fonts/font-variation-settings-calc.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Fonts Test: Allow complex calc expressions in font-variation-settings</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variation-settings">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<div>
+ <div id="target"></div>
+</div>
+<script>
+ test_valid_value('font-variation-settings', '"wght" sign(1em - 1px)');
+ test_valid_value('font-variation-settings', '"wght" sibling-index()');
+ test_computed_value('font-variation-settings', '"wght" sign(1em - 1px)', '"wght" 1');
+ test_computed_value('font-variation-settings', '"wght" sibling-index()', '"wght" 1');
+</script>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html
new file mode 100644
index 00000000000..f77ec2a9d43
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006-ref.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+ width: 430px;
+ height: 430px;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+
+ .col-gap {
+ width: 0;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+
+ position: absolute;
+ top: 105px;
+ left: 102.5px;
+ height: 220px;
+ }
+
+ .col-gap2 {
+ position: absolute;
+ top: 0px;
+ left: 212.5px;
+ height: 215px;
+ }
+
+ .col-gap3 {
+ position: absolute;
+ top: 0px;
+ left: 322.5px;
+ height: 430px;
+ }
+
+ .row-gap {
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ top: 102.5px;
+ left: 0px;
+ width: 215px;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ top: 212.5px;
+ left: 105px;
+ width: 220px;
+ }
+
+ .row-gap3 {
+ position: absolute;
+ top: 322.5px;
+ left: 0px;
+ width: 430px;
+ }
+</style>
+
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+<div class="row-gap row-gap3"> </div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
+<div class="col-gap col-gap3"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html
new file mode 100644
index 00000000000..7b1187c4e44
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-006.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: *rule-break defaults to spanning-item and avoids painting behind spanners.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="match" href="grid-gap-decorations-006-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+
+ width: 430px;
+ height: 430px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+
+</style>
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html
new file mode 100644
index 00000000000..9d74fa00f41
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007-ref.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+
+ width: 430px;
+ height: 430px;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ height: 0px;
+ display: flex;
+ gap: 10px;
+ top: 102.5px;
+ left: 0px;
+ }
+
+ .row-gap1a {
+ width: 100px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1b {
+ width: 100px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ height: 0px;
+ display: flex;
+ gap: 10px;
+ top: 212.5px;
+ left: 110px;
+ }
+
+ .row-gap2a {
+ width: 100px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap2b {
+ width: 100px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap3 {
+ position: absolute;
+ height: 0px;
+ display: flex;
+ gap: 10px;
+ top: 322.5px;
+ left: 0px;
+ }
+
+ .row-gap3a {
+ width: 100px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap3b {
+ width: 210px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap3c {
+ width: 100px;
+ border-bottom: solid 5px red;
+ }
+
+ .col-gap1 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ top: 110px;
+ left: 102.5px;
+ }
+
+ .col-gap1a {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1b {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap2 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ top: 0px;
+ left: 212.5px;
+ }
+
+ .col-gap2a {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap2b {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap3 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ top: 0px;
+ left: 322.5px;
+ }
+
+ .col-gap3a {
+ height: 210px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap3b {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap3c {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+</style>
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
+
+<div class="row-gap1">
+ <div class="row-gap1a"></div>
+ <div class="row-gap1b"></div>
+</div>
+<div class="row-gap2">
+ <div class="row-gap2a"></div>
+ <div class="row-gap2b"></div>
+</div>
+<div class="row-gap3">
+ <div class="row-gap3a"></div>
+ <div class="row-gap3b"></div>
+ <div class="row-gap3c"></div>
+</div>
+
+<div class="col-gap1">
+ <div class="col-gap1a"></div>
+ <div class="col-gap1b"></div>
+</div>
+<div class="col-gap2">
+ <div class="col-gap2a"></div>
+ <div class="col-gap2b"></div>
+</div>
+<div class="col-gap3">
+ <div class="col-gap3a"></div>
+ <div class="col-gap3b"></div>
+ <div class="col-gap3c"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html
new file mode 100644
index 00000000000..adc98e4bc03
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-007.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: setting *rule-break to intersection stops painting decorations at each intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="match" href="grid-gap-decorations-007-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+
+ width: 430px;
+ height: 430px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-break: intersection;
+ column-rule-outset: 0px;
+
+ row-rule-break: intersection;
+ row-rule-outset: 0px;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+</style>
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html
new file mode 100644
index 00000000000..200a2621a21
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008-ref.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+
+ width: 430px;
+ height: 430px;
+ }
+
+ .grid-container>div {
+ z-index: 2
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ height: 0px;
+ top: 102.5px;
+ left: 0px;
+ width: 430px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ height: 0px;
+
+ top: 212.5px;
+ left: 0px;
+ width: 430px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap3 {
+ position: absolute;
+ height: 0px;
+ display: flex;
+ top: 322.5px;
+ left: 0px;
+ border-bottom: solid 5px red;
+ width: 430px;
+ }
+
+ .col-gap1 {
+ position: absolute;
+ width: 0;
+ height: 430px;
+ border-left: solid 5px blue;
+ top: 0px;
+ left: 102.5px;
+ }
+
+ .col-gap2 {
+ position: absolute;
+ width: 0;
+ height: 430px;
+ top: 0px;
+ left: 212.5px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap3 {
+ position: absolute;
+ width: 0;
+ height: 430px;
+ top: 0px;
+ left: 322.5px;
+ border-left: solid 5px blue;
+
+ }
+</style>
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
+
+<div class="row-gap1"></div>
+<div class="row-gap2"></div>
+<div class="row-gap3"></div>
+
+<div class="col-gap1"></div>
+<div class="col-gap2"></div>
+<div class="col-gap3"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html
new file mode 100644
index 00000000000..f8dc0df36e2
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-008.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: setting *rule-break to none paints decorations from first grid line to last grid line.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="match" href="grid-gap-decorations-008-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+
+ width: 430px;
+ height: 430px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-break: none;
+ row-rule-break: none;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+</style>
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html
new file mode 100644
index 00000000000..11d8267235b
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009-ref.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .col-gap1 {
+ position: absolute;
+ width: 0;
+ height: 215px;
+ border-left: solid 5px blue;
+ top: 105px;
+ left: 102.5px;
+ }
+
+
+ .col-gap2 {
+ position: absolute;
+ width: 0;
+ height: 105px;
+ top: 0px;
+ left: 212.5px;
+ border-left: solid 5px blue;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ height: 0px;
+ top: 102.5px;
+ left: 0px;
+ width: 320px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ height: 0px;
+ top: 212.5px;
+ left: 0px;
+ width: 105px;
+ border-bottom: solid 5px red;
+
+ }
+</style>
+<div class="grid-container">
+ <div class="item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="item" style=" grid-column: 3 / 4;"></div>
+ <div class="item"></div>
+ <div class="item" style="grid-column: 2 / 4; grid-row: 2 / 4;"></div>
+ <div class="item"></div>
+</div>
+
+<div class="row-gap1"></div>
+<div class="row-gap2"></div>
+
+<div class="col-gap1"></div>
+<div class="col-gap2"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html
new file mode 100644
index 00000000000..0756b9294be
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-009.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Grid with 2x2 item, decorations are not painted within item when *-rule-break is spanning-item.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-009-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+<div class="grid-container">
+ <div class="item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="item" style=" grid-column: 3 / 4;"></div>
+ <div class="item"></div>
+ <div class="item" style="grid-column: 2 / 4; grid-row: 2 / 4;"></div>
+ <div class="item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html
new file mode 100644
index 00000000000..747391cfedc
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010-ref.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ top: 102.5px;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ top: 212.5px;
+ }
+
+ .col-gap1 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ gap: 10px;
+ flex-direction: column;
+ top: 0px;
+ left: 102.5px;
+ }
+
+ .col-gap1>div {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap2 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ gap: 10px;
+ flex-direction: column;
+ top: 0px;
+ left: 212.5px;
+ }
+
+ .col-gap2>div {
+ height: 100px;
+ border-left: solid 5px blue;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+
+<div class="col-gap1">
+ <div class="col-gap1a"></div>
+ <div class="col-gap1b"></div>
+ <div class="col-gap1c"></div>
+</div>
+<div class="col-gap2">
+ <div class="col-gap2a"></div>
+ <div class="col-gap2b"></div>
+ <div class="col-gap2c"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html
new file mode 100644
index 00000000000..d9201b51cea
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-010.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: An outset of 0px aligns the ends of gap decorations with adjacent item.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-010-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-outset: 0px;
+ column-rule-break: intersection;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html
new file mode 100644
index 00000000000..c49eb95f72e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011-ref.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 102.5px;
+ }
+
+ .row-gap2 {
+ top: 212.5px;
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 0px;
+ width: 0px;
+ height: 320px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+ left: 102.5px;
+ }
+
+ .col-gap2 {
+ left: 212.5px;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html
new file mode 100644
index 00000000000..c0540398d05
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-011.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: *rule-outset defaults to 50% and extends each decoration end halfway into its intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-011-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-break: intersection;
+ }
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+ </style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html
new file mode 100644
index 00000000000..ded98fa1c8d
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012-ref.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 110.5px;
+ }
+
+ .row-gap2 {
+ top: 220.5px;
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 3px;
+ width: 0px;
+ height: 330px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+ left: 110.5px;
+ }
+
+ .col-gap2 {
+ left: 220.5px;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html
new file mode 100644
index 00000000000..26ba45a14ff
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-012.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: An outset of 5px extends decorations slightly beyond the edges of adjacent items.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-012-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-outset: 5px;
+ column-rule-break: intersection;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html
new file mode 100644
index 00000000000..bd8456f525e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013-ref.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ top: 102.5px;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ top: 212.5px;
+ }
+
+ .col-gap1 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ gap: 20px;
+ flex-direction: column;
+ top: 5px;
+ left: 102.5px;
+ }
+
+ .col-gap1>div {
+ height: 90px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap2 {
+ position: absolute;
+ width: 0;
+ display: flex;
+ gap: 20px;
+ flex-direction: column;
+ top: 5px;
+ left: 212.5px;
+ }
+
+ .col-gap2>div {
+ height: 90px;
+ border-left: solid 5px blue;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+
+<div class="col-gap1">
+ <div class="col-gap1a"></div>
+ <div class="col-gap1b"></div>
+ <div class="col-gap1c"></div>
+</div>
+<div class="col-gap2">
+ <div class="col-gap2a"></div>
+ <div class="col-gap2b"></div>
+ <div class="col-gap2c"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html
new file mode 100644
index 00000000000..4a056134089
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-013.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: An outset of -5px shortens the ends of decorations relative to the edges of adjacent items.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-013-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-outset: -5px;
+ column-rule-break: intersection;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+
+<body>
+ <div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html
new file mode 100644
index 00000000000..25a930a51af
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014-ref.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+
+ .row-gap {
+ position: absolute;
+ width: 320px;
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ top: 110.5px;
+ }
+
+ .row-gap2 {
+ top: 220.5px;
+ }
+
+ .col-gap {
+ position: absolute;
+ top: 3px;
+ width: 0px;
+ height: 330px;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+ left: 110.5px;
+ }
+
+ .col-gap2 {
+ left: 220.5px;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html
new file mode 100644
index 00000000000..97ad626e1f2
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-014.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: An outset of 5px with rule-break: `none` extends decorations outside edge track lines.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="grid-gap-decorations-014-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ .grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: 100px 100px 100px;
+ height: 320px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-outset: 5px;
+ column-rule-break: none;
+ }
+
+ .item {
+ background: gray;
+ opacity: 0.5;
+ }
+</style>
+<div class="grid-container">
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+ <div class="item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html
new file mode 100644
index 00000000000..0937a62da6f
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015-ref.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#outset">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin-top: 20px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+ width: 430px;
+ height: 430px;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ z-index: 2;
+ }
+
+ .col-gap {
+ width: 0;
+ border-left: solid 5px blue;
+ }
+
+ .col-gap1 {
+
+ position: absolute;
+ top: 110px;
+ left: 110.5px;
+ height: 250px;
+ }
+
+ .col-gap2 {
+ position: absolute;
+ top: 0px;
+ left: 220.5px;
+ height: 250px;
+ }
+
+ .col-gap3 {
+ position: absolute;
+ top: 0px;
+ left: 330.5px;
+ height: 470px;
+ }
+
+ .row-gap {
+ height: 0px;
+ border-bottom: solid 5px red;
+ }
+
+ .row-gap1 {
+ position: absolute;
+ top: 122.5px;
+ left: 8px;
+ width: 215px;
+ }
+
+ .row-gap2 {
+ position: absolute;
+ top: 232.5px;
+ left: 113px;
+ width: 220px;
+ }
+
+ .row-gap3 {
+ position: absolute;
+ top: 342.5px;
+ left: 8px;
+ width: 430px;
+ }
+</style>
+
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
+
+<div class="row-gap row-gap1"> </div>
+<div class="row-gap row-gap2"> </div>
+<div class="row-gap row-gap3"> </div>
+
+<div class="col-gap col-gap1"> </div>
+<div class="col-gap col-gap2"> </div>
+<div class="col-gap col-gap3"> </div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html
new file mode 100644
index 00000000000..e575c134353
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/grid/grid-gap-decorations-015.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: An outset of 20px with rule-break: `spanning-item` extends decorations into spanning items and outside edge track lines.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
+<link rel="match" href="grid-gap-decorations-015-ref.html">
+<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
+<style>
+ body {
+ margin-top: 20px;
+ }
+
+ .grid-container {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 10px;
+
+ width: 430px;
+ height: 430px;
+
+ column-rule-color: blue;
+ column-rule-style: solid;
+ column-rule-width: 5px;
+
+ row-rule-color: red;
+ row-rule-style: solid;
+ row-rule-width: 5px;
+
+ column-rule-break: spanning-item;
+ row-rule-break: spanning-item;
+ column-rule-outset: 20px;
+ }
+
+ .grid-item {
+ background-color: gray;
+ opacity: 0.5;
+ border: 1px solid #000;
+ }
+</style>
+<div class="grid-container">
+ <div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
+ <div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
+ <div class="grid-item" style="grid-row: 2 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
+ <div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
+ <div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
+ <div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html
index 8d7fc870fae..8c251a9d9f0 100644
--- a/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html
+++ b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-stretch-4-ref.html
@@ -39,7 +39,7 @@
<img class="justify">
</div>
<div>
- <img style="width:20px; height:0px">
+ <img style="width:20px; height:40px">
</div>
<script>
diff --git a/tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001-ref.html b/tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001-ref.html
new file mode 100644
index 00000000000..ec65437e8f3
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Reference Case</title>
+<link rel="author" title="Emily McDonough" href="mailto:emcdonough@mozilla.com"/>
+<style>
+#holder {
+ height: 50px;
+ width: 30px;
+ border: 10px solid fuchsia;
+}
+#item {
+ width: 300px;
+ height: 50px;
+ background: aqua;
+}
+</style>
+<div id="holder">
+ <div id="item"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001.html b/tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001.html
new file mode 100644
index 00000000000..f9358b65db9
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-flex-spanning-items-001.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Intrinsic sizing of grid with spanning flex items in a min-content container</title>
+<link rel="match" href="grid-flex-spanning-items-001-ref.html"/>
+<link rel="help" href="https://drafts.csswg.org/css-grid-2/#intrinsic-sizes"/>
+<link rel="author" title="Emily McDonough" href="mailto:emcdonough@mozilla.com"/>
+<style>
+#mygrid {
+ display: grid;
+ grid-template-columns: 1fr 30px;
+ border: 10px solid fuchsia;
+ width: min-content;
+}
+#item {
+ grid-column: 1 / span 2;
+}
+#filler {
+ width: 300px;
+ height: 50px;
+ background: aqua;
+}
+</style>
+<div id="mygrid">
+ <div id="item">
+ <div id="filler"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html
index 6708e583328..4ece8d754d3 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html
@@ -23,7 +23,6 @@ body { width:600px; height:600px; border:1px solid; box-sizing:border-box; }
padding-block-start: 1px;
margin-left: 1px;
border:1px solid;
- masonry-auto-flow: next;
height: 100px;
width: 100px;
}
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html
index 34911b7c9fa..cc0eaaa9cc2 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html
@@ -23,7 +23,6 @@ body { width:600px; height:600px; border:1px solid; box-sizing:border-box; }
padding-block-start: 1px;
margin-left: 1px;
border:1px solid;
- masonry-auto-flow: next;
height: 100px;
width: 100px;
}
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html
index ca2aaef482d..41a032712a2 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr-ref.html
@@ -83,51 +83,51 @@ grid > item:nth-child(6) {
<item class="hidden" style="grid-area: 4/2">0 0</item>
</grid>
- <grid>
- <item>1</item>
- <item>2 2</item>
- <item style="grid-column: span 2">3 3</item>
- <item>4</item>
- <item style="height:2ch; grid-row:2">5 5</item>
-
- <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
- <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
- </grid>
-
- <grid>
- <item>1</item>
- <item>2 2</item>
- <item>3 3</item>
- <item>4</item>
- <item style="height:4ch; grid-row:2/span 2">5 5</item>
-
- <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
- <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
- </grid>
-
- <grid>
- <item>1</item>
- <item>2 2</item>
- <item>3 3</item>
- <item>4</item>
- <item style="grid-row:2/span 2">5 5</item>
- <item style="height:5ch; grid-row:span 3/4">6</item>
-
- <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
- <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
- </grid>
-
- <grid>
- <item>1</item>
- <item>2 2</item>
- <item>3 3</item>
- <item>4</item>
- <item style="height:3ch; grid-row:span 2/4">5</item>
- <item style="height:5ch; grid-row:1/span 3">6</item>
-
- <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
- <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
- </grid>
+<grid>
+ <item>1</item>
+ <item>2 2</item>
+ <item style="grid-column: span 2">3 3</item>
+ <item>4</item>
+ <item style="height:2ch; grid-row:2">5 5</item>
+
+ <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
+ <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
+</grid>
+
+<grid>
+ <item>1</item>
+ <item>2 2</item>
+ <item>3 3</item>
+ <item>4</item>
+ <item style="height:4ch; grid-row:2/span 2">5 5</item>
+
+ <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
+ <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
+</grid>
+
+<grid>
+ <item>1</item>
+ <item>2 2</item>
+ <item>3 3</item>
+ <item>4</item>
+ <item style="grid-row:2/span 2">5 5</item>
+ <item style="height:5ch; grid-row:span 3/4">6</item>
+
+ <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
+ <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
+</grid>
+
+<grid>
+ <item>1</item>
+ <item>2 2</item>
+ <item>3 3</item>
+ <item>4</item>
+ <item style="height:3ch; grid-row:span 2/4">5</item>
+ <item style="height:5ch; grid-row:1/span 3">6</item>
+
+ <item class="hidden" style="grid-column: 2; grid-row: 1">0 0</item>
+ <item class="hidden" style="grid-column: 2; grid-row: 4">0 0</item>
+</grid>
<grid>
<item>1</item>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html
index 97e6b3ea292..4d1470896c8 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-004-mix2-ref.html
@@ -4,36 +4,36 @@
http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
-<meta charset="utf-8">
-<title>Reference: Masonry layout max-content sizing</title>
-<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
+ <meta charset="utf-8">
+ <title>Reference: Masonry layout max-content sizing</title>
+ <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<style>
- @import "support/masonry-intrinsic-sizing-visual.css";
-
- grid {
- display: inline-grid;
- gap: 1px 2px;
- /* keep fixed values small enough for spanners to have an effect */
- grid-template-rows: 1.1ch auto 1.4ch 1fr;
- grid-auto-flow: column;
- border: 1px solid;
- padding: 1px 0 2px 0;
- vertical-align: top;
- height: max-content;
- }
-
- item {
- justify-self: start;
- writing-mode: vertical-rl;
- text-orientation: sideways;
- }
-
- .hidden {
- visibility: hidden;
- opacity: 0.5;
- width: 1em;
- }
+@import "support/masonry-intrinsic-sizing-visual.css";
+
+grid {
+ display: inline-grid;
+ gap: 1px 2px;
+ /* keep fixed values small enough for spanners to have an effect */
+ grid-template-rows: 1.1ch auto 1.4ch 1fr;
+ grid-auto-flow: column;
+ border: 1px solid;
+ padding: 1px 0 2px 0;
+ vertical-align: top;
+ height: max-content;
+}
+
+item {
+ justify-self: start;
+ writing-mode: vertical-rl;
+ text-orientation: sideways;
+}
+
+.hidden {
+ visibility: hidden;
+ opacity: 0.5;
+ width: 1em;
+}
</style>
<body>
@@ -111,12 +111,12 @@
<item class="hidden" style="grid-area: 4/3">0 0</item>
</grid>
- <grid>
- <item>1</item>
- <item>2 2</item>
- <item style="grid-column: span 2">3 3</item>
- <item>4</item>
- <item style="height:6ch; grid-area: 1/3/5/4">5 5</item>
+<grid>
+ <item>1</item>
+ <item>2 2</item>
+ <item style="grid-column: span 2">3 3</item>
+ <item>4</item>
+ <item style="height:6ch; grid-area: 1/3/5/4">5 5</item>
<item class="hidden" style="grid-area: 4/3">0 0</item>
</grid>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html
index 75d6b741c2f..ba9c72f2925 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004-ref.html
@@ -31,36 +31,9 @@ item {
<body>
<grid>
- <item style="grid-column:1/2">3</item>
+ <item style="grid-column:1/2; grid-row: 1;">2</item>
<item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:2/1">5</item>
- <item style="grid-column:2/3">6</item>
- <item style="grid-column:3/span 2">4</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:2/3">5</item>
- <item style="grid-column:3/span 2">4</item>
- <item style="grid-column:3/4">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:2/1">5</item>
- <item style="grid-column:2/3">6</item>
- <item style="grid-column:3/span 2">4</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
+ <item style="grid-column:4/5; grid-row: 1;">3</item>
<item style="grid-column:2/1">5</item>
<item style="grid-column:2/3">6</item>
<item style="grid-column:3/span 2">4</item>
@@ -68,36 +41,9 @@ item {
<div style="direction:rtl">
<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:2/1">5</item>
- <item style="grid-column:2/3">6</item>
- <item style="grid-column:3/span 2">4</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:2/3">5</item>
- <item style="grid-column:3/span 2">4</item>
- <item style="grid-column:3/4">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:2/1">5</item>
- <item style="grid-column:2/3">6</item>
- <item style="grid-column:3/span 2">4</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
+ <item style="grid-column:1/2">2</item>
<item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
+ <item style="grid-column:4/5">3</item>
<item style="grid-column:2/1">5</item>
<item style="grid-column:2/3">6</item>
<item style="grid-column:3/span 2">4</item>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html
index 52867cd4a21..92741f4b115 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-004.html
@@ -41,33 +41,6 @@ item {
<item>6</item>
</grid>
-<grid style="masonry-auto-flow: next">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:3/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: ordered">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:3/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: next ordered">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:3/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
<div style="direction:rtl">
<grid>
<item style="grid-column:2/span 2">1</item>
@@ -77,33 +50,6 @@ item {
<item>5</item>
<item>6</item>
</grid>
-
-<grid style="masonry-auto-flow: next">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:3/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: ordered">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:3/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: next ordered">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:3/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
</div>
</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html
index 806f314300d..bd5d55262a3 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005-ref.html
@@ -32,76 +32,22 @@ item {
<grid>
<item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">5</item>
- <item style="grid-column:1/2">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
+ <item style="grid-column:1/2; grid-row: 1;">2</item>
<item style="grid-column:1/span 2">4</item>
+ <item style="grid-column:4/5; grid-row: 1;">3</item>
<item style="grid-column:3/4">5</item>
<item style="grid-column:4/5">6</item>
</grid>
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">5</item>
- <item style="grid-column:4/5">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">5</item>
- <item style="grid-column:1/2">6</item>
-</grid>
-
<div style="direction:rtl">
<grid>
<item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">5</item>
- <item style="grid-column:1/2">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
+ <item style="grid-column:1/2; grid-row: 1;">2</item>
<item style="grid-column:1/span 2">4</item>
+ <item style="grid-column:4/5; grid-row: 1;">3</item>
<item style="grid-column:3/4">5</item>
<item style="grid-column:4/5">6</item>
</grid>
-
-<grid>
- <item style="grid-column:1/2">3</item>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">5</item>
- <item style="grid-column:4/5">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:2/span 2">1</item>
- <item style="grid-column:4/5">2</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">5</item>
- <item style="grid-column:1/2">6</item>
-</grid>
</div>
</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html
index 7d4993fb3a6..f879ddce562 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-005.html
@@ -41,33 +41,6 @@ item {
<item>6</item>
</grid>
-<grid style="masonry-auto-flow: ordered">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:1/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: ordered next">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:1/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: next">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:1/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
<div style="direction:rtl">
<grid>
<item style="grid-column:2/span 2">1</item>
@@ -77,33 +50,6 @@ item {
<item>5</item>
<item>6</item>
</grid>
-
-<grid style="masonry-auto-flow: ordered">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:1/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: ordered next">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:1/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid style="masonry-auto-flow: next">
- <item style="grid-column:2/span 2">1</item>
- <item>2</item>
- <item>3</item>
- <item style="grid-column:1/span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
</div>
</body></html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html
index a6e9b75d0e6..a54476a6ba8 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006-ref.html
@@ -84,61 +84,5 @@ item {
<item style="grid-column:2/3">6</item>
</grid>
-<span class="next">
-<grid>
- <item style="padding-top:30px; grid-column:1/2">1</item>
- <item style="grid-column:2/3">2</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-
-<grid>
- <item style="padding-top:30px; grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:4/5">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">5</item>
- <item style="grid-column:4/5">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:1/span 3">4</item>
- <item style="grid-column:4/5">5</item>
- <item style="grid-column:1/2">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:1/span 4">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-</span>
-
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html
index 467e313d339..0f963762af5 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html
@@ -28,9 +28,6 @@ item {
background-color: #444;
color: #fff;
}
-.next > grid {
- masonry-auto-flow: next;
-}
</style>
</head>
<body>
@@ -89,61 +86,5 @@ item {
<item>6</item>
</grid>
-<span class="next">
-<grid>
- <item style="padding-top:30px">1</item>
- <item>2</item>
- <item>3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item>3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item style="padding-top:30px">1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item style="grid-column:span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item style="grid-column:span 3">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item style="grid-column:span 4">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-</span>
-
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html
index 50236046fb0..5c1fd18b3d1 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007-ref.html
@@ -85,61 +85,5 @@ item {
<item style="grid-column:2/3">6</item>
</grid>
-<span class="next">
-<grid>
- <item style="padding-top:30px; grid-column:1/2">1</item>
- <item style="grid-column:2/3">2</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="grid-column:3/4">3</item>
- <item style="grid-column:4/5">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-
-<grid>
- <item style="padding-top:30px; grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:4/5">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:1/span 2">4</item>
- <item style="grid-column:3/4">5</item>
- <item style="grid-column:4/5">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:1/span 3">4</item>
- <item style="grid-column:4/5">5</item>
- <item style="grid-column:1/2">6</item>
-</grid>
-
-<grid>
- <item style="grid-column:1/2">1</item>
- <item style="padding-top:30px; grid-column:2/3">2</item>
- <item style="padding-top:10px; grid-column:3/4">3</item>
- <item style="grid-column:1/span 4">4</item>
- <item style="grid-column:1/2">5</item>
- <item style="grid-column:2/3">6</item>
-</grid>
-</span>
-
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html
index 4c8053ba666..ebbed114a11 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html
@@ -29,9 +29,6 @@ item {
background-color: #444;
color: #fff;
}
-.next > grid {
- masonry-auto-flow: next;
-}
</style>
</head>
<body>
@@ -90,61 +87,5 @@ item {
<item>6</item>
</grid>
-<span class="next">
-<grid>
- <item style="padding-top:30px">1</item>
- <item>2</item>
- <item>3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item>3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item style="padding-top:30px">1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item>4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item style="grid-column:span 2">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item style="grid-column:span 3">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-
-<grid>
- <item>1</item>
- <item style="padding-top:30px">2</item>
- <item style="padding-top:10px">3</item>
- <item style="grid-column:span 4">4</item>
- <item>5</item>
- <item>6</item>
-</grid>
-</span>
-
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html
deleted file mode 100644
index cbb3e825a4b..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001-ref.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE HTML>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
- <meta charset="utf-8">
- <title>CSS Grid masonry rows masonry-auto-flow next</title>
- <link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow">
- <meta name="assert" content="Placing item that would span outside the grid using masonry-auto-flow-next should place the item at the first grid axis track" />
- <style>
-html,body {
- color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0;
-}
-
-grid {
- display: inline-grid;
- gap: 10px 20px;
- grid-template-columns: repeat(4,80px);
- grid-template-rows: auto;
- color: #444;
- border: 1px solid;
- padding: 2px;
-}
-
-item {
- background-color: #444;
- color: #fff;
- padding: 20px;
- margin: 3px;
- border: 5px solid blue;
-}
-</style>
-</head>
-<body>
-
-<grid>
- <item>1</item>
- <item style="grid-column: span 3">2</item>
- <item>3</item>
- <item style="grid-column: span 4">4</item>
-</grid>
-
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html b/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html
deleted file mode 100644
index c425490d2d8..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/item-placement/masonry-rows-item-placement-auto-flow-next-001.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
- <meta charset="utf-8">
- <title>CSS Grid masonry rows masonry-auto-flow next</title>
- <link rel="author" title="Sammy Gill" href="mailto:sammy.gill@apple.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow">
- <link rel="match" href="masonry-rows-item-placement-auto-flow-next-001-ref.html">
- <meta name="assert" content="Placing item that would span outside the grid using masonry-auto-flow-next should place the item at the first grid axis track" />
- <style>
-html,body {
- color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0;
-}
-
-grid {
- display: inline-grid;
- gap: 10px 20px;
- grid-template-columns: repeat(4,80px);
- grid-template-rows: masonry;
- color: #444;
- border: 1px solid;
- padding: 2px;
- masonry-auto-flow: next;
-}
-
-item {
- background-color: #444;
- color: #fff;
- padding: 20px;
- margin: 3px;
- border: 5px solid blue;
-}
-</style>
-</head>
-<body>
-
-<grid>
- <item>1</item>
- <item style="grid-column: span 3">2</item>
- <item>3</item>
- <item style="grid-column: span 4">4</item>
-</grid>
-
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html
deleted file mode 100644
index 15be3fde837..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
- <meta charset="utf-8">
- <title>Reference: Masonry layout using `order` and `masonry-auto-flow: next`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <style>
- html,body {
- color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0;
- }
-
- grid {
- display: inline-grid;
- gap: 10px 20px;
- grid-template-columns: repeat(4,auto);
- grid-template-rows: masonry;
- color: #444;
- border: 1px solid;
- padding: 2px;
- }
-
- item {
- background-color: #444;
- color: #fff;
- padding: 20px;
- margin: 3px;
- border: 5px solid blue;
- }
- </style>
-</head>
-<body>
-
-<grid>
- <item style="grid-column: 1">1</item>
- <item style="margin-top:10px; grid-column: 2;">4</item>
- <item style="grid-column: 3">6</item>
- <item style="grid-column: 4">2</item>
- <item style="grid-column: 2/span 2">5</item>
- <item>3</item>
-</grid>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html b/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html
deleted file mode 100644
index 5ebdec27193..00000000000
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/order/masonry-order-002.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
- <meta charset="utf-8">
- <title>CSS Grid Test: Masonry layout using `order` and `masonry-auto-flow: next`</title>
- <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
- <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-layout-algorithm">
- <link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow">
- <link rel="match" href="masonry-order-002-ref.html">
- <style>
- html,body {
- color:black; background-color:white; font:25px/1 monospace; padding:0; margin:0;
- }
-
- grid {
- display: inline-grid;
- gap: 10px 20px;
- grid-template-columns: repeat(4,auto);
- grid-template-rows: masonry;
- masonry-auto-flow: next;
- color: #444;
- border: 1px solid;
- padding: 2px;
- }
-
- item {
- background-color: #444;
- color: #fff;
- padding: 20px;
- margin: 3px;
- border: 5px solid blue;
- }
- </style>
-</head>
-<body>
-
-<grid>
- <item>1</item>
- <item style="order:1">2</item>
- <item style="order:1">3</item>
- <item style="margin-top:10px">4</item>
- <item style="order:2; grid-column:span 2">5</item>
- <item>6</item>
-</grid>
diff --git a/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html b/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html
index 2204c06f72b..64af83b316c 100644
--- a/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html
+++ b/tests/wpt/tests/css/css-grid/masonry/tentative/parsing/masonry-parsing.html
@@ -4,7 +4,6 @@
<meta charset="utf-8">
<title>CSS Masonry Test: parsing properties and shortands</title>
<link rel="help" href="https://drafts.csswg.org/css-grid-3/#grid-template-masonry">
-<link rel="help" href="https://drafts.csswg.org/css-grid-3/#masonry-auto-flow">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
@@ -74,17 +73,6 @@ test_shorthand_value("grid", '10px / masonry', {
'grid-auto-flow': 'row'
});
-test_valid_value("masonry-auto-flow", 'pack');
-test_valid_value("masonry-auto-flow", 'pack ordered', 'ordered');
-test_valid_value("masonry-auto-flow", 'ordered next', 'next ordered');
-test_valid_value("masonry-auto-flow", 'next definite-first', 'next');
-test_valid_value("masonry-auto-flow", 'definite-first pack', 'pack');
-test_invalid_value("masonry-auto-flow", 'auto');
-test_invalid_value("masonry-auto-flow", 'none');
-test_invalid_value("masonry-auto-flow", '10px');
-test_invalid_value("masonry-auto-flow", 'row');
-test_invalid_value("masonry-auto-flow", 'dense');
-
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html b/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html
index d1ae78c7023..9b31e2b23c6 100644
--- a/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html
+++ b/tests/wpt/tests/css/css-grid/parsing/grid-area-computed.html
@@ -7,9 +7,17 @@
<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>
</head>
<body>
-<div id="target"></div>
+<div id="container">
+ <div id="target"></div>
+</div>
<script>
// auto
test_computed_value("grid-area", "auto / auto / auto / auto",
@@ -34,6 +42,9 @@ test_computed_value("grid-row-start", "9 -Z_");
test_computed_value("grid-column-start", "-44 Z");
test_computed_value("grid-row-end", "1 -πA");
test_computed_value("grid-column-end", "5 π_");
+test_computed_value("grid-row-start", "calc(1.1) -a-", "1 -a-");
+test_computed_value("grid-row-start", "calc(10) -a-", "10 -a-");
+test_computed_value("grid-row-start", "calc(10 + (sign(2cqw - 10px) * 5)) -a-", "5 -a-");
// span && [ <integer> || <custom-ident> ]
test_computed_value("grid-area", "span 2 i / auto / auto / auto",
diff --git a/tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html
new file mode 100644
index 00000000000..2f12c01bb5f
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Tests the maximum value of color stops in conic-gradient().</title>
+<style>
+ body {
+ background-color: lightblue;
+ }
+
+ .test {
+ display: flex;
+ flex-wrap: wrap;
+ }
+
+ li {
+ width: 100px;
+ height: 100px;
+ margin-right: 30px;
+ margin-bottom: 30px;
+ outline: 1px solid black;
+ font-size: 14px;
+ text-align: center;
+ background: lime;
+ }
+</style>
+<p>Should be lime in the background of all boxes.</p>
+<ol class="test">
+ <li>0 999999999%</li>
+ <li>0 calc(Infinity * 0%)</li>
+ <li>0 calc(Infinity * 1%)</li>
+ <li>calc(Infinity * 0%) 100%</li>
+ <li>calc(Infinity * 1%) 100%</li>
+ <li>calc(Infinity * -1%) 100%</li>
+ <li>0% calc(Infinity * 1%)</li>
+ <li>from calc(Infinity * 1deg)</li>
+ <li>from calc(Infinity * 0deg)</li>
+</ol>
diff --git a/tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html
new file mode 100644
index 00000000000..37e41094fb2
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/conic-gradient-001.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<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="conic-gradient-001-ref.html">
+<title>Tests the maximum value of color stops in conic-gradient().</title>
+<style>
+ body {
+ background-color: lightblue;
+ }
+
+ .test {
+ display: flex;
+ flex-wrap: wrap;
+ }
+
+ li {
+ width: 100px;
+ height: 100px;
+ margin-right: 30px;
+ margin-bottom: 30px;
+ outline: 1px solid black;
+ font-size: 14px;
+ text-align: center;
+ background: red;
+ }
+
+ li:nth-child(1) {
+ background: conic-gradient(lime 0 999999999%);
+ }
+
+ li:nth-child(2) {
+ background: conic-gradient(in hsl, lime 0 calc(Infinity * 0%));
+ }
+
+ li:nth-child(3) {
+ background: conic-gradient(in lch, lime 0 calc(Infinity * 1%));
+ }
+
+ li:nth-child(4) {
+ background: conic-gradient(in oklab, lime calc(Infinity * 0%) 100%);
+ }
+
+ li:nth-child(5) {
+ background: conic-gradient(in srgb, lime calc(Infinity * 1%) 100%);
+ }
+
+ li:nth-child(6) {
+ background: conic-gradient(in srgb, lime calc(Infinity * -1%) 100%);
+ }
+
+ li:nth-child(7) {
+ background: conic-gradient(in srgb, lime 0 calc(Infinity * 1%));
+ }
+
+ li:nth-child(8) {
+ background: conic-gradient(from calc(Infinity * 1deg), lime 0 100%);
+ }
+
+ li:nth-child(9) {
+ background: conic-gradient(from calc(Infinity * 0deg), lime 0 100%);
+ }
+</style>
+
+<p>Should be lime in the background of all boxes.</p>
+<ol class="test">
+ <li>0 999999999%</li>
+ <li>0 calc(Infinity * 0%)</li>
+ <li>0 calc(Infinity * 1%)</li>
+ <li>calc(Infinity * 0%) 100%</li>
+ <li>calc(Infinity * 1%) 100%</li>
+ <li>calc(Infinity * -1%) 100%</li>
+ <li>0% calc(Infinity * 1%)</li>
+ <li>from calc(Infinity * 1deg)</li>
+ <li>from calc(Infinity * 0deg)</li>
+</ol>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html
new file mode 100644
index 00000000000..09f168115be
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004-ref.html
@@ -0,0 +1,29 @@
+<!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.">
+ <style>
+ div {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ /* lime to red */
+ background: linear-gradient(to right in oklab, rgb(0, 255, 0), rgb(255, 0, 0));
+ }
+ </style>
+</head>
+<body>
+ <p>The background of all boxes should use the oklab color space, with a gradient from lime to red.</p>
+ <div class="test1">rgb() contains none</div>
+ <div class="test2">rgb() contains none</div>
+ <div class="test3">rgb() contains none</div>
+ <div class="test4">rgb() contains none</div>
+ <div class="test5">rgb() contains none</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html
new file mode 100644
index 00000000000..286caa0226a
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-analogous-missing-components-004.html
@@ -0,0 +1,44 @@
+<!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-004-ref.html">
+ <style>
+ div {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ background: red;
+ }
+ .test1 {
+ background: linear-gradient(to right in oklab, rgb(none 255 0), rgb(255, 0, 0) );
+ }
+ .test2 {
+ background: linear-gradient(to right in oklab, rgb(none 255 0), rgb(255 none 0) );
+ }
+ .test3 {
+ background: linear-gradient(to right, rgb(none 255 0), rgb(255 none 0) );
+ }
+ .test4 {
+ background: linear-gradient(to right, rgb(none 255 0), rgb(255, 0, 0) );
+ }
+ .test5 {
+ background: linear-gradient(to right in oklab, rgb(0 255 0), rgb(255 0 0) );
+ }
+ </style>
+</head>
+<body>
+ <p>The background of all boxes should use the oklab color space, with a gradient from lime to red.</p>
+ <div class="test1">rgb() contains none</div>
+ <div class="test2">rgb() contains none</div>
+ <div class="test3">rgb() contains none</div>
+ <div class="test4">rgb() contains none</div>
+ <div class="test5">rgb() contains none</div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html
index f197386bcfb..f28b30137cd 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004-ref.html
@@ -3,11 +3,12 @@
<head>
<title>Gradient interpolation</title>
<link rel="author" title="Mike Bremford" href="mailto:mike@bfo.com">
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<style>
.test {
width: 100px;
height: 100px;
- background: rgb(0% 50% 50%);
+ background: rgb(0, 0, 99);
}
</style>
</head>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html
index ada406fd2a0..1a9c43610f4 100644
--- a/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-eval-004.html
@@ -2,16 +2,17 @@
<html>
<head>
<title>Gradient interpolation</title>
- <meta name="fuzzy" content="maxDifference=1-2;totalPixels=0-10000">
+ <meta name="fuzzy" content="maxDifference=1-2;totalPixels=0-2000">
<link rel="author" title="Mike Bremford" href="mailto:mike@bfo.com">
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#missing">
<meta name="assert" content="Gradient evaluation when one of the components is none works as specified"/>
<link rel="match" href="gradient-eval-004-ref.html">
<style>
:root {
- --start: rgb(0% 0% 50%);
- --end: rgb(0% 100% none);
+ --start: rgb(0% 0% 100%);
+ --end: rgb(0% 0% none); /* none should resolve to 0 as rgb don't have analogous components with oklab */
--t: 0.5;
--big: 131070000px;
}
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl-ref.html
new file mode 100644
index 00000000000..b6ce2a32d1d
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl-ref.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests</title>
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+ background-image: linear-gradient(to right in hsl, red, hsl(120deg 100% 50% / 0%) );
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test"><div class="info">hsl() Expected</div></li>
+ <li class="test"><div class="info">rgba()</div></li>
+ <li class="test"><div class="info">hwb()</div></li>
+ <li class="test"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl.html
new file mode 100644
index 00000000000..7b37596bfac
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hsl.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - hsl</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 powerless hue component logic works.">
+ <link rel="match" href="gradient-powerless-hue-hsl-ref.html">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+ .hsl {
+ /* Expected */
+ background-image: linear-gradient(to right in hsl, red, hsl(120deg 100% 50% / 0%) );
+ }
+ .rgba {
+ background-image: linear-gradient(to right in hsl, red, rgba(0, 255, 0, 0) );
+ }
+ .hwb {
+ background-image: linear-gradient(to right in hsl, red, hwb(120deg 0% 0% / 0%) );
+ }
+ .color {
+ background-image: linear-gradient(90deg in hsl, red, color(srgb 0 1 0 / 0) );
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test hsl"><div class="info">hsl() Expected</div></li>
+ <li class="test rgba"><div class="info">rgba()</div></li>
+ <li class="test hwb"><div class="info">hwb()</div></li>
+ <li class="test color"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb-ref.html
new file mode 100644
index 00000000000..6bb79ddf419
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb-ref.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - hwb</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+ background-image: linear-gradient(to right in hwb, red, hwb(120deg 0% 0% / 0%) );
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test hwb"><div class="info">hwb() Expected</div></li>
+ <li class="test rgba"><div class="info">rgba()</div></li>
+ <li class="test hsl"><div class="info">hsl()</div></li>
+ <li class="test color"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb.html
new file mode 100644
index 00000000000..e04e5f1bffc
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-hwb.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - hwb</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <meta name="assert" content="Tests that powerless hue component logic works.">
+ <link rel="match" href="gradient-powerless-hue-hwb-ref.html">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+ .hwb {
+ /* Expected */
+ background-image: linear-gradient(to right in hwb, red, hwb(120deg 0% 0% / 0%) );
+
+ }
+ .rgba {
+ background-image: linear-gradient(to right in hwb, red, rgba(0, 255, 0, 0) );
+ }
+ .hsl {
+ background-image: linear-gradient(to right in hwb, red, hsl(120deg 100% 50% / 0%) );
+ }
+ .color {
+ background-image: linear-gradient(90deg in hwb, red, color(srgb 0 1 0 / 0) );
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test hwb"><div class="info">hwb() Expected</div></li>
+ <li class="test rgba"><div class="info">rgba()</div></li>
+ <li class="test hsl"><div class="info">hsl()</div></li>
+ <li class="test color"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch-ref.html
new file mode 100644
index 00000000000..ca383a9857d
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch-ref.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - lch</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <meta name="assert" content="Tests that powerless hue component logic works.">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+
+ /* Expected */
+ background-image: linear-gradient(90deg in lch, red, lch(87.82 113.33 134.38 / 0) );
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test lch"><div class="info">lch() Expected</div></li>
+ <li class="test hwb"><div class="info">hwb()</div></li>
+ <li class="test rgba"><div class="info">rgba()</div></li>
+ <li class="test hsl"><div class="info">hsl()</div></li>
+ <li class="test color"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch.html
new file mode 100644
index 00000000000..b0485869d1d
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-lch.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - hwb</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <meta name="assert" content="Tests that powerless hue component logic works.">
+ <link rel="match" href="gradient-powerless-hue-lch-ref.html">
+ <meta name=fuzzy content="maxDifference=1;totalPixels=0-1500">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+
+ .lch {
+ /* Expected */
+ background-image: linear-gradient(90deg in lch, red, lch(87.82 113.33 134.38 / 0) );
+ }
+ .hwb {
+ background-image: linear-gradient(to right in lch, red, hwb(120deg 0% 0% / 0%) );
+ }
+ .rgba {
+ background-image: linear-gradient(to right in lch, red, rgba(0, 255, 0, 0) );
+ }
+ .hsl {
+ background-image: linear-gradient(to right in lch, red, hsl(120deg 100% 50% / 0%) );
+ }
+ .color {
+ background-image: linear-gradient(90deg in lch, red, color(srgb 0 1 0 / 0) );
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test lch"><div class="info">lch() Expected</div></li>
+ <li class="test hwb"><div class="info">hwb()</div></li>
+ <li class="test rgba"><div class="info">rgba()</div></li>
+ <li class="test hsl"><div class="info">hsl()</div></li>
+ <li class="test color"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch-ref.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch-ref.html
new file mode 100644
index 00000000000..4e25773f280
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch-ref.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - hwb</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+
+ /* Expected */
+ background-image: linear-gradient(to right in oklch, red, oklch(86.64396175234369% 0.295 142.4953450414439 / 0) );
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test"><div class="info">oklch() Expected</div></li>
+ <li class="test"><div class="info">hwb()</div></li>
+ <li class="test"><div class="info">rgba()</div></li>
+ <li class="test"><div class="info">hsl()</div></li>
+ <li class="test"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch.html b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch.html
new file mode 100644
index 00000000000..68c4e120279
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/gradient/gradient-powerless-hue-oklch.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Gradient powerless hue component converting tests - hwb</title>
+ <link rel="author" title="CGQAQ" href="mailto:m.jason.liu@gmail.com">
+ <link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
+ <meta name="assert" content="Tests that powerless hue component logic works.">
+ <link rel="match" href="gradient-powerless-hue-oklch-ref.html">
+ <meta name=fuzzy content="maxDifference=1;totalPixels=0-500">
+ <style>
+ .test {
+ display: flex;
+ align-items: center;
+ width: 200px;
+ height: 50px;
+ position: relative;
+ border: 1px solid black;
+ margin: 10px;
+ }
+
+ .info {
+ position: absolute;
+ right: -10px;
+ transform: translateX(100%);
+ }
+
+ .oklch {
+ /* Expected */
+ background-image: linear-gradient(to right in oklch, red, oklch(86.64396175234369% 0.295 142.4953450414439 / 0) );
+ }
+ .hwb {
+ background-image: linear-gradient(to right in oklch, red, hwb(120deg 0% 0% / 0%) );
+ }
+ .rgba {
+ background-image: linear-gradient(to right in oklch, red, rgba(0, 255, 0, 0) );
+ }
+ .hsl {
+ background-image: linear-gradient(to right in oklch, red, hsl(120deg 100% 50% / 0%) );
+ }
+ .color {
+ background-image: linear-gradient(90deg in oklch, red, color(srgb 0 1 0 / 0) );
+ }
+ </style>
+</head>
+<p>They should be the same as the first box.</p>
+<ol>
+ <li class="test oklch"><div class="info">oklch() Expected</div></li>
+ <li class="test hwb"><div class="info">hwb()</div></li>
+ <li class="test rgba"><div class="info">rgba()</div></li>
+ <li class="test hsl"><div class="info">hsl()</div></li>
+ <li class="test color"><div class="info">color()</div></li>
+</ol>
+</html>
diff --git a/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html b/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html
index b17f59f887f..dd1bf249a55 100644
--- a/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html
+++ b/tests/wpt/tests/css/css-images/object-fit-containcontainintrinsicsize-png-001c.tentative.html
@@ -17,6 +17,7 @@
float: left;
object-position: top left;
contain: size;
+ aspect-ratio: auto;
}
br {
clear: both;
diff --git a/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html b/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html
index 43a50adcedc..733b7592f3b 100644
--- a/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html
+++ b/tests/wpt/tests/css/css-images/object-fit-containsize-png-001c.tentative.html
@@ -16,6 +16,7 @@
image-rendering: pixelated;
float: left;
contain: size;
+ aspect-ratio: auto;
object-position: top left;
}
br {
diff --git a/tests/wpt/tests/css/css-images/parsing/WEB_FEATURES.yml b/tests/wpt/tests/css/css-images/parsing/WEB_FEATURES.yml
index 023eb5f6e05..d60ed3efd4c 100644
--- a/tests/wpt/tests/css/css-images/parsing/WEB_FEATURES.yml
+++ b/tests/wpt/tests/css/css-images/parsing/WEB_FEATURES.yml
@@ -2,7 +2,6 @@ features:
- name: image-orientation
files:
- image-orientation-*
-features:
- name: gradient-interpolation
files:
- "gradient-interpolation-*"
diff --git a/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-geometry-box-delay.html b/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-geometry-box-delay.html
new file mode 100644
index 00000000000..a6040d445a9
--- /dev/null
+++ b/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-geometry-box-delay.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="help" href="https://drafts.csswg.org/css-shapes-1/#basic-shape-interpolation">
+<link rel="match" href="clip-path-animation-non-shape-delay-ref.html">
+<style>
+ .container {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ animation: clippath 1s 10s;
+ animation-fill-mode: none;
+ clip-path: border-box;
+ position: absolute;
+ left: 10px;
+ top: 10px;
+ }
+
+ .child {
+ width: 10px;
+ height: 10px;
+ background-color: blue;
+ left: 150px;
+ position: absolute;
+ }
+
+ @keyframes clippath {
+ 0% {
+ clip-path: circle(50% at 50% 50%);
+ }
+
+ 100% {
+ clip-path: circle(35% at 35% 35%);
+ }
+ }
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="../../../../web-animations/resources/timing-utils.js"></script>
+
+<body>
+ This test passes if the blue child is occluded by the clip-path during the animation delay.
+ <div class="container">
+ <div class="child"></div>
+ </div>
+
+ <script>
+ document.getAnimations()[0].ready.then(() => requestAnimationFrame(takeScreenshot));
+ </script>
+</body>
+
+</html>
diff --git a/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-non-shape-delay-ref.html b/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-non-shape-delay-ref.html
new file mode 100644
index 00000000000..1bd7107cbbd
--- /dev/null
+++ b/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-non-shape-delay-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ position: absolute;
+ left: 10px;
+ top: 10px;
+}
+</style>
+<body>
+ This test passes if the blue child is occluded by the clip-path during the animation delay.
+ <div class="container">
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-reference-delay.html b/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-reference-delay.html
new file mode 100644
index 00000000000..4afecbbf987
--- /dev/null
+++ b/tests/wpt/tests/css/css-masking/clip-path/animations/clip-path-animation-reference-delay.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="help" href="https://drafts.csswg.org/css-shapes-1/#basic-shape-interpolation">
+<link rel="match" href="clip-path-animation-non-shape-delay-ref.html">
+<style>
+ .container {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ animation: clippath 1s 10s;
+ animation-fill-mode: none;
+ clip-path: url(#path);
+ position: absolute;
+ left: 10px;
+ top: 10px;
+ }
+
+ .child {
+ width: 10px;
+ height: 10px;
+ background-color: blue;
+ left: 150px;
+ position: absolute;
+ }
+
+ @keyframes clippath {
+ 0% {
+ clip-path: circle(50% at 50% 50%);
+ }
+
+ 100% {
+ clip-path: circle(35% at 35% 35%);
+ }
+ }
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="../../../../web-animations/resources/timing-utils.js"></script>
+
+<body>
+ This test passes if the blue child is occluded by the clip-path during the animation delay.
+ <svg style="position:absolute; left: 0">
+ <defs>
+ <clipPath id="path">
+ <rect x="0" y="0" width="100" height="100"/>
+ <!-- Adding an empty text node to force mask-based clipping. -->
+ <text></text>
+ </clipPath>
+ </defs>
+ </svg>
+ <div class="container">
+ <div class="child"></div>
+ </div>
+
+ <script>
+ document.getAnimations()[0].ready.then(() => requestAnimationFrame(takeScreenshot));
+ </script>
+</body>
+
+</html>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-001.html b/tests/wpt/tests/css/css-multicol/column-height-001.html
new file mode 100644
index 00000000000..cb7cb6323f5
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-001.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>column-height and column-wrap, auto height</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; width:100px; gap:0; column-height:50px; column-wrap:wrap; background:red;">
+ <div style="height:200px; background:green;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-002.html b/tests/wpt/tests/css/css-multicol/column-height-002.html
new file mode 100644
index 00000000000..902076a65a8
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-002.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>column-height and column-wrap, with gaps, auto height</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position:relative; columns:2; column-fill:auto; width:100px; gap:10px 20px; column-height:45px; column-wrap:wrap; background:red;">
+ <div style="position:absolute; left:0; top:45px; width:100%; height:10px; background:green;"></div>
+ <div style="position:absolute; left:40px; top:0; width:20px; height:100px; background:green;"></div>
+ <div style="height:180px; background:green;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-003.html b/tests/wpt/tests/css/css-multicol/column-height-003.html
new file mode 100644
index 00000000000..879358c1803
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-003.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>auto column-height and column-wrap, fixed height, balanced</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position:relative; width:100px; height:100px; background:red;">
+ <div style="columns:2; height:50px; gap:10px 0; column-wrap:wrap;">
+ <div style="height:180px; background:green;"></div>
+ <div style="position:absolute; left:0; top:50px; width:100px; height:10px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-004.html b/tests/wpt/tests/css/css-multicol/column-height-004.html
new file mode 100644
index 00000000000..07107f3c369
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-004.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>auto column-height and column-wrap, fixed height</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position:relative; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-fill:auto; height:30px; gap:5px 0; column-wrap:wrap;">
+ <div style="height:180px; background:green;"></div>
+ <div style="position:absolute; left:0; top:30px; width:100px; height:5px; background:green;"></div>
+ <div style="position:absolute; left:0; top:65px; width:100px; height:5px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-005.html b/tests/wpt/tests/css/css-multicol/column-height-005.html
new file mode 100644
index 00000000000..e131d62ee5d
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-005.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>column-height and no column-wrap</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width:100px; height:100px; background:red;">
+ <div style="columns:2; column-fill:auto; column-height:100px; width:50px; height:400px; gap:20px 0;">
+ <div style="height:400px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-006.html b/tests/wpt/tests/css/css-multicol/column-height-006.html
new file mode 100644
index 00000000000..773f25edd5c
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-006.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>column-height, column-wrap, spanner</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position:relative; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-fill:auto; column-height:10px; column-wrap:wrap; gap:10px 0;">
+ <div style="background:green;">
+ <div style="height:40px;"></div>
+ <div style="column-span:all; height:10px; background:green;"></div>
+ <div style="height:20px;"></div>
+ <div style="column-span:all; height:10px; background:green;"></div>
+ <div style="height:40px;"></div>
+ <div style="column-span:all; height:10px; background:green;"></div>
+ </div>
+ </div>
+ <div style="position:absolute; top:10px; left:0; width:100px; height:10px; background:green;"></div>
+ <div style="position:absolute; top:70px; left:0; width:100px; height:10px; background:green;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-007.html b/tests/wpt/tests/css/css-multicol/column-height-007.html
new file mode 100644
index 00000000000..4e7308dbd12
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-007.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>column-height and column-wrap in inner multicol, nested multicol</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position:relative; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-fill:auto; height:100px; gap:0;">
+ <div style="columns:2; column-fill:auto; column-height:60px; column-wrap:wrap; gap:10px 0;">
+ <div style="height:360px; background:green;"></div>
+ </div>
+ </div>
+ <div style="position:absolute; top:60px; left:0; width:100px; height:10px; background:green;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-008.html b/tests/wpt/tests/css/css-multicol/column-height-008.html
new file mode 100644
index 00000000000..f8ef2b1477f
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-008.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>column-height and column-wrap in outer multicol, nested multicol</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="position:relative; width:100px; height:100px; background:red;">
+ <div style="columns:2; height:100px; gap:10px 0; column-height:60px; column-wrap:wrap;">
+ <div style="columns:2; gap:0;">
+ <div style="height:360px; background:green;"></div>
+ </div>
+ </div>
+ <div style="position:absolute; top:60px; left:0; width:100px; height:10px; background:green;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-009-ref.html b/tests/wpt/tests/css/css-multicol/column-height-009-ref.html
new file mode 100644
index 00000000000..034440ebd5c
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-009-ref.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ .item {
+ display: block;
+ width: 50px;
+ height: 40px;
+ margin-bottom: 20px;
+ background: cyan;
+ }
+ .column {
+ float: left;
+ width: 100px;
+ }
+ .rule {
+ float: left;
+ width: 2px;
+ margin-left: 9px;
+ margin-right: 9px;
+ background: black;
+ }
+</style>
+<div style="width:340px; height:160px; line-height:20px; background:yellow;">
+ <div class="column">
+ <div class="item">a<br>b</div>
+ <div class="item">g<br>h</div>
+ <div class="item">m<br>n</div>
+ </div>
+ <div class="rule" style="height:160px;"></div>
+ <div class="column">
+ <div class="item">c<br>d</div>
+ <div class="item">i<br>j</div>
+ <div class="item">o<br>p</div>
+ </div>
+ <div class="rule" style="height:100px;"></div>
+ <div class="column">
+ <div class="item">e<br>f</div>
+ <div class="item">k<br>l</div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-multicol/column-height-009.html b/tests/wpt/tests/css/css-multicol/column-height-009.html
new file mode 100644
index 00000000000..1e08242e0f9
--- /dev/null
+++ b/tests/wpt/tests/css/css-multicol/column-height-009.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>column-height, column-wrap, and column-rule</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<link rel="match" href="column-height-009-ref.html">
+<div style="width:340px; orphans:1; widows:1; line-height:20px;">
+ <div style="columns:3; gap:20px; column-rule:2px solid; column-height:40px; column-wrap:wrap; background:yellow;">
+ <div style="width:50px; background:cyan;">
+ a<br>
+ b<br>
+ c<br>
+ d<br>
+ e<br>
+ f<br>
+ g<br>
+ h<br>
+ i<br>
+ j<br>
+ k<br>
+ l<br>
+ m<br>
+ n<br>
+ o<br>
+ p<br>
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html
new file mode 100644
index 00000000000..cd26b8aca85
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-002.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<title>Tab focus and ::colum::scroll-marker, wrapped column rows</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: 3;
+ column-wrap: wrap;
+ column-height: 100px;
+ column-fill: auto;
+ column-rule: solid;
+ height: 150px;
+ 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 tabindex="0" id="c0" style="height:100px;">First</div>
+
+ <!-- Column #1 -->
+ <div tabindex="0" id="c1first">line</div>
+ <div tabindex="0" id="c1second" style="height:100px; background:red;">line</div>
+
+ <!-- Column #2 -->
+
+ <div tabindex="0" id="inlineBlock" style="display:inline-block; box-sizing:border-box; width:100%; height:70px; border:solid;"></div>
+
+ <!-- Column #3 -->
+ <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>
+ </div>
+
+ <!-- Column #4 -->
+ <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 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(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 => {
+ await activateMarker(2);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock);
+ await focusNext();
+ assert_equals(document.activeElement, flex1);
+ }, "Column #2");
+
+ promise_test(async t => {
+ await activateMarker(0);
+ await focusNext();
+ assert_equals(document.activeElement, c0);
+ await focusNext();
+ assert_equals(document.activeElement, c1first);
+ }, "Column #0");
+
+ promise_test(async t => {
+ await activateMarker(4);
+ 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, after);
+ }, "Column #4");
+
+ promise_test(async t => {
+ await activateMarker(3);
+ 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 #3");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-003.html b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-003.html
new file mode 100644
index 00000000000..bb3868066e3
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-003.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<title>Tab focus from ::colum::scroll-marker to non-atomic inline</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: scroll;
+ columns: 7;
+ column-gap: 10px;
+ column-fill: auto;
+ column-rule: solid;
+ height: 100px;
+ line-height: 20px;
+ orphans: 1;
+ widows: 1;
+ }
+ #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">
+ <div id="wrapper">
+ <div tabindex="0" style="display:inline-block; width:100%; height:85px;"></div>
+ <span tabindex="0" id="inlineElm1">
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ <span tabindex="0" id="inlineElm2">inline2</span>
+ </span>
+ <div tabindex="0" id="inlineBlock1" style="display:inline-block; width:100%; height:85px; background:brown;"></div>
+ <span tabindex="0" id="inlineElm3" style="border:1px solid;">
+ inline3<br>
+ <div tabindex="0" id="inlineBlock2" style="display:inline-block; width:100%; height:15px; background:brown;"></div>
+ inline3<br>
+ inline3<br>
+ inline3<br>
+ inline3<br>
+ </span>
+ <span tabindex="0" id="inlineElm4" style="border:1px solid;">
+ inline4<br>
+ </span>
+ </div>
+</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();
+ }
+
+ // Redisplay an element, to reset state. This makes the test harder to pass
+ // with Blink's "culled inlines" concept.
+ function redisplay(elm) {
+ let old_display = elm.style.display;
+ elm.style.display = "none";
+ document.body.offsetTop;
+ elm.style.display = old_display;
+ }
+
+ 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(1);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm1);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm2);
+ redisplay(wrapper);
+ }, "Focus second column");
+
+ promise_test(async t => {
+ await activateMarker(2);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm2);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock1);
+ redisplay(wrapper);
+ }, "Focus third column");
+
+ promise_test(async t => {
+ await activateMarker(3);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock1);
+ await focusNext();
+ let collection = document.activeElement;
+ assert_equals(document.activeElement, inlineElm3);
+ redisplay(wrapper);
+ }, "Focus fourth column");
+
+ promise_test(async t => {
+ await activateMarker(4);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm3);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock2);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm4);
+ redisplay(wrapper);
+ }, "Focus fifth column");
+
+ promise_test(async t => {
+ await activateMarker(5);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm4);
+ redisplay(wrapper);
+ }, "Focus sixth column");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-004.html b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-004.html
new file mode 100644
index 00000000000..fa6adbb15d0
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/column-scroll-marker-focus-004.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<title>Tab focus from ::colum::scroll-marker, some columns with no elements</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;
+ }
+ #scrollable {
+ scroll-marker-group: after;
+ overflow: hidden;
+ height: 100px;
+ line-height: 20px;
+ }
+ #multicol {
+ columns: 11;
+ column-gap: 10px;
+ column-fill: auto;
+ column-rule: solid;
+ height: 100%;
+ orphans: 1;
+ widows: 1;
+ }
+ #scrollable::scroll-marker-group {
+ display: flex;
+ height: 20px;
+ background: hotpink;
+ }
+ #multicol::column::scroll-marker {
+ content: "";
+ width: 20px;
+ height: 20px;
+ margin-right: 5px;
+ background: blue;
+ }
+ #multicol::column::scroll-marker:focus {
+ background: cyan;
+ }
+</style>
+<div id="scrollable">
+ <div id="multicol">
+ <div tabindex="0" id="block1" style="height:85px; background:#ccc;"></div>
+ <div tabindex="0" id="block2">
+ block<br>
+ block<br>
+ block<br>
+ block<br>
+ block<br>
+ block<br>
+ </div>
+ <div tabindex="0" id="inlineBlock1" style="display:inline-block; width:100%; height:81px; background:#ccc;"></div>
+ <span tabindex="0" id="inlineElm1">
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ </span>
+ <div tabindex="0" id="inlineBlock2" style="display:inline-block; width:100%; height:81px; background:#ccc;"></div>
+ <span tabindex="0" id="inlineElm2">
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ inline<br>
+ </span>
+ </div>
+</div>
+<div id="after" tabindex="0">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, 105)
+ .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(1);
+ await focusNext();
+ assert_equals(document.activeElement, block2);
+ }, "Focus column #1");
+
+ promise_test(async t => {
+ await activateMarker(10);
+ await focusNext();
+ assert_equals(document.activeElement, after);
+ }, "Focus column #10");
+
+ promise_test(async t => {
+ await activateMarker(2);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock1);
+ }, "Focus column #2");
+
+ promise_test(async t => {
+ await activateMarker(9);
+ await focusNext();
+ assert_equals(document.activeElement, after);
+ }, "Focus column #9");
+
+ promise_test(async t => {
+ await activateMarker(8);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm2);
+ }, "Focus column #8");
+
+ promise_test(async t => {
+ await activateMarker(7);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock2);
+ }, "Focus column #7");
+
+ promise_test(async t => {
+ await activateMarker(6);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock2);
+ }, "Focus column #6");
+
+ promise_test(async t => {
+ await activateMarker(5);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock2);
+ }, "Focus column #5");
+
+ promise_test(async t => {
+ await activateMarker(4);
+ await focusNext();
+ assert_equals(document.activeElement, inlineElm1);
+ }, "Focus column #4");
+
+ promise_test(async t => {
+ await activateMarker(3);
+ await focusNext();
+ assert_equals(document.activeElement, inlineBlock1);
+ }, "Focus column #3");
+
+ promise_test(async t => {
+ await activateMarker(0);
+ await focusNext();
+ assert_equals(document.activeElement, block1);
+ }, "Focus column #0");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-011.tentative.html b/tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-011.tentative.html
new file mode 100644
index 00000000000..9ee25208239
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-011.tentative.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: the ellipsis is not placed on the last line of the line-clamp container</title>
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#block-ellipsis">
+<link rel="match" href="reference/block-ellipsis-011-ref.html">
+<meta name="assert" content="block-ellipsis will insert an ellipsis immediately before a region break, and there can be no region break after the last line of the line-clamp container. If a line would be the last if the ellipsis was not inserted, then it must not be inserted.">
+<style>
+.clamp {
+ line-clamp: 2;
+ width: 31.1ch;
+ border: 1px solid black;
+ font-family: monospace;
+}
+p {
+ margin: 0;
+}
+</style>
+<div class="clamp">
+ <p>
+ There should not be an ellipsis
+ at the end of this line of text
+ </p>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html b/tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html
new file mode 100644
index 00000000000..54dd4df5141
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/line-clamp/block-ellipsis-012.tentative.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: the ellipsis can be placed in the last line of an inline formatting context</title>
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#block-ellipsis">
+<link rel="match" href="reference/block-ellipsis-012-ref.html">
+<meta name="assert" content="block-ellipsis will insert an ellipsis immediately before a region break, and there can be no region break after the last line of the line-clamp container. However, there can be one after the last line in an IFC, if there is content after it.">
+<style>
+.clamp {
+ line-clamp: 1;
+ width: 38.1ch;
+ border: 1px solid black;
+ font-family: monospace;
+}
+p {
+ margin: 0;
+}
+</style>
+<div class="clamp">
+ <p>This line should have an ellipsis here</p>
+ <p>After all, it is not the last line in the line-clamp container</p>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html b/tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html
new file mode 100644
index 00000000000..be5693c7045
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/line-clamp/line-clamp-auto-002-crash.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: `line-clamp: auto` box containing float after margins should not crash</title>
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://crbug.com/404288146">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#line-clamp">
+<style>
+ .parent {
+ line-height: 1.2em;
+ line-clamp: auto;
+ max-height: 3lh;
+ }
+ .float {
+ float: left;
+ }
+ .margins {
+ margin-block-start: 1em;
+ margin-block-end: 1em;
+ }
+</style>
+<div class="parent">
+ <div class="margins">A</div>
+ <div>
+ <div class="float"></div>
+ B
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-011-ref.html b/tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-011-ref.html
new file mode 100644
index 00000000000..379cf974f64
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-011-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+.clamp {
+ width: 31.1ch;
+ border: 1px solid black;
+ font-family: monospace;
+}
+</style>
+<div class="clamp">
+ There should not be an ellipsis
+ at the end of this line of text
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-012-ref.html b/tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-012-ref.html
new file mode 100644
index 00000000000..7f9c44293e8
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/line-clamp/reference/block-ellipsis-012-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<style>
+.clamp {
+ width: 38.1ch;
+ border: 1px solid black;
+ font-family: monospace;
+}
+</style>
+<div class="clamp">
+ This line should have an ellipsis…
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/root-scroll-marker-activation-and-scroll-tracking.html b/tests/wpt/tests/css/css-overflow/root-scroll-marker-activation-and-scroll-tracking.html
new file mode 100644
index 00000000000..524e5399022
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/root-scroll-marker-activation-and-scroll-tracking.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: ::scroll-marker with ::scroll-marker-group on root element scroll tracking</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker-pseudo">
+<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>
+<style>
+ body {
+ margin: 0;
+ }
+
+ :root {
+ scroll-marker-group: before;
+ }
+
+ :root::scroll-marker-group {
+ border: 3px solid black;
+ padding: 5px;
+ height: 20px;
+ display: block;
+ position: fixed;
+ top: 0;
+ }
+
+ div {
+ width: 600px;
+ height: 300px;
+ margin-bottom: 20px;
+ background: blue;
+ }
+
+ div:first-of-type {
+ margin-top: 40px;
+ }
+
+ div::scroll-marker {
+ content: "";
+ width: 20px;
+ height: 20px;
+ background-color: red;
+ display: inline-block;
+ margin-right: 4px;
+ }
+
+ div::scroll-marker:target-current {
+ background-color: green;
+ }
+
+ div:last-of-type::scroll-marker {
+ margin-right: 0px;
+ }
+</style>
+<div></div>
+<div></div>
+<div id="target"></div>
+<script>
+ promise_test(async t => {
+ await new test_driver.Actions()
+ .pointerMove(65, 20)
+ .pointerDown()
+ .pointerUp()
+ .pointerDown()
+ .pointerUp()
+ .send();
+ assert_equals(window.scrollY, 380);
+ assert_equals(getComputedStyle(target, "::scroll-marker").backgroundColor, "rgb(0, 128, 0)");
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/root-scroll-marker-ref.html b/tests/wpt/tests/css/css-overflow/root-scroll-marker-ref.html
new file mode 100644
index 00000000000..24d3fab4ef1
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/root-scroll-marker-ref.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: ::scroll-marker with ::scroll-marker-group on root element</title>
+<style>
+ body {
+ margin: 0;
+ }
+
+ #scroll-marker-group {
+ border: 3px solid black;
+ padding: 5px;
+ height: 20px;
+ display: block;
+ position: fixed;
+ top: 0;
+ }
+
+ .item {
+ width: 600px;
+ height: 300px;
+ margin-bottom: 20px;
+ background: green;
+ }
+
+ #first {
+ margin-top: 40px;
+ }
+
+ .scroll-marker {
+ width: 10px;
+ height: 10px;
+ background-color: blue;
+ border-radius: 100%;
+ display: inline-block;
+ }
+</style>
+<div id="scroll-marker-group">
+ <div class="scroll-marker"></div>
+ <div class="scroll-marker"></div>
+ <div class="scroll-marker"></div>
+</div>
+<div id="first" class="item"></div>
+<div class="item"></div>
+<div class="item"></div>
diff --git a/tests/wpt/tests/css/css-overflow/root-scroll-marker.html b/tests/wpt/tests/css/css-overflow/root-scroll-marker.html
new file mode 100644
index 00000000000..48f3a81338a
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/root-scroll-marker.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: ::scroll-marker with ::scroll-marker-group on root element</title>
+<link rel="match" href="root-scroll-marker-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker-pseudo">
+<style>
+ body {
+ margin: 0;
+ }
+
+ :root {
+ scroll-marker-group: before;
+ }
+
+ :root::scroll-marker-group {
+ border: 3px solid black;
+ padding: 5px;
+ height: 20px;
+ display: block;
+ position: fixed;
+ top: 0;
+ }
+
+ div {
+ width: 600px;
+ height: 300px;
+ margin-bottom: 20px;
+ background: green;
+ }
+
+ div:first-of-type {
+ margin-top: 40px;
+ }
+
+ div::scroll-marker {
+ content: "";
+ width: 10px;
+ height: 10px;
+ background-color: blue;
+ border-radius: 100%;
+ display: inline-block;
+ margin-right: 4px;
+ }
+
+ div:last-of-type::scroll-marker {
+ margin-right: 0px;
+ }
+</style>
+<div></div>
+<div></div>
+<div></div>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-15.html b/tests/wpt/tests/css/css-overflow/scroll-marker-15.html
new file mode 100644
index 00000000000..764e56b5543
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-15.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: scroll tracking for ::scroll-marker with overflow: hidden</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-container-scroll">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/css-transitions/support/helper.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ scroll-marker-group: before;
+ height: 100px;
+ }
+
+ #scroller::scroll-marker-group {
+ border: 3px solid black;
+ display: flex;
+ width: 100px;
+ height: 20px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ }
+
+ #scroller div::scroll-marker {
+ overflow: hidden;
+ content: '';
+ background-color: red;
+ display: inline-flex;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ }
+
+ #scroller div::scroll-marker:target-current {
+ background-color: green;
+ }
+</style>
+<div id='scroller'>
+ <div></div>
+ <div id='target'></div>
+</div>
+<script>
+ function assertPseudoElementProperty(originatingElement, pseudoType, backgroundColor) {
+ const pseudoStyle = getComputedStyle(originatingElement, pseudoType);
+ const pseudoBackgroundColor = pseudoStyle.getPropertyValue('background-color');
+ assert_equals(pseudoBackgroundColor, backgroundColor, pseudoType +
+ " background-color should be " + backgroundColor.toString() +
+ " but was " + pseudoBackgroundColor.toString());
+ }
+ promise_test(async () => {
+ await waitForAnimationFrames(2);
+ assertPseudoElementProperty(target, "::scroll-marker", "rgb(255, 0, 0)");
+ }, "::scroll-marker is not activated when its originating element is not scrolled into the view");
+ promise_test(async () => {
+ scroller.scrollTop = 150;
+ await waitForAnimationFrames(2);
+ assertPseudoElementProperty(target, "::scroll-marker", "rgb(0, 128, 0)");
+ }, "::scroll-marker is activated when its originating element is scrolled into the view");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html
new file mode 100644
index 00000000000..69e9167cc33
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001-ref.tentative.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test Reference: scroll-marker-contain property makes anchor elements scroll markers</title>
+<style>
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:first-of-type {
+ color: green;
+ }
+</style>
+<div>
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html
new file mode 100644
index 00000000000..93d7df72508
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-001.tentative.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property makes anchor elements scroll markers</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-001-ref.tentative.html">
+<style>
+ #wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="wrapper">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html
new file mode 100644
index 00000000000..3fa777f7863
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002-ref.tentative.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test Reference: scroll-marker-contain property makes anchor elements scroll markers and does scroll tracking</title>
+<style>
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:last-of-type {
+ color: green;
+ }
+</style>
+<div>
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ scroller.scrollTop = 400;
+</script>
+
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html
new file mode 100644
index 00000000000..af2a5e668be
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-002.tentative.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property makes anchor elements scroll markers and does scroll tracking</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-002-ref.tentative.html">
+<style>
+ #wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="wrapper">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a id="link4" href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ scroller.scrollTop = 400;
+ assert_equals(getComputedStyle(link4).color, "rgb(0, 128, 0)", "link4 should be :target-current");
+</script>
+
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html
new file mode 100644
index 00000000000..09bb93d4ebc
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003-ref.tentative.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test Reference: anchor scroll markers and pseudo element scroll markers</title>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+ :root {
+ font-family: "Ahem";
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:last-of-type {
+ color: green;
+ }
+</style>
+<div>
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<div>
+ <a href="#target1">t1</a><a href="#target2">t2</a><a href="#target3">t3</a><a href="#target4">t4</a>
+</div>
+<script>
+ scroller.scrollTop = 400;
+</script>
+
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html
new file mode 100644
index 00000000000..59daa5cf5ce
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-003.tentative.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: anchor scroll markers and pseudo element scroll markers</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-5/#scroll-marker">
+<link rel="match" href="scroll-marker-contain-003-ref.tentative.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+ :root {
+ font-family: "Ahem";
+ }
+
+ #wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ scroll-marker-group: after;
+ counter-reset: t;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ counter-increment: t;
+ }
+
+ #scroller div::scroll-marker {
+ content: "t" counter(t);
+ color: red;
+ }
+
+ #scroller div::scroll-marker:target-current {
+ color: green;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="wrapper">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a id="link4" href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ scroller.scrollTop = 400;
+ assert_equals(getComputedStyle(link4).color, "rgb(0, 128, 0)", "link4 should be :target-current");
+</script>
+
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html
new file mode 100644
index 00000000000..2ec6f6bde76
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-004.tentative.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property makes anchor elements scroll markers inside size containers</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-001-ref.tentative.html">
+<style>
+ html {
+ container: my-container / size;
+ }
+
+ #wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="wrapper">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-005.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-005.tentative.html
new file mode 100644
index 00000000000..3d435bf74cb
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-005.tentative.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property invalidation - reparenting nested anchors</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-001-ref.tentative.html">
+<style>
+ .wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div class="wrapper">
+ <div id="target" class="wrapper">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+ </div>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ scroller.scrollTop = 400;
+ document.documentElement.offsetTop;
+ target.classList.remove('wrapper');
+ document.documentElement.offsetTop;
+ scroller.scrollTop = 0;
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-006.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-006.tentative.html
new file mode 100644
index 00000000000..234b57e5bbe
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-006.tentative.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property invalidation - anchor and target removal and addition</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-001-ref.tentative.html">
+<style>
+ .wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="target" class="wrapper">
+ <a id="link1" href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ const newLink1 = link1.cloneNode(true);
+ const newTarget1 = target1.cloneNode();
+ target.removeChild(link1);
+ scroller.removeChild(target1);
+ document.documentElement.offsetTop;
+ target.prepend(newLink1);
+ scroller.prepend(newTarget1);
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-007.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-007.tentative.html
new file mode 100644
index 00000000000..5f15c85819a
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-007.tentative.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property invalidation - dynamic creation</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-001-ref.tentative.html">
+<style>
+ .wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="target">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ document.documentElement.offsetTop;
+ target.classList.add("wrapper");
+</script>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-008-ref.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-008-ref.tentative.html
new file mode 100644
index 00000000000..d74777d3bbf
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-008-ref.tentative.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test Reference: scroll-marker-contain property makes anchor elements scroll markers - </title>
+<style>
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+</style>
+<div>
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-marker-contain-008.tentative.html b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-008.tentative.html
new file mode 100644
index 00000000000..80801854a0f
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-marker-contain-008.tentative.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: scroll-marker-contain property invalidation - dynamic removal</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/10916">
+<link rel="match" href="scroll-marker-contain-008-ref.tentative.html">
+<style>
+ .wrapper {
+ scroll-marker-contain: auto;
+ }
+
+ #scroller {
+ overflow: auto;
+ height: 130px;
+ width: 100px;
+ }
+
+ #scroller div {
+ width: 100px;
+ height: 100px;
+ background-color: blue;
+ margin: 5px;
+ }
+
+ a {
+ color: red;
+ }
+
+ a:target-current {
+ color: green;
+ }
+</style>
+<div id="target" class="wrapper">
+ <a href="#target1">t1</a>
+ <a href="#target2">t2</a>
+ <a href="#target3">t3</a>
+ <a href="#target4">t4</a>
+</div>
+<div id="scroller">
+ <div id="target1"></div>
+ <div id="target2"></div>
+ <div id="target3"></div>
+ <div id="target4"></div>
+</div>
+<script>
+ document.documentElement.offsetTop;
+ target.classList.remove("wrapper");
+</script>
diff --git a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
index 18c172b40a1..a116ead01b7 100644
--- a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
+++ b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
@@ -29,7 +29,8 @@ promise_test(async function() {
assert_not_equals(originalScrollPos, 0, "Should have scrolled to get the iframe into view");
await new test_driver.Actions()
- .scroll(bounds.left + bounds.width / 2, bounds.top + bounds.height / 2, 0, -100)
+ .scroll(Math.round(bounds.left + bounds.width / 2),
+ Math.round(bounds.top + bounds.height / 2), 0, -100)
.send();
assert_equals(window.scrollY, originalScrollPos, "overscroll-behavior should work on the root");
diff --git a/tests/wpt/tests/css/css-page/crashtests/counter-containment-001.html b/tests/wpt/tests/css/css-page/crashtests/counter-containment-001.html
new file mode 100644
index 00000000000..2672bfffb5b
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/crashtests/counter-containment-001.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/400087471">
+<style>
+ :root {
+ counter-increment: a1 9;
+ container-type: inline-size;
+ }
+</style>
+<script>
+ window.print();
+</script>
diff --git a/tests/wpt/tests/css/css-page/crashtests/counter-containment-002.html b/tests/wpt/tests/css/css-page/crashtests/counter-containment-002.html
new file mode 100644
index 00000000000..04b4710ab28
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/crashtests/counter-containment-002.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/400087476">
+<style>
+ :root {
+ contain: style;
+ counter-increment: a1;
+ }
+</style>
+<script>
+ window.print();
+</script>
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html
new file mode 100644
index 00000000000..83313e0ad10
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+ <style>
+ table {
+ border-spacing: 0;
+ }
+ td {
+ padding: 0px 9.6px;
+ background-color: #fff;
+ }
+ .sticky {
+ position: sticky;
+ left: 0px;
+ background-color: #c3c3c3;
+ }
+ </style>
+ <table>
+ <tr>
+ <td class="sticky" style="width: 64px"></td>
+ <td class="sticky" style="width: 10px"></td>
+ <td class="sticky">Content</td>
+ </tr>
+ </table>
+
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html
new file mode 100644
index 00000000000..3bda20efc9d
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-table-pixel-rounding.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+ <link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+ <link rel="match" href="position-sticky-table-pixel-rounding-ref.html" />
+ <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org" />
+ <meta name="assert" content="Passes if there is no gap between the second and third column">
+ <style>
+ table {
+ border-spacing: 0;
+ }
+ td {
+ padding: 0px 9.6px;
+ background-color: #fff;
+ }
+ .sticky {
+ position: sticky;
+ left: 0px;
+ background-color: #c3c3c3;
+ }
+ </style>
+ <table>
+ <tr>
+ <td class="sticky" style="width: 64.138px"></td>
+ <td class="sticky" style="width: 10px"></td>
+ <td class="sticky">Content</td>
+ </tr>
+ </table>
+
diff --git a/tests/wpt/tests/css/css-pseudo/WEB_FEATURES.yml b/tests/wpt/tests/css/css-pseudo/WEB_FEATURES.yml
index ac89c2b7313..c197d348edf 100644
--- a/tests/wpt/tests/css/css-pseudo/WEB_FEATURES.yml
+++ b/tests/wpt/tests/css/css-pseudo/WEB_FEATURES.yml
@@ -2,16 +2,13 @@ features:
- name: target-text
files:
- target-text-*
-features:
- name: spelling-grammar-error
files:
- spelling-error-*
- grammar-spelling-errors-*
-features:
- name: marker
files:
- marker-*
-features:
- name: file-selector-button
files:
- file-selector-button-*
diff --git a/tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html b/tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html
new file mode 100644
index 00000000000..05fc8232491
--- /dev/null
+++ b/tests/wpt/tests/css/css-pseudo/focus-visible-originating-element.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::before matches when originating element has :focus-visible selector</title>
+<link rel="help" href="https://drafts.csswg.org/css-pseudo/#generated-content">
+<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>
+<style>
+ input {
+ outline: none;
+
+ &:not(:disabled):focus-visible::before {
+ background-color: green;
+ }
+ }
+
+ input::before {
+ content: "";
+ background-color: red;
+ display: inline-block;
+ height: 50px;
+ width: 50px;
+ }
+</style>
+<input type="checkbox" id="target"/>
+<script>
+ promise_test(async t => {
+ const kTab = '\uE004';
+ await new test_driver.Actions()
+ .keyDown(kTab)
+ .keyUp(kTab)
+ .send();
+ assert_equals(getComputedStyle(target, "::before").backgroundColor, "rgb(0, 128, 0)");
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/host-has-internal-004.html b/tests/wpt/tests/css/css-scoping/host-has-internal-004.html
new file mode 100644
index 00000000000..fe51186f59f
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/host-has-internal-004.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>:has(...):host internal descendent</title>
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div id="host">
+ <template shadowrootmode="open">
+ <style>
+ div {
+ width: 100px;
+ height: 100px;
+ background-color: red;
+ }
+ :has(section):host div {
+ background-color: green;
+ }
+ </style>
+ <span><div></div></span>
+ <section></section>
+ </template>
+</div>
diff --git a/tests/wpt/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html b/tests/wpt/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html
index 1c6caf224ac..5c03c049a01 100644
--- a/tests/wpt/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap/input/snap-area-overflow-boundary-viewport-covering.tentative.html
@@ -118,8 +118,8 @@ promise_test(async t => {
}, "Keyboard scrolling with vertical snap-area overflow");
promise_test(async t => {
+ await waitForScrollReset(t, scroller);
await waitForCompositorCommit();
- scroller.scrollTo(0, 0);
assert_equals(scroller.scrollTop, 0, "verify test pre-condition");
// Ensure we can freely scroll in an oversized element.
diff --git a/tests/wpt/tests/css/css-scroll-snap/scroll-start/scroll-start-overflow-toggled.tentative.html b/tests/wpt/tests/css/css-scroll-snap/scroll-start/scroll-start-overflow-toggled.tentative.html
index 8829519024a..8c0f2a45177 100644
--- a/tests/wpt/tests/css/css-scroll-snap/scroll-start/scroll-start-overflow-toggled.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap/scroll-start/scroll-start-overflow-toggled.tentative.html
@@ -44,7 +44,7 @@
scroller.scrollLeft = 100;
// Allow for an animation frame that might be needed for the update to take
// place.
- await requestAnimationFrame(() => { });
+ await new Promise(r => requestAnimationFrame(r));
assert_equals(scroller.scrollTop, 200,
"vertical scroll position is programmatically adjusted");
assert_equals(scroller.scrollLeft, 100,
@@ -64,4 +64,4 @@
"toggle.");
}, "scroll-start sets scroller position if overflow is not visible");
</script>
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html
new file mode 100644
index 00000000000..41e454b2789
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/resnap-on-oveflow-hidden-container.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" />
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1946375">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#scroller {
+ display: flex;
+ overflow-x: hidden;
+ scroll-snap-align: start;
+ scroll-snap-type: x mandatory;
+ width: 500px;
+ height: 200px;
+ position: absolute;
+}
+.child {
+ display: flex;
+ flex: 0 0 500px;
+ scroll-snap-align: start;
+ width: 500px;
+ height: 100%;
+ align-items: center;
+ justify-content: center;
+ font-size: 30px;
+}
+</style>
+<div id="scroller">
+ <div class="child" style="background-color: blue;">1</div>
+ <div class="child" style="background-color: green;">2</div>
+ <div class="child" style="background-color: yellow;">3</div>
+</div>
+<script>
+promise_test(async () => {
+ assert_equals(scroller.scrollLeft, 0, "The initial scroll position");
+
+ const scrollPromise = new Promise(resolve => {
+ scroller.addEventListener("scroll", resolve);
+ });
+ // Do an async scroll operation to the second child.
+ scroller.scrollTo({ left: 500, behavior: "smooth" });
+
+ // Wait a scroll event.
+ await scrollPromise;
+
+ // Assuming that the current scroll position is not yet the scroll
+ // destination, i.e. during the async scroll is runnig try to do
+ // a new async scroll operation to the third child.
+ const scrollendPromise = new Promise(resolve => {
+ scroller.addEventListener("scrollend", resolve);
+ });
+ scroller.scrollTo({ left: 1000, behavior: "smooth" });
+ await scrollendPromise;
+
+ assert_equals(scroller.scrollLeft, 1000,
+ "Now the scroll position should be 1000px");
+
+ // Change a child element width so that re-snapping will happen.
+ document.querySelectorAll(".child")[0].style.width = "501px";
+
+ assert_equals(scroller.scrollLeft, 1000, "The scroll position should stay");
+});
+</script>
diff --git a/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-computed.html b/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-computed.html
index 2d80b861723..5646f149d80 100644
--- a/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-computed.html
+++ b/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-computed.html
@@ -18,6 +18,7 @@ test_computed_value("text-size-adjust", 'none', '100%');
test_computed_value("text-size-adjust", '200%');
test_computed_value("text-size-adjust", '100%');
test_computed_value("text-size-adjust", '0%');
+test_computed_value("text-size-adjust", 'calc(10% * sibling-index())', '10%');
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-valid.html b/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-valid.html
index bd58ae5f699..a9835da3ab4 100644
--- a/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-valid.html
+++ b/tests/wpt/tests/css/css-size-adjust/parsing/text-size-adjust-valid.html
@@ -17,6 +17,8 @@ test_valid_value("text-size-adjust", 'none');
test_valid_value("text-size-adjust", '200%');
test_valid_value("text-size-adjust", '100%');
test_valid_value("text-size-adjust", '0%');
+test_valid_value("text-size-adjust", 'calc(10% + 5%)', 'calc(15%)');
+test_valid_value("text-size-adjust", 'calc(10% * sibling-index())');
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html
index bcbf653d68a..564858e360e 100644
--- a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html
+++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-013.html
@@ -2,11 +2,11 @@
<title>CSS aspect-ratio: img</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
-<!-- Replaced elements should always use content-box sizing for the purpose of
- aspect ratio. -->
-<img src="support/20x50-green.png" style="aspect-ratio: 20/50; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box;">
+<!-- When coercing the natural-size and aspect-ratio to be consistent, it should use the correct box-sizing. -->
+<img src="support/20x50-green.png" style="aspect-ratio: 1; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box;">
diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html
index 4c1ad16ce86..8b7bdafc107 100644
--- a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html
+++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-014.html
@@ -2,11 +2,11 @@
<title>CSS aspect-ratio: img</title>
<link rel="author" title="Google LLC" href="https://www.google.com/">
<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
-<!-- Replaced elements should always use content-box sizing for the purpose of
- aspect ratio. -->
-<img src="support/20x50-green.png" style="aspect-ratio: 20/50; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box; max-height: 100px;">
+<!-- When coercing the natural-size and aspect-ratio to be consistent, it should use the correct box-sizing. -->
+<img src="support/20x50-green.png" style="aspect-ratio: 1; background: green; padding-right: 80px; padding-bottom: 50px; box-sizing: border-box; max-height: 100px;">
diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html
new file mode 100644
index 00000000000..3339de4cb7d
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-045.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<!-- The coerced natural-size should be 40px by 40px. -->
+<canvas width="40" height="10" style="aspect-ratio: 1; background: green; padding-right: 60px; padding-bottom: 60px; box-sizing: border-box;">
+
diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html
new file mode 100644
index 00000000000..13a9fd99513
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/replaced-element-046.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11236">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<!-- The coerced natural-size should be 10px by 10px. -->
+<canvas width="10" height="40" style="aspect-ratio: 1; background: green; padding-right: 90px; padding-bottom: 90px; box-sizing: border-box; max-height: 110px;">
+
diff --git a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html
index 15e8e0e8910..da31a1efead 100644
--- a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html
+++ b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-028.html
@@ -31,6 +31,9 @@
.vertical {
writing-mode: vertical-lr;
}
+canvas {
+ aspect-ratio: auto;
+}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html
index 48fedb11483..9ee60268d60 100644
--- a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html
+++ b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html
@@ -35,6 +35,9 @@
.vertical {
writing-mode: vertical-lr;
}
+canvas {
+ aspect-ratio: auto;
+}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html
index 9f5741e2349..7176768b8df 100644
--- a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html
+++ b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-001.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-balance">
+<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance">
<link rel="match" href="reference/text-wrap-balance-before-after-001-ref.html">
<style>
.container {
diff --git a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html
index e9d08953fac..60e3a777df3 100644
--- a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html
+++ b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-before-after-002.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-balance">
+<link rel="help" href="https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance">
<link rel="match" href="reference/text-wrap-balance-before-after-002-ref.html">
<style>
.container {
diff --git a/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-computed.html b/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-computed.html
index cb110549d0b..3bf1e818e77 100644
--- a/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-computed.html
+++ b/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-computed.html
@@ -10,7 +10,7 @@
<script src="/css/support/computed-testcommon.js"></script>
</head>
<body>
-<div id="target"></div>
+<div id="target" style="font-size: 16px;"></div>
<script>
test_computed_value("transition-timing-function", "linear");
@@ -31,6 +31,10 @@ test_computed_value("transition-timing-function", "steps(2, jump-start)");
test_computed_value("transition-timing-function", "steps(2, jump-end)", "steps(2)");
test_computed_value("transition-timing-function", "steps(2, jump-both)");
test_computed_value("transition-timing-function", "steps(2, jump-none)");
+test_computed_value("transition-timing-function", "steps(calc(2 * sibling-index()), jump-none)", "steps(2, jump-none)");
+test_computed_value("transition-timing-function", "steps(sibling-index(), jump-none)", "steps(2, jump-none)");
+test_computed_value("transition-timing-function", "steps(calc(2 * sign(1em - 1000px)), jump-none)", "steps(2, jump-none)");
+test_computed_value("transition-timing-function", "steps(calc(2 * sign(1em - 1000px)), start)", "steps(1, start)");
test_computed_value("transition-timing-function", "linear, ease, linear");
</script>
diff --git a/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-valid.html b/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-valid.html
index 658ef76bbe8..5c7214e4041 100644
--- a/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-valid.html
+++ b/tests/wpt/tests/css/css-transitions/parsing/transition-timing-function-valid.html
@@ -34,6 +34,7 @@ test_valid_value("transition-timing-function", "steps(2, jump-start)");
test_valid_value("transition-timing-function", "steps(2, jump-end)", "steps(2)");
test_valid_value("transition-timing-function", "steps(2, jump-both)");
test_valid_value("transition-timing-function", "steps(2, jump-none)");
+test_valid_value("transition-timing-function", "steps(sibling-index(), jump-none)");
test_valid_value("transition-timing-function", "linear, ease, linear");
</script>
diff --git a/tests/wpt/tests/css/css-transitions/support/properties.js b/tests/wpt/tests/css/css-transitions/support/properties.js
index 81cf9d46d5f..e4502083890 100644
--- a/tests/wpt/tests/css/css-transitions/support/properties.js
+++ b/tests/wpt/tests/css/css-transitions/support/properties.js
@@ -265,6 +265,7 @@ var unspecified_properties = {
'column-rule-color': ['color'],
'column-rule-width': ['length'],
'column-width': ['length'],
+ 'column-height': ['length'],
'transform': ['transform'],
'transform-origin': ['horizontal'],
'display': ['display'],
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html
index f8087562236..fa23071c4f2 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/inline/append.tentative.html
@@ -19,6 +19,7 @@ const gInvalidTestCases = [
{ property: 'transition-duration', values: [CSS.s(1), '10px', CSS.px(10)], desc: 'a mix of valid and invalid values' },
{ property: 'transition-duration', values: [new CSSUnparsedValue([])], desc: 'a CSSUnparsedValue' },
{ property: 'transition-duration', values: ['var(--A)'], desc: 'a var ref' },
+ { property: 'background-size', values: [document.getElementsByTagName('title')[0].computedStyleMap().get('mask-position')], desc: 'a CSSVariableReferenceValue property' },
];
for (const {property, values, desc} of gInvalidTestCases) {
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html
new file mode 100644
index 00000000000..f9986221f48
--- /dev/null
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-height.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>'column-height' property</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om/#dom-stylepropertymapreadonly-get">
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om/#dom-stylepropertymap-set">
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om/#reify-stylevalue">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<script src="resources/testsuite.js"></script>
+<body>
+<div id="log"></div>
+<script>
+'use strict';
+
+runPropertyTests('column-height', [
+ { syntax: 'auto' },
+ {
+ syntax: '<length>',
+ specified: assert_is_equal_with_range_handling
+ },
+]);
+
+</script>
diff --git a/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html b/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html
new file mode 100644
index 00000000000..84f9ca35b79
--- /dev/null
+++ b/tests/wpt/tests/css/css-ui/cursor-calc-hotspot.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS UI Test: Allow complex calc expressions in cursor hotspot</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui/#cursor">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #t1 {
+ font-size: 20px;
+ cursor: url(cur.ico) calc(7 * sign(1em - 18px)) 0, auto;
+ }
+ #t2 {
+ cursor: url(cur.ico) calc(4 * sibling-index()) 0, auto;
+ }
+</style>
+<div>
+ <div id="t1"></div>
+ <div id="t2"></div>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(t1).cursor, "url(cur.ico) 7 0, auto");
+ }, "cursor hotspot with sign() depending on font relative units");
+
+ test(() => {
+ assert_equals(getComputedStyle(t2).cursor, "url(cur.ico) 8 0, auto");
+ }, "cursor hotspot depending on sibling-index()");
+</script>
diff --git a/tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html b/tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html
new file mode 100644
index 00000000000..64bccd216ab
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/calc-complex-unresolved-serialize.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Serialization of non-simplified calc() expressions</title>
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-simplification">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/serialize-testcommon.js"></script>
+<style>
+ #target { font-size: 20px; }
+</style>
+<div>
+ <div id="target"></div>
+</div>
+<script>
+ function test_serialization(value, specified, computed) {
+ test_specified_serialization("orphans", value, specified);
+ test_computed_serialization("orphans", value, computed);
+ }
+
+ test_serialization("calc(pow(2, sign(1em - 18px)))", "calc(pow(2, sign(1em - 18px)))", "2");
+ test_serialization("calc(pow(sign(1em - 18px), 2))", "calc(pow(sign(1em - 18px), 2))", "1");
+ test_serialization("calc(pow(sign(1em - 18px), sign(1em - 18px)))", "calc(pow(sign(1em - 18px), sign(1em - 18px)))", "1");
+
+ test_serialization("calc(pow(2, sibling-index())", "calc(pow(2, sibling-index()))", "2");
+ test_serialization("calc(pow(sibling-index(), 2)", "calc(pow(sibling-index(), 2))", "1");
+ test_serialization("calc(pow(sibling-index(), sibling-index())", "calc(pow(sibling-index(), sibling-index()))", "1");
+</script>
diff --git a/tests/wpt/tests/css/css-values/crashtests/chrome-405422528-crash.html b/tests/wpt/tests/css/css-values/crashtests/chrome-405422528-crash.html
new file mode 100644
index 00000000000..fcf7407b5f7
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/crashtests/chrome-405422528-crash.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/405422528">
+<div data-crash="sibling-index()" style="width: attr(data-crash px)"></div>
+<div data-crash="sign(1em - 1px)" style="width: attr(data-crash px)"></div>
diff --git a/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html b/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html
index edecfceb13a..3e298895883 100644
--- a/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html
+++ b/tests/wpt/tests/css/css-values/hypot-pow-sqrt-invalid.html
@@ -49,6 +49,8 @@ test_invalid_number('pow(1 * )');
test_invalid_number('pow(1 / )');
test_invalid_number('pow(1 2)');
test_invalid_number('pow(1, , 2)');
+test_invalid_number('pow(2px, 2)');
+test_invalid_number('pow(10, 1px)');
// General tests
test_invalid_length('calc(1px * pow(1))');
@@ -64,4 +66,5 @@ test_invalid_length('pow())');
test_invalid_length('pow(1, 2)');
test_invalid_length('calc(sqrt())');
test_invalid_length('calc(sqrt(100, 200))');
+test_invalid_length('pow(10px, 1)');
</script>
diff --git a/tests/wpt/tests/css/css-values/if-cycle.tentative.html b/tests/wpt/tests/css/css-values/if-cycle.html
index 74d56dc9ed7..74d56dc9ed7 100644
--- a/tests/wpt/tests/css/css-values/if-cycle.tentative.html
+++ b/tests/wpt/tests/css/css-values/if-cycle.html
diff --git a/tests/wpt/tests/css/css-values/progress-computed.tentative.html b/tests/wpt/tests/css/css-values/progress-computed.html
index 8eb4e2b6757..8eb4e2b6757 100644
--- a/tests/wpt/tests/css/css-values/progress-computed.tentative.html
+++ b/tests/wpt/tests/css/css-values/progress-computed.html
diff --git a/tests/wpt/tests/css/css-values/progress-invalid.tentative.html b/tests/wpt/tests/css/css-values/progress-invalid.html
index f135487e1c4..f135487e1c4 100644
--- a/tests/wpt/tests/css/css-values/progress-invalid.tentative.html
+++ b/tests/wpt/tests/css/css-values/progress-invalid.html
diff --git a/tests/wpt/tests/css/css-values/progress-serialize.tentative.html b/tests/wpt/tests/css/css-values/progress-serialize.html
index 49c3a3c3d56..49c3a3c3d56 100644
--- a/tests/wpt/tests/css/css-values/progress-serialize.tentative.html
+++ b/tests/wpt/tests/css/css-values/progress-serialize.html
diff --git a/tests/wpt/tests/css/css-view-transitions/auto-name-from-id.html b/tests/wpt/tests/css/css-view-transitions/auto-name-from-id.html
index 9a04d431dfd..d3430c93a1d 100644
--- a/tests/wpt/tests/css/css-view-transitions/auto-name-from-id.html
+++ b/tests/wpt/tests/css/css-view-transitions/auto-name-from-id.html
@@ -17,6 +17,7 @@ main {
.item {
view-transition-name: auto;
+ view-transition-class: item;
}
main.switch #item1 {
@@ -38,8 +39,7 @@ html::view-transition {
}
:root { view-transition-name: none; }
-html::view-transition-group(item1),
-html::view-transition-group(item2) {
+html::view-transition-group(*.item) {
animation-timing-function: steps(2, start);
animation-play-state: paused;
}
@@ -51,7 +51,7 @@ html::view-transition-new(*) { animation: unset; opacity: 1 }
</style>
-<main>
+<main id=main>
<div class="item" id="item1"></div>
<div class="item" id="item2"></div>
</main>
@@ -61,10 +61,19 @@ failIfNot(document.startViewTransition, "Missing document.startViewTransition");
function runTest() {
document.startViewTransition(() => {
- document.querySelector("main").classList.toggle("switch");
+ main.classList.toggle("switch");
+ let div1 = document.createElement("div");
+ div1.classList.add("item");
+ div1.id = "item1";
+
+ let div2 = document.createElement("div");
+ div2.classList.add("item");
+ div2.id = "item2";
+
+ main.replaceChildren(div1, div2);
}).ready.then(takeScreenshot);
}
onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
</script>
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html b/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html
index aceced0dded..2fddb7e17a4 100644
--- a/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/pageswap-in-hidden-doc-should-skip-transition.html
@@ -9,7 +9,14 @@
promise_test(async t => {
let popup;
onload = () => {
+ // Need to restore this browser window once after the window got minimized.
+ window.set_original_window_rect = rect => {
+ t.add_cleanup(async () => {
+ await test_driver.set_window_rect(rect);
+ });
+ };
popup = window.open("resources/navigate-after-hide.html");
+
t.add_cleanup(() => popup.close());
};
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/resources/at-rule-types-shared-elements.html b/tests/wpt/tests/css/css-view-transitions/navigation/resources/at-rule-types-shared-elements.html
new file mode 100644
index 00000000000..c9cff7f4734
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/resources/at-rule-types-shared-elements.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>View Transitions: @view-transition opt in with types and elements</title>
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+<script src="/common/reftest-wait.js"></script>
+
+<link rel=expect href="#target">
+
+<style>
+@view-transition {
+ navigation:auto;
+ types:mode;
+}
+
+:root { view-transition-name: none }
+html:active-view-transition-type(mode) {
+ .target {
+ view-transition-name: target;
+ }
+}
+
+.target {
+ width: 100px;
+ height: 100px;
+ position: relative;
+ background: green;
+ left: 200px;
+}
+
+::view-transition-group(target) {
+ animation-play-state: paused;
+}
+
+::view-transition-old(target) {
+ animation: unset;
+ opacity: 1;
+}
+::view-transition-new(target) {
+ animation: unset;
+ opacity: 0;
+}
+</style>
+</head>
+
+<div id=target class=target></div>
+
+<script>
+ onload = takeScreenshot;
+</script>
+
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/resources/auto-name-from-id.html b/tests/wpt/tests/css/css-view-transitions/navigation/resources/auto-name-from-id.html
index f1fd1e48a68..71ea52a273e 100644
--- a/tests/wpt/tests/css/css-view-transitions/navigation/resources/auto-name-from-id.html
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/resources/auto-name-from-id.html
@@ -23,7 +23,7 @@ html::view-transition-group(root) {
display: none;
}
-html::view-transition-group(green) {
+html::view-transition-group(*) {
animation-play-state: paused;
animation-duration: 3s;
animation-timing-function: steps(2, start);
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html b/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html
index 0b6a3d669e8..9bed19eda2a 100644
--- a/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/resources/navigate-after-hide.html
@@ -4,7 +4,8 @@
<script>
onload = async () => {
test_driver.set_test_context(window.opener);
- await test_driver.minimize_window();
+ const original_rect = await test_driver.minimize_window();
+ window.opener.set_original_window_rect(original_rect);
if (document.visibilityState !== "hidden" || !document.hidden) {
window.opener.popup_error("popup isn't hidden");
} else {
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements-ref.html b/tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements-ref.html
new file mode 100644
index 00000000000..2fc574c0f79
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>View Transitions: @view-transition opt in with types and elements (ref)</title>
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+
+<style>
+.target {
+ width: 100px;
+ height: 100px;
+ position: relative;
+ background: blue;
+}
+</style>
+
+<div class=target></div>
diff --git a/tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements.html b/tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements.html
new file mode 100644
index 00000000000..50dc5ba1f43
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/navigation/with-types/at-rule-types-shared-elements.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>View Transitions: @view-transition opt in with types and elements</title>
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+<link rel="match" href="at-rule-types-shared-elements-ref.html">
+<script src="/common/reftest-wait.js"></script>
+
+<style>
+@view-transition {
+ navigation:auto;
+ types:mode;
+}
+
+:root { view-transition-name: none }
+html:active-view-transition-type(mode) {
+ .target {
+ view-transition-name: target;
+ }
+}
+
+.target {
+ width: 100px;
+ height: 100px;
+ position: relative;
+ background: blue;
+}
+</style>
+
+<div class=target></div>
+<script>
+ function runTest() {
+ const url = "../resources/at-rule-types-shared-elements.html";
+ window.location.replace(new URL(url, window.location));
+ }
+ onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
+</script>
+
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html
new file mode 100644
index 00000000000..0e2c7d02543
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip-ref.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<title>Nested View Transitions root capture with border radius (ref)</title>
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+<link rel="author" href="mailto:vmpstr@chromium.org">
+
+<style>
+#clipper {
+ overflow: clip;
+ height: 200px;
+ width: 100px;
+ border-radius: 50%;
+ background: rebeccapurple;
+}
+
+#i0 {
+ background: pink;
+ margin-bottom: 10px;
+ height: 20px;
+}
+</style>
+
+<div id=clipper>
+ <div id=i0 class=item></div>
+</div>
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html
new file mode 100644
index 00000000000..eb728182865
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/nested/nested-root-capture-with-clip.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<title>Nested View Transitions root capture with border radius</title>
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-2/">
+<link rel="author" href="mailto:vmpstr@chromium.org">
+<link rel="match" href="nested-root-capture-with-clip-ref.html">
+<meta name=fuzzy content="maxDifference=0-40; totalPixels=0-400">
+<script src="/common/reftest-wait.js"></script>
+<script src="/dom/events/scrolling/scroll_support.js"></script>
+
+<style>
+:root { view-transition-name: none }
+#clipper {
+ view-transition-group: contain;
+ view-transition-name: clipper;
+ overflow: clip;
+ height: 200px;
+ width: 100px;
+ border-radius: 50%;
+ background: rebeccapurple;
+}
+
+.item {
+ view-transition-name: match-element;
+ view-transition-class: item;
+ background: pink;
+ margin-bottom: 10px;
+ height: 20px;
+}
+#i0 {
+ view-transition-name: none;
+ will-change: transform;
+}
+::view-transition-group(clipper) {
+ animation-play-state: pause;
+}
+::view-transition-new(clipper) {
+ animation: unset;
+ opacity: 0;
+}
+::view-transition-old(clipper) {
+ animation: unset;
+ opacity: 1;
+}
+::view-transition-group(*.item) {
+ display: none;
+}
+</style>
+
+<div id=clipper>
+ <div id=i0 class=item></div>
+ <div id=i1 class=item></div>
+ <div id=i2 class=item></div>
+ <div id=i3 class=item></div>
+</div>
+
+<script>
+function runTest() {
+ document.startViewTransition().ready.then(takeScreenshot);
+}
+
+onload = async () => {
+ await waitForCompositorReady();
+ runTest();
+}
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-ident.html b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-ident.html
index 107f388b388..493127b86b3 100644
--- a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-ident.html
+++ b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-ident.html
@@ -20,7 +20,10 @@ div {
view-transition-class: cls;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
diff --git a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-partial.html b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-partial.html
index ddb9b2535f2..d4a6e0a4f15 100644
--- a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-partial.html
+++ b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-partial.html
@@ -20,7 +20,10 @@ div {
view-transition-class: cls;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
diff --git a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-wildcard.html b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-wildcard.html
index 1e27dc2c05c..bdf51161447 100644
--- a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-wildcard.html
+++ b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-mismatch-wildcard.html
@@ -20,7 +20,10 @@ div {
view-transition-class: cls;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
diff --git a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-new-with-class-old-without.html b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-new-with-class-old-without.html
index 225ed1cb7f3..5adb88f143f 100644
--- a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-new-with-class-old-without.html
+++ b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-new-with-class-old-without.html
@@ -23,7 +23,10 @@ div {
view-transition-class: cls;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
diff --git a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-old-with-class-new-without.html b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-old-with-class-new-without.html
index f9ef100ef7e..17d03f8fcfc 100644
--- a/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-old-with-class-new-without.html
+++ b/tests/wpt/tests/css/css-view-transitions/pseudo-with-classes-old-with-class-new-without.html
@@ -23,7 +23,10 @@ div {
view-transition-class: cls;
}
-::view-transition-group(*) {
+::view-transition-group(*),
+::view-transition-image-pair(*),
+::view-transition-old(*),
+::view-transition-new(*) {
animation-play-state: paused;
}
diff --git a/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html
new file mode 100644
index 00000000000..3395465c5d5
--- /dev/null
+++ b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified-ref.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<title>CSS zoom applies to font-size when specified by keywords</title>
+<div style="font-size: medium">
+ <div style="zoom: 2">This is some zoomed medium text</div>
+</div>
diff --git a/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html
new file mode 100644
index 00000000000..fc724307f46
--- /dev/null
+++ b/tests/wpt/tests/css/css-viewport/zoom/font-size-keyword-specified.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<title>CSS zoom applies to font-size when specified by keywords</title>
+<link rel="help" href="https://drafts.csswg.org/css-viewport/">
+<link rel="match" href="font-size-keyword-specified-ref.html">
+<div style="zoom: 2">
+ <div style="font-size: medium">This is some zoomed medium text</div>
+</div>
diff --git a/tests/wpt/tests/css/css-viewport/zoom/iframe-very-small-zoom-001-crash.html b/tests/wpt/tests/css/css-viewport/zoom/iframe-very-small-zoom-001-crash.html
new file mode 100644
index 00000000000..05369040456
--- /dev/null
+++ b/tests/wpt/tests/css/css-viewport/zoom/iframe-very-small-zoom-001-crash.html
@@ -0,0 +1,4 @@
+<style>
+* { zoom: 13% }
+</style>
+<iframe>
diff --git a/tests/wpt/tests/css/css-viewport/zoom/zoom-iframe-dynamic.html b/tests/wpt/tests/css/css-viewport/zoom/zoom-iframe-dynamic.html
new file mode 100644
index 00000000000..1836408fb33
--- /dev/null
+++ b/tests/wpt/tests/css/css-viewport/zoom/zoom-iframe-dynamic.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<meta charset=utf-8>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="author" title="Mozilla" href="https://mozilla.org/">
+<link rel="help" href="https://drafts.csswg.org/css-viewport/">
+<title>Dynamic CSS zoom change on iframe</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe srcdoc="Child frame"></iframe>
+<script>
+const iframe = document.querySelector("iframe");
+
+function promiseDpiChange(win, expected) {
+ // There might be multiple resize events, wait for the one that changes the device pixel ratio to the expected value.
+ return new Promise(resolve => {
+ win.addEventListener("resize", function listener() {
+ if (win.devicePixelRatio == expected) {
+ win.removeEventListener("resize", listener);
+ resolve();
+ }
+ });
+ });
+}
+
+promise_test(async function(t) {
+ if (document.readyState != "complete") {
+ await new Promise(r => addEventListener("load", r, { once: true }));
+ }
+
+ let parentDpi = window.devicePixelRatio;
+ let origSize = iframe.getBoundingClientRect();
+ assert_equals(parentDpi, iframe.contentWindow.devicePixelRatio, "DPI should match between frame and parent");
+ iframe.style.zoom = 2;
+ await promiseDpiChange(iframe.contentWindow, 2 * parentDpi);
+ assert_equals(iframe.contentWindow.devicePixelRatio, 2 * parentDpi, "DPI should have doubled on the frame");
+ assert_equals(iframe.getBoundingClientRect().width, origSize.width * 2, "Width should have doubled as well");
+ assert_equals(iframe.getBoundingClientRect().height, origSize.height * 2, "Height should have doubled as well");
+});
+</script>
diff --git a/tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html b/tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html
new file mode 100644
index 00000000000..c75b792e6de
--- /dev/null
+++ b/tests/wpt/tests/css/css-viewport/zoom/zoom-revert-layer-crash.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<title>Don't crash when zooming revert-layer</title>
+<link rel="help" href="https://issues.chromium.org/issues/398060133">
+<span style="zoom: 101%; line-height: revert-layer">PASS if no crash</span>
diff --git a/tests/wpt/tests/css/css-writing-modes/reference/text-orientation-020-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/text-orientation-020-ref.html
new file mode 100644
index 00000000000..c5f83ef92a3
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/reference/text-orientation-020-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS test reference</title>
+<style>
+.ref ol {
+ text-orientation: upright;
+}
+.ref span {
+ text-orientation: mixed;
+}
+figure {
+ writing-mode: vertical-rl;
+ border: solid 1px black;
+ padding: 1em 0 1ch;
+ margin: 0 1ch;
+ float: left;
+}
+</style>
+
+<p>Test passes if the two boxes below are identical.
+
+<figure class=ref>
+ <ol><li><span>hello世界</span></ol>
+</figure>
+<figure class=ref>
+ <ol><li><span>hello世界</span></ol>
+</figure>
diff --git a/tests/wpt/tests/css/css-writing-modes/reference/text-orientation-021-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/text-orientation-021-ref.html
new file mode 100644
index 00000000000..3ff53e3da4a
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/reference/text-orientation-021-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS test reference</title>
+<style>
+body > div {
+ border: solid 1px black;
+ padding: 10px;
+ margin: 10px;
+ float: left;
+}
+</style>
+
+<p>Test passes if the two boxes below are identical.
+
+<div style="writing-mode: vertical-rl; text-orientation: upright">
+ AB
+</div>
+
+<div style="writing-mode: vertical-rl; text-orientation: upright">
+ AB
+</div>
diff --git a/tests/wpt/tests/css/css-writing-modes/text-orientation-020.html b/tests/wpt/tests/css/css-writing-modes/text-orientation-020.html
new file mode 100644
index 00000000000..84f4e62e573
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/text-orientation-020.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS Writing-Modes test: text-orientation on list markers</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#text-orientation">
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#marker-properties">
+<link rel=match href="reference/text-orientation-020-ref.html">
+<meta name="assert" content="text-orientation applies to text, and thus to the text in ::marker pseudos">
+<style>
+.test ol {
+ text-orientation: mixed; /*the default*/
+}
+.test ol li::marker {
+ text-orientation: upright;
+}
+.ref ol {
+ text-orientation: upright;
+}
+.ref span {
+ text-orientation: mixed;
+}
+figure {
+ writing-mode: vertical-rl;
+ border: solid 1px black;
+ padding: 1em 0 1ch;
+ margin: 0 1ch;
+ float: left;
+}
+</style>
+
+<p>Test passes if the two boxes below are identical.
+
+<figure class=test>
+ <ol><li>hello世界</ol>
+</figure>
+<figure class=ref>
+ <ol><li><span>hello世界</span></ol>
+</figure>
diff --git a/tests/wpt/tests/css/css-writing-modes/text-orientation-021.html b/tests/wpt/tests/css/css-writing-modes/text-orientation-021.html
new file mode 100644
index 00000000000..27fae03dddc
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/text-orientation-021.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS Writing-Modes test: text-orientation on text</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#text-orientation">
+<link rel="help" href="https://drafts.csswg.org/css-lists-3/#marker-properties">
+<link rel=match href="reference/text-orientation-021-ref.html">
+<meta name="assert" content="text-orientation applies to text, and thus works even if there is no parent box with that same value">
+<style>
+body > div {
+ border: solid 1px black;
+ padding: 10px;
+ margin: 10px;
+ float: left;
+}
+</style>
+
+<p>Test passes if the two boxes below are identical.
+
+<div style="writing-mode: vertical-rl; text-orientation: upright">
+ AB
+</div>
+
+<div style="writing-mode: vertical-rl">
+ <div style="display: contents; text-orientation: upright">AB</div>
+</div>
diff --git a/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html b/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html
index 9cf46c0b214..f61f97c9a1d 100644
--- a/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html
+++ b/tests/wpt/tests/css/css-writing-modes/wm-propagation-body-044-ref.html
@@ -7,7 +7,10 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
<style>
-
+ body
+ {
+ margin-bottom: 0;
+ }
img#orange-square
{
padding-right: 16px;
diff --git a/tests/wpt/tests/css/cssom-view/support/action-utils.js b/tests/wpt/tests/css/cssom-view/support/action-utils.js
new file mode 100644
index 00000000000..c3ab5272da6
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/support/action-utils.js
@@ -0,0 +1,23 @@
+async function pinch_zoom_action(targetWindow = window) {
+ // Pinch zoom in this document.
+ await new test_driver.Actions()
+ .addPointer("finger1", "touch")
+ .addPointer("finger2", "touch")
+ .pointerMove(parseInt(targetWindow.innerWidth / 2),
+ parseInt(targetWindow.innerHeight / 2),
+ {origin: "viewport", sourceName: "finger1"})
+ .pointerMove(parseInt(targetWindow.innerWidth / 2),
+ parseInt(targetWindow.innerHeight / 2),
+ {origin: "viewport", sourceName: "finger2"})
+ .pointerDown({sourceName: "finger1"})
+ .pointerDown({sourceName: "finger2"})
+ .pointerMove(parseInt(targetWindow.innerWidth / 3),
+ parseInt(targetWindow.innerHeight / 3),
+ {origin: "viewport", sourceName: "finger1"})
+ .pointerMove(parseInt(targetWindow.innerWidth / 3 * 2),
+ parseInt(targetWindow.innerHeight / 3 * 2),
+ {origin: "viewport", sourceName: "finger2"})
+ .pointerUp({sourceName: "finger1"})
+ .pointerUp({sourceName: "finger2"})
+ .send();
+}
diff --git a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView.html b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-001.html
index 78a3203c585..825556be969 100644
--- a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView.html
+++ b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-001.html
@@ -6,6 +6,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="support/action-utils.js"></script>
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1943865">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1943053">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#perform-a-scroll">
@@ -28,26 +29,7 @@ promise_test(async t => {
assert_equals(visualViewport.pageTop, 0);
// Pinch zoom in this document.
- await new test_driver.Actions()
- .addPointer("finger1", "touch")
- .addPointer("finger2", "touch")
- .pointerMove(parseInt(window.innerWidth / 2),
- parseInt(window.innerHeight / 2),
- {origin: "viewport", sourceName: "finger1"})
- .pointerMove(parseInt(window.innerWidth / 2),
- parseInt(window.innerHeight / 2),
- {origin: "viewport", sourceName: "finger2"})
- .pointerDown({sourceName: "finger1"})
- .pointerDown({sourceName: "finger2"})
- .pointerMove(parseInt(window.innerWidth / 3),
- parseInt(window.innerHeight / 3),
- {origin: "viewport", sourceName: "finger1"})
- .pointerMove(parseInt(window.innerWidth / 3 * 2),
- parseInt(window.innerHeight / 3 * 2),
- {origin: "viewport", sourceName: "finger2"})
- .pointerUp({sourceName: "finger1"})
- .pointerUp({sourceName: "finger2"})
- .send();
+ await pinch_zoom_action();
assert_greater_than(visualViewport.scale, 1.0);
diff --git a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html
new file mode 100644
index 00000000000..7f9170654e3
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-002.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<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 src="support/action-utils.js"></script>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1947470">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#perform-a-scroll">
+<style>
+html {
+ height: 10000px;
+}
+body {
+ margin: 0px;
+ padding: 0px;
+}
+#fixed {
+ position: fixed;
+ bottom: 0px;
+ height: 50vh;
+ width: 100vw;
+ overflow: scroll;
+ background-color: gray;
+}
+input {
+ height: 20px;
+}
+</style>
+<div id="fixed">
+ <div style="height: calc(80vh - 40px)"></div>
+ <input type="text" id="name" />
+</div>
+<script>
+promise_test(async t => {
+ assert_equals(window.scrollY, 0);
+ assert_equals(visualViewport.scale, 1.0);
+ assert_equals(visualViewport.pageTop, 0);
+
+ // Pinch zoom in this document.
+ await pinch_zoom_action();
+
+ assert_greater_than(visualViewport.scale, 1.0);
+
+ // Scroll the root scroll container.
+ window.scrollTo(0, 1000);
+ assert_equals(window.scrollY, 1000);
+
+ const expectedPageTop = visualViewport.pageTop;
+
+ // Now trigger a scrollIntoView call to an element inside a position:fixed element.
+ scrollPromise =
+ new Promise(resolve => visualViewport.addEventListener("scroll", resolve));
+ document.querySelector('#name').scrollIntoView({ behavior: "instant" });
+ await scrollPromise;
+
+ assert_greater_than(visualViewport.pageTop, expectedPageTop);
+}, "Element.scrollIntoView scrolls visually to a position: fixed element with non-zero layout scroll offset");
+</script>
diff --git a/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html
new file mode 100644
index 00000000000..c0592098a90
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/visual-scrollIntoView-003.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<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 src="support/action-utils.js"></script>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1951021">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#perform-a-scroll">
+<style>
+body {
+ margin: 0px;
+ padding: 0px;
+}
+#container {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ top: 0px;
+ left: 0px;
+}
+#banner {
+ position: fixed;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ background-color: blue;
+}
+</style>
+<div id="anchor"></div>
+<div id="container">
+ <aside id="banner"></aside>
+</div>
+<script>
+promise_test(async t => {
+ assert_equals(window.scrollY, 0);
+ assert_equals(visualViewport.scale, 1.0);
+ assert_equals(visualViewport.pageTop, 0);
+
+ // Pinch zoom in this document.
+ await pinch_zoom_action();
+
+ assert_greater_than(visualViewport.scale, 1.0);
+
+ // Suppose that the pinch zoom-in gesture at the center of the document did
+ // move the visual viewport offset.
+ assert_greater_than(visualViewport.pageTop, 0);
+
+ // Move to zero offset of the visual viewport.
+ let scrollPromise =
+ new Promise(resolve => visualViewport.addEventListener("scroll", resolve));
+ document.querySelector('#anchor').scrollIntoView({ behavior: "instant" });
+ await scrollPromise;
+
+ assert_equals(visualViewport.pageTop, 0);
+
+ // Now trigger a scrollIntoView call to an element inside nested position:fixed elements.
+ scrollPromise =
+ new Promise(resolve => visualViewport.addEventListener("scroll", resolve));
+ document.querySelector("#banner").scrollIntoView({ behavior: "instant" });
+ await scrollPromise;
+
+ assert_greater_than(visualViewport.pageTop, 0);
+}, "Element.scrollIntoView scrolls visually to an element in nested position: fixed elements");
+</script>
diff --git a/tests/wpt/tests/css/cssom/WEB_FEATURES.yml b/tests/wpt/tests/css/cssom/WEB_FEATURES.yml
index def314c45c7..cabaad6760c 100644
--- a/tests/wpt/tests/css/cssom/WEB_FEATURES.yml
+++ b/tests/wpt/tests/css/cssom/WEB_FEATURES.yml
@@ -5,3 +5,7 @@ features:
- CSSStyleSheet-constructable-*
- CSSStyleSheet-constructable.html
- CSSStyleSheet-template-adoption.html
+- name: document-caretpositionfrompoint
+ files:
+ - caretPositionFromPoint-with-transformation.html
+ - caretPositionFromPoint.html
diff --git a/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html
new file mode 100644
index 00000000000..4345e3d8ac1
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-ref.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<div style="position: absolute; top: 20px; left: 20px;
+ width: 100px; height: 100px; background: black">
+</div>
diff --git a/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-svg.html b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-svg.html
new file mode 100644
index 00000000000..7c9fd6a6f4d
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input-svg.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="help" href="https://crbug.com/373759987">
+<link rel="match" href="feComposite-intersection-feTile-input-ref.html">
+<style>body { margin: 0; }</style>
+<svg>
+ <filter id="test" filterUnits="userSpaceOnUse"
+ color-interpolation-filters="sRGB" x="0" y="0">
+ <feColorMatrix width="5" height="5"></feColorMatrix>
+ <feTile result="fill"></feTile>
+ <feColorMatrix in="SourceGraphic" values="0 0 0 0 0
+ 0 0 0 0 0
+ 0 0 0 0 0
+ 0 1 0 0 0">
+ </feColorMatrix>
+ <feComposite in="fill" operator="in"></feComposite>
+ </filter>
+ <g filter="url(#test)">
+ <rect fill="none" stroke="black" stroke-width="20" x="10" y="10" width="120" height="120"/>
+ <rect fill="#0f0" x="20" y="20" width="100" height="100" opacity="0.5"/>
+ </g>
+</svg>
diff --git a/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html
new file mode 100644
index 00000000000..1bf1f4b8fba
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="help" href="https://crbug.com/373759987">
+<link rel="match" href="feComposite-intersection-feTile-input-ref.html">
+<svg width="0" height="0">
+ <filter id="test" color-interpolation-filters="sRGB" x="0" y="0">
+ <feColorMatrix width="5" height="5"></feColorMatrix>
+ <feTile result="fill"></feTile>
+ <feColorMatrix in="SourceGraphic" values="0 0 0 0 0
+ 0 0 0 0 0
+ 0 0 0 0 0
+ 0 1 0 0 0">
+ </feColorMatrix>
+ <feComposite in="fill" operator="in"></feComposite>
+ </filter>
+</svg>
+<div></div>
+<style>
+body {
+ margin: 0;
+}
+div {
+ position: absolute;
+ top: 0;
+ border: solid 20px;
+ width: 100px; height: 100px;
+ filter: url(#test);
+}
+div::after {
+ opacity: 0.5;
+ position: absolute;
+ inset: 0;
+ background: #0f0;
+ content: '';
+}
+</style>
diff --git a/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-computed.svg b/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-computed.svg
index a395eda22e3..9024aaa4f3f 100644
--- a/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-computed.svg
+++ b/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-computed.svg
@@ -19,6 +19,8 @@ test_computed_value("flood-opacity", "3", "1");
test_computed_value("flood-opacity", "-100%", "0");
test_computed_value("flood-opacity", "50%", "0.5");
test_computed_value("flood-opacity", "300%", "1");
+test_computed_value("flood-opacity", "calc(0.5 * sign(10em - 1px))", "0.5");
+test_computed_value("flood-opacity", "calc(50% * sign(10em - 1px))", "0.5");
]]></script>
</svg>
diff --git a/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-valid.svg b/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-valid.svg
index 67eb37fad5e..7c11b26bc92 100644
--- a/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-valid.svg
+++ b/tests/wpt/tests/css/filter-effects/parsing/flood-opacity-valid.svg
@@ -19,6 +19,7 @@ test_valid_value("flood-opacity", "3");
test_valid_value("flood-opacity", "-100%", "-1");
test_valid_value("flood-opacity", "50%", "0.5");
test_valid_value("flood-opacity", "300%", "3");
+test_valid_value("flood-opacity", "calc(0.5 * sign(10em - 1px))");
]]></script>
</svg>
diff --git a/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml b/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml
index cc952ac2009..b090111be0a 100644
--- a/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml
+++ b/tests/wpt/tests/css/mediaqueries/WEB_FEATURES.yml
@@ -3,27 +3,21 @@ features:
files:
- prefers-color-scheme.html
- prefers-color-scheme-*
-features:
- name: forced-colors
files:
- forced-colors.html
-features:
- name: prefers-contrast
files:
- prefers-contrast.html
-features:
- name: prefers-reduced-transparency
files:
- prefers-reduced-transparency.html
-features:
- name: overflow
files:
- overflow-media-features.html
-features:
- name: dynamic-range
files:
- dynamic-range.html
-features:
- name: display-mode
files:
- display-mode.html
diff --git a/tests/wpt/tests/device-bound-session-credentials/fetch-no-credentials.https.html b/tests/wpt/tests/device-bound-session-credentials/fetch-no-credentials.https.html
new file mode 100644
index 00000000000..4cac685727a
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/fetch-no-credentials.https.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>DBSC does not refresh cross-site fetch without credentials</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 { documentHasCookie, expireCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState, configureServer } from "./helper.js";
+
+ promise_test(async t => {
+ const testId = await setupShardedServerState();
+ const expectedCookieAndValue = "auth_cookie=abcdef0123";
+ const expectedCookieAndAttributes = `${expectedCookieAndValue};Domain=${location.hostname};Path=/device-bound-session-credentials`;
+ addCookieAndSessionCleanup(t);
+
+ // Prompt starting a session, and wait until registration completes.
+ const loginResponse = await fetch('login.py');
+ assert_equals(loginResponse.status, 200);
+ await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
+
+ // Expire the cookies
+ expireCookie(expectedCookieAndAttributes);
+
+ // Setup for receiving messages
+ let messageCallbacks = [];
+ function messageListener(event) {
+ if (messageCallbacks.length > 0) {
+ messageCallbacks[0](event.data);
+ messageCallbacks.shift();
+ }
+ };
+ window.addEventListener("message", messageListener);
+ t.add_cleanup(() => {
+ window.removeEventListener("message", messageListener);
+ });
+
+ function getMessage() {
+ return new Promise((resolve, reject) => {
+ messageCallbacks.push(resolve);
+ });
+ }
+
+ // Create a cross-site iframe that's going to try to fetch without credentials
+ let iframe = document.createElement('iframe');
+ iframe.src = `${get_host_info().HTTPS_NOTSAMESITE_ORIGIN}/device-bound-session-credentials/fetch-verify-authenticated.https.html`;
+ document.body.appendChild(iframe);
+
+ let statusCode = await getMessage();
+ assert_equals(statusCode, 401);
+
+ // We should not have refreshed.
+ assert_false(documentHasCookie(expectedCookieAndValue));
+ }, "A cross-site fetch without credentials should not refresh");
+</script>
diff --git a/tests/wpt/tests/device-bound-session-credentials/fetch-verify-authenticated.https.html b/tests/wpt/tests/device-bound-session-credentials/fetch-verify-authenticated.https.html
new file mode 100644
index 00000000000..d9e3df9f5c6
--- /dev/null
+++ b/tests/wpt/tests/device-bound-session-credentials/fetch-verify-authenticated.https.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<script src="/common/get-host-info.sub.js"></script>
+<body>
+ <script>
+ async function onload() {
+ let base_origin = get_host_info().ORIGIN;
+ let response = await fetch(`${base_origin}/device-bound-session-credentials/verify_authenticated.py`, {credentials: "omit"});
+ window.parent.postMessage(response.status, base_origin);
+ }
+ onload();
+ </script>
+</body>
diff --git a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html
index 40aa77f4764..e3e63f28201 100644
--- a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html
+++ b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html
@@ -6,6 +6,12 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/subset-tests-by-key.js"></script>
+<meta name="variant" content="?include=subframe-inline-end-block-end-behavior-auto"/>
+<meta name="variant" content="?include=subframe-inline-start-block-start-behavior-smooth"/>
+<meta name="variant" content="?include=root-inline-end-block-end-behavior-auto"/>
+<meta name="variant" content="?include=root-inline-start-block-start-behavior-smooth"/>
+<meta name="variant" content="?include=nested-scrollIntoView"/>
<script src="scroll_support.js"></script>
<style>
html {
@@ -31,8 +37,8 @@ html {
</div>
</body>
<script>
-var element_scrollend_arrived = false;
-var document_scrollend_arrived = false;
+let element_scrollend_arrived = false;
+let document_scrollend_arrived = false;
function onElementScrollEnd(event) {
assert_false(event.cancelable);
@@ -47,80 +53,147 @@ function onDocumentScrollEnd(event) {
document_scrollend_arrived = true;
}
-function callScrollFunction([scrollTarget, scrollFunction, args]) {
- scrollTarget[scrollFunction](args);
-}
+let root_element = document.scrollingElement;
+let target_div = document.getElementById("targetDiv");
+let inner_div = document.getElementById("innerDiv");
+
+// Get expected position for root_element scrollIntoView.
+root_element.scrollTo(10000, 10000);
+let max_root_x = root_element.scrollLeft;
+let max_root_y = root_element.scrollTop;
+root_element.scrollTo(0, 0);
+
+target_div.scrollTo(10000, 10000);
+let max_element_x = target_div.scrollLeft;
+let max_element_y = target_div.scrollTop;
+target_div.scrollTo(0, 0);
+
+let test_cases = [
+ {
+ key: "subframe-inline-end-block-end-behavior-auto",
+ args: { inline: "end", block: "end", behavior: "smooth" },
+ target: target_div,
+ scroll_target: inner_div,
+ expected: {
+ pos: { x: max_element_x, y: max_element_y },
+ },
+ title: "Tests scrollend event for scrollIntoView with behavior 'auto' on subframe.",
+ },
+ {
+ key: "subframe-inline-start-block-start-behavior-smooth",
+ args: { inline: "start", block: "start", behavior: "auto" },
+ target: target_div,
+ scroll_target: inner_div,
+ expected: {
+ pos: { x: 0, y: 0 },
+ },
+ title: "Tests scrollend event for scrollIntoView with behavior 'smooth' on subframe.",
+ },
+ {
+ key: "root-inline-end-block-end-behavior-auto",
+ args: { inline: "end", block: "end", behavior: "smooth" },
+ target: document.scrollingElement,
+ scroll_target: document.scrollingElement,
+ expected: {
+ pos: { x: max_root_x, y: max_root_y },
+ },
+ title: "Tests scrollend event for scrollIntoView with behavior 'auto' on root.",
+ },
+ {
+ key: "root-inline-start-block-start-behavior-smooth",
+ args: { inline: "start", block: "start", behavior: "auto" },
+ target: document.scrollingElement,
+ scroll_target: document.scrollingElement,
+ expected: {
+ pos: { x: 0, y: 0 },
+ },
+ title: "Tests scrollend event for scrollIntoView with behavior 'smooth' on root.",
+ },
+];
function runTest() {
- let root_element = document.scrollingElement;
- let target_div = document.getElementById("targetDiv");
- let inner_div = document.getElementById("innerDiv");
-
- // Get expected position for root_element scrollIntoView.
- root_element.scrollTo(10000, 10000);
- let max_root_x = root_element.scrollLeft;
- let max_root_y = root_element.scrollTop;
- root_element.scrollTo(0, 0);
-
- target_div.scrollTo(10000, 10000);
- let max_element_x = target_div.scrollLeft;
- let max_element_y = target_div.scrollTop;
- target_div.scrollTo(0, 0);
-
- promise_test (async (t) => {
+ async function testScrollIntoView(testInfo, t) {
+ let test_start = { x: 0, y: 0 };
+ if (testInfo.args.inline == "start") {
+ test_start.x = 10000;
+ }
+ if (testInfo.args.block == "start") {
+ test_start.y = 10000;
+ }
+
+ if (test_start.x != 0 || test_start.y != 0) {
+ testInfo.target.scrollTo(test_start.x, test_start.y);
+ }
+
await waitForCompositorCommit();
- target_div.addEventListener("scrollend", onElementScrollEnd);
+
+ targetDiv.addEventListener("scrollend", onElementScrollEnd);
document.addEventListener("scrollend", onDocumentScrollEnd);
- let test_cases = [
- [target_div, max_element_x, max_element_y, [inner_div, "scrollIntoView", { inline: "end", block: "end", behavior: "auto" }]],
- [target_div, 0, 0, [inner_div, "scrollIntoView", { inline: "start", block: "start", behavior: "smooth" }]],
- [root_element, max_root_x, max_root_y, [root_element, "scrollIntoView", { inline: "end", block: "end", behavior: "smooth" }]],
- [root_element, 0, 0, [root_element, "scrollIntoView", { inline: "start", block: "start", behavior: "smooth" }]]
- ];
-
- for(i = 0; i < test_cases.length; i++) {
- let t = test_cases[i];
- let target = t[0];
- let expected_x = t[1];
- let expected_y = t[2];
- let scroll_datas = t[3];
-
- callScrollFunction(scroll_datas);
- await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, target.tagName + ".scrollIntoView did not receive scrollend event.");
- if (target == root_element)
- assert_false(element_scrollend_arrived);
- else
- assert_false(document_scrollend_arrived);
- assert_equals(target.scrollLeft, expected_x, target.tagName + ".scrollIntoView scrollLeft");
- assert_equals(target.scrollTop, expected_y, target.tagName + ".scrollIntoView scrollTop");
-
- element_scrollend_arrived = false;
- document_scrollend_arrived = false;
- }
- }, "Tests scrollend event for scrollIntoView.");
-
- promise_test(async (t) => {
- document.body.removeChild(target_div);
- let out_div = document.createElement("div");
- out_div.style = "width: 100px; height:100px; overflow:scroll; scroll-behavior:smooth;";
- out_div.appendChild(target_div);
- document.body.appendChild(out_div);
await waitForCompositorCommit();
- inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" });
- const scrollend_events = [
- waitForScrollendEventNoTimeout(out_div),
- waitForScrollendEventNoTimeout(target_div)
- ];
- await Promise.all(scrollend_events);
- assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft");
- assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop");
- assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft");
- assert_equals(out_div.scrollTop, 100, "Nested scrollIntoView out_div scrollTop");
- assert_equals(target_div.scrollLeft, max_element_x, "Nested scrollIntoView target_div scrollLeft");
- assert_equals(target_div.scrollTop, max_element_y, "Nested scrollIntoView target_div scrollTop");
- assert_false(document_scrollend_arrived);
- }, "Tests scrollend event for nested scrollIntoView.");
+ testInfo.scroll_target.scrollIntoView({ inline: testInfo.args.inline,
+ block: testInfo.args.block,
+ behavior: testInfo.args.behavior });
+
+ await waitFor(
+ () => { return element_scrollend_arrived || document_scrollend_arrived; },
+ testInfo.target.tagName + ".scrollIntoView did not receive scrollend event."
+ );
+
+ assert_equals(testInfo.target.scrollLeft, testInfo.expected.pos.x,
+ testInfo.target.tagName + ".scrollIntoView scrollLeft");
+ assert_equals(testInfo.target.scrollTop, testInfo.expected.pos.y,
+ testInfo.target.tagName + ".scrollIntoView scrollTop");
+
+ if (testInfo.target == root_element) {
+ assert_false(element_scrollend_arrived,
+ "root element targetted, but element scrollend arrived");
+ } else {
+ assert_false(document_scrollend_arrived,
+ "subframe targetted, but document scrollend arrived");
+ }
+ }
+
+ test_cases.forEach((test_info) => {
+ subsetTestByKey(test_info.key, promise_test,
+ async (t) => testScrollIntoView(test_info, t), test_info.title);
+ });
+
+ subsetTestByKey(
+ "nested-scrollIntoView",
+ promise_test,
+ async (t) => {
+ await waitForCompositorCommit();
+
+ document.addEventListener("scrollend", onDocumentScrollEnd);
+ target_div.addEventListener("scrollend", onElementScrollEnd);
+
+ await waitForCompositorCommit();
+
+ document.body.removeChild(target_div);
+ let out_div = document.createElement("div");
+ out_div.style = "width: 100px; height:100px; overflow:scroll; scroll-behavior:smooth;";
+ out_div.appendChild(target_div);
+ document.body.appendChild(out_div);
+ await waitForCompositorCommit();
+
+ inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" });
+ const scrollend_events = [
+ waitForScrollendEventNoTimeout(out_div),
+ waitForScrollendEventNoTimeout(target_div)
+ ];
+ await Promise.all(scrollend_events);
+ assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft");
+ assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop");
+ assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft");
+ assert_equals(out_div.scrollTop, 100, "Nested scrollIntoView out_div scrollTop");
+ assert_equals(target_div.scrollLeft, max_element_x, "Nested scrollIntoView target_div scrollLeft");
+ assert_equals(target_div.scrollTop, max_element_y, "Nested scrollIntoView target_div scrollTop");
+ assert_false(document_scrollend_arrived);
+ },
+ "Tests scrollend event for nested scrollIntoView.",
+ );
}
+
</script>
diff --git a/tests/wpt/tests/dom/nodes/moveBefore/tentative/focus-preserve.html b/tests/wpt/tests/dom/nodes/moveBefore/focus-preserve.html
index a00e8b77880..a00e8b77880 100644
--- a/tests/wpt/tests/dom/nodes/moveBefore/tentative/focus-preserve.html
+++ b/tests/wpt/tests/dom/nodes/moveBefore/focus-preserve.html
diff --git a/tests/wpt/tests/ecmascript/locale-compat.html b/tests/wpt/tests/ecmascript/locale-compat.html
index 74806987879..1f863b21ecb 100644
--- a/tests/wpt/tests/ecmascript/locale-compat.html
+++ b/tests/wpt/tests/ecmascript/locale-compat.html
@@ -44,7 +44,10 @@ test(t => { // https://bugs.chromium.org/p/chromium/issues/detail?id=1418727
}, '`Date.prototype.toLocaleString` produces `yyyy-mm-dd` instead of `m/d/yyyy` for `en-CA` locale');
test(t => { // https://bugzilla.mozilla.org/show_bug.cgi?id=1864612
- assert_true(new Intl.DateTimeFormat('sv-SE', {}).format(0).endsWith('-01-01'));
-});
+ const date = new Date('1970-01-01T00:00:00');
+ const formatter = new Intl.DateTimeFormat('sv-SE')
+
+ assert_equals(formatter.format(date), '1970-01-01');
+}, '`Intl.DateTimeFormat.prototype.format` produces `yyyy-mm-dd` instead of `yyyy-m-d` for `sv-SE` locale');
</script>
diff --git a/tests/wpt/tests/editing/crashtests/inserthorizontalrule-to-replace-selection-containing-comment.html b/tests/wpt/tests/editing/crashtests/inserthorizontalrule-to-replace-selection-containing-comment.html
new file mode 100644
index 00000000000..5db139351cd
--- /dev/null
+++ b/tests/wpt/tests/editing/crashtests/inserthorizontalrule-to-replace-selection-containing-comment.html
@@ -0,0 +1,21 @@
+<head>
+<meta charset="utf-8">
+<script>
+addEventListener("DOMContentLoaded", () => {
+ document.execCommand("selectAll");
+ document.designMode = "on";
+ document.execCommand("insertHorizontalRule");
+});
+</script>
+</head>
+<body>
+<audio></audio>
+<ins contenteditable>
+<q dir="ltr">
+<button>A</button>
+<dialog dir="rtl" open>
+<canvas></canvas>
+<fieldset>
+<!-- The following white-space is important -->
+</fieldset></dialog></q></ins></body>
+</html>
diff --git a/tests/wpt/tests/editing/whitespaces/delete-word-around-span.html b/tests/wpt/tests/editing/whitespaces/delete-word-around-span.html
new file mode 100644
index 00000000000..6250e9aec21
--- /dev/null
+++ b/tests/wpt/tests/editing/whitespaces/delete-word-around-span.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="variant" content="?white-space=normal">
+<meta name="variant" content="?white-space=pre">
+<meta name="variant" content="?white-space=pre-wrap">
+<meta name="variant" content="?white-space=pre-line">
+<title>Delete per word should not change the deleting range whether the surrounding word is wrapped in an inline element</title>
+<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="../include/editor-test-utils.js"></script>
+<script>
+"use strict";
+
+const searchParams = new URLSearchParams(document.location.search);
+const whiteSpace = searchParams.get("white-space");
+
+document.addEventListener("DOMContentLoaded", () => {
+ const editingHost = document.querySelector("div[contenteditable]");
+ editingHost.style.whiteSpace = whiteSpace;
+ const utils = new EditorTestUtils(editingHost);
+ /**
+ * How to delete per word may depend on the browser and the platform. On the
+ * other hand, the result (at least in the plaintext point of view) should be
+ * same even if surrounding word is wrapped in a <span>.
+ */
+ for (const data of [
+ {
+ innerHTML: `abc <span>def</span> ghi[]`,
+ referenceInnerHTML: `abc def ghi[]`,
+ },
+ {
+ innerHTML: `abc <span>def</span>[] ghi`,
+ referenceInnerHTML: `abc def[] ghi`,
+ },
+ {
+ innerHTML: `abc <span>def[]</span> ghi`,
+ referenceInnerHTML: `abc def[] ghi`,
+ },
+ {
+ innerHTML: `abc <span>[]def</span> ghi`,
+ referenceInnerHTML: `abc []def ghi`,
+ },
+ {
+ innerHTML: `abc []<span>def</span> ghi`,
+ referenceInnerHTML: `abc []def ghi`,
+ },
+ {
+ innerHTML: `abc[] <span>def</span> ghi`,
+ referenceInnerHTML: `abc[] def ghi`,
+ },
+ ]) {
+ promise_test(async () => {
+ utils.setupEditingHost(data.referenceInnerHTML);
+ await utils.sendBackspaceKey(utils.deleteWordModifier);
+ const expectedInnerText = editingHost.innerText;
+ utils.setupEditingHost(data.innerHTML);
+ await utils.sendBackspaceKey(utils.deleteWordModifier);
+ assert_equals(
+ editingHost.innerText.replaceAll("\u00A0", " "),
+ expectedInnerText.replaceAll("\u00A0", " ")
+ );
+ }, `Ctrl/Cmd - Backspace when "${data.innerHTML}" should get same innerText as when "${data.referenceInnerHTML}"`);
+ }
+}, {once: true});
+</script>
+</head>
+<body>
+ <div contenteditable></div>
+</body>
+</html>
diff --git a/tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html b/tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html
new file mode 100644
index 00000000000..ac7cbaee186
--- /dev/null
+++ b/tests/wpt/tests/editing/whitespaces/forwarddelete-word-around-span.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="variant" content="?white-space=normal">
+<meta name="variant" content="?white-space=pre">
+<meta name="variant" content="?white-space=pre-wrap">
+<meta name="variant" content="?white-space=pre-line">
+<title>Forward-delete per word should not change the deleting range whether the surrounding word is wrapped in an inline element</title>
+<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="../include/editor-test-utils.js"></script>
+<script>
+"use strict";
+
+const searchParams = new URLSearchParams(document.location.search);
+const whiteSpace = searchParams.get("white-space");
+
+document.addEventListener("DOMContentLoaded", () => {
+ const editingHost = document.querySelector("div[contenteditable]");
+ editingHost.style.whiteSpace = whiteSpace;
+ const utils = new EditorTestUtils(editingHost);
+ /**
+ * How to delete per word may depend on the browser and the platform. On the
+ * other hand, the result (at least in the plaintext point of view) should be
+ * same even if surrounding word is wrapped in a <span>.
+ */
+ for (const data of [
+ {
+ innerHTML: `[]abc <span>def</span> ghi`,
+ referenceInnerHTML: `[]abc def ghi`,
+ },
+ {
+ innerHTML: `abc[] <span>def</span> ghi`,
+ referenceInnerHTML: `abc[] def ghi`,
+ },
+ {
+ innerHTML: `abc []<span>def</span> ghi`,
+ referenceInnerHTML: `abc []def ghi`,
+ },
+ {
+ innerHTML: `abc <span>[]def</span> ghi`,
+ referenceInnerHTML: `abc []def ghi`,
+ },
+ {
+ innerHTML: `abc <span>def</span>[] ghi`,
+ referenceInnerHTML: `abc def[] ghi`,
+ },
+ {
+ innerHTML: `abc <span>def</span> []ghi`,
+ referenceInnerHTML: `abc def []ghi`,
+ },
+ ]) {
+ promise_test(async () => {
+ utils.setupEditingHost(data.referenceInnerHTML);
+ await utils.sendDeleteKey(utils.deleteWordModifier);
+ const expectedInnerText = editingHost.innerText;
+ utils.setupEditingHost(data.innerHTML);
+ await utils.sendDeleteKey(utils.deleteWordModifier);
+ assert_equals(
+ editingHost.innerText.replaceAll("\u00A0", " "),
+ expectedInnerText.replaceAll("\u00A0", " ")
+ );
+ }, `Ctrl/Cmd - Delete when "${data.innerHTML}" should get same innerText as when "${data.referenceInnerHTML}"`);
+ }
+}, {once: true});
+</script>
+</head>
+<body>
+ <div contenteditable></div>
+</body>
+</html>
diff --git a/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.https.html b/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.https.html
deleted file mode 100644
index 11b3e8f15ce..00000000000
--- a/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record-events.https.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <title>Encrypted Media Extensions: Successful Playback, persistent-usage-record session with Clear Key, mp4, event sequence</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Web Platform Test Harness scripts -->
- <script src=/resources/testharness.js></script>
- <script src=/resources/testharnessreport.js></script>
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/testmediasource.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Content metadata -->
- <script src=/encrypted-media/content/content-metadata.js></script>
-
- <!-- Message handler for Clear Key keysystem -->
- <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
-
- <!-- The script for this specific test -->
- <script src=/encrypted-media/scripts/playback-persistent-usage-record-events.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <div id='video'>
- <video id="videoelement" width="200px"></video>
- </div>
-
- <script>
- var contentitem = content['mp4-basic'],
- handler = new MessageHandler( 'org.w3.clearkey', contentitem ),
- config = { video: document.getElementById('videoelement'),
- keysystem: 'org.w3.clearkey',
- messagehandler: handler.messagehandler,
- audioPath: contentitem.audio.path,
- videoPath: contentitem.video.path,
- audioType: contentitem.audio.type,
- videoType: contentitem.video.type,
- initDataType: 'keyids',
- initData: getInitData(contentitem,'keyids')
- };
-
- runTest(config);
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record.https.html b/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record.https.html
deleted file mode 100644
index 3f0d55e4138..00000000000
--- a/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-persistent-usage-record.https.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <title>Encrypted Media Extensions: Successful Playback, persistent-usage-record session with Clear Key, mp4, event sequence</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Web Platform Test Harness scripts -->
- <script src=/resources/testharness.js></script>
- <script src=/resources/testharnessreport.js></script>
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/testmediasource.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Content metadata -->
- <script src=/encrypted-media/content/content-metadata.js></script>
-
- <!-- Message handler for Clear Key keysystem -->
- <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
-
- <!-- The script for this specific test -->
- <script src=/encrypted-media/scripts/playback-persistent-usage-record.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <div id='video'>
- <video id="videoelement" width="200px"></video>
- </div>
-
- <script>
- var contentitem = content['mp4-basic'],
- handler = new MessageHandler( 'org.w3.clearkey', contentitem ),
- config = { video: document.getElementById('videoelement'),
- keysystem: 'org.w3.clearkey',
- messagehandler: handler.messagehandler,
- audioPath: contentitem.audio.path,
- videoPath: contentitem.video.path,
- audioType: contentitem.audio.type,
- videoType: contentitem.video.type,
- initDataType: 'keyids',
- initData: getInitData(contentitem,'keyids')
- };
-
- runTest(config);
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.https.html b/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.https.html
deleted file mode 100644
index 63e792c2987..00000000000
--- a/tests/wpt/tests/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.https.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <title>Encrypted Media Extensions: persistent-usage-record, playback and retrieve record in new window, Clear Key, mp4</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Web Platform Test Harness scripts -->
- <script src=/resources/testharness.js></script>
- <script src=/resources/testharnessreport.js></script>
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/testmediasource.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Content metadata -->
- <script src=/encrypted-media/content/content-metadata.js></script>
-
- <!-- Message handler for Clear Key keysystem -->
- <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
-
- <!-- The script for this specific test -->
- <script src=/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <div id='video'>
- <video id="videoelement" width="200px"></video>
- </div>
-
- <script>
- var contentitem = content['mp4-basic'],
- handler = new MessageHandler( 'org.w3.clearkey', contentitem ),
- config = { video: document.getElementById('videoelement'),
- keysystem: 'org.w3.clearkey',
- messagehandler: handler.messagehandler,
- audioPath: contentitem.audio.path,
- videoPath: contentitem.video.path,
- audioType: contentitem.audio.type,
- videoType: contentitem.video.type,
- initDataType: 'keyids',
- initData: getInitData(contentitem,'keyids'),
- windowscript: 'resources/retrieve-persistent-usage-record.html' };
-
- runTest(config);
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.https.html b/tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.https.html
deleted file mode 100644
index 5cbb8021b07..00000000000
--- a/tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record-events.https.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <meta name="timeout" content="long">
- <title>Encrypted Media Extensions: Successful Playback, persistent-usage-record session with DRM, mp4, event sequence</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Web Platform Test Harness scripts -->
- <script src=/resources/testharness.js></script>
- <script src=/resources/testharnessreport.js></script>
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/testmediasource.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Content metadata -->
- <script src=/encrypted-media/content/content-metadata.js></script>
-
- <!-- Message handler for DRM servers -->
- <script src=/encrypted-media/util/drm-messagehandler.js></script>
-
- <!-- The script for this specific test -->
- <script src=/encrypted-media/scripts/playback-persistent-usage-record-events.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <div id='video'>
- <video id="videoelement" width="200px"></video>
- </div>
-
- <script>
- var keysystem = getSupportedKeySystem(),
- contentitem = content['mp4-basic'],
- handler = new MessageHandler( keysystem, contentitem, 'persistent-usage-record' ),
- config = { video: document.getElementById('videoelement'),
- keysystem: keysystem,
- messagehandler: handler.messagehandler,
- audioPath: contentitem.audio.path,
- videoPath: contentitem.video.path,
- audioType: contentitem.audio.type,
- videoType: contentitem.video.type,
- initDataType: contentitem.initDataType,
- servercertificate: handler.servercertificate
- };
-
- runTest(config);
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record.https.html b/tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record.https.html
deleted file mode 100644
index 69876be9892..00000000000
--- a/tests/wpt/tests/encrypted-media/drm-mp4-playback-persistent-usage-record.https.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <meta name="timeout" content="long">
- <title>Encrypted Media Extensions: Successful Playback, persistent-usage-record session with DRM, mp4</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Web Platform Test Harness scripts -->
- <script src=/resources/testharness.js></script>
- <script src=/resources/testharnessreport.js></script>
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/testmediasource.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Content metadata -->
- <script src=/encrypted-media/content/content-metadata.js></script>
-
- <!-- Message handler for DRM servers -->
- <script src=/encrypted-media/util/drm-messagehandler.js></script>
-
- <!-- The script for this specific test -->
- <script src=/encrypted-media/scripts/playback-persistent-usage-record.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <div id='video'>
- <video id="videoelement" width="200px"></video>
- </div>
-
- <script>
- var keysystem = getSupportedKeySystem(),
- contentitem = content['mp4-basic'],
- handler = new MessageHandler( keysystem, contentitem, 'persistent-usage-record' ),
- config = { video: document.getElementById('videoelement'),
- keysystem: keysystem,
- messagehandler: handler.messagehandler,
- audioPath: contentitem.audio.path,
- videoPath: contentitem.video.path,
- audioType: contentitem.audio.type,
- videoType: contentitem.video.type,
- initDataType: contentitem.initDataType,
- servercertificate: handler.servercertificate
- };
-
- runTest(config);
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.https.html b/tests/wpt/tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.https.html
deleted file mode 100644
index 4059bff0cfc..00000000000
--- a/tests/wpt/tests/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.https.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <meta name="timeout" content="long">
- <title>Encrypted Media Extensions: persistent-usage-record, playback and retrieve record in new window, DRM, mp4</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Web Platform Test Harness scripts -->
- <script src=/resources/testharness.js></script>
- <script src=/resources/testharnessreport.js></script>
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/testmediasource.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Content metadata -->
- <script src=/encrypted-media/content/content-metadata.js></script>
-
- <!-- Message handler for DRM server -->
- <script src=/encrypted-media/util/drm-messagehandler.js></script>
-
- <!-- The script for this specific test -->
- <script src=/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <div id='video'>
- <video id="videoelement" width="200px"></video>
- </div>
-
- <script>
- var keysystem = getSupportedKeySystem(),
- contentitem = content['mp4-basic'],
- handler = new MessageHandler( keysystem, contentitem, 'persistent-usage-record' ),
- config = { video: document.getElementById('videoelement'),
- keysystem: keysystem,
- messagehandler: handler.messagehandler,
- audioPath: contentitem.audio.path,
- videoPath: contentitem.video.path,
- audioType: contentitem.audio.type,
- videoType: contentitem.video.type,
- initDataType: contentitem.initDataType,
- servercertificate: handler.servercertificate,
- windowscript: 'resources/drm-retrieve-persistent-usage-record.html' };
-
- runTest(config);
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/polyfill/edge-persistent-usage-record.js b/tests/wpt/tests/encrypted-media/polyfill/edge-persistent-usage-record.js
deleted file mode 100644
index 7f86f0c0589..00000000000
--- a/tests/wpt/tests/encrypted-media/polyfill/edge-persistent-usage-record.js
+++ /dev/null
@@ -1,193 +0,0 @@
-(function() {
-
- // This polyfill fixes the following problems with Edge browser
- // (1) To retrieve a persisted usage record, you must use session type 'persistent-release-message' instead of 'persistent-usage-record'
- // (2) To retrieve a persisted usage record, you must call remove() after calling load()
- // (3) On providing a license release acknowledgement, the session does not automatically close as is should
- // (4) Retrieval of the usage record at the end of an active session is not supported
-
- if ( navigator.userAgent.toLowerCase().indexOf('edge') > -1 ) {
-
- var _mediaKeySystemAccessCreateMediaKeys = MediaKeySystemAccess.prototype.createMediaKeys;
- _mediaKeysCreateSession = MediaKeys.prototype.createSession;
-
- // MediaKeySession proxy
- function MediaKeySession( mediaKeys, session )
- {
- EventTarget.call( this );
-
- this._mediaKeys = mediaKeys;
- this._session = session;
- this._sessionId = undefined;
- this._removing = false;
-
- session.addEventListener( 'message', this.dispatchEvent.bind( this ) );
- session.addEventListener( 'keystatuseschange', this.dispatchEvent.bind( this ) );
- session.closed.then( function() { if ( !this._removing ) this._resolveClosed(); }.bind ( this ) );
-
- this._closed = new Promise( function( resolve ) { this._resolveClosed = resolve; }.bind( this ) );
- }
-
- MediaKeySession.prototype = Object.create( EventTarget.prototype );
-
- Object.defineProperties( MediaKeySession.prototype, {
- sessionId: { get: function() { return this._sessionId ? this._sessionId : this._session.sessionId; } },
- expiration: { get: function() { return this._session.expiration; } },
- closed: { get: function() { return this._closed; } },
- keyStatuses:{ get: function() { return this._session.keyStatuses; } }
- });
-
- // load()
- //
- // Use a surrogate 'persistent-release-message' session to obtain the release message
- //
- MediaKeySession.prototype.load = function load( sessionId )
- {
- if ( this.sessionId ) return Promise.reject( new DOMException('InvalidAccessError') );
-
- this._surrogate = this._mediaKeys.createSession( 'persistent-release-message' );
- this._surrogate.addEventListener( 'message', this.dispatchEvent.bind( this ) );
-
- return this._surrogate.load( sessionId ).then( function( success ) {
- if (!success) return false;
-
- this._sessionId = sessionId;
- this._removing = true;
- this._session.close();
-
- return this._surrogate.remove().then( function() { return true; } );
- }.bind( this ) );
- };
-
- // remove()
- //
- // On an existing session, use a surrogate 'persistent-release-message' session to obtain the release message
- //
- MediaKeySession.prototype.remove = function remove()
- {
- if ( this._sessionId !== undefined ) return Promise.reject( new DOMException('InvalidAccessError') );
- if ( this.sessionId === undefined ) return Promise.reject( new DOMException('InvalidAccessError') );
-
- this._surrogate = this._mediaKeys.createSession( 'persistent-release-message' );
- this._surrogate.addEventListener( 'message', this.dispatchEvent.bind( this ) );
- this._removing = true;
- this._sessionId = this._session.sessionId;
-
- var self = this;
-
- return Promise.all( [ self._session.close(), self._session.closed ] ).then( function() {
- return self._surrogate.load( self._sessionId );
- }).then( function( success ) {
- if ( !success ) {
- throw new DOMException('InvalidAccessError');
- }
-
- return self._surrogate.remove();
- }).then( function() { return true; } );
- }
-
- // update()
- //
- // For a normal session, pass through, otherwise update the surrogate and close the proxy
- MediaKeySession.prototype.update = function update( message )
- {
- if ( !this._removing ) return this._session.update( message );
-
- return this._surrogate.update( message ).then( function() {
- this._sessionId = undefined;
- this._resolveClosed();
- }.bind( this ) );
- };
-
- // close() - pass through
- //
- MediaKeySession.prototype.close = function close()
- {
- if ( !this._removing ) return this._session.close();
- this._resolveClosed();
- return Promise.resolve();
- };
-
- // generateRequest() - pass through
- //
- MediaKeySession.prototype.generateRequest = function generateRequest( initDataType, initData )
- {
- if ( this.sessionId ) Promise.reject( new DOMException('InvalidAccessError') );
- return this._session.generateRequest( initDataType, initData );
- };
-
- // Wrap PlayReady persistent-usage-record sessions in our Proxy
- MediaKeys.prototype.createSession = function createSession( sessionType ) {
-
- var session = _mediaKeysCreateSession.call( this, sessionType );
- if ( this._keySystem !== 'com.microsoft.playready' || sessionType !== 'persistent-usage-record' )
- {
- return session;
- }
-
- return new MediaKeySession( this, session );
-
- };
-
- //
- // Annotation polyfills - annotate not otherwise available data
- //
-
- // Annotate MediaKeys with the keysystem
- MediaKeySystemAccess.prototype.createMediaKeys = function createMediaKeys()
- {
- return _mediaKeySystemAccessCreateMediaKeys.call( this ).then( function( mediaKeys ) {
- mediaKeys._keySystem = this.keySystem;
- return mediaKeys;
- }.bind( this ) );
- };
-
- //
- // Utilities
- //
-
- // Allow us to modify the target of Events
- Object.defineProperties( Event.prototype, {
- target: { get: function() { return this._target || this.currentTarget; },
- set: function( newtarget ) { this._target = newtarget; } }
- } );
-
- // Make an EventTarget base class
- function EventTarget(){
- this.listeners = {};
- };
-
- EventTarget.prototype.listeners = null;
-
- EventTarget.prototype.addEventListener = function(type, callback){
- if(!(type in this.listeners)) {
- this.listeners[type] = [];
- }
- this.listeners[type].push(callback);
- };
-
- EventTarget.prototype.removeEventListener = function(type, callback){
- if(!(type in this.listeners)) {
- return;
- }
- var stack = this.listeners[type];
- for(var i = 0, l = stack.length; i < l; i++){
- if(stack[i] === callback){
- stack.splice(i, 1);
- return this.removeEventListener(type, callback);
- }
- }
- };
-
- EventTarget.prototype.dispatchEvent = function(event){
- if(!(event.type in this.listeners)) {
- return;
- }
- var stack = this.listeners[event.type];
- event.target = this;
- for(var i = 0, l = stack.length; i < l; i++) {
- stack[i].call(this, event);
- }
- };
- }
-})();
diff --git a/tests/wpt/tests/encrypted-media/resources/drm-retrieve-persistent-usage-record.html b/tests/wpt/tests/encrypted-media/resources/drm-retrieve-persistent-usage-record.html
deleted file mode 100644
index d1b3e0c6949..00000000000
--- a/tests/wpt/tests/encrypted-media/resources/drm-retrieve-persistent-usage-record.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <title>Encrypted Media Extensions: Retrieve stored persistent-usage-record</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Message handler for Clear Key keysystem -->
- <script src=/encrypted-media/util/drm-messagehandler.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <script>
- window.addEventListener( 'message', function( event ) {
-
- var config = event.data.config,
- configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'persistent-usage-record' ] },
- assertions = [ ],
- _mediaKeys,
- _mediaKeySession;
-
- config.messagehandler = (new MessageHandler( config.keysystem, undefined, 'persistent-usage-record' ) ).messagehandler;
-
- function onFailure(error) {
- assertions.push( { actual: false, expected: true, message: error } );
- window.opener.postMessage({ testResult: assertions }, '*');
- }
-
- function onMessage( event )
- {
- assertions.push( { expected: true, actual: event instanceof window.MediaKeyMessageEvent, message: "event is of correct class" } );
- assertions.push( { expected: 'message', actual: event.type, message: "event type is message" } );
- assertions.push( { expected: 'license-release', actual: event.messageType, message: "message type is license-release" } );
-
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- event.target.update( response ).catch( onFailure );
- });
- }
-
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ] ).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- _mediaKeys = mediaKeys;
- return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
- }).then( function( success ) {
- _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' );
- _mediaKeySession.addEventListener( 'message', onMessage );
- _mediaKeySession.closed.then( function() {
- window.opener.postMessage({ testResult: assertions }, '*');
- });
- return _mediaKeySession.load( event.data.sessionId );
- }).then(function( success ) {
- if ( !success ) {
- assertions.push( { actual: success, expected: true, message: "Error loading session" } );
- window.opener.postMessage({ testResult: assertions }, '*');
- }
- }).catch( onFailure );
- });
- </script>
- </body>
-</html>
diff --git a/tests/wpt/tests/encrypted-media/resources/retrieve-persistent-usage-record.html b/tests/wpt/tests/encrypted-media/resources/retrieve-persistent-usage-record.html
deleted file mode 100644
index c09134b5469..00000000000
--- a/tests/wpt/tests/encrypted-media/resources/retrieve-persistent-usage-record.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset=utf-8>
- <title>Encrypted Media Extensions: Retrieve stored persistent-usage-record</title>
- <link rel="help" href="https://w3c.github.io/encrypted-media/">
-
- <!-- Helper scripts for Encrypted Media Extensions tests -->
- <script src=/encrypted-media/util/utils.js></script>
- <script src=/encrypted-media/util/utf8.js></script>
-
- <!-- Message handler for Clear Key keysystem -->
- <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
-
- </head>
- <body>
- <div id='log'></div>
-
- <script>
-
- window.addEventListener( 'message', function( event ) {
-
- var config = event.data.config,
- configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'persistent-usage-record' ] },
- assertions = [ ];
-
- config.messagehandler = (new MessageHandler('org.w3.keysystem')).messagehandler;
-
- function onMessage( event )
- {
- assertions.push( { expected: true, actual: event instanceof window.MediaKeyMessageEvent, message: "event is of correct class" } );
- assertions.push( { expected: 'message', actual: event.type, message: "event type is message" } );
- assertions.push( { expected: 'license-release', actual: event.messageType, message: "message type is license-release" } );
-
- var release = fromUtf8( event.message );
-
- consoleWrite( JSON.stringify( release ) );
-
- assertions.push( { expected: 1, actual: release.kids.length, message: "release message contains a single key" } );
- assertions.push( { expected: true, actual: ( typeof release.firstTime === 'number' ), message: "firstTime is a number" } );
- assertions.push( { expected: true, actual: ( typeof release.latestTime === 'number' ), message: "latestTime is a number" } );
-
- var duration = release.latestTime - release.firstTime;
- assertions.push( { expected: true, actual: ( duration >= 2000 ), message: "duration >= 2s" } );
- assertions.push( { expected: true, actual: ( duration < 4000 ), message: "duration < 4s" } );
-
- config.messagehandler( event.messageType, event.message )
- .then( function( response ) {
-
- event.target.update( response ).catch(function(error) {
-
- assertions.push( { actual: false, expected: true, message: error } );
-
- window.opener.postMessage({ testResult: assertions }, '*');
- });
- });
- }
-
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ] ).then(function(access) {
-
- return access.createMediaKeys();
-
- }).then(function(mediaKeys) {
-
- var mediaKeySession = mediaKeys.createSession( 'persistent-usage-record' );
-
- mediaKeySession.addEventListener( 'message', onMessage );
- mediaKeySession.closed.then( function() {
-
- window.opener.postMessage({ testResult: assertions }, '*');
-
- });
-
- return mediaKeySession.load( event.data.sessionId );
-
- }).catch(function(error) {
-
- assertions.push( { actual: false, expected: true, message: error.toString() } );
-
- window.opener.postMessage({ testResult: assertions }, '*');
-
- });
-
-
- } );
-
- </script>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record-events.js b/tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record-events.js
deleted file mode 100644
index e8e1e54790b..00000000000
--- a/tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record-events.js
+++ /dev/null
@@ -1,109 +0,0 @@
-function runTest(config,qualifier) {
-
- var testname = testnamePrefix(qualifier, config.keysystem)
- + ', persistent-usage-record, '
- + /video\/([^;]*)/.exec(config.videoType)[1]
- + ', playback, check events';
-
- var configuration = { initDataTypes: [config.initDataType ],
- audioCapabilities: [{contentType: config.audioType}],
- videoCapabilities: [{contentType: config.videoType}],
- sessionTypes: ['persistent-usage-record']};
-
-
- async_test(function(test) {
- var _video = config.video,
- _mediaKeys,
- _mediaKeySession,
- _sessionId,
- _timeupdateEvent = false,
- _events = [ ];
-
- function recordEventFunc(eventType) {
- return function() { _events.push(eventType); };
- }
-
- function onFailure(error) {
- forceTestFailureFromPromise(test, error);
- }
-
- function onMessage(event) {
- assert_equals(event.target, _mediaKeySession);
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.type, 'message');
-
- if (event.messageType !== 'individualization-request') {
- _events.push(event.messageType);
- }
-
- config.messagehandler(event.messageType, event.message).then(function(response) {
- _events.push(event.messageType + '-response');
- return _mediaKeySession.update(response);
- }).then(test.step_func(function() {
- _events.push('update-resolved');
- if (event.messageType === 'license-release') {
- checkEventSequence( _events,
- ['encrypted','generaterequest-done',
- ['license-request', 'license-request-response', 'update-resolved'], // potentially repeating
- 'keystatuseschange',
- 'playing',
- 'remove-resolved',
- 'keystatuseschange',
- 'license-release',
- 'license-release-response',
- 'closed-attribute-resolved',
- 'update-resolved' ]);
- test.done();
- }
-
- if ( event.messageType === 'license-request' ) {
- _video.setMediaKeys(_mediaKeys);
- }
- })).catch(onFailure);
- }
-
- function onEncrypted(event) {
- assert_equals(event.target, _video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- _events.push(event.type);
- _mediaKeySession.generateRequest( config.initDataType || event.initDataType,
- config.initData || event.initData ).then( function() {
- _events.push( 'generaterequest-done' );
- _sessionId = _mediaKeySession.sessionId;
- }).catch(onFailure);
- }
-
- function onTimeupdate(event) {
- if (_video.currentTime > (config.duration || 1) && !_timeupdateEvent) {
- _timeupdateEvent = true;
- _video.pause();
- _mediaKeySession.remove().then(recordEventFunc('remove-resolved')).catch(onFailure);
- }
- }
-
- navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- _mediaKeys = mediaKeys;
- waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
- waitForEventAndRunStep('playing', _video, recordEventFunc('playing'), test);
-
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- _video.addEventListener('timeupdate', onTimeupdate, true);
-
- _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' );
- waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
- waitForEventAndRunStep('keystatuseschange', _mediaKeySession, recordEventFunc('keystatuseschange'), test);
- _mediaKeySession.closed.then(recordEventFunc('closed-attribute-resolved'));
- return config.servercertificate ? _mediaKeys.setServerCertificate(config.servercertificate) : true;
- }).then(function( success ) {
- return testmediasource(config);
- }).then(function(source) {
- _video.src = URL.createObjectURL(source);
- return source.done;
- }).then(function(){
- _video.play();
- }).catch(onFailure);
- }, testname);
-}
diff --git a/tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record.js b/tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record.js
deleted file mode 100644
index 1772b4bd5f3..00000000000
--- a/tests/wpt/tests/encrypted-media/scripts/playback-persistent-usage-record.js
+++ /dev/null
@@ -1,104 +0,0 @@
-function runTest(config,qualifier) {
-
- var testname = testnamePrefix(qualifier, config.keysystem)
- + ', persistent-usage-record, '
- + /video\/([^;]*)/.exec(config.videoType)[1]
- + 'playback';
-
- var configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'persistent-usage-record' ] };
-
-
- async_test(function(test) {
- var _video = config.video,
- _mediaKeys,
- _mediaKeySession,
- _mediaSource,
- _releaseSequence = false;
-
- function onFailure(error) {
- forceTestFailureFromPromise(test, error);
- }
-
- function onMessage(event) {
- assert_equals(event.target, _mediaKeySession);
- // event instance verification failing on CastTV
- // assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals(event.type, 'message');
-
- if (!_releaseSequence)
- {
- assert_in_array(event.messageType, ['license-request', 'individualization-request']);
- }
- else
- {
- assert_equals(event.messageType, 'license-release');
- }
-
- config.messagehandler(event.messageType, event.message).then(function(response) {
- return _mediaKeySession.update(response);
- }).then(function() {
- if(event.messageType === 'license-request') {
- return _video.setMediaKeys(_mediaKeys);
- } else if(event.messageType === 'license-release') {
- test.done();
- }
- }).catch(onFailure);
- }
-
- function onEncrypted(event) {
- assert_equals(event.target, _video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
-
- waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
- _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType,
- config.initData || event.initData )
- .catch(onFailure);
- }
-
- function onClosed(event) {
- _video.src = "";
- _video.setMediaKeys( null );
- }
-
- function onTimeupdate(event) {
- if (_video.currentTime > ( config.duration || 1) && !_releaseSequence) {
- _video.removeEventListener('timeupdate', onTimeupdate );
- _video.pause();
- _releaseSequence = true;
-
- _mediaKeySession.closed.then(test.step_func(onClosed));
- _mediaKeySession.remove().catch(onFailure);
-
- _video.removeEventListener('timeupdate', onTimeupdate);
- }
- }
-
- function onPlaying(event) {
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- _video.addEventListener('timeupdate', onTimeupdate, true);
- }
-
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- _mediaKeys = mediaKeys;
- _mediaKeySession = _mediaKeys.createSession('persistent-usage-record');
- waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
- waitForEventAndRunStep('playing', _video, onPlaying, test);
- return config.servercertificate ? _mediaKeys.setServerCertificate(config.servercertificate) : true;
- }).then(function(success) {
- return testmediasource(config);
- }).then(function(source) {
- _mediaSource = source;
- _video.src = URL.createObjectURL(_mediaSource);
- return source.done;
- }).then(function(){
- _video.play();
- }).catch(onFailure);
- }, testname);
-}
diff --git a/tests/wpt/tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js b/tests/wpt/tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js
deleted file mode 100644
index a04f97d2ca9..00000000000
--- a/tests/wpt/tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js
+++ /dev/null
@@ -1,114 +0,0 @@
-function runTest(config,qualifier) {
-
- var testname = testnamePrefix(qualifier, config.keysystem)
- + ', persistent-usage-record, '
- + /video\/([^;]*)/.exec(config.videoType)[1]
- + ', playback, retrieve in new window';
-
- var configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'persistent-usage-record' ] };
-
-
- async_test( function( test ) {
- var _video = config.video,
- _mediaKeys,
- _mediaKeySession,
- _mediaSource,
- _sessionId,
- _isClosing = false;
-
- function onFailure(error) {
- forceTestFailureFromPromise(test, error);
- }
-
- function onEncrypted(event) {
- assert_equals(event.target, _video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
-
- waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
- _mediaKeySession.generateRequest( config.initDataType || event.initDataType,
- config.initData || event.initData ).then( function() {
- _sessionId = _mediaKeySession.sessionId;
- }).catch(onFailure);
- }
-
- function onMessage(event) {
- assert_equals(event.target, _mediaKeySession);
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.type, 'message');
-
- assert_in_array( event.messageType,['license-request', 'individualization-request']);
-
- config.messagehandler( event.messageType, event.message ).then(function(response) {
- return _mediaKeySession.update(response);
- }).then(function() {
- return _video.setMediaKeys(_mediaKeys);
- }).catch(onFailure);
- }
-
- function onPlaying(event) {
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- _video.addEventListener('timeupdate', onTimeupdate, true);
- }
-
- function onTimeupdate(event) {
- if (!_isClosing && _video.currentTime > (config.duration || 1)) {
- _isClosing = true;
- _video.removeEventListener('timeupdate', onTimeupdate);
- _video.pause();
- _mediaKeySession.closed.then( test.step_func(onClosed));
- _mediaKeySession.close();
- }
- }
-
- function onClosed(event) {
- _video.src = "";
- _video.setMediaKeys( null );
-
- var win = window.open(config.windowscript);
- assert_not_equals(win, null, "Popup windows not allowed?");
-
- window.addEventListener('message', test.step_func(function(event) {
- if (event.data.testResult) {
- event.data.testResult.forEach(test.step_func(function(assertion) {
- assert_equals(assertion.actual, assertion.expected, assertion.message);
- }));
-
- win.close();
- test.done();
- }
- }));
-
- delete config.video;
- delete config.messagehandler;
-
- win.onload = function() {
- win.postMessage({ config: config, sessionId: _sessionId }, '*');
- }
- }
-
- navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- _mediaKeys = mediaKeys;
- return _video.setMediaKeys(mediaKeys);
- }).then(function(){
- _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' );
- waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
- waitForEventAndRunStep('playing', _video, onPlaying, test);
- return config.servercertificate ? _mediaKeys.setServerCertificate(config.servercertificate) : true;
- }).then(function(success) {
- return testmediasource(config);
- }).then(function(source) {
- _mediaSource = source;
- _video.src = URL.createObjectURL(_mediaSource);
- return source.done;
- }).then(function(){
- _video.play();
- }).catch(onFailure);
- }, testname);
-}
diff --git a/tests/wpt/tests/event-timing/WEB_FEATURES.yml b/tests/wpt/tests/event-timing/WEB_FEATURES.yml
new file mode 100644
index 00000000000..b20102ff2a3
--- /dev/null
+++ b/tests/wpt/tests/event-timing/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: event-timing
+ files: "**"
diff --git a/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-button-space.html b/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-button-space.html
index d3ab5437f8e..b7a7675f324 100644
--- a/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-button-space.html
+++ b/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-button-space.html
@@ -13,7 +13,7 @@
<script>
promise_test(async t => {
-
+ assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
let map = new Map();
const button = document.getElementById('button');
diff --git a/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-checkbox-space.html b/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-checkbox-space.html
index 3dd8e21e784..e2582259e15 100644
--- a/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-checkbox-space.html
+++ b/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-checkbox-space.html
@@ -13,7 +13,7 @@
<script>
promise_test(async t => {
-
+ assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
let map = new Map();
const checkbox = document.querySelector('input[type="checkbox"]');
diff --git a/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-link-enter.html b/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-link-enter.html
index 6945d2ff771..9e1f4ee3761 100644
--- a/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-link-enter.html
+++ b/tests/wpt/tests/event-timing/interactionid-keyboard-event-simulated-click-link-enter.html
@@ -13,7 +13,7 @@
<script>
promise_test(async t => {
-
+ assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.');
let map = new Map();
const link = document.getElementById('lnk');
diff --git a/tests/wpt/tests/fetch/content-encoding/zstd/WEB_FEATURES.yml b/tests/wpt/tests/fetch/content-encoding/zstd/WEB_FEATURES.yml
new file mode 100644
index 00000000000..b5d970fdb14
--- /dev/null
+++ b/tests/wpt/tests/fetch/content-encoding/zstd/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: zstd
+ files: "**"
diff --git a/tests/wpt/tests/fetch/private-network-access/README.md b/tests/wpt/tests/fetch/private-network-access/README.md
index a69aab48723..cbb5b85b74d 100644
--- a/tests/wpt/tests/fetch/private-network-access/README.md
+++ b/tests/wpt/tests/fetch/private-network-access/README.md
@@ -8,3 +8,6 @@ See also:
* [The specification](https://wicg.github.io/private-network-access/)
* [The repository](https://github.com/WICG/private-network-access/)
* [Open issues](https://github.com/WICG/private-network-access/issues/)
+
+Private Network Access is deprecated and will eventually be replaced by [Local
+Network Access](https://github.com/explainers-by-googlers/local-network-access).
diff --git a/tests/wpt/tests/file-system-access/WEB_FEATURES.yml b/tests/wpt/tests/file-system-access/WEB_FEATURES.yml
new file mode 100644
index 00000000000..45e40acba1d
--- /dev/null
+++ b/tests/wpt/tests/file-system-access/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: file-system-access
+ files: "**"
diff --git a/tests/wpt/tests/fledge/tentative/abort.https.window.js b/tests/wpt/tests/fledge/tentative/abort.https.window.js
index db6aae46045..e4a3189a30c 100644
--- a/tests/wpt/tests/fledge/tentative/abort.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/abort.https.window.js
@@ -4,7 +4,7 @@
// META: script=resources/fledge-util.sub.js
// META: timeout=long
-"use strict;"
+"use strict";
promise_test(async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js b/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js
index edacb05512e..384a9e62030 100644
--- a/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/additional-bids.https.window.js
@@ -6,7 +6,7 @@
// META: timeout=long
// META: variant=?1-last
-"use strict;"
+"use strict";
// This file contains tests for additional bids and negative targeting.
//
diff --git a/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js b/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js
index dec49b80a96..1fb59972b58 100644
--- a/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/auction-config-passed-to-worklets.https.window.js
@@ -12,7 +12,7 @@
// META: variant=?26-30
// META: variant=?30-35
-"use strict;"
+"use strict";
// These tests focus on making sure AuctionConfig fields are passed to seller worklets,
// and are normalized if necessary. This test does not check the behaviors of the
diff --git a/tests/wpt/tests/fledge/tentative/auction-config.https.window.js b/tests/wpt/tests/fledge/tentative/auction-config.https.window.js
index 50b9cb9e9e6..e32d8b31773 100644
--- a/tests/wpt/tests/fledge/tentative/auction-config.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/auction-config.https.window.js
@@ -19,7 +19,7 @@
// META: variant=?61-65
// META: variant=?66-last
-"use strict;"
+"use strict";
// The tests in this file focus on calls to runAdAuction with various
// auctionConfigs.
diff --git a/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js b/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js
index 097978a7858..9f0818da2c4 100644
--- a/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/clear-origin-joined-ad-interest-groups.https.window.js
@@ -9,7 +9,7 @@
// META: variant=?9-12
// META: variant=?13-last
-"use strict;"
+"use strict";
///////////////////////////////////////////////////////////////////////////////
// Basic tests with no interest groups joined.
diff --git a/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js b/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js
index 9669f2790bc..6c95f74c1f5 100644
--- a/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/cross-origin.https.window.js
@@ -9,7 +9,7 @@
// META: variant=?9-12
// META: variant=?13-last
-"use strict;"
+"use strict";
////////////////////////////////////////////////////////////////////////////////
// Join interest group in iframe tests.
diff --git a/tests/wpt/tests/fledge/tentative/currency.https.window.js b/tests/wpt/tests/fledge/tentative/currency.https.window.js
index f1b2bba8734..b65dea5820a 100644
--- a/tests/wpt/tests/fledge/tentative/currency.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/currency.https.window.js
@@ -14,7 +14,7 @@
// META: variant=?29-32
// META: variant=?33-last
-'use strict;'
+'use strict';
const ORIGIN = window.location.origin;
diff --git a/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js b/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js
index 75377ca7aa3..51daaf27797 100644
--- a/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/deprecated-render-url-replacements.https.window.js
@@ -10,7 +10,7 @@
// META: variant=?16-last
-"use strict;"
+"use strict";
// This test ensures proper handling of deprecatedRenderURLReplacements within auctionConfigOverrides.
// It validates that these replacements are correctly applied to the winning bid's renderURL by
diff --git a/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js b/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js
index 3f58b2c8ad5..a4e6911491d 100644
--- a/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/direct-from-seller-signals.https.window.js
@@ -14,7 +14,7 @@
// META: variant=?29-32
// META: variant=?33-36
-"use strict;"
+"use strict";
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
index 00c4bfdcc31..e472fccdc4d 100644
--- a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
@@ -13,7 +13,7 @@
// META: variant=?25-28
// META: variant=?29-last
-"use strict;"
+"use strict";
// These tests focus on the browserSignals argument passed to generateBid().
// Note that "topLevelSeller" is covered by component auction tests,
diff --git a/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js
index 855e6b5a075..de749e1e60a 100644
--- a/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js
@@ -12,6 +12,8 @@
// META: variant=?13-16
// META: variant=?17-last
+"use strict";
+
// These tests focus on the navigator.getInterestGroupAdAuctionData() method.
// Checks various fields for decoded InterestGroupAdAuctionData that's
diff --git a/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js b/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js
index 172cbab4664..6b5602158ff 100644
--- a/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/interest-group-passed-to-generate-bid.https.window.js
@@ -22,7 +22,7 @@
// META: variant=?76-80
// META: variant=?81-85
-"use strict;"
+"use strict";
// These tests focus on making sure InterestGroup fields are passed to generateBid(),
// and are normalized if necessary. This test does not check the behaviors of the
diff --git a/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js b/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js
index ceac2c79a6e..04110054744 100644
--- a/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/interest-group-update.https.window.js
@@ -10,7 +10,7 @@
// META: variant=?15-19
// META: variant=?20-last
-"use strict;"
+"use strict";
// This test repeatedly runs auctions to verify an update. A modified bidding script
// continuously throws errors until it detects the expected change in the interest group
@@ -32,7 +32,7 @@ const makeTestForUpdate = ({
}) => {
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
- extraBiddingLogic = ``;
+ let extraBiddingLogic = ``;
let replacePlaceholders = (ads) => ads.forEach(element => {
element.renderURL = element.renderURL.replace(`UUID-PLACEHOLDER`, uuid);
diff --git a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js
index 1e2824666cc..2939d384784 100644
--- a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group-in-fenced-frame.https.window.js
@@ -8,7 +8,7 @@
// META: variant=?5-8
// META: variant=?9-last
-"use strict;"
+"use strict";
// These are separate from the other join-leave tests because these all create
// and navigate fenced frames, which is much slower than just joining/leaving
diff --git a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js
index 68a4e9d09c9..5e004ed1dc5 100644
--- a/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/join-leave-ad-interest-group.https.window.js
@@ -14,7 +14,7 @@
// META: variant=?71-80
// META: variant=?81-last
-"use strict;"
+"use strict";
// These tests are focused on joinAdInterestGroup() and leaveAdInterestGroup().
// Most join tests do not run auctions, but instead only check the result of
@@ -460,7 +460,7 @@ const SIMPLE_JOIN_LEAVE_TEST_CASES = [
},
];
-for (testCase of SIMPLE_JOIN_LEAVE_TEST_CASES) {
+for (let testCase of SIMPLE_JOIN_LEAVE_TEST_CASES) {
var test_name = 'Join and leave interest group: ';
if ('testCaseName' in testCase) {
test_name += testCase.testCaseName;
diff --git a/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js b/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js
index 6f3c2f572a1..419b94bd781 100644
--- a/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/kanon-status-below-threshold.https.window.js
@@ -4,7 +4,7 @@
// META: script=resources/fledge-util.sub.js
// META: script=/common/subset-tests.js
-"use strict;"
+"use strict";
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js b/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js
index 87a66c106fb..965082d8ffd 100644
--- a/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/kanon-status-not-calculated.https.window.js
@@ -4,7 +4,7 @@
// META: script=resources/fledge-util.sub.js
// META: script=/common/subset-tests.js
-"use strict;"
+"use strict";
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/no-winner.https.window.js b/tests/wpt/tests/fledge/tentative/no-winner.https.window.js
index 2632a95deee..cfa0704dbc4 100644
--- a/tests/wpt/tests/fledge/tentative/no-winner.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/no-winner.https.window.js
@@ -15,7 +15,7 @@
// META: variant=?41-45
// META: variant=?46-last
-"use strict;"
+"use strict";
// The tests in this file focus on simple auctions (one bidder, one seller, one
// origin, one frame) which have no winning bid, either due to errors or due to
@@ -76,7 +76,7 @@ const BIDDING_WASM_HELPER_ERRORS = [
'error=not-wasm'
];
-for (error of BIDDING_LOGIC_SCRIPT_ERRORS) {
+for (let error of BIDDING_LOGIC_SCRIPT_ERRORS) {
subsetTest(promise_test, (async (error, test) => {
let biddingLogicURL = `${BASE_URL}resources/bidding-logic.sub.py?${error}`;
await joinGroupAndRunBasicFledgeTestExpectingNoWinner(
@@ -86,7 +86,7 @@ for (error of BIDDING_LOGIC_SCRIPT_ERRORS) {
}).bind(undefined, error), `Bidding logic script: ${error}`);
}
-for (error of DECISION_LOGIC_SCRIPT_ERRORS) {
+for (let error of DECISION_LOGIC_SCRIPT_ERRORS) {
subsetTest(promise_test, (async (error, test) => {
let decisionLogicURL =
`${BASE_URL}resources/decision-logic.sub.py?${error}`;
@@ -96,7 +96,7 @@ for (error of DECISION_LOGIC_SCRIPT_ERRORS) {
}).bind(undefined, error), `Decision logic script: ${error}`);
}
-for (error of BIDDING_WASM_HELPER_ERRORS) {
+for (let error of BIDDING_WASM_HELPER_ERRORS) {
subsetTest(promise_test, (async (error, test) => {
let biddingWasmHelperURL =
`${BASE_URL}resources/wasm-helper.py?${error}`;
diff --git a/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js b/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js
index a1c261b6291..474bf4ced76 100644
--- a/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/private-aggregation.https.window.js
@@ -10,7 +10,7 @@
// META: variant=?11-15
// META: variant=?16-20
-'use strict;'
+'use strict';
// To better isolate from private aggregation tests run in parallel,
// don't use the usual origin here.
diff --git a/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js b/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js
index 5ebd20d19ae..84dce53844f 100644
--- a/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/real-time-reporting.https.window.js
@@ -8,7 +8,7 @@
// META: variant=?1-5
// META: variant=?6-last
-'use strict;'
+'use strict';
// The tests in this file focus on real time reporting.
diff --git a/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js b/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js
index d74f0dab5e5..98b6a75c42f 100644
--- a/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/register-ad-beacon.https.window.js
@@ -8,7 +8,7 @@
// META: variant=?6-10
// META: variant=?11-last
-"use strict;"
+"use strict";
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js b/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js
index a3b546f5964..04af8ebc643 100644
--- a/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/reporting-arguments.https.window.js
@@ -9,7 +9,7 @@
// META: variant=?11-15
// META: variant=?16-last
-"use strict;"
+"use strict";
// Simplified version of reportTest() for validating arguments to reporting
// methods. Only takes expressions to check in reporting methods. "uuid" is
diff --git a/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js b/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js
index 43c78987f1e..0019393008b 100644
--- a/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/reporting-ids.https.window.js
@@ -8,7 +8,7 @@
// META: variant=?6-last
-"use strict;"
+"use strict";
const makeTest = ({
// Name of the test.
diff --git a/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js
index 3371813feee..8fa4eb1e351 100644
--- a/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js
+++ b/tests/wpt/tests/fledge/tentative/resources/ba-fledge-util.sub.js
@@ -1,4 +1,4 @@
-'use strict;'
+'use strict';
let BA = {};
diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
index ebd2b44b992..e0d5d99bb65 100644
--- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
+++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
@@ -1,10 +1,10 @@
-"use strict;"
+"use strict";
const BASE_URL = document.baseURI.substring(0, document.baseURI.lastIndexOf('/') + 1);
const BASE_PATH = (new URL(BASE_URL)).pathname;
// Allow overriding to allow other repositories to use these utility functions.
-RESOURCE_PATH = `${BASE_PATH}resources/`
+let RESOURCE_PATH = `${BASE_PATH}resources/`
const DEFAULT_INTEREST_GROUP_NAME = 'default name';
@@ -969,7 +969,7 @@ let additionalBidHelper = function() {
// not be reused in a future call to `fetchAdditionalBids()`, since this
// mothod consumes and destroys their `testMetadata` field.
async function fetchAdditionalBids(seller, additionalBids) {
- additionalBidHeaderValues = await Promise.all(additionalBids.map(
+ let additionalBidHeaderValues = await Promise.all(additionalBids.map(
async additionalBid =>
await _convertAdditionalBidToResponseHeader(additionalBid)));
diff --git a/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js b/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js
index cc001813597..2b94dc60e01 100644
--- a/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js
+++ b/tests/wpt/tests/fledge/tentative/resources/service-worker-helper.js
@@ -1,4 +1,4 @@
-"use strict;"
+"use strict";
// Service workers, once activated, will use 'clients.claim()'
// so that clients loaded in the same scope do not need to be reloaded
@@ -18,4 +18,4 @@ self.addEventListener('fetch', (event) => {
url: url,
message: "Service worker saw this URL: " + url
});
-}); \ No newline at end of file
+});
diff --git a/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js b/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js
index 2195b45ea5f..21bbf295726 100644
--- a/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/round-a-value.https.window.js
@@ -4,7 +4,7 @@
// META: script=resources/fledge-util.sub.js
// META: timeout=long
-"use strict;"
+"use strict";
promise_test(async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js
index 23fee313af5..9acf994cf9f 100644
--- a/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/score-ad-browser-signals.https.window.js
@@ -6,7 +6,7 @@
// META: timeout=long
// META: variant=?1-last
-"use strict;"
+"use strict";
// These tests focus on the browserSignals argument passed to scoreAd().
diff --git a/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js b/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js
index 163443cb76d..fa0f01ccfe8 100644
--- a/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/send-report-to.https.window.js
@@ -7,7 +7,7 @@
// META: variant=?1-5
// META: variant=?6-last
-"use strict;"
+"use strict";
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
diff --git a/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js b/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js
index 1b4edc66a89..e6787e8a2d9 100644
--- a/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/server-response-for-debugging-only.https.window.js
@@ -9,6 +9,8 @@
// META: timeout=long
// META: variant=?1-last
+"use strict";
+
// These tests focus on the debugReports field in AuctionConfig's
// serverResponse, i.e. auctions involving forDebuggingOnly reports.
// NOTE: Due to DB's fDO lockout/cooldown tables are not cleaned after each run
diff --git a/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js b/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js
index d7f21e16cf0..6d9a8a88770 100644
--- a/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/server-response-private-aggregation.https.window.js
@@ -10,6 +10,8 @@
// META: variant=?1-6
// META: variant=?7-last
+"use strict";
+
// These tests focus on the paggResponse field in AuctionConfig's
// serverResponse, i.e. auctions involving private aggregation reporting. NOTE:
// Due to debug mode being disabled for B&A's Private Aggregation reports, these
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 d4eaf0d2512..4241cc8e1c9 100644
--- a/tests/wpt/tests/fledge/tentative/server-response.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/server-response.https.window.js
@@ -24,6 +24,8 @@
// META: variant=?63-66
// META: variant=?67-70
+"use strict";
+
// These tests focus on the serverResponse field in AuctionConfig, e.g.
// auctions involving bidding and auction services.
diff --git a/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js b/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js
index 8b8618420e5..41ebf839600 100644
--- a/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/service-worker-request-visibility.https.window.js
@@ -6,7 +6,7 @@
// META: timeout=long
// META: variant=?1-last
-"use strict;"
+"use strict";
const SERVICE_WORKER_SCRIPT = "resources/service-worker-helper.js";
diff --git a/tests/wpt/tests/fledge/tentative/tie.https.window.js b/tests/wpt/tests/fledge/tentative/tie.https.window.js
index f528df8fb02..21be690c92e 100644
--- a/tests/wpt/tests/fledge/tentative/tie.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/tie.https.window.js
@@ -4,12 +4,12 @@
// META: script=resources/fledge-util.sub.js
// META: timeout=long
-"use strict;"
+"use strict";
// Runs one auction at a time using `auctionConfigOverrides` until the auction
// has a winner.
async function runAuctionsUntilWinner(test, uuid, auctionConfigOverrides) {
- fencedFrameConfig = null;
+ let fencedFrameConfig = null;
while (!fencedFrameConfig) {
fencedFrameConfig =
await runBasicFledgeAuction(test, uuid, auctionConfigOverrides);
diff --git a/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js b/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js
index 4a712bf6269..9d8d0836419 100644
--- a/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/utf8-helpers.https.window.js
@@ -8,7 +8,7 @@
// META: variant=?6-10
// META: variant=?11-15
-'use strict;'
+'use strict';
// These tests cover encodeUtf8 and decodeUtf8.
diff --git a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium-Liga.ttf b/tests/wpt/tests/fonts/Lato-Medium-Liga.ttf
index 3a0beaea38b..3a0beaea38b 100644
--- a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium-Liga.ttf
+++ b/tests/wpt/tests/fonts/Lato-Medium-Liga.ttf
Binary files differ
diff --git a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium.ttf b/tests/wpt/tests/fonts/Lato-Medium.ttf
index 2c612da2ae5..2c612da2ae5 100644
--- a/tests/wpt/tests/css/css-fonts/support/fonts/Lato-Medium.ttf
+++ b/tests/wpt/tests/fonts/Lato-Medium.ttf
Binary files differ
diff --git a/tests/wpt/tests/graphics-aam/META.yml b/tests/wpt/tests/graphics-aam/META.yml
index 197263836e7..c51c6e1b186 100644
--- a/tests/wpt/tests/graphics-aam/META.yml
+++ b/tests/wpt/tests/graphics-aam/META.yml
@@ -1,3 +1,4 @@
spec: https://w3c.github.io/graphics-aam/
suggested_reviewers:
- spectranaut
+ - sideshowbarker
diff --git a/tests/wpt/tests/html-aam/META.yml b/tests/wpt/tests/html-aam/META.yml
index 212cae7fa52..bfca09eadfa 100644
--- a/tests/wpt/tests/html-aam/META.yml
+++ b/tests/wpt/tests/html-aam/META.yml
@@ -2,3 +2,4 @@ spec: https://w3c.github.io/html-aam/
suggested_reviewers:
- cookiecrook
- scottaohara
+ - sideshowbarker
diff --git a/tests/wpt/tests/html-aam/roles-contextual.html b/tests/wpt/tests/html-aam/roles-contextual.html
index 793bdf1f413..e1f343cd074 100644
--- a/tests/wpt/tests/html-aam/roles-contextual.html
+++ b/tests/wpt/tests/html-aam/roles-contextual.html
@@ -81,7 +81,7 @@
<img data-testname="el-img-empty-alt-aria-labelledby-non-existing" class="ex-generic" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt aria-labelledby="non-existing">
<img data-testname="el-img-empty-alt-aria-labelledby-empty" class="ex-generic" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt aria-labelledby="empty">
<img data-testname="el-img-empty-alt-aria-labelledby-whitespace" class="ex-generic" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt aria-labelledby="space">
-<img data-testname="el-img-empty-alt-title" data-expectedrole="image" class="ex" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt title="x">
+<img data-testname="el-img-empty-alt-title" class="ex-generic" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt title="x">
<img data-testname="el-img-empty-alt-title-empty" class="ex-generic" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt title="">
<img data-testname="el-img-empty-alt-title-whitespace" class="ex-generic" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt title=" ">
@@ -110,4 +110,4 @@ AriaUtils.verifyGenericRolesBySelector(".ex-generic");
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/tests/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html b/tests/wpt/tests/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html
index d0b09f335db..a960fb87020 100644
--- a/tests/wpt/tests/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html
+++ b/tests/wpt/tests/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html
@@ -14,7 +14,7 @@
</body>
<script>
// Regression test for crbug.com/1399759. This is mainly based on
-// html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window.html,
+// external/wpt/html/infrastructure/urls/base-url/document-base-url-initiated-grand-parent.https.window.js
// but restricts itself to the exact error condition.
//
// This test is run in two variants which differ in the Origin-Agent-Cluster
diff --git a/tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html b/tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html
new file mode 100644
index 00000000000..a3a82d76468
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/the-window-object/open-close/open_initial_size.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTML: window.open: window geometry immediately after open</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#apis-for-creating-and-navigating-browsing-contexts-by-name">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/PrefixedPostMessage.js"></script>
+<script>
+var windowURL = 'resources/message-opener.html';
+
+async_test(t => {
+ var prefixedMessage = new PrefixedMessageTest();
+ var initialWidth, initialHeight, initialLeft, initialTop;
+ prefixedMessage.onMessage(t.step_func_done((data, e) => {
+ e.source.close();
+ assert_equals(initialWidth, data.width);
+ assert_equals(initialHeight, data.height);
+ assert_equals(initialLeft, data.left);
+ assert_equals(initialTop, data.top);
+ }));
+ var win = window.open(prefixedMessage.url(windowURL), '');
+ initialWidth = win.innerWidth;
+ initialHeight = win.innerHeight;
+ initialLeft = win.screenX;
+ initialTop = win.screenY;
+}, "Window geometry is available in opener context immediately");
+</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 6bb9238a74a..f20533fc471 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
@@ -1,46 +1,50 @@
<!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');
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test Reference: The lang attribute.</title>
+ <link rel="author" href="mailto:schenney@chromium.org"/>
+ <script src="/common/reftest-wait.js"></script>
+ <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');
- 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(/fonts/Lato-Medium.ttf)"
- );
+ 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(/fonts/Lato-Medium.ttf)"
+ );
- test_font.load().then((font) => {
- document.fonts.add(font);
- drawText('tr');
- drawText('en');
- });
- }
-</script>
-<body onload="generateReference()">
- <canvas lang="en" id="canvas-tr" width="300" height="100">
- Browser does not support HTML5 Canvas.
- </canvas>
- <canvas lang="tr" id="canvas-en" width="300" height="100">
- Browser does not support HTML5 Canvas.
- </canvas>
-</body>
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ takeScreenshot();
+ });
+ }
+ </script>
+ <body onload="generateReference()">
+ <canvas lang="en" id="canvas-tr" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas lang="tr" id="canvas-en" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ </body>
+</html>
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 177bddb1794..0262f588978 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
@@ -1,72 +1,76 @@
<!doctype HTML>
-<meta charset="utf-8">
-<title>HTML5 Canvas Test Reference: The lang attribute.</title>
-<link rel="author" href="mailto:schenney@chromium.org"/>
-<style>
- #canvas1 {
- position: absolute;
- left: 0px;
- top: 0px;
- }
- #canvas2 {
- position: absolute;
- left: 0px;
- top: 50px;
- }
- #canvas3 {
- position: absolute;
- left: 0px;
- top: 100px;
- }
- #canvas4 {
- position: absolute;
- left: 0px;
- top: 150px;
- }
-</style>
-<script>
- function generateReference() {
- let test_font = new FontFace(
- // Lato-Medium is a font with language specific ligatures.
- "Lato-Medium",
- "url(/fonts/Lato-Medium.ttf)"
- );
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test Reference: The lang attribute.</title>
+ <link rel="author" href="mailto:schenney@chromium.org"/>
+ <script src="/common/reftest-wait.js"></script>
+ <style>
+ #canvas1 {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ }
+ #canvas2 {
+ position: absolute;
+ left: 0px;
+ top: 50px;
+ }
+ #canvas3 {
+ position: absolute;
+ left: 0px;
+ top: 100px;
+ }
+ #canvas4 {
+ position: absolute;
+ left: 0px;
+ top: 150px;
+ }
+ </style>
+ <script>
+ function generateReference() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/fonts/Lato-Medium.ttf)"
+ );
- 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);
+ 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 canvas2 = document.getElementById('canvas2');
- var ctx2 = canvas2.getContext('2d');
- ctx2.font = '25px Lato-Medium';
- ctx2.fillText('fi', 60, 30);
+ var canvas2 = document.getElementById('canvas2');
+ var ctx2 = canvas2.getContext('2d');
+ ctx2.font = '25px Lato-Medium';
+ ctx2.fillText('fi', 60, 30);
- var canvas3 = document.getElementById('canvas3');
- var ctx3 = canvas3.getContext('2d');
- ctx3.font = '25px Lato-Medium';
- ctx3.fillText('fi', 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="en" width="300" height="50">
- Browser does not support HTML5 Canvas.
- </canvas>
- <canvas id="canvas2" lang="tr" width="300" height="50">
- Browser does not support HTML5 Canvas.
- </canvas>
- <canvas id="canvas3" lang="en" width="300" height="50">
- Browser does not support HTML5 Canvas.
- </canvas>
- <canvas id="canvas4" lang="tr" width="300" height="50">
- Browser does not support HTML5 Canvas.
- </canvas>
-</body>
+ var canvas4 = document.getElementById('canvas4');
+ var ctx4 = canvas4.getContext('2d');
+ ctx4.font = '25px Lato-Medium';
+ ctx4.fillText('fi', 60, 30);
+ takeScreenshot();
+ });
+ }
+ </script>
+ <body onload="generateReference()">
+ <canvas id="canvas1" lang="en" width="300" height="50">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas id="canvas2" lang="tr" width="300" height="50">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas id="canvas3" lang="en" width="300" height="50">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas id="canvas4" lang="tr" width="300" height="50">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ </body>
+</html>
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 225fcaa7ba1..02fb530baef 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
@@ -1,47 +1,51 @@
<!doctype HTML>
-<meta charset="utf-8">
-<title>HTML5 Canvas Test: The lang attribute dynamically updates</title>
-<link rel="match" href="canvas.2d.lang.dynamic-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 text lang change is applied."/>
-<style>
- canvas {
- position: absolute;
- left: 0px;
- top: 0px;
- }
-</style>
-<script type="text/javascript">
- function runTest() {
- let test_font = new FontFace(
- // Lato-Medium is a font with language specific ligatures.
- "Lato-Medium",
- "url(/fonts/Lato-Medium.ttf)"
- );
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test: The lang attribute dynamically updates</title>
+ <link rel="match" href="canvas.2d.lang.dynamic-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 text lang change is applied."/>
+ <script src="/common/reftest-wait.js"></script>
+ <style>
+ canvas {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ }
+ </style>
+ <script type="text/javascript">
+ function runTest() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/fonts/Lato-Medium.ttf)"
+ );
- test_font.load().then((font) => {
- document.fonts.add(font);
- var canvas = document.getElementById('canvas1');
- var ctx = canvas.getContext('2d');
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ var canvas = document.getElementById('canvas1');
+ var ctx = canvas.getContext('2d');
- ctx.font = '25px Lato-Medium';
- ctx.fillText('fi', 60, 30);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 60, 30);
- canvas.setAttribute('lang', 'tr');
- ctx.fillText('fi', 60, 80);
+ canvas.setAttribute('lang', 'tr');
+ ctx.fillText('fi', 60, 80);
- ctx.lang = 'en';
- ctx.fillText('fi', 60, 130);
+ ctx.lang = 'en';
+ ctx.fillText('fi', 60, 130);
- ctx.lang = 'inherit';
- ctx.fillText('fi', 60, 180);
- });
- }
-</script>
-<body onload="runTest()">
- <canvas lang="en" id="canvas1" width="300" height="200">
- Browser does not support HTML5 Canvas.
- </canvas>
-</body>
+ ctx.lang = 'inherit';
+ ctx.fillText('fi', 60, 180);
+ takeScreenshot();
+ });
+ }
+ </script>
+ <body onload="runTest()">
+ <canvas lang="en" id="canvas1" width="300" height="200">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ </body>
+</html>
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 258ebf6298e..7fa4dacd6e4 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
@@ -1,29 +1,33 @@
<!doctype HTML>
-<meta charset="utf-8">
-<title>HTML5 Canvas Test Reference: The lang attribute.</title>
-<link rel="author" href="mailto:schenney@chromium.org"/>
-<script>
- function generateReference() {
- let test_font = new FontFace(
- // Lato-Medium is a font with language specific ligatures.
- "Lato-Medium",
- "url(/fonts/Lato-Medium.ttf)"
- );
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test Reference: The lang attribute.</title>
+ <link rel="author" href="mailto:schenney@chromium.org"/>
+ <script src="/common/reftest-wait.js"></script>
+ <script>
+ function generateReference() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/fonts/Lato-Medium.ttf)"
+ );
- test_font.load().then((font) => {
- document.fonts.add(font);
- var canvas = document.getElementById('canvas1');
- var ctx = canvas.getContext('2d');
+ 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()">
- <canvas id="canvas1" width="300" height="150">
- Browser does not support HTML5 Canvas.
- </canvas>
-</body>
+ // 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);
+ takeScreenshot();
+ });
+ }
+ </script>
+ <body onload="generateReference()">
+ <canvas id="canvas1" width="300" height="150">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ </body>
+</html>
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 099081de379..9c5eb3f96b2 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
@@ -1,11 +1,12 @@
<!doctype HTML>
-<html>
+<html class="reftest-wait">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The empty string lang attribute uses the unknown language</title>
<link rel="match" href="canvas.2d.lang.empty-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="When the lang attribute is the empty string, use the unknown language." />
+ <script src="/common/reftest-wait.js"></script>
<script type="text/javascript">
function runTest() {
let test_font = new FontFace(
@@ -24,6 +25,7 @@
ctx.font = '25px Lato-Medium';
ctx.lang = '';
ctx.fillText('fi', 5, 50);
+ takeScreenshot();
});
}
</script>
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 b8fca4dd5e7..e078eaa1235 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
@@ -1,11 +1,12 @@
<!doctype HTML>
-<html lang="en-US">
+<html lang="en-US" class="reftest-wait">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute is respected.</title>
<link rel="match" href="canvas.2d.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="When the canvas context has a lang attribute, override the document." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -38,6 +39,7 @@
document.fonts.add(font);
drawText('tr');
drawText('en');
+ takeScreenshot();
});
}
</script>
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 0af5f20d6f5..83854b9b377 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
@@ -1,5 +1,5 @@
<!doctype HTML>
-<html lang="en-US">
+<html lang="en-US" class="reftest-wait">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute inherits from a disconnected canvas element</title>
<link rel="match" href="canvas.2d.lang-ref.html"/>
@@ -7,6 +7,7 @@
<link rel="help"
href="https://html.spec.whatwg.org/multipage/canvas.html#text-styles"/>
<meta name="assert" content="Verify that a disconnected canvas uses the canvas lang."/>
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -46,6 +47,7 @@
document.fonts.add(font);
drawText('tr');
drawText('en');
+ takeScreenshot();
});
</script>
</body>
diff --git a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html
index 6b06ae5df96..87fc358af9e 100644
--- a/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html
+++ b/tests/wpt/tests/html/canvas/element/manual/text/canvas.2d.lang.inherit.disconnected.canvas.no.lang.html
@@ -1,5 +1,5 @@
<!doctype HTML>
-<html lang="tr">
+<html lang="tr" class="reftest-wait">
<meta charset="utf-8">
<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"/>
@@ -7,6 +7,7 @@
<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 unknown lang."/>
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -46,7 +47,8 @@
drawText('tr');
document.documentElement.setAttribute('lang', 'en');
drawText('en');
+ takeScreenshot();
});
</script>
</body>
-</html> \ No newline at end of file
+</html>
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 845880f20d8..06e97745ddb 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,11 +1,12 @@
<!doctype HTML>
-<html lang="en">
+<html lang="en" class="reftest-wait">
<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" />
<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="When the canvas element has a lang attribute, override the document." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -41,6 +42,7 @@
ctxEN.font = '25px Lato-Medium';
ctxEN.fillText('fi', 5, 50);
+ takeScreenshot();
});
}
</script>
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
index 9d12ba0d695..d48f9286da5 100644
--- 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
@@ -1,47 +1,51 @@
<!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');
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test Reference: The lang attribute.</title>
+ <link rel="author" href="mailto:schenney@chromium.org"/>
+ <script src="/common/reftest-wait.js"></script>
+ <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(/fonts/Lato-Medium.ttf)"
- );
+ // 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(/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>
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ takeScreenshot();
+ });
+ }
+ </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>
+</html>
diff --git a/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html
new file mode 100644
index 00000000000..a11e838799c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.text.measure.lang</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<style>
+@font-face {
+ font-family: Lato-Medium;
+ src: url("/fonts/Lato-Medium.ttf");
+}
+</style>
+<body class="show_output">
+
+<h1>2d.text.measure.lang</h1>
+<p class="desc">Testing the lang attribute</p>
+
+
+<span style="font-family: Lato-Medium; position: absolute; visibility: hidden">A</span>
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+promise_test(async t => {
+
+ var canvas = document.getElementById('c');
+ var ctx = canvas.getContext('2d');
+
+ await document.fonts.ready;
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'tr';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ _assert(tr_width > en_width, "tr_width > en_width");
+
+}, "Testing the lang attribute");
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html
new file mode 100644
index 00000000000..565308a895b
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/text/2d.text.measure.lang.inherit.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.text.measure.lang.inherit</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<style>
+@font-face {
+ font-family: Lato-Medium;
+ src: url("/fonts/Lato-Medium.ttf");
+}
+</style>
+<body class="show_output">
+
+<h1>2d.text.measure.lang.inherit</h1>
+<p class="desc">Testing the lang attribute</p>
+
+
+<span style="font-family: Lato-Medium; position: absolute; visibility: hidden">A</span>
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"lang="tr"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+promise_test(async t => {
+
+ var canvas = document.getElementById('c');
+ var ctx = canvas.getContext('2d');
+
+ await document.fonts.ready;
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'inherit';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ _assert(tr_width > en_width, "tr_width > en_width");
+
+}, "Testing the lang attribute");
+</script>
+
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 51eff356b8e..d3a4a4089e0 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
@@ -1,46 +1,50 @@
<!doctype HTML>
-<meta charset="utf-8">
-<title>HTML5 Canvas Test Reference: The lang attribute in an offscreen canvas</title>
-<link rel="author" href="mailto:schenney@chromium.org"/>
-<style>
- #canvas-tr {
- position: absolute;
- top: 10px;
- left: 10px;
- }
- #canvas-en {
- position: absolute;
- top: 120px;
- left: 10px;
- }
-</style>
-<script>
- function drawText(language) {
- var canvas = document.getElementById('canvas-' + language);
- var ctx = canvas.getContext('2d');
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test Reference: The lang attribute in an offscreen canvas</title>
+ <link rel="author" href="mailto:schenney@chromium.org"/>
+ <script src="/common/reftest-wait.js"></script>
+ <style>
+ #canvas-tr {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ }
+ #canvas-en {
+ position: absolute;
+ top: 120px;
+ left: 10px;
+ }
+ </style>
+ <script>
+ function drawText(language) {
+ var canvas = document.getElementById('canvas-' + language);
+ var ctx = canvas.getContext('2d');
- 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(/fonts/Lato-Medium.ttf)"
- );
+ 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(/fonts/Lato-Medium.ttf)"
+ );
- test_font.load().then((font) => {
- document.fonts.add(font);
- drawText('tr');
- drawText('en');
- });
- }
-</script>
-<body onload="generateReference()">
- <canvas lang="tr" id="canvas-tr" width="300" height="100">
- Browser does not support HTML5 Canvas.
- </canvas>
- <canvas lang="en" id="canvas-en" width="300" height="100">
- Browser does not support HTML5 Canvas.
- </canvas>
-</body>
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ takeScreenshot();
+ });
+ }
+ </script>
+ <body onload="generateReference()">
+ <canvas lang="tr" id="canvas-tr" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas lang="en" id="canvas-en" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ </body>
+</html>
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 c3c6b36901d..d1d9bc0998d 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
@@ -1,11 +1,12 @@
<!doctype HTML>
-<html lang="en-US">
+<html lang="en-US" class="reftest-wait">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute is respected in offscreen canvas</title>
<link rel="match" href="canvas.2d.offscreen.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="An offscreen canvas respects the lang text attribute." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -45,6 +46,7 @@
document.fonts.add(font);
drawText('tr');
drawText('en');
+ takeScreenshot();
});
}
</script>
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 63b6854cd78..05849f419ff 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,11 +1,12 @@
<!doctype HTML>
-<html lang="tr">
+<html lang="tr" class="reftest-wait">
<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" />
<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="An offscreen canvas inherits the lang from the document." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -45,6 +46,7 @@
drawText('tr');
document.documentElement.setAttribute('lang', 'en');
drawText('en');
+ takeScreenshot();
});
}
</script>
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 06c0db121d0..a6a908b1d18 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
@@ -1,11 +1,12 @@
<!doctype HTML>
-<html lang="en-US">
+<html lang="en-US" class="reftest-wait">
<meta charset="utf-8">
<title>HTML5 Canvas Test: The lang attribute functions in a transferred offscreen</title>
<link rel="match" href="canvas.2d.offscreen.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 setting lang in a transferred offscreen works." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -39,6 +40,7 @@
document.fonts.add(font);
drawText('tr');
drawText('en');
+ takeScreenshot();
});
}
</script>
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 a7561ddd855..3146d078eba 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,11 +1,12 @@
<!doctype HTML>
-<html lang="tr">
+<html lang="tr" class="reftest-wait">
<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" />
<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="An offscreen transferred from a canvas inherits the document language." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -40,6 +41,7 @@
drawText('tr');
document.documentElement.setAttribute('lang', 'en');
drawText('en');
+ takeScreenshot();
});
}
</script>
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 72aab773a5e..1a9b7ec63e1 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
@@ -1,11 +1,12 @@
<!doctype HTML>
-<html lang="en-US">
+<html lang="en-US" class="reftest-wait">
<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" />
<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="An offscreen transferred from a canvas element inherits the canvas language." />
+ <script src="/common/reftest-wait.js"></script>
<style>
#canvas-tr {
position: absolute;
@@ -38,6 +39,7 @@
document.fonts.add(font);
drawText('tr');
drawText('en');
+ takeScreenshot();
});
}
</script>
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 35c87f8c69e..1c2228a7acc 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
@@ -1,49 +1,53 @@
<!doctype HTML>
-<meta charset="utf-8">
-<title>HTML5 Canvas Test Reference: The lang attribute in an offscreen worker</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');
+<html class="reftest-wait">
+ <meta charset="utf-8">
+ <title>HTML5 Canvas Test Reference: The lang attribute in an offscreen worker</title>
+ <link rel="author" href="mailto:schenney@chromium.org"/>
+ <script src="/common/reftest-wait.js"></script>
+ <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');
- ctx.font = '25px Lato-Medium';
- ctx.fillText('fi', 5, 50);
+ ctx.font = '25px Lato-Medium';
+ ctx.fillText('fi', 5, 50);
- ctx.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 1, 1);
- }
- function generateReference() {
- let test_font = new FontFace(
- // Lato-Medium is a font with language specific ligatures.
- "Lato-Medium",
- "url(/fonts/Lato-Medium.ttf)"
- );
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 1, 1);
+ }
+ function generateReference() {
+ let test_font = new FontFace(
+ // Lato-Medium is a font with language specific ligatures.
+ "Lato-Medium",
+ "url(/fonts/Lato-Medium.ttf)"
+ );
- test_font.load().then((font) => {
- document.fonts.add(font);
- drawText('tr');
- drawText('en');
- });
- }
-</script>
-<body onload="generateReference()">
- <canvas lang="en" id="canvas-tr" width="300" height="100">
- Browser does not support HTML5 Canvas.
- </canvas>
- <canvas lang="tr" id="canvas-en" width="300" height="100">
- Browser does not support HTML5 Canvas.
- </canvas>
-</body>
+ test_font.load().then((font) => {
+ document.fonts.add(font);
+ drawText('tr');
+ drawText('en');
+ takeScreenshot();
+ });
+ }
+ </script>
+ <body onload="generateReference()">
+ <canvas lang="en" id="canvas-tr" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ <canvas lang="tr" id="canvas-en" width="300" height="100">
+ Browser does not support HTML5 Canvas.
+ </canvas>
+ </body>
+</html>
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 8ed884a1775..3cd2ec4f42c 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
@@ -20,42 +20,49 @@
}
</style>
<script type="text/javascript">
- function runTest() {
- 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_tr = new Worker('text-lang-worker-tr.js');
- worker_tr.postMessage({canvas: offscreen_tr}, [offscreen_tr]);
+ function createWorker(language) {
+ const placeholder_canvas = document.createElement('canvas');
+ placeholder_canvas.setAttribute('width', '300');
+ placeholder_canvas.setAttribute('height', '100');
+ const offscreen = placeholder_canvas.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 = new Worker('text-lang-worker-' + language + '.js');
+ worker.postMessage({canvas: offscreen}, [offscreen]);
- const worker_en = new Worker('text-lang-worker-en.js');
- worker_en.postMessage({canvas: offscreen_en}, [offscreen_en]);
+ return placeholder_canvas;
+ }
+ function runTest() {
+ const placeholder_canvas_tr = createWorker('tr');
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() {
+ function checkFirstResult() {
// Wait until frame propagates.
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_tr[3] == 0 || pixel_en[3] == 0) {
+ if (pixel_tr[3] == 0) {
// Results not available, wait longer.
- requestAnimationFrame(checkResult);
+ requestAnimationFrame(checkFirstResult);
} else {
- takeScreenshot();
+ const placeholder_canvas_en = createWorker('en');
+ const canvas_en = document.getElementById('canvas-en');
+ const ctx_en = canvas_en.getContext('2d', {willReadFrequently: true});
+ function checkSecondResult() {
+ ctx_en.drawImage(placeholder_canvas_en, 0, 0);
+ const pixel_en = ctx_en.getImageData(0, 0, 1, 1).data;
+
+ if (pixel_en[3] == 0) {
+ // Results not available, wait longer.
+ requestAnimationFrame(checkSecondResult);
+ } else {
+ takeScreenshot();
+ }
+ }
+ requestAnimationFrame(checkSecondResult);
}
}
- requestAnimationFrame(checkResult);
+ requestAnimationFrame(checkFirstResult);
}
</script>
<body onload="runTest()">
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 43157d54d2b..ce437887bc4 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
@@ -20,44 +20,50 @@
}
</style>
<script type="text/javascript">
- function runTest() {
- 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_tr = new Worker('text-lang-worker-inherit.js');
- worker_tr.postMessage({canvas: offscreen_tr}, [offscreen_tr]);
+ function createWorker(language) {
+ const placeholder_canvas = document.createElement('canvas');
+ placeholder_canvas.setAttribute('width', '300');
+ placeholder_canvas.setAttribute('height', '100');
+ placeholder_canvas.setAttribute('lang', language);
+ const offscreen = placeholder_canvas.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 = new Worker('text-lang-worker-inherit.js');
+ worker.postMessage({canvas: offscreen}, [offscreen]);
- const worker_en = new Worker('text-lang-worker-inherit.js');
- worker_en.postMessage({canvas: offscreen_en}, [offscreen_en]);
+ return placeholder_canvas;
+ }
+ function runTest() {
+ const placeholder_canvas_tr = createWorker('tr');
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() {
+ function checkFirstResult() {
// Wait until frame propagates.
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_tr[3] == 0 || pixel_en[3] == 0) {
+ if (pixel_tr[3] == 0) {
// Results not available, wait longer.
- requestAnimationFrame(checkResult);
+ requestAnimationFrame(checkFirstResult);
} else {
- takeScreenshot();
+ const placeholder_canvas_en = createWorker('en');
+ const canvas_en = document.getElementById('canvas-en');
+ const ctx_en = canvas_en.getContext('2d', {willReadFrequently: true});
+ function checkSecondResult() {
+ ctx_en.drawImage(placeholder_canvas_en, 0, 0);
+ const pixel_en = ctx_en.getImageData(0, 0, 1, 1).data;
+
+ if (pixel_en[3] == 0) {
+ // Results not available, wait longer.
+ requestAnimationFrame(checkSecondResult);
+ } else {
+ takeScreenshot();
+ }
+ }
+ requestAnimationFrame(checkSecondResult);
}
}
- requestAnimationFrame(checkResult);
+ requestAnimationFrame(checkFirstResult);
}
</script>
<body onload="runTest()">
diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html
new file mode 100644
index 00000000000..22183f94342
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>OffscreenCanvas test: 2d.text.measure.lang</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.text.measure.lang</h1>
+<p class="desc">Testing the lang attribute</p>
+
+
+<script>
+promise_test(async t => {
+
+ var canvas = new OffscreenCanvas(100, 50);
+ var ctx = canvas.getContext('2d');
+
+ var f = new FontFace("Lato-Medium", "url('/fonts/Lato-Medium.ttf')");
+ f.load();
+ document.fonts.add(f);
+ await document.fonts.ready;
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'tr';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ _assert(tr_width > en_width, "tr_width > en_width");
+
+}, "Testing the lang attribute");
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html
new file mode 100644
index 00000000000..8b630794e1d
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.inherit.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>OffscreenCanvas test: 2d.text.measure.lang.inherit</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.text.measure.lang.inherit</h1>
+<p class="desc">Testing the lang attribute</p>
+
+
+<script>
+promise_test(async t => {
+
+ var canvas = new OffscreenCanvas(100, 50);
+ var ctx = canvas.getContext('2d');
+
+ document.documentElement.setAttribute('lang','tr');
+ var f = new FontFace("Lato-Medium", "url('/fonts/Lato-Medium.ttf')");
+ f.load();
+ document.fonts.add(f);
+ await document.fonts.ready;
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'inherit';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ _assert(tr_width > en_width, "tr_width > en_width");
+
+}, "Testing the lang attribute");
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js
new file mode 100644
index 00000000000..5bbb2317f24
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/text/2d.text.measure.lang.worker.js
@@ -0,0 +1,30 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.text.measure.lang
+// Description:Testing the lang attribute
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+promise_test(async t => {
+ var canvas = new OffscreenCanvas(100, 50);
+ var ctx = canvas.getContext('2d');
+
+ var f = new FontFace("Lato-Medium", "url('/fonts/Lato-Medium.ttf')");
+ f.load();
+ self.fonts.add(f);
+ await self.fonts.ready;
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'tr';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ _assert(tr_width > en_width, "tr_width > en_width");
+}, "Testing the lang attribute");
+done();
diff --git a/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js b/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js
index f5410efca5b..2cb50c322f7 100644
--- a/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js
+++ b/tests/wpt/tests/html/canvas/resources/canvas-promise-test-worker.js
@@ -9,7 +9,8 @@ function canvasPromiseTest(
testBody, description,
{testTypes = Object.values(CanvasTestType)} = {}) {
if (testTypes.includes(CanvasTestType.WORKER)) {
- promise_test(() => testBody(new OffscreenCanvas(300, 150)),
+ promise_test(() => testBody(new OffscreenCanvas(300, 150),
+ {canvasType: CanvasTestType.WORKER}),
'Worker: ' + description);
}
}
diff --git a/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js b/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js
index 1b2e2b3a584..09e01633ace 100644
--- a/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js
+++ b/tests/wpt/tests/html/canvas/resources/canvas-promise-test.js
@@ -83,18 +83,20 @@ function canvasPromiseTest(
}
const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
- await testBody(canvas);
+ await testBody(canvas, {canvasType: CanvasTestType.HTML});
document.body.removeChild(canvas);
}, 'HTMLCanvasElement: ' + description);
}
if (testTypes.includes(CanvasTestType.DETACHED_HTML)) {
- promise_test(() => testBody(document.createElement('canvas')),
+ promise_test(() => testBody(document.createElement('canvas'),
+ {canvasType: CanvasTestType.DETACHED_HTML}),
'Detached HTMLCanvasElement: ' + description);
}
if (testTypes.includes(CanvasTestType.OFFSCREEN)) {
- promise_test(() => testBody(new OffscreenCanvas(300, 150)),
+ promise_test(() => testBody(new OffscreenCanvas(300, 150),
+ {canvasType: CanvasTestType.OFFSCREEN}),
'OffscreenCanvas: ' + description);
}
}
diff --git a/tests/wpt/tests/html/canvas/tools/yaml/text.yaml b/tests/wpt/tests/html/canvas/tools/yaml/text.yaml
index 48a0429f267..900431860e2 100644
--- a/tests/wpt/tests/html/canvas/tools/yaml/text.yaml
+++ b/tests/wpt/tests/html/canvas/tools/yaml/text.yaml
@@ -2718,6 +2718,67 @@
@assert ctx.letterSpacing === '1px';
@assert ctx.wordSpacing === '10px';
+- name: 2d.text.measure.lang
+ desc: Testing the lang attribute
+ test_type: promise
+ fonts:
+ - Lato-Medium
+ code: |
+ {{ load_font }}
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'tr';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ @assert tr_width > en_width;
+ variants:
+ - *load-font-variant-definition
+
+- name: 2d.text.measure.lang.inherit
+ desc: Testing the lang attribute
+ test_type: promise
+ canvas_types: ['HtmlCanvas', 'OffscreenCanvas']
+ fonts:
+ - Lato-Medium
+ canvas: 'lang="tr"'
+ code: |
+ {{ load_font }}
+
+ ctx.font = '50px Lato-Medium';
+ ctx.lang = 'inherit';
+ const text = 'fi';
+ const tm_tr = ctx.measureText(text);
+ const tr_width = tm_tr.width;
+
+ ctx.lang = 'en';
+ const tm_en = ctx.measureText(text);
+ const en_width = tm_en.width;
+
+ @assert tr_width > en_width;
+ variants:
+ - &load-font-variant-definitio-and-set-lang
+ HtmlCanvas:
+ append_variants_to_name: false
+ canvas_types: ['HtmlCanvas']
+ load_font: |-
+ await document.fonts.ready;
+ OffscreenCanvas:
+ append_variants_to_name: false
+ canvas_types: ['OffscreenCanvas']
+ load_font: |-
+ document.documentElement.setAttribute('lang','tr');
+ var f = new FontFace("{{ fonts[0] }}", "url('/fonts/{{ fonts[0] }}.ttf')");
+ f.load();
+ {% set root = 'self' if canvas_type == 'Worker' else 'document' %}
+ {{ root }}.fonts.add(f);
+ await {{ root }}.fonts.ready;
+
- name: 2d.text.drawing.style.font-relative.spacing
desc: Testing letter spacing and word spacing with font-relative length
code: |
diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html
index 2b428aa65bd..2caeed7dd00 100644
--- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html
+++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-01.html
@@ -8,12 +8,111 @@
<div id="log"></div>
<div id="test">
<img id="a" name="b">
+<img id="test" name="test">
+<img id="test2a" name="test2b">
+<img id="test3a" name="test3b">
+<img id="test4a" name="test4b">
+<img id="test5a" name="test5b">
+<img id="test6a" name="test6b">
</div>
<script>
test(function() {
- assert_equals(document.a, document.getElementsByTagName("img")[0]);
- assert_equals(document['a'], document.getElementsByTagName("img")[0]);
- assert_equals(document.b, document.getElementsByTagName("img")[0]);
- assert_equals(document['b'], document.getElementsByTagName("img")[0]);
+ let img = document.getElementsByTagName("img")[0];
+ assert_equals(document.a, img);
+ assert_equals(document['a'], img);
+ assert_equals(document.b, img);
+ assert_equals(document['b'], img);
}, "img elements that have a name and id attribute, should be accessible by both values.");
+
+test(function() {
+ let img = document.getElementsByTagName("img")[1];
+ assert_equals(document.test, img);
+ assert_equals(document['test'], img);
+}, "img elements that have a name and id attribute with same value.");
+
+test(function() {
+ let img = document.getElementsByTagName("img")[2];
+ assert_equals(document.test2a, img);
+ assert_equals(document['test2a'], img);
+ assert_equals(document.test2b, img);
+ assert_equals(document['test2b'], img);
+
+ img.removeAttribute("name");
+ assert_equals(document.test2a, undefined);
+ assert_equals(document['test2a'], undefined);
+ assert_equals(document.test2b, undefined);
+ assert_equals(document['test2b'], undefined);
+}, "Dynamically removing the name attribute from img elements, should not be accessible.");
+
+test(function() {
+ let img = document.getElementsByTagName("img")[3];
+ assert_equals(document.test3a, img);
+ assert_equals(document['test3a'], img);
+ assert_equals(document.test3b, img);
+ assert_equals(document['test3b'], img);
+
+ img.removeAttribute("id");
+ assert_equals(document.test3a, undefined);
+ assert_equals(document['test3a'], undefined);
+ assert_equals(document.test3b, img);
+ assert_equals(document['test3b'], img);
+}, "Dynamically removing the id attribute from img elements, should still be accessible by name value.");
+
+test(function() {
+ let img = document.getElementsByTagName("img")[4];
+ assert_equals(document.test4a, img);
+ assert_equals(document['test4a'], img);
+ assert_equals(document.test4b, img);
+ assert_equals(document['test4b'], img);
+
+ img.name = 'test4a';
+ assert_equals(document.test4a, img);
+ assert_equals(document['test4a'], img);
+ assert_equals(document.test4b, undefined);
+ assert_equals(document['test4b'], undefined);
+
+ img.name = 'test4c';
+ assert_equals(document.test4a, img);
+ assert_equals(document['test4a'], img);
+ assert_equals(document.test4b, undefined);
+ assert_equals(document['test4b'], undefined);
+ assert_equals(document.test4c, img);
+ assert_equals(document['test4c'], img);
+}, "Dynamically updating the name attribute from img elements, should be accessible by values.");
+
+test(function() {
+ let img = document.getElementsByTagName("img")[5];
+ assert_equals(document.test5a, img);
+ assert_equals(document['test5a'], img);
+ assert_equals(document.test5b, img);
+ assert_equals(document['test5b'], img);
+
+ img.id = 'test5b';
+ assert_equals(document.test5a, undefined);
+ assert_equals(document['test5a'], undefined);
+ assert_equals(document.test5b, img);
+ assert_equals(document['test5b'], img);
+
+ img.id = 'test5c';
+ assert_equals(document.test5a, undefined);
+ assert_equals(document['test5a'], undefined);
+ assert_equals(document.test5b, img);
+ assert_equals(document['test5b'], img);
+ assert_equals(document.test5c, img);
+ assert_equals(document['test5c'], img);
+}, "Dynamically updating the id attribute from img elements, should be accessible by values.");
+
+test(function() {
+ let img = document.getElementsByTagName("img")[6];
+ assert_equals(document.test6a, img);
+ assert_equals(document['test6a'], img);
+ assert_equals(document.test6b, img);
+ assert_equals(document['test6b'], img);
+
+ img.remove();
+ assert_equals(document.test6a, undefined);
+ assert_equals(document['test6a'], undefined);
+ assert_equals(document.test6b, undefined);
+ assert_equals(document['test6b'], undefined);
+}, "img elements that is removed, should not be accessible.");
</script>
diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html
index 8c3155e7e4c..84cf64c1ffc 100644
--- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html
+++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-02.html
@@ -25,6 +25,14 @@
<iframe name="fail" id="test7"></iframe>
<iframe name="42"></iframe>
+
+<iframe name="test9" id="test9"></iframe>
+
+<iframe></iframe>
+
+<iframe name="test11a"></iframe>
+
+<iframe name="test12"></iframe>
</div>
<script>
test(function() {
@@ -96,4 +104,71 @@ test(function() {
assert_true(42 in document, '42 in document should be true');
assert_equals(document[42], iframe.contentWindow);
}, "An iframe whose name looks like an array index should work.");
+
+test(function() {
+ var iframe = document.getElementsByTagName("iframe")[9];
+ assert_equals(iframe.name, "test9");
+
+ assert_true("test9" in document, 'test9 in document should be true');
+ assert_equals(document["test9"], iframe.contentWindow);
+ assert_equals(document.test9, iframe.contentWindow);
+
+ iframe.removeAttribute("name");
+ assert_false("test9" in document, 'test9 in document should be false');
+ assert_equals(document["test9"], undefined);
+ assert_equals(document.test9, undefined);
+}, "Dynamically removing the name attribute from iframe elements, should not be accessible.");
+
+test(function() {
+ var iframe = document.getElementsByTagName("iframe")[10];
+ iframe.setAttribute("name", "test10a");
+
+ assert_true("test10a" in document, 'test10a in document should be true');
+ assert_equals(document["test10a"], iframe.contentWindow);
+ assert_equals(document.test10a, iframe.contentWindow);
+
+ iframe.setAttribute("name", "test10b");
+ assert_false("test10a" in document, 'test10a in document should be false');
+ assert_equals(document["test10a"], undefined);
+ assert_equals(document.test10a, undefined);
+ assert_true("test10b" in document, 'test10b in document should be true');
+ assert_equals(document["test10b"], iframe.contentWindow);
+ assert_equals(document.test10b, iframe.contentWindow);
+}, "Dynamically updating the name attribute from iframe elements, should be accessible by its name.");
+
+test(function() {
+ var iframe = document.getElementsByTagName("iframe")[11];
+ assert_equals(iframe.name, "test11a");
+
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], iframe.contentWindow);
+ assert_equals(document.test11a, iframe.contentWindow);
+
+ iframe.setAttribute("id", "test11a");
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], iframe.contentWindow);
+ assert_equals(document.test11a, iframe.contentWindow);
+
+ iframe.setAttribute("id", "test11b");
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], iframe.contentWindow);
+ assert_equals(document.test11a, iframe.contentWindow);
+ assert_false("test11b" in document, 'test11b in document should be false');
+ assert_equals(document["test11b"], undefined);
+ assert_equals(document.test11b, undefined);
+}, "Dynamically updating the id attribute from iframe elements, should be accessible only by its name.");
+
+test(function() {
+ var iframe = document.getElementsByTagName("iframe")[12];
+ assert_equals(iframe.name, "test12");
+
+ assert_true("test12" in document, 'test12 in document should be true');
+ assert_equals(document["test12"], iframe.contentWindow);
+ assert_equals(document.test12, iframe.contentWindow);
+
+ iframe.remove();
+ assert_false("test12" in document, 'test12 in document should be false');
+ assert_equals(document["test12"], undefined);
+ assert_equals(document.test12, undefined);
+}, "iframe elements that is removed, should not be accessible.");
</script>
diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html
index b7c3ef8e9bb..2b4a3c55b71 100644
--- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html
+++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-04.html
@@ -26,6 +26,14 @@
<form id=test7 name=fail></form>
<form name=test8 id=fail></form>
+
+<form name=test9 id=test9></form>
+
+<form></form>
+
+<form name="test11a"></form>
+
+<form name="test12"></form>
</div>
<script>
test(function() {
@@ -101,4 +109,71 @@ test(function() {
assert_true("test8" in document, '"test8" in document should be true');
assert_equals(document.test8, form);
}, "An id shouldn't affect getting an form by name");
+
+test(function() {
+ var form = document.getElementsByTagName("form")[12];
+ assert_equals(form.name, "test9");
+
+ assert_true("test9" in document, 'test9 in document should be true');
+ assert_equals(document["test9"], form);
+ assert_equals(document.test9, form);
+
+ form.removeAttribute("name");
+ assert_false("test9" in document, 'test9 in document should be false');
+ assert_equals(document["test9"], undefined);
+ assert_equals(document.test9, undefined);
+}, "Dynamically removing the name attribute from form elements, should not be accessible.");
+
+test(function() {
+ var form = document.getElementsByTagName("form")[13];
+ form.setAttribute("name", "test10a");
+
+ assert_true("test10a" in document, 'test10a in document should be true');
+ assert_equals(document["test10a"], form);
+ assert_equals(document.test10a, form);
+
+ form.setAttribute("name", "test10b");
+ assert_false("test10a" in document, 'test10a in document should be false');
+ assert_equals(document["test10a"], undefined);
+ assert_equals(document.test10a, undefined);
+ assert_true("test10b" in document, 'test10b in document should be true');
+ assert_equals(document["test10b"], form);
+ assert_equals(document.test10b, form);
+}, "Dynamically updating the name attribute from form elements, should be accessible by its name.");
+
+test(function() {
+ var form = document.getElementsByTagName("form")[14];
+ assert_equals(form.name, "test11a");
+
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], form);
+ assert_equals(document.test11a, form);
+
+ form.setAttribute("id", "test11a");
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], form);
+ assert_equals(document.test11a, form);
+
+ form.setAttribute("id", "test11b");
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], form);
+ assert_equals(document.test11a, form);
+ assert_false("test11b" in document, 'test11b in document should be false');
+ assert_equals(document["test11b"], undefined);
+ assert_equals(document.test11b, undefined);
+}, "Dynamically updating the id attribute from form elements, should be accessible only by its name.");
+
+test(function() {
+ var form = document.getElementsByTagName("form")[15];
+ assert_equals(form.name, "test12");
+
+ assert_true("test12" in document, 'test12 in document should be true');
+ assert_equals(document["test12"], form);
+ assert_equals(document.test12, form);
+
+ form.remove();
+ assert_false("test12" in document, 'test12 in document should be false');
+ assert_equals(document["test12"], undefined);
+ assert_equals(document.test12, undefined);
+}, "form elements that is removed, should not be accessible.");
</script>
diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html
index 843ce357962..b38872498b6 100644
--- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html
+++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-05.html
@@ -26,6 +26,14 @@
<embed id=test7 name=fail></embed>
<embed name=test8 id=fail></embed>
+
+<embed name="test9" id="test9"></embed>
+
+<embed></embed>
+
+<embed name="test11a"></embed>
+
+<embed name="test12"></embed>
</div>
<script>
test(function() {
@@ -101,4 +109,71 @@ test(function() {
assert_true("test8" in document, '"test8" in document should be true');
assert_equals(document.test8, embed);
}, "An id shouldn't affect getting an embed by name");
+
+test(function() {
+ var embed = document.getElementsByTagName("embed")[12];
+ assert_equals(embed.name, "test9");
+
+ assert_true("test9" in document, 'test9 in document should be true');
+ assert_equals(document["test9"], embed);
+ assert_equals(document.test9, embed);
+
+ embed.removeAttribute("name");
+ assert_false("test9" in document, 'test9 in document should be false');
+ assert_equals(document["test9"], undefined);
+ assert_equals(document.test9, undefined);
+}, "Dynamically removing the name attribute from embed elements, should not be accessible.");
+
+test(function() {
+ var embed = document.getElementsByTagName("embed")[13];
+ embed.setAttribute("name", "test10a");
+
+ assert_true("test10a" in document, 'test10a in document should be true');
+ assert_equals(document["test10a"], embed);
+ assert_equals(document.test10a, embed);
+
+ embed.setAttribute("name", "test10b");
+ assert_false("test10a" in document, 'test10a in document should be false');
+ assert_equals(document["test10a"], undefined);
+ assert_equals(document.test10a, undefined);
+ assert_true("test10b" in document, 'test10b in document should be true');
+ assert_equals(document["test10b"], embed);
+ assert_equals(document.test10b, embed);
+}, "Dynamically updating the name attribute from embed elements, should be accessible by its name.");
+
+test(function() {
+ var embed = document.getElementsByTagName("embed")[14];
+ assert_equals(embed.name, "test11a");
+
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], embed);
+ assert_equals(document.test11a, embed);
+
+ embed.setAttribute("id", "test11a");
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], embed);
+ assert_equals(document.test11a, embed);
+
+ embed.setAttribute("id", "test11b");
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], embed);
+ assert_equals(document.test11a, embed);
+ assert_false("test11b" in document, 'test11b in document should be false');
+ assert_equals(document["test11b"], undefined);
+ assert_equals(document.test11b, undefined);
+}, "Dynamically updating the id attribute from embed elements, should be accessible only by its name.");
+
+test(function() {
+ var embed = document.getElementsByTagName("embed")[15];
+ assert_equals(embed.name, "test12");
+
+ assert_true("test12" in document, 'test12 in document should be true');
+ assert_equals(document["test12"], embed);
+ assert_equals(document.test12, embed);
+
+ embed.remove();
+ assert_false("test12" in document, 'test12 in document should be false');
+ assert_equals(document["test12"], undefined);
+ assert_equals(document.test12, undefined);
+}, "embed elements that is removed, should not be accessible.");
</script>
diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html
index 15a72b5f6ba..592535f0d6a 100644
--- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html
+++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-06.html
@@ -23,9 +23,11 @@
<img id=test6>
<img name=test6>
-<img id=test7 name=fail>
+<img name="test7">
-<img name=test8 id=fail>
+<img>
+
+<img name="test9">
</div>
<script>
test(function() {
@@ -88,17 +90,46 @@ test(function() {
test(function() {
var img = document.getElementsByTagName("img")[10];
- assert_equals(img.id, "test7");
+ assert_equals(img.name, "test7");
- assert_true("test7" in document, '"test7" in document should be true');
+ assert_true("test7" in document, 'test7 in document should be true');
+ assert_equals(document["test7"], img);
assert_equals(document.test7, img);
-}, "A name should affect getting an img by id");
+
+ img.removeAttribute("name");
+ assert_false("test7" in document, 'test7 in document should be false');
+ assert_equals(document["test7"], undefined);
+ assert_equals(document.test7, undefined);
+}, "Dynamically removing the name attribute from img elements, should not be accessible.");
test(function() {
var img = document.getElementsByTagName("img")[11];
- assert_equals(img.name, "test8");
+ img.setAttribute("name", "test8a");
+
+ assert_true("test8a" in document, 'test8a in document should be true');
+ assert_equals(document["test8a"], img);
+ assert_equals(document.test8a, img);
- assert_true("test8" in document, '"test8" in document should be true');
- assert_equals(document.test8, img);
-}, "An id shouldn't affect getting an img by name");
+ img.setAttribute("name", "test8b");
+ assert_false("test8a" in document, 'test8a in document should be false');
+ assert_equals(document["test8a"], undefined);
+ assert_equals(document.test8a, undefined);
+ assert_true("test8b" in document, 'test8b in document should be true');
+ assert_equals(document["test8b"], img);
+ assert_equals(document.test8b, img);
+}, "Dynamically updating the name attribute from img elements, should be accessible by its name.");
+
+test(function() {
+ var img = document.getElementsByTagName("img")[12];
+ assert_equals(img.name, "test9");
+
+ assert_true("test9" in document, 'test9 in document should be true');
+ assert_equals(document["test9"], img);
+ assert_equals(document.test9, img);
+
+ img.remove();
+ assert_false("test9" in document, 'test9 in document should be false');
+ assert_equals(document["test9"], undefined);
+ assert_equals(document.test9, undefined);
+}, "img elements that is removed, should not be accessible.");
</script>
diff --git a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html
index fc3f06c01b9..69a3bb0f09a 100644
--- a/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html
+++ b/tests/wpt/tests/html/dom/documents/dom-tree-accessors/nameditem-07.html
@@ -22,9 +22,15 @@
<object id=test6></object>
<object name=test6></object>
-<object id=test7 name=fail></object>
+<object name=test7></object>
-<object name=test8 id=fail></object>
+<object id=test8></object>
+
+<object id=test9a></object>
+
+<object name=test10a></object>
+
+<object name=test11a id=test11b></object>
</div>
<script>
test(function() {
@@ -93,17 +99,114 @@ test(function() {
test(function() {
var object = document.getElementsByTagName("object")[10];
- assert_equals(object.id, "test7");
+ assert_equals(object.name, "test7");
- assert_true("test7" in document, '"test7" in document should be true');
+ assert_true("test7" in document, 'test7 in document should be true');
+ assert_equals(document["test7"], object);
assert_equals(document.test7, object);
-}, "A name shouldn't affect getting an object by id");
+
+ object.removeAttribute("name");
+ assert_false("test7" in document, 'test7 in document should be false');
+ assert_equals(document["test7"], undefined);
+ assert_equals(document.test7, undefined);
+}, "Dynamically removing the name attribute from object elements, should not be accessible.");
test(function() {
var object = document.getElementsByTagName("object")[11];
- assert_equals(object.name, "test8");
+ assert_equals(object.id, "test8");
- assert_true("test8" in document, '"test8" in document should be true');
+ assert_true("test8" in document, 'test8 in document should be true');
+ assert_equals(document["test8"], object);
assert_equals(document.test8, object);
-}, "An id shouldn't affect getting an object by name");
+
+ object.removeAttribute("id");
+ assert_false("test8" in document, 'test8 in document should be false');
+ assert_equals(document["test8"], undefined);
+ assert_equals(document.test8, undefined);
+}, "Dynamically removing the id attribute from object elements, should not be accessible.");
+
+test(function() {
+ var object = document.getElementsByTagName("object")[12];
+ assert_equals(object.id, "test9a");
+ assert_true("test9a" in document, 'test9a in document should be true');
+ assert_equals(document["test9a"], object);
+ assert_equals(document.test9a, object);
+
+ object.setAttribute("name", "test9a");
+ assert_true("test9a" in document, 'test9a in document should be true');
+ assert_equals(document["test9a"], object);
+ assert_equals(document.test9a, object);
+
+ object.setAttribute("name", "test9b");
+ assert_true("test9a" in document, 'test9a in document should be true');
+ assert_equals(document["test9a"], object);
+ assert_equals(document.test9a, object);
+ assert_true("test9b" in document, 'test9b in document should be true');
+ assert_equals(document["test9b"], object);
+ assert_equals(document.test9b, object);
+
+ object.setAttribute("name", "test9c");
+ assert_true("test9a" in document, 'test9a in document should be true');
+ assert_equals(document["test9a"], object);
+ assert_equals(document.test9a, object);
+ assert_false("test9b" in document, 'test9b in document should be false');
+ assert_equals(document["test9b"], undefined);
+ assert_equals(document.test9b, undefined);
+ assert_true("test9c" in document, 'test9c in document should be true');
+ assert_equals(document["test9c"], object);
+ assert_equals(document.test9c, object);
+}, "Dynamically updating the name attribute from object elements, should be accessible by its name and id.");
+
+test(function() {
+ var object = document.getElementsByTagName("object")[13];
+ assert_equals(object.name, "test10a");
+ assert_true("test10a" in document, 'test11a in document should be true');
+ assert_equals(document["test10a"], object);
+ assert_equals(document.test10a, object);
+
+ object.setAttribute("id", "test10a");
+ assert_true("test10a" in document, 'test10a in document should be true');
+ assert_equals(document["test10a"], object);
+ assert_equals(document.test10a, object);
+
+ object.setAttribute("id", "test10b");
+ assert_true("test10a" in document, 'test10a in document should be true');
+ assert_equals(document["test10a"], object);
+ assert_equals(document.test10a, object);
+ assert_true("test10b" in document, 'test10b in document should be false');
+ assert_equals(document["test10b"], object);
+ assert_equals(document.test10b, object);
+
+ object.setAttribute("id", "test10c");
+ assert_true("test10a" in document, 'test10a in document should be true');
+ assert_equals(document["test10a"], object);
+ assert_equals(document.test10a, object);
+ assert_false("test10b" in document, 'test10b in document should be false');
+ assert_equals(document["test10b"], undefined);
+ assert_equals(document.test10b, undefined);
+ assert_true("test10c" in document, 'test10b in document should be false');
+ assert_equals(document["test10c"], object);
+ assert_equals(document.test10c, object);
+}, "Dynamically updating the id attribute from object elements, should be accessible by its name and id.");
+
+test(function() {
+ var object = document.getElementsByTagName("object")[14];
+ assert_equals(object.name, "test11a");
+ assert_equals(object.id, "test11b");
+
+ assert_true("test11a" in document, 'test11a in document should be true');
+ assert_equals(document["test11a"], object);
+ assert_equals(document.test11a, object);
+ assert_true("test11b" in document, 'test11b in document should be true');
+ assert_equals(document["test11b"], object);
+ assert_equals(document.test11b, object);
+
+ object.remove();
+ assert_false("test11a" in document, 'test11a in document should be false');
+ assert_equals(document["test11a"], undefined);
+ assert_equals(document.test11a, undefined);
+ assert_false("test11b" in document, 'test11b in document should be false');
+ assert_equals(document["test11b"], undefined);
+ assert_equals(document.test11b, undefined);
+}, "object elements that is removed, should not be accessible.");
</script>
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html
new file mode 100644
index 00000000000..3ef1fefc4f8
--- /dev/null
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-040.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/utils.js"></script>
+<title>`link rel=expect` is unblocked for dynamically inserted element</title>
+
+<link rel=expect href="#target" blocking="render">
+<script>
+async_test((t) => {
+ requestAnimationFrame(() => {
+ t.step(() => assert_true(!!document.getElementById("target"), "The target element should be present when rendering is unblocked"));
+ t.step(() => assert_false(!!document.getElementById("last"), "the target element should unblock rendering"));
+ t.done();
+ });
+}, "blocking defers frames until full parsing");
+</script>
+</head>
+<body>
+ <div id="first">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue
+ nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit
+ tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies
+ tempor mi est eget ipsum egestas.
+ </div>
+ <script>
+ generateParserDelay();
+ </script>
+ <a id="fold">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue
+ nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit
+ tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies
+ tempor mi est eget ipsum egestas.
+ </a>
+ <script>
+ const target = document.createElement("div");
+ target.id = "target";
+ document.body.append(target);
+ </script>
+ <script>
+ generateParserDelay();
+ </script>
+ <div id="last">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue
+ nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit
+ tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies
+ tempor mi est eget ipsum egestas.
+ </div>
+</body>
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html
new file mode 100644
index 00000000000..c6d87710f7e
--- /dev/null
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-041.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/utils.js"></script>
+<title>`link rel=expect` is unblocked for dynamically inserted anchor with name</title>
+
+<link rel=expect href="#target" blocking="render">
+<script>
+async_test((t) => {
+ requestAnimationFrame(() => {
+ t.step(() => assert_equals(document.getElementsByName("target").length, 1, "The target element should be present when rendering is unblocked"));
+ t.step(() => assert_equals(document.getElementById("last"), null, "the target element should unblock rendering"));
+ t.done();
+ });
+}, "blocking defers frames until full parsing");
+</script>
+</head>
+<body>
+ <div id="first">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue
+ nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit
+ tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies
+ tempor mi est eget ipsum egestas.
+ </div>
+ <script>
+ generateParserDelay();
+ </script>
+ <a id="fold">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue
+ nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit
+ tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies
+ tempor mi est eget ipsum egestas.
+ </a>
+ <script>
+ const target = document.createElement("a");
+ target.name = "target";
+ document.body.append(target);
+ </script>
+ <script>
+ generateParserDelay();
+ </script>
+ <div id="last">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum augue
+ nibh, venenatis a ligula in, tempus pharetra urna. Fusce semper, velit
+ tincidunt lobortis sollicitudin, sapien velit fermentum odio, ultricies
+ tempor mi est eget ipsum egestas.
+ </div>
+</body>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-element-fragment-navigation.html b/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-element-fragment-navigation.html
index 812a55f3187..9be5f9baa6d 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-element-fragment-navigation.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-element-fragment-navigation.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8">
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#the-hidden-attribute:event-beforematch">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-scroll-to-text-fragment.html b/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-scroll-to-text-fragment.html
index dddab4c6ba8..618493addea 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-scroll-to-text-fragment.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/beforematch-scroll-to-text-fragment.html
@@ -2,7 +2,7 @@
<meta charset="utf-8">
<title>beforematch fired on ScrollToTextFragment</title>
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#the-hidden-attribute:event-beforematch">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-001.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-001.html
index 3c87b985dcc..0fa46f523cd 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-001.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-001.html
@@ -4,7 +4,7 @@
<meta charset="utf8">
<title>content-visibility changes after a delay</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<link rel="match" href="./resources/container-ref.html">
<meta name="assert" content="scrollIntoView has no effect on hidden=until-found">
<script src="/common/reftest-wait.js"></script>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-002.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-002.html
index a454e3a0091..e947274bedb 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-002.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-002.html
@@ -2,7 +2,7 @@
<meta charset="utf8">
<title>Content Visibility: tab order navigation ignores hidden=until-found subtrees</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<meta name="assert" content="tab order navigation ignores hidden=until-found subtrees.">
<script src="/resources/testharness.js"></script>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-004.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-004.html
index 3ca6feb7a3d..2c0c643c307 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-004.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-004.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>hidden=until-found does not paint</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<link rel="match" href="./resources/container-ref.html">
<meta name="assert" content="content-visibility subtrees are not painted">
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005-ref.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005-ref.html
index 0ca77849a46..e128e1e7139 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005-ref.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005-ref.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>Content Visibility: hidden-matchable and size contained (reference)</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<style>
div {
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005.html
index fabf636ec94..2c4df955aee 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-005.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>hidden=until-found and size contained</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<link rel="match" href="hidden-until-found-005-ref.html">
<meta name="assert" content="hidden=until-found puts in size containment">
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-006-ref.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-006-ref.html
index e14ba82c278..d8b9761694c 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-006-ref.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-006-ref.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>content-visibility hidden-matchable + scrollIntoView (reference)</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<style>
.spacer {
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-007.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-007.html
index 7b11a92cc93..64c39c4153a 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-007.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-007.html
@@ -4,7 +4,7 @@
<meta charset="utf8">
<title>hidden=until-found + focus</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<link rel="match" href="./resources/spacer-and-container-ref.html">
<meta name="assert" content="focus does not scroll or focus element under hidden=until-found">
<script src="/common/reftest-wait.js"></script>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-text-fragment.html b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-text-fragment.html
index 05220f7ce11..aa8a989509f 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-text-fragment.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/hidden-until-found-text-fragment.html
@@ -2,7 +2,7 @@
<meta charset="utf-8">
<title>beforematch fired on ScrollToTextFragment</title>
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/resources/container-ref.html b/tests/wpt/tests/html/editing/the-hidden-attribute/resources/container-ref.html
index e2df59014b0..53986abdd1f 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/resources/container-ref.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/resources/container-ref.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>CSS Content Visibility: container (reference)</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<style>
#container {
diff --git a/tests/wpt/tests/html/editing/the-hidden-attribute/resources/spacer-and-container-ref.html b/tests/wpt/tests/html/editing/the-hidden-attribute/resources/spacer-and-container-ref.html
index 816a6c9a9d8..474da707083 100644
--- a/tests/wpt/tests/html/editing/the-hidden-attribute/resources/spacer-and-container-ref.html
+++ b/tests/wpt/tests/html/editing/the-hidden-attribute/resources/spacer-and-container-ref.html
@@ -3,7 +3,7 @@
<meta charset="utf8">
<title>Content Visibility: spacer and a container (reference)</title>
<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#attr-hidden-until-found">
<style>
.spacer {
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html b/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html
new file mode 100644
index 00000000000..ba3d8241f0f
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles-quirks.html
@@ -0,0 +1,238 @@
+<!-- This file is the same as lists-styles.html except:
+- no doctype
+- different title
+- added quirks mode styles
+-->
+<title>quirks mode - default styles and preshints for ol, ul, menu, li, dir, dl, dt, dd</title>
+<meta name="viewport" content="width=device-width">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/rendering/support/test-ua-stylesheet.js"></script>
+<style>
+/* Specify this bogus namespace, so the rules in this stylesheet only apply to the `fakeClone`d elements in #refs, not the HTML elements in #tests. */
+@namespace url(urn:not-html);
+
+dir, dd, dl, dt, menu, ol, ul { display: block; }
+li { display: list-item; text-align: match-parent; }
+
+dir, dl, menu, ol, ul { margin-block-start: 1em; margin-block-end: 1em; }
+
+:is(dir, dl, menu, ol, ul) :is(dir, dl, menu, ol, ul) {
+ margin-block-start: 0; margin-block-end: 0;
+}
+
+dd { margin-inline-start: 40px; }
+dir, menu, ol, ul { padding-inline-start: 40px; }
+
+ol, ul, menu { counter-reset: list-item; }
+ol { list-style-type: decimal; }
+
+dir, menu, ul {
+ list-style-type: disc;
+}
+:is(dir, menu, ol, ul) :is(dir, menu, ul) {
+ list-style-type: circle;
+}
+:is(dir, menu, ol, ul) :is(dir, menu, ol, ul) :is(dir, menu, ul) {
+ list-style-type: square;
+}
+
+/* preshints */
+ol[type="1"], li[type="1"] { list-style-type: decimal; }
+/* use classes due to lack of support for "s" annotation */
+ol[class=type-a], li[class=type-a] { list-style-type: lower-alpha; }
+ol[class=type-A], li[class=type-A] { list-style-type: upper-alpha; }
+ol[class=type-i], li[class=type-i] { list-style-type: lower-roman; }
+ol[class=type-I], li[class=type-I] { list-style-type: upper-roman; }
+ul[type=none i], li[type=none i] { list-style-type: none; }
+ul[type=disc i], li[type=disc i] { list-style-type: disc; }
+ul[type=circle i], li[type=circle i] { list-style-type: circle; }
+ul[type=square i], li[type=square i] { list-style-type: square; }
+
+li[value="10"], li[value="10xyz"], li[value="10e10"] { counter-set: list-item 10; }
+ol[start="10"], ol[start="10xyz"], ol[start="10e10"] { counter-reset: list-item 9; }
+ol[reversed] { counter-reset: reversed(list-item); }
+ol[reversed][start="20"], ol[reversed][start="20xyz"], ol[reversed][start="20e10"] { counter-reset: reversed(list-item) 21; }
+
+/* dir="" */
+[dir=ltr] { direction: ltr; }
+[dir=rtl] { direction: rtl; }
+
+/* quirks mode styles */
+li { list-style-position: inside; }
+li :is(dir, menu, ol, ul) { list-style-position: outside; }
+:is(dir, menu, ol, ul) :is(dir, menu, ol, ul, li) { list-style-position: unset; }
+</style>
+
+<div id="log"></div>
+
+<div id="tests">
+ <li></li>
+ <dir>
+ <li></li>
+ </dir>
+ <dt></dt>
+ <dd></dd>
+ <dl>
+ <dt></dt>
+ <dd></dd>
+ </dl>
+ <menu>
+ <li></li>
+ </menu>
+ <ol>
+ <li></li>
+ </ol>
+ <ul>
+ <li></li>
+ </ul>
+ <dir data-skip><dir></dir></dir>
+ <dir data-skip><menu></menu></dir>
+ <dir data-skip><ul></ul></dir>
+ <menu data-skip><dir></dir></menu>
+ <menu data-skip><menu></menu></menu>
+ <menu data-skip><ul></ul></menu>
+ <ol data-skip><dir></dir></ol>
+ <ol data-skip><menu></menu></ol>
+ <ol data-skip><ul></ul></ol>
+ <ul data-skip><dir></dir></ul>
+ <ul data-skip><menu></menu></ul>
+ <ul data-skip><ul></ul></ul>
+
+ <dir data-skip><dir data-skip><dir></dir></dir></dir>
+ <dir data-skip><dir data-skip><menu></menu></dir></dir>
+ <dir data-skip><dir data-skip><ul></ul></dir></dir>
+ <dir data-skip><menu data-skip><dir></dir></menu></dir>
+ <dir data-skip><menu data-skip><menu></menu></menu></dir>
+ <dir data-skip><menu data-skip><ul></ul></menu></dir>
+ <dir data-skip><ol data-skip><dir></dir></ol></dir>
+ <dir data-skip><ol data-skip><menu></menu></ol></dir>
+ <dir data-skip><ol data-skip><ul></ul></ol></dir>
+ <dir data-skip><ul data-skip><dir></dir></ul></dir>
+ <dir data-skip><ul data-skip><menu></menu></ul></dir>
+ <dir data-skip><ul data-skip><ul></ul></ul></dir>
+
+ <menu data-skip><dir data-skip><dir></dir></dir></menu>
+ <menu data-skip><dir data-skip><menu></menu></dir></menu>
+ <menu data-skip><dir data-skip><ul></ul></dir></menu>
+ <menu data-skip><menu data-skip><dir></dir></menu></menu>
+ <menu data-skip><menu data-skip><menu></menu></menu></menu>
+ <menu data-skip><menu data-skip><ul></ul></menu></menu>
+ <menu data-skip><ol data-skip><dir></dir></ol></menu>
+ <menu data-skip><ol data-skip><menu></menu></ol></menu>
+ <menu data-skip><ol data-skip><ul></ul></ol></menu>
+ <menu data-skip><ul data-skip><dir></dir></ul></menu>
+ <menu data-skip><ul data-skip><menu></menu></ul></menu>
+ <menu data-skip><ul data-skip><ul></ul></ul></menu>
+
+ <ol data-skip><dir data-skip><dir></dir></dir></ol>
+ <ol data-skip><dir data-skip><menu></menu></dir></ol>
+ <ol data-skip><dir data-skip><ul></ul></dir></ol>
+ <ol data-skip><menu data-skip><dir></dir></menu></ol>
+ <ol data-skip><menu data-skip><menu></menu></menu></ol>
+ <ol data-skip><menu data-skip><ul></ul></menu></ol>
+ <ol data-skip><ol data-skip><dir></dir></ol></ol>
+ <ol data-skip><ol data-skip><menu></menu></ol></ol>
+ <ol data-skip><ol data-skip><ul></ul></ol></ol>
+ <ol data-skip><ul data-skip><dir></dir></ul></ol>
+ <ol data-skip><ul data-skip><menu></menu></ul></ol>
+ <ol data-skip><ul data-skip><ul></ul></ul></ol>
+
+ <ul data-skip><dir data-skip><dir></dir></dir></ul>
+ <ul data-skip><dir data-skip><menu></menu></dir></ul>
+ <ul data-skip><dir data-skip><ul></ul></dir></ul>
+ <ul data-skip><menu data-skip><dir></dir></menu></ul>
+ <ul data-skip><menu data-skip><menu></menu></menu></ul>
+ <ul data-skip><menu data-skip><ul></ul></menu></ul>
+ <ul data-skip><ol data-skip><dir></dir></ol></ul>
+ <ul data-skip><ol data-skip><menu></menu></ol></ul>
+ <ul data-skip><ol data-skip><ul></ul></ol></ul>
+ <ul data-skip><ul data-skip><dir></dir></ul></ul>
+ <ul data-skip><ul data-skip><menu></menu></ul></ul>
+ <ul data-skip><ul data-skip><ul></ul></ul></ul>
+
+ <ol type="1"></ol>
+ <ul type="1"></ul>
+ <li type="1"></li>
+ <ol type="a" class="type-a"></ol>
+ <ul type="a" class="type-a"></ul>
+ <li type="a" class="type-a"></li>
+ <ol type="A" class="type-A"></ol>
+ <ul type="A" class="type-A"></ul>
+ <li type="A" class="type-A"></li>
+ <ol type="i" class="type-i"></ol>
+ <ul type="i" class="type-i"></ul>
+ <li type="i" class="type-i"></li>
+ <ol type="I" class="type-I"></ol>
+ <ul type="I" class="type-I"></ul>
+ <li type="I" class="type-I"></li>
+ <ol type="none"></ol>
+ <ul type="none"></ul>
+ <li type="none"></li>
+ <ol type="NONE"></ol>
+ <ul type="NONE"></ul>
+ <li type="NONE"></li>
+ <ol type="disc"></ol>
+ <ul type="disc"></ul>
+ <li type="disc"></li>
+ <ol type="DISC"></ol>
+ <ul type="DISC"></ul>
+ <li type="DISC"></li>
+ <ol type="circle"></ol>
+ <ul type="circle"></ul>
+ <li type="circle"></li>
+ <ol type="CIRCLE"></ol>
+ <ul type="CIRCLE"></ul>
+ <li type="CIRCLE"></li>
+ <ol type="square"></ol>
+ <ul type="square"></ul>
+ <li type="square"></li>
+ <ol type="SQUARE"></ol>
+ <ul type="SQUARE"></ul>
+ <li type="SQUARE"></li>
+
+ <ol>
+ <li value="10"></li>
+ <li value="10xyz"></li>
+ <li value="10e10"></li>
+ <li value="xyz"></li>
+ </ol>
+
+ <ol start="10"><li></li></ol>
+ <ol start="10xyz"><li></li></ol>
+ <ol start="10e10"><li></li></ol>
+ <ol start="xyz"><li></li></ol>
+ <ol reversed><li></li></ol>
+ <ol reversed start="20"><li></li></ol>
+ <ol reversed start="20xyz"><li></li></ol>
+ <ol reversed start="20e10"><li></li></ol>
+ <ol reversed start="xyz"><li></li></ol>
+
+ <ul data-skip dir="rtl"><li dir="ltr"></li></ul>
+ <ul data-skip dir="ltr"><li dir="rtl"></li></ul>
+
+</div>
+
+<div id="refs"></div>
+
+<script>
+ const props = [
+ 'display',
+ 'margin-top',
+ 'margin-right',
+ 'margin-bottom',
+ 'margin-left',
+ 'padding-top',
+ 'padding-right',
+ 'padding-bottom',
+ 'padding-left',
+ 'list-style-type',
+ 'counter-set',
+ 'counter-reset',
+ 'counter-increment',
+ 'text-align',
+ 'list-style-position',
+ ];
+ runUAStyleTests(props);
+
+</script>
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles.html b/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles.html
index a5f011cecc1..6c2500b7eed 100644
--- a/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles.html
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/lists/lists-styles.html
@@ -222,6 +222,7 @@ ol[reversed][start="20"], ol[reversed][start="20xyz"], ol[reversed][start="20e10
'counter-reset',
'counter-increment',
'text-align',
+ 'list-style-position',
];
runUAStyleTests(props);
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html
new file mode 100644
index 00000000000..afd2425221f
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-column-height.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>fieldset multicol with auto count, non-auto width</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#ch">
+<link rel="help" href="https://drafts.csswg.org/css-multicol-2/#cwr">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #test { margin: 0; padding: 0; border: none }
+ #test, #ref { columns:3; column-height:1.5em; column-wrap:wrap; gap:20px; }
+ p { margin: 0 }
+</style>
+<fieldset id="test">
+ <p>1</p>
+ <p>2</p>
+ <p>3</p>
+ <p>4</p>
+ <p>5</p>
+</fieldset>
+<div id="ref">
+ <p>1</p>
+ <p>2</p>
+ <p>3</p>
+ <p>4</p>
+ <p>5</p>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById('test')).height,
+ getComputedStyle(document.getElementById('ref')).height);
+ });
+</script>
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html
new file mode 100644
index 00000000000..9f794007a47
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-count.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>fieldset multicol with auto count, non-auto width</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #test { margin: 0; padding: 0; border: none }
+ #test, #ref { width:min-content; column-count:4; }
+ p { margin: 0 }
+</style>
+<fieldset id="test">
+ <p>1</p>
+ <p>2</p>
+ <p>3</p>
+ <p>4</p>
+ <p>5</p>
+</fieldset>
+<div id="ref">
+ <p>1</p>
+ <p>2</p>
+ <p>3</p>
+ <p>4</p>
+ <p>5</p>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById('test')).height,
+ getComputedStyle(document.getElementById('ref')).height);
+ });
+</script>
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html
new file mode 100644
index 00000000000..e3fd552439a
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-multicol-only-column-width.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>fieldset multicol with auto count, non-auto width</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-fieldset-and-legend-elements">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #test { margin: 0; padding: 0; border: none }
+ #test, #ref { width:500px; column-width:100px; }
+ p { margin: 0 }
+</style>
+<fieldset id="test">
+ <p>1</p>
+ <p>2</p>
+ <p>3</p>
+ <p>4</p>
+ <p>5</p>
+</fieldset>
+<div id="ref">
+ <p>1</p>
+ <p>2</p>
+ <p>3</p>
+ <p>4</p>
+ <p>5</p>
+</div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById('test')).height,
+ getComputedStyle(document.getElementById('ref')).height);
+ });
+</script>
diff --git a/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html
new file mode 100644
index 00000000000..b0567c2b4e3
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2-ref.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<select>
+ <option></option>
+</select>
diff --git a/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html
new file mode 100644
index 00000000000..95b3a3c73db
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/replaced-elements/the-option-element/option-label-whitespace-2.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/issues/10955">
+<link rel=mismatch href="option-label-whitespace-2-ref.html">
+
+<select>
+ <option label=" "></option>
+</select>
diff --git a/tests/wpt/tests/html/rendering/the-details-element/auto-expand-details-text-fragment.html b/tests/wpt/tests/html/rendering/the-details-element/auto-expand-details-text-fragment.html
index 321d82c02d0..7cc3cc22964 100644
--- a/tests/wpt/tests/html/rendering/the-details-element/auto-expand-details-text-fragment.html
+++ b/tests/wpt/tests/html/rendering/the-details-element/auto-expand-details-text-fragment.html
@@ -2,7 +2,7 @@
<meta charset="utf-8">
<title>beforematch fired on ScrollToTextFragment</title>
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interactive-elements.html#the-details-element">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
diff --git a/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html b/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html
index 1e18bd20703..579462ca2f5 100644
--- a/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html
+++ b/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea-relayout.html
@@ -2,7 +2,7 @@
<html class="reftest-wait">
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#field-sizing">
<link rel=match href="field-sizing-textarea-relayout-ref.html">
-<meta name="fuzzy" content="maxDifference=153; totalPixels=2" />
+<meta name="fuzzy" content="maxDifference=0-153; totalPixels=0-2" />
<script src="/common/reftest-wait.js"></script>
<body>
<textarea id="textarea" style="field-sizing: content"></textarea><textarea></textarea>
diff --git a/tests/wpt/tests/html/semantics/forms/the-form-element/form-controls-id-removal-crash.html b/tests/wpt/tests/html/semantics/forms/the-form-element/form-controls-id-removal-crash.html
new file mode 100644
index 00000000000..2b1ef87774f
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-form-element/form-controls-id-removal-crash.html
@@ -0,0 +1,29 @@
+<script>
+document.addEventListener("DOMContentLoaded" , () => {
+ c.beginElement()
+ document.onselectstart = fuzz_01
+ document.execCommand("selectAll", false, null)
+})
+function fuzz_01() {
+ document.execCommand("underline", false, null)
+ c.onend = fuzz_01
+ document.designMode = "on"
+}
+function fuzz_02() {
+ d.insertAdjacentElement("beforebegin", b)
+ a.appendChild(c)
+ h.clientTop
+ b.insertAdjacentHTML("afterend", f.innerHTML)
+}
+</script>
+<svg>
+<path id="a">
+<polygon id="b">
+<set id="c" onbegin="fuzz_02()" max="2s">
+<strong>
+<style id="d">
+</style>
+</strong>
+<time id="f">
+<form id="g">
+<output id="h" form="g">
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html
new file mode 100644
index 00000000000..d96124d008c
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-color-inheritance.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/404464591">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<select>
+ <option>option</option>
+</select>
+<style>
+select {
+ color: rgb(12, 34, 56);
+}
+</style>
+
+<script>
+test(() => {
+ const style = getComputedStyle(document.querySelector('option'));
+ assert_equals(style.color, 'rgb(12, 34, 56)', 'color');
+}, 'option elements should inherit color from their parent select element.');
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html
deleted file mode 100644
index ba2861a5c61..00000000000
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/option-computed-style.tentative.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<link rel=author href="mailto:jarhar@chromium.org">
-<link rel=help href="https://github.com/openui/open-ui/issues/863#issuecomment-1769004174">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<select style="appearance:base-select">
- <option>option</option>
-</select>
-
-<script>
-test(() => {
- assert_equals(
- getComputedStyle(document.querySelector('option'), '::checkmark').content,
- `"\u2713" / ""`);
-}, 'appearance:base-select options should have a checkmark with empty alt text.');
-</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html
index 93baf65cf60..7137edcd1a1 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html
@@ -167,7 +167,12 @@ async function test_move_focus_dont_scroll_viewport(showModal) {
document.body.appendChild(outViewPortButton);
await new Promise(resolve => {
- document.addEventListener("scroll", resolve, { once: true });
+ document.addEventListener("scroll", () => {
+ if (resolve && document.documentElement.scrollTop) {
+ resolve();
+ resolve = null;
+ }
+ });
outViewPortButton.focus();
});
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error-location.tentative.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error-location.tentative.html
new file mode 100644
index 00000000000..5c8dda80cd5
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error-location.tentative.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>JSON modules: parse error file location</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+setup({
+ allow_uncaught_exception: true,
+});
+async_test(t => {
+ window.addEventListener("error", t.step_func_done(e => {
+ // The specific values of these properties are implementation-defined
+ // per https://html.spec.whatwg.org/#report-an-exception
+ // and https://html.spec.whatwg.org/#extract-error,
+ // but it's preferable if implementations provide the
+ // correct file location.
+ assert_equals(e.filename, new URL("parse-error.json", location).href);
+ }));
+});
+</script>
+<script type="module">
+import v from "./parse-error.json" with { type: "json" };
+</script>
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error.html
index 88fb23a00d9..3c079f0654b 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/json-module/parse-error.html
@@ -11,8 +11,16 @@ setup({
async_test(t => {
window.addEventListener("error", t.step_func_done(e => {
assert_true(e instanceof ErrorEvent, "ErrorEvent");
- assert_equals(e.filename, new URL("parse-error.json", location).href);
assert_true(e.error instanceof SyntaxError, "SyntaxError");
+
+ // The specific values of these properties are implementation-defined
+ // per https://html.spec.whatwg.org/#report-an-exception
+ // and https://html.spec.whatwg.org/#extract-error.
+ // But, we can at least check that they exist.
+ assert_not_equals(e.message, undefined);
+ assert_not_equals(e.filename, undefined);
+ assert_not_equals(e.lineno, undefined);
+ assert_not_equals(e.colno, undefined);
}));
});
</script>
diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/window/minimize-1.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/window/minimize-1.html.ini
new file mode 100644
index 00000000000..2e3ac5190f3
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/window/minimize-1.html.ini
@@ -0,0 +1,4 @@
+[minimize-1.html]
+ [Minimize a window]
+ expected:
+ if os == "android": FAIL
diff --git a/tests/wpt/tests/infrastructure/window/minimize-1.html b/tests/wpt/tests/infrastructure/window/minimize-1.html
new file mode 100644
index 00000000000..3b6d46874b3
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/window/minimize-1.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Use testdriver to minimize the window</title>
+<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>
+<!-- This is really setup for the actual test which is test2.html which checks the harness restores the window -->
+<script>
+promise_test(async () => {
+ await test_driver.minimize_window()
+ assert_true(document.hidden);
+ // And no cleanup
+}, "Minimize a window");
+</script>
diff --git a/tests/wpt/tests/infrastructure/window/minimize-2.html b/tests/wpt/tests/infrastructure/window/minimize-2.html
new file mode 100644
index 00000000000..279f01b7b73
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/window/minimize-2.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Use testdriver to check window is not minimized</title>
+<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>
+<!-- This only checks something meaningful when run after test1.html -->
+<script>
+promise_test(async () => {
+ assert_false(document.hidden);
+}), "Test window is not minimized";
+</script>
diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl
index f7038a6fee1..c26e2b14c73 100644
--- a/tests/wpt/tests/interfaces/fedcm.idl
+++ b/tests/wpt/tests/interfaces/fedcm.idl
@@ -12,6 +12,7 @@ interface IdentityCredential : Credential {
static Promise<undefined> disconnect(IdentityCredentialDisconnectOptions options);
readonly attribute USVString? token;
readonly attribute boolean isAutoSelected;
+ readonly attribute USVString configURL;
};
dictionary DisconnectedAccount {
@@ -78,6 +79,7 @@ dictionary IdentityProviderAPIConfig {
required USVString login_url;
USVString disconnect_endpoint;
IdentityProviderBranding branding;
+ USVString account_label;
};
dictionary IdentityProviderAccount {
@@ -89,6 +91,7 @@ dictionary IdentityProviderAccount {
sequence<USVString> approved_clients;
sequence<DOMString> login_hints;
sequence<DOMString> domain_hints;
+ sequence<DOMString> label_hints;
};
dictionary IdentityProviderAccountList {
sequence<IdentityProviderAccount> accounts;
diff --git a/tests/wpt/tests/interfaces/webaudio.idl b/tests/wpt/tests/interfaces/webaudio.idl
index 3b351f4d9e9..286aeba4069 100644
--- a/tests/wpt/tests/interfaces/webaudio.idl
+++ b/tests/wpt/tests/interfaces/webaudio.idl
@@ -6,7 +6,8 @@
enum AudioContextState {
"suspended",
"running",
- "closed"
+ "closed",
+ "interrupted"
};
enum AudioContextRenderSizeCategory {
diff --git a/tests/wpt/tests/interfaces/webgpu.idl b/tests/wpt/tests/interfaces/webgpu.idl
index d91a6a710b1..de1f7c1e52b 100644
--- a/tests/wpt/tests/interfaces/webgpu.idl
+++ b/tests/wpt/tests/interfaces/webgpu.idl
@@ -64,6 +64,7 @@ interface GPUAdapterInfo {
readonly attribute DOMString description;
readonly attribute unsigned long subgroupMinSize;
readonly attribute unsigned long subgroupMaxSize;
+ readonly attribute boolean isFallbackAdapter;
};
interface mixin NavigatorGPU {
@@ -96,7 +97,6 @@ interface GPUAdapter {
[SameObject] readonly attribute GPUSupportedFeatures features;
[SameObject] readonly attribute GPUSupportedLimits limits;
[SameObject] readonly attribute GPUAdapterInfo info;
- readonly attribute boolean isFallbackAdapter;
Promise<GPUDevice> requestDevice(optional GPUDeviceDescriptor descriptor = {});
};
@@ -938,10 +938,14 @@ interface GPUCommandEncoder {
undefined copyBufferToBuffer(
GPUBuffer source,
+ GPUBuffer destination,
+ optional GPUSize64 size);
+ undefined copyBufferToBuffer(
+ GPUBuffer source,
GPUSize64 sourceOffset,
GPUBuffer destination,
GPUSize64 destinationOffset,
- GPUSize64 size);
+ optional GPUSize64 size);
undefined copyBufferToTexture(
GPUTexelCopyBufferInfo source,
diff --git a/tests/wpt/tests/interfaces/webxr.idl b/tests/wpt/tests/interfaces/webxr.idl
index dea448d7440..1098000d6c2 100644
--- a/tests/wpt/tests/interfaces/webxr.idl
+++ b/tests/wpt/tests/interfaces/webxr.idl
@@ -70,6 +70,7 @@ enum XRVisibilityState {
dictionary XRRenderStateInit {
double depthNear;
double depthFar;
+ boolean passthroughFullyObscured;
double inlineVerticalFieldOfView;
XRWebGLLayer? baseLayer;
sequence<XRLayer>? layers;
@@ -78,6 +79,7 @@ dictionary XRRenderStateInit {
[SecureContext, Exposed=Window] interface XRRenderState {
readonly attribute double depthNear;
readonly attribute double depthFar;
+ readonly attribute boolean? passthroughFullyObscured;
readonly attribute double? inlineVerticalFieldOfView;
readonly attribute XRWebGLLayer? baseLayer;
};
diff --git a/tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml b/tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml
new file mode 100644
index 00000000000..fbd4cc58df9
--- /dev/null
+++ b/tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: largest-contentful-paint
+ files: "**"
diff --git a/tests/wpt/tests/lint.ignore b/tests/wpt/tests/lint.ignore
index 65e22dccbc1..c8b98fb5890 100644
--- a/tests/wpt/tests/lint.ignore
+++ b/tests/wpt/tests/lint.ignore
@@ -287,6 +287,9 @@ SET TIMEOUT: shadow-dom/scroll-to-the-fragment-in-shadow-tree.html
SET TIMEOUT: shadow-dom/slotchange-event.html
SET TIMEOUT: trusted-types/support/block-string-assignment-to-DOMWindowTimers-setTimeout-setInterval.js
SET TIMEOUT: trusted-types/support/DOMWindowTimers-setTimeout-setInterval.js
+SET TIMEOUT: trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js
+SET TIMEOUT: trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js
+SET TIMEOUT: trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js
SET TIMEOUT: trusted-types/support/trusted-types-reporting-for-DOMWindowTimers-setTimeout-setInterval.js
SET TIMEOUT: user-timing/*
SET TIMEOUT: web-animations/crashtests/reparent-animating-element-002.html
diff --git a/tests/wpt/tests/media-capabilities/decodingInfo-webrtc.any.js b/tests/wpt/tests/media-capabilities/decodingInfo-webrtc.any.js
index 0f3a4fa0f2d..b38c8e67f9c 100644
--- a/tests/wpt/tests/media-capabilities/decodingInfo-webrtc.any.js
+++ b/tests/wpt/tests/media-capabilities/decodingInfo-webrtc.any.js
@@ -19,6 +19,17 @@ const minimalAudioConfiguration = {
contentType: 'audio/opus',
};
+const videoConfigurationWithDynamicRange = {
+ contentType: 'video/webm; codecs="vp09.00.10.08.00.09.16.09.00"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ hdrMetadataType: 'smpteSt2086',
+ colorGamut: 'rec2020',
+ transferFunction: 'pq',
+};
+
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
type: 'webrtc',
@@ -93,6 +104,19 @@ promise_test(t => {
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
type: 'webrtc',
+ video: {
+ contentType: 'application/ogg; codecs=vorbis',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration contentType is of type audio");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
audio: { contentType: 'fgeoa' },
}));
}, "Test that decodingInfo rejects if the audio configuration contentType doesn't parse");
@@ -105,6 +129,49 @@ promise_test(t => {
}, "Test that decodingInfo rejects if the audio configuration contentType isn't of type audio");
promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: {
+ contentType: 'application/ogg; codecs=theora',
+ channels: 2,
+ },
+ }));
+}, "Test that decodingInfo rejects if the audio configuration contentType is of type video");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/webm; codecs="vp09.00.10.08"; foo="bar"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration contentType has more than one parameter");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/webm; foo="bar"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that decodingInfo rejects if the video configuration contentType has one parameter that isn't codecs");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'fgeoa' },
+ }));
+}, "Test that decodingInfo rejects if the audio configuration contenType doesn't parse");
+
+promise_test(t => {
return navigator.mediaCapabilities.decodingInfo({
type: 'webrtc',
video: minimalVideoConfiguration,
@@ -225,3 +292,27 @@ validVideoCodecs.forEach(codec => {
}, "Test that decodingInfo returns supported true for the codec " + codec + (isWorkerEnvironment ? "" : " returned by RTCRtpReceiver.getCapabilities()"))}
);
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'audio/webm; codecs="opus"; foo="bar"' },
+ }));
+}, "Test that decodingInfo rejects if the audio configuration contentType has more than one parameters");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'audio/webm; foo="bar"' },
+ }));
+}, "Test that decodingInfo rejects if the audio configuration contentType has one parameter that isn't codecs");
+
+promise_test(t => {
+ bt709Config.contentType = 'video/webm; codecs="vp09.00.10.08"';
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
+ type: 'webrtc',
+ video: videoConfigurationWithDynamicRange,
+ }));
+}, "Test that decodingInfo rejects for type 'webrtc' if HDR members are set");
+
+
+
diff --git a/tests/wpt/tests/media-capabilities/decodingInfo.any.js b/tests/wpt/tests/media-capabilities/decodingInfo.any.js
index 2fd3743b442..510a59d9d78 100644
--- a/tests/wpt/tests/media-capabilities/decodingInfo.any.js
+++ b/tests/wpt/tests/media-capabilities/decodingInfo.any.js
@@ -141,7 +141,7 @@ promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
type: 'file',
video: {
- contentType: 'application/ogg; codec=vorbis',
+ contentType: 'application/ogg; codecs=vorbis',
width: 800,
height: 600,
bitrate: 3000,
@@ -154,7 +154,7 @@ promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
type: 'file',
audio: {
- contentType: 'application/ogg; codec=theora',
+ contentType: 'application/ogg; codecs=theora',
channels: 2,
},
}));
@@ -228,97 +228,6 @@ promise_test(t => {
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/1001',
- }
- }));
-}, "Test that decodingInfo rejects framerate in the form of x/y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/0',
- }
- }));
-}, "Test that decodingInfo rejects framerate in the form of x/0");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '0/10001',
- }
- }));
-}, "Test that decodingInfo rejects framerate in the form of 0/y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '-24000/10001',
- }
- }));
-}, "Test that decodingInfo rejects framerate in the form of -x/y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/-10001',
- }
- }));
-}, "Test that decodingInfo rejects framerate in the form of x/-y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/',
- }
- }));
-}, "Test that decodingInfo rejects framerate in the form of x/");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '1/3x',
- }
- }));
-}, "Test that decodingInfo rejects framerate with trailing unallowed characters");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
- type: 'file',
audio: { contentType: 'fgeoa' },
}));
}, "Test that decodingInfo rejects if the audio configuration contentType doesn't parse");
diff --git a/tests/wpt/tests/media-capabilities/decodingInfoEncryptedMedia.https.html b/tests/wpt/tests/media-capabilities/decodingInfoEncryptedMedia.https.html
index 7ac914de89d..2d671b3ce83 100644
--- a/tests/wpt/tests/media-capabilities/decodingInfoEncryptedMedia.https.html
+++ b/tests/wpt/tests/media-capabilities/decodingInfoEncryptedMedia.https.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>MediaCapabilities.decodingInfo() for encrypted media</title>
+<title>MediaCapabilities.decodingInfo for encrypted media</title>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script>
<script src="/resources/testharnessreport.js"></script>
@@ -38,7 +38,7 @@ promise_test(t => {
video: minimalVideoConfiguration,
keySystemConfiguration: minimalKeySystemConfiguration,
});
-}, "Test that decodingInfo() accepts a stub key system configuration (w/video).");
+}, "Test that decodingInfo accepts a stub key system configuration (w/video).");
promise_test(t => {
return navigator.mediaCapabilities.decodingInfo({
@@ -46,7 +46,7 @@ promise_test(t => {
audio: minimalAudioConfiguration,
keySystemConfiguration: minimalKeySystemConfiguration,
});
-}, "Test that decodingInfo() accepts a stub key system configuration (w/audio).");
+}, "Test that decodingInfo accepts a stub key system configuration (w/audio).");
promise_test(t => {
return navigator.mediaCapabilities.decodingInfo({
@@ -59,7 +59,7 @@ promise_test(t => {
},
},
});
-}, "Test that decodingInfo() accepts a key system configuration with video info.");
+}, "Test that decodingInfo accepts a key system configuration with video info.");
promise_test(t => {
return navigator.mediaCapabilities.decodingInfo({
@@ -72,7 +72,7 @@ promise_test(t => {
},
},
});
-}, "Test that decodingInfo() accepts a key system configuration with audio info.");
+}, "Test that decodingInfo accepts a key system configuration with audio info.");
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
@@ -85,7 +85,7 @@ promise_test(t => {
},
},
}));
-}, "Test that decodingInfo() rejects if robustness and configuration do not match (1).");
+}, "Test that decodingInfo rejects if robustness and configuration do not match (1).");
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
@@ -98,7 +98,7 @@ promise_test(t => {
},
},
}));
-}, "Test that decodingInfo() rejects if robustness and configuration do not match (2).");
+}, "Test that decodingInfo rejects if robustness and configuration do not match (2).");
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
@@ -114,7 +114,7 @@ promise_test(t => {
},
},
}));
-}, "Test that decodingInfo() rejects if robustness and configuration do not match (3).");
+}, "Test that decodingInfo rejects if robustness and configuration do not match (3).");
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
@@ -132,7 +132,7 @@ promise_test(t => {
persistentState: "foobar",
},
}));
-}, "Test that decodingInfo() rejects if persistentState isn't valid.");
+}, "Test that decodingInfo rejects if persistentState isn't valid.");
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
@@ -150,7 +150,7 @@ promise_test(t => {
distinctiveIdentifier: "foobar",
},
}));
-}, "Test that decodingInfo() rejects if distinctiveIdentifier isn't valid.");
+}, "Test that decodingInfo rejects if distinctiveIdentifier isn't valid.");
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({
@@ -168,7 +168,7 @@ promise_test(t => {
sessionTypes: "foobar",
},
}));
-}, "Test that decodingInfo() rejects if sessionTypes isn't a sequence.");
+}, "Test that decodingInfo rejects if sessionTypes isn't a sequence.");
promise_test(t => {
return navigator.mediaCapabilities.decodingInfo({
@@ -186,7 +186,7 @@ promise_test(t => {
},
},
});
-}, "Test that decodingInfo() does not reject when properties are set to unexpected values.");
+}, "Test that decodingInfo does not reject when properties are set to unexpected values.");
promise_test(t => {
return navigator.mediaCapabilities.decodingInfo({
@@ -257,6 +257,6 @@ promise_test(t => {
video: minimalVideoConfiguration,
keySystemConfiguration: minimalKeySystemConfiguration,
}));
-}, "Test that decodingInfo() with type webrtc rejects key system configuration.");
+}, "Test that decodingInfo with type webrtc rejects key system configuration.");
</script>
diff --git a/tests/wpt/tests/media-capabilities/encodingInfo-webrtc.any.js b/tests/wpt/tests/media-capabilities/encodingInfo-webrtc.any.js
index 635801c9f1a..1369941a0a5 100644
--- a/tests/wpt/tests/media-capabilities/encodingInfo-webrtc.any.js
+++ b/tests/wpt/tests/media-capabilities/encodingInfo-webrtc.any.js
@@ -100,11 +100,51 @@ promise_test(t => {
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
type: 'webrtc',
+ video: {
+ contentType: 'video/webm; codecs="vp09.00.10.08"; foo="bar"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that encodingInfo rejects if the video configuration contentType has more than one parameter");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
+ type: 'webrtc',
+ video: {
+ contentType: 'video/webm; foo="bar"',
+ width: 800,
+ height: 600,
+ bitrate: 3000,
+ framerate: 24,
+ },
+ }));
+}, "Test that encodingInfo rejects if the video configuration contentType has one parameter that isn't codecs");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
+ type: 'webrtc',
audio: { contentType: 'video/fgeoa' },
}));
}, "Test that encodingInfo rejects if the audio configuration contentType isn't of type audio");
promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'audio/webm; codecs="opus"; foo="bar"' },
+ }));
+}, "Test that encodingInfo rejects if the audio configuration contentType has more than one parameters");
+
+promise_test(t => {
+ return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
+ type: 'webrtc',
+ audio: { contentType: 'audio/webm; foo="bar"' },
+ }));
+}, "Test that encodingInfo rejects if the audio configuration contentType has one parameter that isn't codecs");
+
+promise_test(t => {
return navigator.mediaCapabilities.encodingInfo({
type: 'webrtc',
video: minimalVideoConfiguration,
diff --git a/tests/wpt/tests/media-capabilities/encodingInfo.any.js b/tests/wpt/tests/media-capabilities/encodingInfo.any.js
index 14612238e60..97b6c196f09 100644
--- a/tests/wpt/tests/media-capabilities/encodingInfo.any.js
+++ b/tests/wpt/tests/media-capabilities/encodingInfo.any.js
@@ -198,97 +198,6 @@ promise_test(t => {
promise_test(t => {
return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/1001',
- }
- }));
-}, "Test that encodingInfo rejects framerate in the form of x/y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/0',
- }
- }));
-}, "Test that encodingInfo rejects framerate in the form of x/0");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '0/10001',
- }
- }));
-}, "Test that encodingInfo rejects framerate in the form of 0/y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '-24000/10001',
- }
- }));
-}, "Test that encodingInfo rejects framerate in the form of -x/y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/-10001',
- }
- }));
-}, "Test that encodingInfo rejects framerate in the form of x/-y");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '24000/',
- }
- }));
-}, "Test that encodingInfo rejects framerate in the form of x/");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
- video: {
- contentType: 'video/webm; codecs="vp09.00.10.08"',
- width: 800,
- height: 600,
- bitrate: 3000,
- framerate: '1/3x',
- }
- }));
-}, "Test that encodingInfo rejects framerate with trailing unallowed characters");
-
-promise_test(t => {
- return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.encodingInfo({
- type: 'record',
audio: { contentType: 'fgeoa' },
}));
}, "Test that encodingInfo rejects if the audio configuration contenType doesn't parse");
diff --git a/tests/wpt/tests/mediacapture-record/META.yml b/tests/wpt/tests/mediacapture-record/META.yml
index d59e5e30845..6a5b5839b61 100644
--- a/tests/wpt/tests/mediacapture-record/META.yml
+++ b/tests/wpt/tests/mediacapture-record/META.yml
@@ -1,3 +1,7 @@
spec: https://w3c.github.io/mediacapture-record/
suggested_reviewers:
+ - guidou
+ - jan-ivar
+ - jyavenard
- yellowdoge
+ - youennf
diff --git a/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html b/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html
index 0c5f47f0ef8..0339c18df42 100644
--- a/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html
+++ b/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html
@@ -30,8 +30,15 @@
</head>
<body>
- <canvas id="canvas"></canvas>
<script>
+async function createWorker(script) {
+ script += "self.postMessage('ready');";
+ const blob = new Blob([script], { type: 'text/javascript' });
+ const url = URL.createObjectURL(blob);
+ const worker = new Worker(url);
+ await new Promise(resolve => worker.onmessage = resolve);
+ return worker;
+}
async_test(test => {
const CANVAS_WIDTH = 256;
@@ -100,49 +107,61 @@ async_test(test => {
return;
}
- const canvas = document.querySelector("canvas");
- const ctx = canvas.getContext("2d", {
- alpha: false,
- });
-
- canvas.width = CANVAS_WIDTH;
- canvas.height = CANVAS_HEIGHT;
-
const {startCamera, stopCamera} = useUserMedia(CAMERA_CONSTRAINTS);
startCamera().then(async stream => {
const videoTrack = stream.getVideoTracks()[0];
- const { readable: readableStream } = new MediaStreamTrackProcessor({
- track: videoTrack
- });
-
- const composedTrackGenerator = new MediaStreamTrackGenerator({
- kind: "video"
- });
- const sink = composedTrackGenerator.writable;
-
- ctx.fillStyle = "#333";
- ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
-
- const transformer = new TransformStream({
- async transform(cameraFrame, controller) {
- if (cameraFrame && cameraFrame?.codedWidth > 0) {
- const leftPos = (CANVAS_WIDTH - cameraFrame.displayWidth) / 2;
- const topPos = (CANVAS_HEIGHT - cameraFrame.displayHeight) / 2;
-
- ctx.drawImage(cameraFrame, leftPos, topPos);
-
- const newFrame = new VideoFrame(canvas, {
- timestamp: cameraFrame.timestamp
- });
- cameraFrame.close();
- controller.enqueue(newFrame);
- }
+ const worker = await createWorker(`
+ const CANVAS_WIDTH = ${CANVAS_WIDTH};
+ const CANVAS_HEIGHT = ${CANVAS_HEIGHT};
+ onmessage = e => {
+ const videoTrack = e.data;
+ const { readable: readableStream } = new MediaStreamTrackProcessor({
+ track: videoTrack
+ });
+
+ const composedTrackGenerator = new VideoTrackGenerator();
+ const sink = composedTrackGenerator.writable;
+
+ const canvas = new OffscreenCanvas(CANVAS_WIDTH, CANVAS_HEIGHT);
+ const ctx = canvas.getContext("2d", {
+ alpha: false,
+ });
+ ctx.fillStyle = "#333";
+ ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
+
+ const transformer = new TransformStream({
+ async transform(cameraFrame, controller) {
+ if (cameraFrame && cameraFrame?.codedWidth > 0) {
+ const leftPos = (CANVAS_WIDTH - cameraFrame.displayWidth) / 2;
+ const topPos = (CANVAS_HEIGHT - cameraFrame.displayHeight) / 2;
+
+ ctx.drawImage(cameraFrame, leftPos, topPos);
+
+ const newFrame = new VideoFrame(canvas, {
+ timestamp: cameraFrame.timestamp
+ });
+ cameraFrame.close();
+ controller.enqueue(newFrame);
+ }
+ }
+ });
+
+ readableStream.pipeThrough(transformer).pipeTo(sink);
+ self.postMessage(composedTrackGenerator.track, [composedTrackGenerator.track]);
}
+ `);
+ try {
+ worker.postMessage(videoTrack, [videoTrack]);
+ } catch(e) {
+ test.step_func_done(() => {
+ assert_unreached("MediaStreamTrack transfer not supported");
+ })();
+ }
+ const composedTrack = await new Promise((resolve, reject) => {
+ worker.onmessage = e => resolve(e.data);
+ test.step_timeout(() => reject("unable to get composited track"), 2000);
});
-
- readableStream.pipeThrough(transformer).pipeTo(sink);
-
- const compositedMediaStream = new MediaStream([composedTrackGenerator]);
+ const compositedMediaStream = new MediaStream([composedTrack]);
useMediaRecorder(compositedMediaStream, mimeType, (size => {
if (size > THRESHOLD_FOR_EMPTY_FRAMES) {
@@ -153,7 +172,6 @@ async_test(test => {
}));
});
}, "MediaRecorder returns frames containing video content");
-
</script>
</body>
diff --git a/tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html b/tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html
new file mode 100644
index 00000000000..bcfc2af2737
--- /dev/null
+++ b/tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html
@@ -0,0 +1,165 @@
+<!doctype html>
+<html>
+<meta name="timeout" content="long">
+
+<head>
+ <title>MediaRecorder canvas media source</title>
+ <meta name=variant content="?mimeType=''">
+ <meta name=variant content="?mimeType=video/webm;codecs=vp8,opus">
+ <meta name=variant content="?mimeType=video/webm;codecs=vp9,opus">
+ <meta name=variant content="?mimeType=video/webm;codecs=av1,opus">
+ <meta name=variant content="?mimeType=video/mp4;codecs=avc1.64003E,mp4a.40.2">
+ <meta name=variant content="?mimeType=video/mp4;codecs=avc3.64003E,mp4a.40.2">
+ <meta name=variant content="?mimeType=video/mp4;codecs=vp9,opus">
+ <meta name=variant content="?mimeType=video/mp4;codecs=av01,opus">
+ <meta name=variant content="?mimeType=video/mp4;codecs=av01,mp4a.40.2">
+ <meta name=variant content="?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,opus">
+ <meta name=variant content="?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,opus">
+ <meta name=variant content="?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,mp4a.40.2">
+ <meta name=variant content="?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,mp4a.40.2">
+ <meta name=variant content="?mimeType=video/x-matroska;codecs=hvc1.1.6.L186.B0,opus">
+ <meta name=variant content="?mimeType=video/x-matroska;codecs=hev1.1.6.L186.B0,opus">
+ <meta name=variant content="?mimeType=video/mp4">
+ <link rel="help"
+ href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#dom-mediarecorder-mimeType">
+ <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="../../mediacapture-streams/permission-helper.js"></script>
+</head>
+
+<body>
+ <canvas id="canvas"></canvas>
+ <script>
+
+async_test(test => {
+ const CANVAS_WIDTH = 256;
+ const CANVAS_HEIGHT = 144;
+
+ let large_size_data_available = false;
+
+ // Empty video frames from this resolution consistently have ~750 bytes in my
+ // tests, while valid video frames usually contain 7-8KB. A threshold of
+ // 1.5KB consistently fails when video frames are empty but passes when video
+ // frames are non-empty.
+ const THRESHOLD_FOR_EMPTY_FRAMES = 1500;
+
+ const CAMERA_CONSTRAINTS = {
+ video: {
+ width: { ideal: CANVAS_WIDTH },
+ height: { ideal: CANVAS_HEIGHT }
+ }
+ };
+
+ function useUserMedia(constraints) {
+ let activeStream = null;
+
+ function startCamera() {
+ return navigator.mediaDevices.getUserMedia(constraints).then(
+ (stream) => {
+ activeStream = stream;
+ return stream;
+ }
+ );
+ }
+
+ function stopCamera() {
+ activeStream?.getTracks().forEach((track) => track.stop());
+ }
+
+ return { startCamera, stopCamera };
+ }
+
+ function useMediaRecorder(stream, mimeType, frameSizeCallback) {
+ const mediaRecorder = new MediaRecorder(
+ stream, { mimeType }
+ );
+
+ mediaRecorder.ondataavailable = event => {
+ const {size} = event.data;
+ frameSizeCallback(size);
+
+ if (mediaRecorder.state !== "inactive") {
+ mediaRecorder.stop();
+ }
+ };
+
+ mediaRecorder.onstop = event => {
+ assert_equals(large_size_data_available, true),
+ "onstop is called after valid data is available";
+ };
+
+ mediaRecorder.start(1000);
+ }
+
+ const params = new URLSearchParams(window.location.search);
+ const mimeType = params.get('mimeType');
+ if (mimeType && !MediaRecorder.isTypeSupported(mimeType)) {
+ test.done();
+ return;
+ }
+
+ if (!window.MediaStreamTrackProcessor) {
+ test.done();
+ return;
+ }
+
+ const canvas = document.querySelector("canvas");
+ const ctx = canvas.getContext("2d", {
+ alpha: false,
+ });
+
+ canvas.width = CANVAS_WIDTH;
+ canvas.height = CANVAS_HEIGHT;
+
+ const {startCamera, stopCamera} = useUserMedia(CAMERA_CONSTRAINTS);
+ startCamera().then(async stream => {
+ const videoTrack = stream.getVideoTracks()[0];
+ const { readable: readableStream } = new MediaStreamTrackProcessor({
+ track: videoTrack
+ });
+
+ const composedTrackGenerator = new MediaStreamTrackGenerator({
+ kind: "video"
+ });
+ const sink = composedTrackGenerator.writable;
+
+ ctx.fillStyle = "#333";
+ ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
+
+ const transformer = new TransformStream({
+ async transform(cameraFrame, controller) {
+ if (cameraFrame && cameraFrame?.codedWidth > 0) {
+ const leftPos = (CANVAS_WIDTH - cameraFrame.displayWidth) / 2;
+ const topPos = (CANVAS_HEIGHT - cameraFrame.displayHeight) / 2;
+
+ ctx.drawImage(cameraFrame, leftPos, topPos);
+
+ const newFrame = new VideoFrame(canvas, {
+ timestamp: cameraFrame.timestamp
+ });
+ cameraFrame.close();
+ controller.enqueue(newFrame);
+ }
+ }
+ });
+
+ readableStream.pipeThrough(transformer).pipeTo(sink);
+
+ const compositedMediaStream = new MediaStream([composedTrackGenerator]);
+
+ useMediaRecorder(compositedMediaStream, mimeType, (size => {
+ if (size > THRESHOLD_FOR_EMPTY_FRAMES) {
+ large_size_data_available = true;
+ stopCamera();
+ test.done();
+ }
+ }));
+ });
+}, "MediaRecorder returns frames containing video content");
+
+ </script>
+</body>
+
+</html>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-push.html b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-push.html
deleted file mode 100644
index 34bdcf7cac7..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-push.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../navigation-methods/return-value/resources/helpers.js"></script>
-<script src="resources/after-transition-commit-helpers.js"></script>
-<body>
-<script>
-let tests = [
- { mode: "rejectBeforeCommit", description: "{ commit: 'after-transition' } for a push navigation, reject before commit" },
- { mode: "rejectAfterCommit", description: "{ commit: 'after-transition' } for a push navigation, reject after commit" },
- { mode: "successExplicitCommit", description: "{ commit: 'after-transition' } for a push navigation, explicit commit()" },
- { mode: "successNoExplicitCommit", description: "{ commit: 'after-transition' } for a push navigation, commit when handler resolves" }
-];
-
-let onload_promise = new Promise(resolve => window.onload = resolve);
-for (let test of tests) {
- promise_test(async t => {
- await onload_promise;
- await testAfterTransitionCommit(t, "push", test.mode);
- }, test.description);
-}
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-explicit-commit.html b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-explicit-commit.html
deleted file mode 100644
index 7fa35676087..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-explicit-commit.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<body>
-<script>
-promise_test(async t => {
- // Wait for after the load event so that the navigation doesn't get converted
- // into a replace navigation.
- await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
-
- let start_length = navigation.entries().length;
- let start_hash = location.hash;
- navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- assert_equals(location.hash, start_hash);
- assert_equals(new URL(e.destination.url).hash, "#push");
-
- e.redirect("#redirect1");
- assert_equals(location.hash, start_hash);
- assert_equals(new URL(e.destination.url).hash, "#redirect1");
-
- e.redirect("#redirect2");
- assert_equals(location.hash, start_hash);
- assert_equals(new URL(e.destination.url).hash, "#redirect2");
-
- e.commit();
- assert_equals(location.hash, "#redirect2");
- assert_equals(new URL(e.destination.url).hash, "#redirect2");
- }),
- commit: "after-transition"
- });
- });
- await navigation.navigate("#push").committed;
- assert_equals(location.hash, "#redirect2");
- assert_equals(navigation.entries().length, start_length + 1);
-}, "redirect() then commit()");
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-reload.html b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-reload.html
deleted file mode 100644
index 203150eb051..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-reload.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../navigation-methods/return-value/resources/helpers.js"></script>
-<script src="resources/after-transition-commit-helpers.js"></script>
-<body>
-<script>
-let tests = [
- { mode: "rejectBeforeCommit", description: "{ commit: 'after-transition' } for a reload navigation, reject before commit" },
- { mode: "rejectAfterCommit", description: "{ commit: 'after-transition' } for a reload navigation, reject after commit" },
- { mode: "successExplicitCommit", description: "{ commit: 'after-transition' } for a reload navigation, explicit commit()" },
- { mode: "successNoExplicitCommit", description: "{ commit: 'after-transition' } for a reload navigation, commit when handler resolves" }
-];
-
-for (let test of tests) {
- promise_test(t => testAfterTransitionCommit(t, "reload", test.mode), test.description);
-}
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-replace.html b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-replace.html
deleted file mode 100644
index 2fd48736a34..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-replace.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../navigation-methods/return-value/resources/helpers.js"></script>
-<script src="resources/after-transition-commit-helpers.js"></script>
-<body>
-<script>
-let tests = [
- { mode: "rejectBeforeCommit", description: "{ commit: 'after-transition' } for a replace navigation, reject before commit" },
- { mode: "rejectAfterCommit", description: "{ commit: 'after-transition' } for a replace navigation, reject after commit" },
- { mode: "successExplicitCommit", description: "{ commit: 'after-transition' } for a replace navigation, explicit commit()" },
- { mode: "successNoExplicitCommit", description: "{ commit: 'after-transition' } for a replace navigation, commit when handler resolves" }
-];
-
-for (let test of tests) {
- promise_test(t => testAfterTransitionCommit(t, "replace", test.mode), test.description);
-}
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html b/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html
deleted file mode 100644
index d348a218ac4..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traverse.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../navigation-methods/return-value/resources/helpers.js"></script>
-<script src="resources/after-transition-commit-helpers.js"></script>
-<body>
-<script>
-let start_index = navigation.currentEntry.index;
-
-let tests = [
- { mode: "rejectBeforeCommit", destinationIndex: start_index, description: "{ commit: 'after-transition' } for a traverse navigation, reject before commit" },
- { mode: "rejectAfterCommit", destinationIndex: start_index + 1, description: "{ commit: 'after-transition' } for a traverse navigation, reject after commit" },
- { mode: "successExplicitCommit", destinationIndex: start_index + 2, description: "{ commit: 'after-transition' } for a traverse navigation, explicit commit()" },
- { mode: "successNoExplicitCommit", destinationIndex: start_index + 3, description: "{ commit: 'after-transition' } for a traverse navigation, commit when handler resolves" }
-];
-
-// Push a bunch of history entries so each test case can target a unique entry.
-history.pushState("", "", "#1");
-history.pushState("", "", "#2");
-history.pushState("", "", "#3");
-history.pushState("", "", "#4");
-
-let onload_promise = new Promise(resolve => window.onload = resolve);
-for (let test of tests) {
- promise_test(async t => {
- await onload_promise;
- await testAfterTransitionCommit(t, "traverse", test.mode, test.destinationIndex);
- }, test.description);
-}
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/commit-throws.html b/tests/wpt/tests/navigation-api/commit-behavior/commit-throws.html
deleted file mode 100644
index 54abdbfd0fb..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/commit-throws.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<body>
-<script>
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- assert_throws_dom("InvalidStateError", () => e.commit());
- });
- await navigation.navigate("#").finished;
-}, "commit() before intercept()");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ handler: t.step_func(() => {
- assert_throws_dom("InvalidStateError", () => e.commit());
- }) });
- });
- await navigation.navigate("#").finished;
-}, "commit() without commit behavior specified");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- assert_throws_dom("InvalidStateError", () => e.commit());
- }),
- commit: "immediate"
- });
- });
- await navigation.navigate("#").finished;
-}, "commit() with { commit: immediate }");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ commit: "after-transition" });
- assert_throws_dom("InvalidStateError", () => e.commit());
- });
- await navigation.navigate("#").finished;
-}, "commit() during event dispatch");
-
-promise_test(async t => {
- let navigate_event;
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ commit: "after-transition" });
- navigate_event = e;
- });
- await navigation.navigate("#").finished;
- assert_throws_dom("InvalidStateError", () => navigate_event.commit());
-}, "commit() after finish");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- e.commit();
- assert_throws_dom("InvalidStateError", () => e.commit());
- }),
- commit: "after-transition"
- });
- });
- await navigation.navigate("#").finished;
-}, "commit() twice");
-
-promise_test(async t => {
- // We need to grab an NavigationDestination to construct the event.
- navigation.onnavigate = t.step_func(e => {
- const event = new NavigateEvent("navigate", {
- destination: e.destination,
- signal: (new AbortController()).signal
- });
-
- assert_throws_dom("SecurityError", () => event.commit());
- });
- await navigation.navigate("#").finished;
-}, "commit() on synthetic NavigateEvent");
-
-promise_test(async t => {
- let i = document.createElement("iframe");
- i.src = "about:blank";
- document.body.appendChild(i);
- i.contentWindow.navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- let iframe_constructor = i.contentWindow.DOMException;
- i.remove();
- assert_throws_dom("InvalidStateError", iframe_constructor, () => e.commit());
- }),
- commit: "after-transition"
- });
- });
- i.contentWindow.navigation.navigate("#");
-}, "commit() in detached iframe");
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/redirect-throws.html b/tests/wpt/tests/navigation-api/commit-behavior/redirect-throws.html
deleted file mode 100644
index 4bb6f966071..00000000000
--- a/tests/wpt/tests/navigation-api/commit-behavior/redirect-throws.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<body>
-<script>
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- });
- await navigation.navigate("#").finished;
-}, "redirect() before intercept()");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ handler: t.step_func(() => {
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- }) });
- });
- await navigation.navigate("#").finished;
-}, "redirect() without commit behavior specified");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- }),
- commit: "immediate"
- });
- });
- await navigation.navigate("#").finished;
-}, "redirect() with { commit: immediate }");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ commit: "after-transition" });
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- });
- await navigation.navigate("#").finished;
-}, "redirect() during event dispatch");
-
-promise_test(async t => {
- let navigate_event;
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ commit: "after-transition" });
- navigate_event = e;
- });
- await navigation.navigate("#").finished;
- assert_throws_dom("InvalidStateError", () => navigate_event.redirect("#"));
-}, "redirect() after finish");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- e.commit();
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- }),
- commit: "after-transition"
- });
- });
- await navigation.navigate("#").finished;
-}, "redirect() after commit()");
-
-promise_test(async t => {
- // We need to grab an NavigationDestination to construct the event.
- navigation.onnavigate = t.step_func(e => {
- const event = new NavigateEvent("navigate", {
- destination: e.destination,
- signal: (new AbortController()).signal
- });
-
- assert_throws_dom("SecurityError", () => event.redirect("#"));
- });
- await navigation.navigate("#").finished;
-}, "redirect() on synthetic NavigateEvent");
-
-promise_test(async t => {
- let i = document.createElement("iframe");
- i.src = "about:blank";
- document.body.appendChild(i);
- i.contentWindow.navigation.onnavigate = t.step_func(e => {
- e.intercept({
- handler: t.step_func(() => {
- let iframe_constructor = i.contentWindow.DOMException;
- i.remove();
- assert_throws_dom("InvalidStateError", iframe_constructor, () => e.redirect("#"));
- }),
- commit: "after-transition"
- });
- });
- i.contentWindow.navigation.navigate("#");
-}, "redirect() in detached iframe");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ handler: t.step_func(() => {
- assert_throws_dom("SyntaxError", () => e.redirect("https://example.com\u0000mozilla.org"));
- }),
- commit: "after-transition" });
- });
- await navigation.navigate("#").finished;
-}, "redirect() to invalid url");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ handler: t.step_func(() => {
- assert_throws_dom("SecurityError", () => e.redirect("https://example.com"));
- }),
- commit: "after-transition" });
- });
- await navigation.navigate("#").finished;
-}, "redirect() to cross-origin url");
-
-promise_test(async t => {
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ handler: t.step_func(() => {
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- }),
- commit: "after-transition" });
- });
- await navigation.reload().finished;
-}, "redirect() reload");
-
-promise_test(async t => {
- // Wait for after the load event so that the navigation doesn't get converted
- // into a replace navigation.
- await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
-
- await navigation.navigate("#forward").finished;
-
- navigation.onnavigate = t.step_func(e => {
- e.intercept({ handler: t.step_func(() => {
- assert_throws_dom("InvalidStateError", () => e.redirect("#"));
- }),
- commit: "after-transition" });
- });
- await navigation.back().finished;
-}, "redirect() traverse");
-</script>
-</body>
diff --git a/tests/wpt/tests/navigation-api/navigate-event/defaultPrevented-window-stop-after-dispatch.html b/tests/wpt/tests/navigation-api/navigate-event/defaultPrevented-window-stop-after-dispatch.html
index da5de10ddd8..889179603b8 100644
--- a/tests/wpt/tests/navigation-api/navigate-event/defaultPrevented-window-stop-after-dispatch.html
+++ b/tests/wpt/tests/navigation-api/navigate-event/defaultPrevented-window-stop-after-dispatch.html
@@ -6,11 +6,12 @@ async_test(t => {
window.onload = t.step_func_done(() => {
let navigateEvent;
navigation.onnavigate = e => navigateEvent = e;
- navigation.navigate("?1");
+ let committed_promise = navigation.navigate("?1").committed;
assert_false(navigateEvent.defaultPrevented);
window.stop();
assert_false(navigateEvent.defaultPrevented);
+ promise_rejects_dom(t, "AbortError", committed_promise);
});
}, "window.stop() doesn't affect navigateEvent.defaultPrevented after dispatch");
</script>
diff --git a/tests/wpt/tests/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.html b/tests/wpt/tests/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.html
deleted file mode 100644
index e97b72b1571..00000000000
--- a/tests/wpt/tests/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<iframe id="i" src="/common/blank.html"></iframe>
-<script>
-async_test(t => {
- window.onload = t.step_func(() => {
- i.contentWindow.onunload = t.step_func(() => {
- i.contentWindow.history.replaceState(null, "", "#");
- i.remove();
- t.step_timeout(t.step_func_done(), 0);
- });
- i.contentWindow.location = "/common/blank.html?1";
- });
-}, "reacting to the navigate event doesn't crash when replaceState is called in onunload");
-</script>
diff --git a/tests/wpt/tests/navigation-api/navigate-event/signal-abort-window-stop.html b/tests/wpt/tests/navigation-api/navigate-event/signal-abort-window-stop.html
index 43e005e8b41..cd3bb7431a3 100644
--- a/tests/wpt/tests/navigation-api/navigate-event/signal-abort-window-stop.html
+++ b/tests/wpt/tests/navigation-api/navigate-event/signal-abort-window-stop.html
@@ -11,10 +11,11 @@ async_test(t => {
abort_signal = e.signal;
abort_signal.onabort = () => onabort_called = true;
});
- navigation.navigate("?1");
+ let committed_promise = navigation.navigate("?1").committed;
window.stop();
assert_true(abort_signal.aborted);
assert_true(onabort_called);
+ promise_rejects_dom(t, "AbortError", committed_promise);
// Complete the test asynchronously to ensure that onnavigatesuccess
// didn't fire on a microtask.
t.step_timeout(t.step_func_done(() => {}), 0);
diff --git a/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept-with-redirect.html b/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-intercept-precommitHandler-redirect.html
index 1d7c47b5e73..90cf813d058 100644
--- a/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept-with-redirect.html
+++ b/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-intercept-precommitHandler-redirect.html
@@ -22,19 +22,17 @@ promise_test(async t => {
recorder.setUpNavigationAPIListeners();
navigation.addEventListener("navigate", e => {
- e.intercept({ commit: "after-transition",
+ e.intercept({ async precommitHandler(controller) {
+ recorder.record("precommitHandler start");
+ await new Promise(r => t.step_timeout(r, 0));
+ recorder.record("precommitHandler async step 1a");
+ controller.redirect("#2");
+ recorder.record("precommitHandler async step 1b");
+ },
async handler() {
recorder.record("handler start");
await new Promise(r => t.step_timeout(r, 0));
- recorder.record("handler async step 1a");
- e.redirect("#2");
- recorder.record("handler async step 1b");
- await new Promise(r => t.step_timeout(r, 0));
- recorder.record("handler async step 2a");
- e.commit();
- recorder.record("handler async step 2b");
- await new Promise(r => t.step_timeout(r, 0));
- recorder.record("handler async step 3");
+ recorder.record("handler async step 1");
}
});
});
@@ -49,18 +47,17 @@ promise_test(async t => {
recorder.assert([
/* event name, location.hash value, navigation.transition properties */
["navigate", "", null],
- ["handler start", "", { from, navigationType: "push" }],
+ ["precommitHandler start", "", { from, navigationType: "push" }],
["promise microtask", "", { from, navigationType: "push" }],
- ["handler async step 1a", "", { from, navigationType: "push" }],
- ["handler async step 1b", "", { from, navigationType: "push" }],
- ["handler async step 2a", "", { from, navigationType: "push" }],
+ ["precommitHandler async step 1a", "", { from, navigationType: "push" }],
+ ["precommitHandler async step 1b", "", { from, navigationType: "push" }],
["currententrychange", "#2", { from, navigationType: "push" }],
- ["handler async step 2b", "#2", { from, navigationType: "push" }],
+ ["handler start", "#2", { from, navigationType: "push" }],
["committed fulfilled", "#2", { from, navigationType: "push" }],
- ["handler async step 3", "#2", { from, navigationType: "push" }],
+ ["handler async step 1", "#2", { from, navigationType: "push" }],
["navigatesuccess", "#2", { from, navigationType: "push" }],
["finished fulfilled", "#2", null],
["transition.finished fulfilled", "#2", null],
]);
-}, "event and promise ordering for same-document navigation.navigate() intercepted by intercept() with { commit: 'after-transition' } and a redirect()");
+}, "event and promise ordering for same-document navigation.navigate() intercepted by intercept() with a precommitHandler that redirects");
</script>
diff --git a/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept.html b/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-intercept-precommitHandler.html
index 16c8796d6f4..27e317cfc67 100644
--- a/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-commit-after-transition-intercept.html
+++ b/tests/wpt/tests/navigation-api/ordering-and-transition/navigate-intercept-precommitHandler.html
@@ -22,15 +22,15 @@ promise_test(async t => {
recorder.setUpNavigationAPIListeners();
navigation.addEventListener("navigate", e => {
- e.intercept({ commit: "after-transition",
+ e.intercept({ async precommitHandler() {
+ recorder.record("precommitHandler start");
+ await new Promise(r => t.step_timeout(r, 0));
+ recorder.record("precommitHandler async step");
+ },
async handler() {
recorder.record("handler start");
await new Promise(r => t.step_timeout(r, 0));
- recorder.record("handler async step 1a");
- e.commit();
- recorder.record("handler async step 1b");
- await new Promise(r => t.step_timeout(r, 0));
- recorder.record("handler async step 2");
+ recorder.record("handler async step");
}
});
});
@@ -45,16 +45,16 @@ promise_test(async t => {
recorder.assert([
/* event name, location.hash value, navigation.transition properties */
["navigate", "", null],
- ["handler start", "", { from, navigationType: "push" }],
+ ["precommitHandler start", "", { from, navigationType: "push" }],
["promise microtask", "", { from, navigationType: "push" }],
- ["handler async step 1a", "", { from, navigationType: "push" }],
+ ["precommitHandler async step", "", { from, navigationType: "push" }],
["currententrychange", "#1", { from, navigationType: "push" }],
- ["handler async step 1b", "#1", { from, navigationType: "push" }],
+ ["handler start", "#1", { from, navigationType: "push" }],
["committed fulfilled", "#1", { from, navigationType: "push" }],
- ["handler async step 2", "#1", { from, navigationType: "push" }],
+ ["handler async step", "#1", { from, navigationType: "push" }],
["navigatesuccess", "#1", { from, navigationType: "push" }],
["finished fulfilled", "#1", null],
["transition.finished fulfilled", "#1", null],
]);
-}, "event and promise ordering for same-document navigation.navigate() intercepted by intercept() with { commit: 'after-transition' }");
+}, "event and promise ordering for same-document navigation.navigate() intercepted by intercept() with a precommitHandler");
</script>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/multiple-intercept.html b/tests/wpt/tests/navigation-api/precommit-handler/multiple-intercept.html
index 848af6a65d8..b7fd9109bd5 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/multiple-intercept.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/multiple-intercept.html
@@ -26,58 +26,58 @@ async function testUrlDidNotChangeImmediately(listener) {
promise_test(async t => {
await testUrlDidNotChangeImmediately(e => {
- e.intercept({ commit: "after-transition" });
- e.intercept({ commit: "after-transition" });
+ e.intercept({ precommitHandler: async () => {} });
+ e.intercept({ precommitHandler: async () => {} });
});
-}, "after-transition + after-transition");
+}, "precommitHandler + precommitHandler");
promise_test(async t => {
await testUrlDidNotChangeImmediately(e => {
- e.intercept({ commit: "after-transition" });
+ e.intercept({ precommitHandler: async () => {} });
e.intercept();
});
-}, "after-transition + (not provided)");
+}, "precommitHandler + (not provided)");
promise_test(async t => {
- await testUrlDidChangeImmediately(e => {
- e.intercept({ commit: "after-transition" });
- e.intercept({ commit: "immediate" });
+ await testUrlDidNotChangeImmediately(e => {
+ e.intercept({ precommitHandler: async () => {} });
+ e.intercept({ handler: async () => {} });
});
-}, "after-transition + immediate");
+}, "precommitHandler + handler");
promise_test(async t => {
await testUrlDidNotChangeImmediately(e => {
- e.intercept({ commit: "immediate" });
- e.intercept({ commit: "after-transition" });
+ e.intercept({ handler: async () => {} });
+ e.intercept({ precommitHandler: async () => {} });
});
-}, "immediate + after-transition");
+}, "handler + precommitHandler");
promise_test(async t => {
await testUrlDidChangeImmediately(e => {
- e.intercept({ commit: "immediate" });
+ e.intercept({ handler: async () => {} });
e.intercept();
});
-}, "immediate + (not provided)");
+}, "handler + (not provided)");
promise_test(async t => {
await testUrlDidChangeImmediately(e => {
- e.intercept({ commit: "immediate" });
- e.intercept({ commit: "immediate" });
+ e.intercept({ handler: async () => {} });
+ e.intercept({ handler: async () => {} });
});
-}, "immediate + immediate");
+}, "handler + handler");
promise_test(async t => {
await testUrlDidNotChangeImmediately(e => {
e.intercept();
- e.intercept({ commit: "after-transition" });
+ e.intercept({ precommitHandler: async () => {} });
});
-}, "(not provided) + after-transition");
+}, "(not provided) + precommitHandler");
promise_test(async t => {
await testUrlDidChangeImmediately(e => {
e.intercept();
- e.intercept({ commit: "immediate" });
+ e.intercept({ handler: async () => {} });
});
-}, "(not provided) + immediate");
+}, "(not provided) + handler");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-new-navigation-before-commit.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-new-navigation-before-commit.html
index 2d09d40dc95..89e9895534f 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-new-navigation-before-commit.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-new-navigation-before-commit.html
@@ -5,7 +5,7 @@
<body>
<script>
promise_test(async t => {
- navigation.addEventListener("navigate", e => e.intercept({ commit: "after-transition" }), { once: "true" });
+ navigation.addEventListener("navigate", e => e.intercept({ precommitHandler: async () => {} }), { once: "true" });
let navigateerror_called = false;
navigation.onnavigateerror = t.step_func(() => {
@@ -20,6 +20,6 @@ promise_test(async t => {
assert_equals(location.hash, "#1");
assert_true(navigateerror_called);
-}, "Cancel a { commit: 'after-transition' } navigation before commit() by starting a new navigation");
+}, "Cancel a navigation with a precommitHandler before commit by starting a new navigation");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-push.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-push.html
new file mode 100644
index 00000000000..41856ed6c43
--- /dev/null
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-push.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../navigation-methods/return-value/resources/helpers.js"></script>
+<script src="resources/precommitHandler-helpers.js"></script>
+<body>
+<script>
+let tests = [
+ { mode: "rejectBeforeCommit", description: "precommitHandler for a push navigation, reject before commit" },
+ { mode: "rejectAfterCommit", description: "precommitHandler for a push navigation, reject after commit" },
+ { mode: "success", description: "precommitHandler for a push navigation, success" },
+];
+
+let onload_promise = new Promise(resolve => window.onload = resolve);
+for (let test of tests) {
+ promise_test(async t => {
+ await onload_promise;
+ await testDeferredCommit(t, "push", test.mode);
+ }, test.description);
+}
+</script>
+</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-push.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-push.html
index 79b46ea4750..de75198d975 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-push.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-push.html
@@ -12,24 +12,23 @@ promise_test(async t => {
let start_hash = location.hash;
navigation.onnavigate = t.step_func(e => {
e.intercept({
- handler: t.step_func(() => {
+ precommitHandler: t.step_func(controller => {
assert_equals(location.hash, start_hash);
assert_equals(new URL(e.destination.url).hash, "#push");
- e.redirect("#redirect1");
+ controller.redirect("#redirect1");
assert_equals(location.hash, start_hash);
assert_equals(new URL(e.destination.url).hash, "#redirect1");
- e.redirect("#redirect2");
+ controller.redirect("#redirect2");
assert_equals(location.hash, start_hash);
assert_equals(new URL(e.destination.url).hash, "#redirect2");
}),
- commit: "after-transition"
});
});
await navigation.navigate("#push").committed;
assert_equals(location.hash, "#redirect2");
assert_equals(navigation.entries().length, start_length + 1);
-}, "redirect() push");
+}, "precommitHandler redirect() push");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-replace.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-replace.html
index e31f5884a27..049909fefde 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-redirect-replace.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-replace.html
@@ -12,24 +12,23 @@ promise_test(async t => {
let start_hash = location.hash;
navigation.onnavigate = t.step_func(e => {
e.intercept({
- handler: t.step_func(() => {
+ precommitHandler: t.step_func(controller => {
assert_equals(location.hash, start_hash);
assert_equals(new URL(e.destination.url).hash, "#replace");
- e.redirect("#redirect1");
+ controller.redirect("#redirect1");
assert_equals(location.hash, start_hash);
assert_equals(new URL(e.destination.url).hash, "#redirect1");
- e.redirect("#redirect2");
+ controller.redirect("#redirect2");
assert_equals(location.hash, start_hash);
assert_equals(new URL(e.destination.url).hash, "#redirect2");
}),
- commit: "after-transition"
});
});
await navigation.navigate("#replace", { history: "replace" }).committed;
assert_equals(location.hash, "#redirect2");
assert_equals(navigation.entries().length, start_length);
-}, "redirect() replace");
+}, "precommitHandler redirect() replace");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-throws.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-throws.html
new file mode 100644
index 00000000000..353daa1a48b
--- /dev/null
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-redirect-throws.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+
+promise_test(async t => {
+ let precommit_controller;
+ navigation.onnavigate = t.step_func(e => {
+ e.intercept({ precommitHandler: async controller => precommit_controller = controller });
+ });
+ await navigation.navigate("#").finished;
+ assert_throws_dom("InvalidStateError", () => precommit_controller.redirect("#"));
+}, "redirect() after finish");
+
+promise_test(async t => {
+ let precommit_controller;
+ navigation.onnavigate = t.step_func(e => {
+ e.intercept({
+ precommitHandler: async controller => precommit_controller = controller,
+ handler: t.step_func(async () => {
+ assert_throws_dom("InvalidStateError", () => precommit_controller.redirect("#"));
+ })
+ });
+ });
+ await navigation.navigate("#").finished;
+}, "redirect() after commit");
+
+promise_test(async t => {
+ let i = document.createElement("iframe");
+ i.src = "about:blank";
+ document.body.appendChild(i);
+ i.contentWindow.navigation.onnavigate = t.step_func(e => {
+ e.intercept({
+ precommitHandler: t.step_func(controller => {
+ let iframe_constructor = i.contentWindow.DOMException;
+ i.remove();
+ assert_throws_dom("InvalidStateError", iframe_constructor, () => controller.redirect("#"));
+ })
+ });
+ });
+ i.contentWindow.navigation.navigate("#");
+}, "redirect() in detached iframe");
+
+promise_test(async t => {
+ navigation.onnavigate = t.step_func(e => {
+ e.intercept({ precommitHandler: t.step_func(controller => {
+ assert_throws_dom("SyntaxError", () => controller.redirect("https://example.com\u0000mozilla.org"));
+ })});
+ });
+ await navigation.navigate("#").finished;
+}, "redirect() to invalid url");
+
+promise_test(async t => {
+ navigation.onnavigate = t.step_func(e => {
+ e.intercept({ precommitHandler: t.step_func(controller => {
+ assert_throws_dom("SecurityError", () => controller.redirect("https://example.com"));
+ })});
+ });
+ await navigation.navigate("#").finished;
+}, "redirect() to cross-origin url");
+
+promise_test(async t => {
+ navigation.onnavigate = t.step_func(e => {
+ e.intercept({ precommitHandler: t.step_func(controller => {
+ assert_throws_dom("InvalidStateError", () => controller.redirect("#"));
+ })});
+ });
+ await navigation.reload().finished;
+}, "redirect() reload");
+
+promise_test(async t => {
+ // Wait for after the load event so that the navigation doesn't get converted
+ // into a replace navigation.
+ await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
+
+ await navigation.navigate("#forward").finished;
+
+ navigation.onnavigate = t.step_func(e => {
+ e.intercept({ precommitHandler: t.step_func(controller => {
+ assert_throws_dom("InvalidStateError", () => controller.redirect("#"));
+ })});
+ });
+ await navigation.back().finished;
+}, "redirect() traverse");
+</script>
+</body>
diff --git a/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-reload.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-reload.html
new file mode 100644
index 00000000000..0fd5da33e4c
--- /dev/null
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-reload.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../navigation-methods/return-value/resources/helpers.js"></script>
+<script src="resources/precommitHandler-helpers.js"></script>
+<body>
+<script>
+let tests = [
+ { mode: "rejectBeforeCommit", description: "precommitHandler for a reload navigation, reject before commit" },
+ { mode: "rejectAfterCommit", description: "precommitHandler for a reload navigation, reject after commit" },
+ { mode: "success", description: "precommitHandler for a reload navigation, success" },
+];
+
+for (let test of tests) {
+ promise_test(t => testDeferredCommit(t, "reload", test.mode), test.description);
+}
+</script>
+</body>
diff --git a/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-replace.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-replace.html
new file mode 100644
index 00000000000..7c28c99af1e
--- /dev/null
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-replace.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../navigation-methods/return-value/resources/helpers.js"></script>
+<script src="resources/precommitHandler-helpers.js"></script>
+<body>
+<script>
+let tests = [
+ { mode: "rejectBeforeCommit", description: "precommitHandler for a replace navigation, reject before commit" },
+ { mode: "rejectAfterCommit", description: "precommitHandler for a replace navigation, reject after commit" },
+ { mode: "success", description: "precommitHandler for a replace navigation, success" },
+];
+
+for (let test of tests) {
+ promise_test(t => testDeferredCommit(t, "replace", test.mode), test.description);
+}
+</script>
+</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traversal-commit-new-navigation-before-commit.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traversal-commit-new-navigation-before-commit.html
index 9e74e10676d..226f332e421 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traversal-commit-new-navigation-before-commit.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traversal-commit-new-navigation-before-commit.html
@@ -19,7 +19,7 @@ promise_test(async t => {
// Go back and wait for the navigate event to fire. This traversal will be deferred.
let promises_should_not_commit = assertBothRejectDOM(t, navigation.back(), "AbortError");
- navigation.addEventListener("navigate", e => e.intercept({ commit: "after-transition", handler: () => new Promise(r => t.step_timeout(r, 1000)) }), { once: "true" });
+ navigation.addEventListener("navigate", e => e.intercept({ precommitHandler: () => new Promise(r => t.step_timeout(r, 1000)) }), { once: "true" });
await new Promise(resolve => navigation.addEventListener("navigate", resolve, { once: "true" }));
// While the traversal is deferred, start a new navigation and commit immediately.
@@ -31,6 +31,6 @@ promise_test(async t => {
assert_equals(location.hash, "#2");
assert_true(navigateerror_called);
-}, "Cancel a { commit: 'after-transition' } traversal before commit() by starting a new navigation");
+}, "Cancel a precommitHandler traversal before commit by starting a new navigation");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traversal-window-stop-before-commit.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traversal-window-stop-before-commit.html
index 282f806f4d3..c45f8268f2a 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-traversal-window-stop-before-commit.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traversal-window-stop-before-commit.html
@@ -23,8 +23,7 @@ promise_test(async t => {
stopped_first_traverse = true;
t.step_timeout(() => window.stop(), 0);
}
- e.intercept({ commit: "after-transition",
- handler: () => new Promise(r => t.step_timeout(r, 10)) });
+ e.intercept({ precommitHandler: () => new Promise(r => t.step_timeout(r, 10)) });
});
let navigatesuccess_called = false;
@@ -52,6 +51,6 @@ promise_test(async t => {
assert_equals(navigation.currentEntry.index, start_index + 1);
assert_equals(location.hash, "#1");
assert_true(navigatesuccess_called);
-}, " { commit: 'after-transition' } traverse with window.stop() before commit");
+}, " precommitHandler traverse with window.stop() before commit");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traverse.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traverse.html
new file mode 100644
index 00000000000..f152129ce26
--- /dev/null
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-traverse.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../navigation-methods/return-value/resources/helpers.js"></script>
+<script src="resources/precommitHandler-helpers.js"></script>
+<body>
+<script>
+let start_index = navigation.currentEntry.index;
+
+// Note that `destinationIndex` is chosen relative to `start_index`, and the
+// tests begin at `start_index` + 4. So:
+// * "rejectBeforeCommit" will try to go back 4 steps and fail.
+// * "rejectAfterCommit" will go back 3 steps, then reject after commit.
+// * "success" will go forward 2 steps
+let tests = [
+ { mode: "rejectBeforeCommit", destinationIndex: start_index, description: "precommitHandler for a traverse navigation, reject before commit" },
+ { mode: "rejectAfterCommit", destinationIndex: start_index + 1, description: "precommitHandler for a traverse navigation, reject after commit" },
+ { mode: "success", destinationIndex: start_index + 3, description: "precommitHandler for a traverse navigation, success" }
+];
+
+// Push a bunch of history entries so each test case can target a unique entry.
+history.pushState("", "", "#1");
+history.pushState("", "", "#2");
+history.pushState("", "", "#3");
+history.pushState("", "", "#4");
+
+let onload_promise = new Promise(resolve => window.onload = resolve);
+for (let test of tests) {
+ promise_test(async t => {
+ await onload_promise;
+ await testDeferredCommit(t, "traverse", test.mode, test.destinationIndex);
+ }, test.description);
+}
+</script>
+</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-uncancelable.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-uncancelable.html
index 45bde9f0900..af320b4e32c 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-uncancelable.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-uncancelable.html
@@ -13,11 +13,12 @@ promise_test(async t => {
i.contentWindow.navigation.onnavigate = t.step_func(e => {
assert_false(e.cancelable);
- // intercept() should throw with commit: "after-transition" because e.cancelable is false.
+ // intercept() with a precommitHandler is forbidden because e.cancelable is false.
let iframe_constructor = i.contentWindow.DOMException;
- assert_throws_dom("InvalidStateError", iframe_constructor, () => e.intercept({ commit: "after-transition" }));
+ assert_throws_dom("InvalidStateError", iframe_constructor,
+ () => e.intercept({ precommitHandler: async () => {} }));
});
await i.contentWindow.navigation.back().finished;
-}, "{ commit: 'after-transition' } for an uncancelable traverse navigation");
+}, "precommitHandler for an uncancelable traverse navigation");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-window-stop-before-commit.html b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-window-stop-before-commit.html
index 0f5e57d5b66..857a21ed3a9 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/after-transition-window-stop-before-commit.html
+++ b/tests/wpt/tests/navigation-api/precommit-handler/precommitHandler-window-stop-before-commit.html
@@ -10,7 +10,7 @@ promise_test(async t => {
await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
navigation.onnavigate = e => {
- e.intercept({ commit: "after-transition" });
+ e.intercept({ precommitHandler: async () => {} });
};
navigation.onnavigatesuccess = t.unreached_func("navigatesuccess must not fire");
@@ -28,6 +28,6 @@ promise_test(async t => {
assert_equals(location.hash, "");
assert_true(navigateerror_called);
-}, " { commit: 'after-transition' } with window.stop() before commit");
+}, " precommitHandler with window.stop() before commit");
</script>
</body>
diff --git a/tests/wpt/tests/navigation-api/commit-behavior/resources/after-transition-commit-helpers.js b/tests/wpt/tests/navigation-api/precommit-handler/resources/precommitHandler-helpers.js
index 2be6a03bac8..1338617681f 100644
--- a/tests/wpt/tests/navigation-api/commit-behavior/resources/after-transition-commit-helpers.js
+++ b/tests/wpt/tests/navigation-api/precommit-handler/resources/precommitHandler-helpers.js
@@ -1,4 +1,4 @@
-window.testAfterTransitionCommit = async (t, navigationType, mode, destinationIndex = 0) => {
+window.testDeferredCommit = async (t, navigationType, mode, destinationIndex = 0) => {
let startHash = location.hash;
let destinationHash;
const err = new Error("boo!");
@@ -12,35 +12,25 @@ window.testAfterTransitionCommit = async (t, navigationType, mode, destinationIn
// mode-specific logic for the navigate event handler
let navigate_helpers = {
- rejectBeforeCommit : async (e) => {
- return Promise.reject(err);
- },
+ rejectBeforeCommit : async (e) => { return Promise.reject("Should never run") },
rejectAfterCommit : async (e) => {
- e.commit();
assert_equals(location.hash, destinationHash, "hash after commit");
- assert_equals(navigationType == "traverse", popstate_fired, "popstate fired after commit");
+ assert_equals(false, popstate_fired, "popstate before handler starts");
await new Promise(resolve => t.step_timeout(resolve, 0));
+ assert_equals(navigationType == "traverse", popstate_fired, "popstate fired after handler async step");
return Promise.reject(err);
},
- successExplicitCommit : async (e) => {
- e.commit();
+ success : async (e) => {
assert_equals(location.hash, destinationHash, "hash after commit");
- assert_equals(navigationType == "traverse", popstate_fired, "popstate fired after commit");
- return new Promise(resolve => t.step_timeout(resolve, 0));
- },
- successNoExplicitCommit : async (e) => {
- assert_equals(location.hash, startHash, "start has after first async step");
- assert_false(popstate_fired, "popstate fired after first async step");
+ assert_equals(false, popstate_fired, "popstate before handler starts");
await new Promise(resolve => t.step_timeout(resolve, 0));
- assert_equals(location.hash, startHash, "start has after second async step");
- assert_false(popstate_fired, "popstate fired after second async step");
+ assert_equals(navigationType == "traverse", popstate_fired, "popstate fired after handler async step");
return new Promise(resolve => t.step_timeout(resolve, 0));
- }
+ },
}
navigation.addEventListener("navigate", e => {
- e.intercept({ commit: "after-transition",
- handler: t.step_func(async () => {
+ e.intercept({ precommitHandler: t.step_func(async () => {
assert_equals(e.navigationType, navigationType);
assert_equals(location.hash, startHash, "start hash");
assert_false(popstate_fired, "popstate fired at handler start");
@@ -49,21 +39,31 @@ window.testAfterTransitionCommit = async (t, navigationType, mode, destinationIn
assert_equals(location.hash, startHash, "hash after first async step");
assert_false(popstate_fired, "popstate fired after first async step");
- return navigate_helpers[mode](e);
- })});
+ if (mode == "rejectBeforeCommit")
+ return Promise.reject(err);
+ }),
+ handler: t.step_func(navigate_helpers[mode])
+ });
}, { once: true });
+ let startingIndex = navigation.currentEntry.index;
+ let expectedIndexOnCommit;
+
let promises;
if (navigationType === "push" || navigationType === "replace") {
destinationHash = (startHash === "" ? "#" : startHash) + "a";
promises = navigation.navigate(destinationHash, { history: navigationType });
+ expectedIndexOnCommit = (navigationType === "push") ? startingIndex + 1
+ : startingIndex;
} else if (navigationType === "reload") {
destinationHash = startHash;
promises = navigation.reload();
+ expectedIndexOnCommit = startingIndex;
} else if (navigationType === "traverse") {
let destinationEntry = navigation.entries()[destinationIndex];
destinationHash = new URL(destinationEntry.url).hash;
promises = navigation.traverseTo(destinationEntry.key);
+ expectedIndexOnCommit = destinationIndex;
}
if (mode === "rejectBeforeCommit") {
@@ -72,6 +72,7 @@ window.testAfterTransitionCommit = async (t, navigationType, mode, destinationIn
assert_false(popstate_fired, "popstate fired after promise resolution");
assert_false(navigatesuccess_fired, "navigatesuccess fired");
assert_true(navigateerror_fired, "navigateerror fired");
+ assert_equals(navigation.currentEntry.index, startingIndex);
} else if (mode === "rejectAfterCommit") {
await promises.committed;
await assertCommittedFulfillsFinishedRejectsExactly(t, promises, navigation.currentEntry, err);
@@ -79,6 +80,7 @@ window.testAfterTransitionCommit = async (t, navigationType, mode, destinationIn
assert_equals(navigationType == "traverse", popstate_fired, "popstate fired after promise resolution");
assert_false(navigatesuccess_fired, "navigatesuccess fired");
assert_true(navigateerror_fired, "navigateerror fired");
+ assert_equals(navigation.currentEntry.index, expectedIndexOnCommit);
} else {
await promises.committed;
await assertBothFulfill(t, promises, navigation.currentEntry);
@@ -86,5 +88,6 @@ window.testAfterTransitionCommit = async (t, navigationType, mode, destinationIn
assert_equals(navigationType == "traverse", popstate_fired, "popstate fired after promise resolution");
assert_true(navigatesuccess_fired, "navigatesuccess fired");
assert_false(navigateerror_fired, "navigateerror fired");
+ assert_equals(navigation.currentEntry.index, expectedIndexOnCommit);
}
}
diff --git a/tests/wpt/tests/navigation-api/scroll-behavior/manual-scroll-before-after-transition-commit.html b/tests/wpt/tests/navigation-api/scroll-behavior/manual-scroll-in-precommit-handler.html
index 3b32e72bb11..3f92b5276a3 100644
--- a/tests/wpt/tests/navigation-api/scroll-behavior/manual-scroll-before-after-transition-commit.html
+++ b/tests/wpt/tests/navigation-api/scroll-behavior/manual-scroll-in-precommit-handler.html
@@ -15,11 +15,11 @@ promise_test(async t => {
navigation.onnavigate = e => {
e.intercept({
scroll: "manual",
- commit: "after-transition",
- handler: t.step_func(() => {
+ precommitHandler: t.step_func(() => {
assert_throws_dom("InvalidStateError", () => e.scroll());
assert_not_equals(window.scrollY, 0);
- e.commit();
+ }),
+ handler: t.step_func(() => {
e.scroll();
assert_equals(window.scrollY, 0);
})
@@ -27,6 +27,6 @@ promise_test(async t => {
}
await navigation.back().finished;
assert_equals(window.scrollY, 0);
-}, "scroll: scroll() before commit()");
+}, "scroll: scroll() in precommitHandler throws");
</script>
</body>
diff --git a/tests/wpt/tests/paint-timing/paint-timing-mixin.html b/tests/wpt/tests/paint-timing/paint-timing-mixin.html
index 65c1062a059..c43b7668b5c 100644
--- a/tests/wpt/tests/paint-timing/paint-timing-mixin.html
+++ b/tests/wpt/tests/paint-timing/paint-timing-mixin.html
@@ -26,8 +26,12 @@
});
const entry = await performance_entry_promise;
assert_greater_than(entry.paintTime, reference_time);
- assert_greater_than(entry.presentationTime, entry.paintTime);
- assert_equals(entry.presentationTime, entry.startTime);
+ if ("presentationTime" in entry) {
+ assert_greater_than(entry.presentationTime, entry.paintTime);
+ assert_equals(entry.presentationTime, entry.startTime);
+ } else {
+ assert_equals(entry.paintTime, entry.startTime);
+ }
}, "Paint timing entries should expose paintTime and presentationTime");
</script>
</body>
diff --git a/tests/wpt/tests/requestidlecallback/callback-iframe-different-origin.html b/tests/wpt/tests/requestidlecallback/callback-iframe-different-origin.html
new file mode 100644
index 00000000000..5e66b36d712
--- /dev/null
+++ b/tests/wpt/tests/requestidlecallback/callback-iframe-different-origin.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<title>window.requestIdleCallback in a cross-origin iframe.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(t => {
+ onload = function() {
+ const iframe = document.createElement('iframe');
+ iframe.src = location.href.replace('://', '://www1.')
+ .replace('callback-iframe-different-origin', 'resources/child');
+ document.body.appendChild(iframe);
+ };
+
+ onmessage = function(e) {
+ assert_equals(e.data, 'done');
+ t.done();
+ }
+}, 'Check that idle tasks run in a cross-origin iframe');
+</script>
diff --git a/tests/wpt/tests/requestidlecallback/resources/child.html b/tests/wpt/tests/requestidlecallback/resources/child.html
new file mode 100644
index 00000000000..4d6895125a2
--- /dev/null
+++ b/tests/wpt/tests/requestidlecallback/resources/child.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<h2>Child Frame</h2>
+<script>
+onload = () => {
+ let count = 0;
+ const loop = () => {
+ if (++count < 10) {
+ requestIdleCallback(loop);
+ } else {
+ const target = location.href.replace('www1.', '')
+ .replace('resources/child.html', '');
+ window.parent.postMessage('done', target);
+ }
+ };
+ requestIdleCallback(loop);
+}
+</script>
diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js
index 05301bf5589..15f3a4b7cc7 100644
--- a/tests/wpt/tests/resources/testdriver.js
+++ b/tests/wpt/tests/resources/testdriver.js
@@ -1428,7 +1428,7 @@
* Causes a virtual pressure source to report a new reading.
*
* Matches the `Update virtual pressure source
- * <https://w3c.github.io/compute-pressure/#update-virtual-pressure-source>`_
+ * <https://w3c.github.io/compute-pressure/?experimental=1#update-virtual-pressure-source>`_
* WebDriver command.
*
* @param {String} source_type - A `virtual pressure source type
@@ -1437,6 +1437,8 @@
* @param {String} sample - A `virtual pressure state
* <https://w3c.github.io/compute-pressure/#dom-pressurestate>`_
* such as "critical".
+ * @param {number} estimate - Optional, A `virtual own contribution estimate`
+ * <https://w3c.github.io/compute-pressure/?experimental=1#the-owncontributionestimate-attribute>`_
* @param {WindowProxy} [context=null] - Browsing context in which to
* run the call, or null for the
* current browsing context.
@@ -1447,8 +1449,8 @@
* virtual pressure source of the given type does not
* exist).
*/
- update_virtual_pressure_source: function(source_type, sample, context=null) {
- return window.test_driver_internal.update_virtual_pressure_source(source_type, sample, context);
+ update_virtual_pressure_source: function(source_type, sample, estimate, context=null) {
+ return window.test_driver_internal.update_virtual_pressure_source(source_type, sample, estimate, context);
},
/**
@@ -1472,6 +1474,29 @@
*/
remove_virtual_pressure_source: function(source_type, context=null) {
return window.test_driver_internal.remove_virtual_pressure_source(source_type, context);
+ },
+
+ /**
+ * Sets which hashes are considered k-anonymous for the Protected
+ * Audience interest group with specified `owner` and `name`.
+ *
+ * Matches the `Set Protected Audience K-Anonymity
+ * <https://wicg.github.io/turtledove/#sctn-automation-set-protected-audience-k-anonymity>
+ * WebDriver command.
+ *
+ * @param {String} owner - Origin of the owner of the interest group
+ * to modify
+ * @param {String} name - Name of the interest group to modify
+ * @param {Array} hashes - An array of strings, each of which is a
+ * base64 ecoded hash to consider k-anonymous.
+ *
+ * @returns {Promise} Fulfilled after the k-anonymity status for the
+ * specified Protected Audience interest group has
+ * been updated.
+ *
+ */
+ set_protected_audience_k_anonymity: function(owner, name, hashes, context = null) {
+ return window.test_driver_internal.set_protected_audience_k_anonymity(owner, name, hashes, context);
}
};
@@ -1723,12 +1748,16 @@
throw new Error("create_virtual_pressure_source() is not implemented by testdriver-vendor.js");
},
- async update_virtual_pressure_source(source_type, sample, context=null) {
+ async update_virtual_pressure_source(source_type, sample, estimate, context=null) {
throw new Error("update_virtual_pressure_source() is not implemented by testdriver-vendor.js");
},
async remove_virtual_pressure_source(source_type, context=null) {
throw new Error("remove_virtual_pressure_source() is not implemented by testdriver-vendor.js");
+ },
+
+ async set_protected_audience_k_anonymity(owner, name, hashes, context=null) {
+ throw new Error("set_protected_audience_k_anonymity() is not implemented by testdriver-vendor.js");
}
};
})();
diff --git a/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html b/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html
index 438e1db7ead..4a7b7ecc517 100644
--- a/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html
+++ b/tests/wpt/tests/sanitizer-api/sanitizer-config.tentative.html
@@ -95,9 +95,10 @@ for (key of ["attributes", "removeAttributes"]) {
test_normalization(key,
{name: "href", namespace: null},
{name: "href", namespace: null});
+ // https://wicg.github.io/sanitizer-api/#canonicalize-a-sanitizer-name, step 5
test_normalization(key,
{name: "href", namespace: ""},
- {name: "href", namespace: null}); // ??? Is this correct?
+ {name: "href", namespace: null});
test_normalization(key,
{name: "href", namespace: "https://www.w3.org/1999/xlink"},
{name: "href", namespace: "https://www.w3.org/1999/xlink"});
diff --git a/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html b/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html
index ab954f04b4c..f78d7d72d53 100644
--- a/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html
+++ b/tests/wpt/tests/screen-orientation/lock-sandboxed-iframe.html
@@ -18,14 +18,13 @@
resolve(evt.data.orientation);
break;
case "errored":
- resolve(evt.data.name);
+ resolve(evt.data);
break;
default:
assert_unreached(`Unexpected message: ${evt.data.result}`);
return;
}
window.removeEventListener("message", callback);
- resolve(evt.data.msg);
}
window.addEventListener("message", callback);
});
@@ -38,10 +37,15 @@
});
const message = await wait_result();
assert_equals(
- message,
+ message.lock_name,
"SecurityError",
"screen.lockOrientation() throws a SecurityError"
);
+ assert_equals(
+ message.unlock_name,
+ "SecurityError",
+ "screen.orientation.unlock() throws a SecurityError"
+ );
}, "Test without 'allow-orientation-lock' sandboxing directive");
promise_test(async (t) => {
diff --git a/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html b/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html
index 436c67f5b53..f4773535dbc 100644
--- a/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html
+++ b/tests/wpt/tests/screen-orientation/resources/sandboxed-iframe-locking.html
@@ -4,9 +4,6 @@
<script>
test_driver.set_test_context(parent);
-// At first, run simple unlock test without lock.
-screen.orientation?.unlock();
-
test_driver.bless("request full screen", async () => {
const data = {};
try {
@@ -16,15 +13,22 @@ test_driver.bless("request full screen", async () => {
data.orientation = screen.orientation.type;
} catch (error) {
data.result = "errored";
- data.name = error.name;
+ data.lock_name = error.name;
+ }
+
+ // Common safety check test for unlock().
+ try {
+ screen.orientation.unlock();
+ } catch (error) {
+ data.result = "errored";
+ data.unlock_name = error.name;
}
- screen.orientation.unlock();
try {
await document.exitFullscreen();
} catch (error) {
data.result = "errored";
- data.name = error.name;
+ data.exit_name = error.name;
}
parent.window.postMessage(data, "*");
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html
new file mode 100644
index 00000000000..aa92e32c562
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-alternate.tentative.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/web-animations/testcommon.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="support/support.js"></script>
+ </head>
+ <body>
+ <style>
+ @keyframes myAnim {
+ from { transform: scaleX(1); }
+ to { transform: scaleX(5); }
+ }
+ .subject, .target {
+ height: 50px;
+ width: 50px;
+ background-color: red;
+ }
+ .target {
+ animation: myAnim linear 0.5s both;
+ animation-trigger: alternate;
+ animation-trigger-range: 150px 200px;
+ }
+ .scroll {
+ animation-trigger-timeline: scroll();
+ }
+ .view {
+ animation-trigger-timeline: view();
+ }
+ .deferred {
+ animation-trigger-timeline: --viewtimeline;
+ }
+ .deferred.subject {
+ view-timeline: --viewtimeline;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 500px;
+ width: 500px;
+ border: solid 1px;
+ position: relative;
+ }
+ #wrapper {
+ timeline-scope: --viewtimeline;
+ }
+ #space {
+ width: 50px;
+ height: 600px;
+ }
+ </style>
+ <div id="wrapper">
+ <div id="scroll_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="scroll_target" class="scroll subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="view_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="view_target" class="view subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="deferred_subject" class="deferred subject" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_target" class="deferred target" tabindex="0"></div>
+ </div>
+ <script>
+ async function testAlternateAnimationTrigger(test, rangeBoundaries) {
+ // Just short of the trigger range start, no trigger action expected.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeAbove();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ // This skips the trigger range and should not play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeBelow();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ const initial_transform = getComputedStyle(target).transform;
+ // This enters the trigger range and should play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.enterTriggerRange();
+ }, target, ["animationstart", "animationend"], [true, true]);
+
+ const final_transform = getComputedStyle(target).transform;
+ // This is an alternate trigger, exiting the exit range reverses the
+ // animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitExitRangeAbove();
+ }, target, ["animationstart", "animationend", "animationcancel"],
+ [true, true, false]);
+ assert_equals(getComputedStyle(target).transform, initial_transform,
+ "animation reversed after reaching end");
+
+ // This is an alternate trigger, re-entering plays the animation.
+ await testAnimationTrigger(test, async () => {
+ // Enter the range.
+ await rangeBoundaries.enterTriggerRange();
+ await waitForAnimationFrames(5);
+ // Expect some but not all progress.
+ const current_transform = getComputedStyle(target).transform;
+ assert_not_equals(current_transform, initial_transform);
+ assert_not_equals(current_transform, final_transform);
+ // Exit the range.
+ return rangeBoundaries.exitExitRangeBelow();
+ }, target,
+ ["animationstart", "animationend", "animationcancel"],
+ [true, true, false]);
+ assert_equals(getComputedStyle(target).transform, initial_transform,
+ "animation reverse mid-animation");
+ }
+
+ // The trigger and exit ranges are the same for this test.
+ const CSS_TRIGGER_START_PX = 150;
+ const CSS_TRIGGER_END_PX = 200;
+
+ promise_test(async (test) => {
+ scroller = scroll_scroller;
+ target = scroll_target;
+
+ const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ scroller);
+ await testAlternateAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via scroll() timeline.");
+
+ promise_test(async (test) => {
+ scroller = view_scroller;
+ target = view_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testAlternateAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via view() timeline.");
+
+ promise_test(async (test) => {
+ scroller = deferred_scroller;
+ target = deferred_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testAlternateAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via deferred (view) timeline.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both-ref.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both-ref.html
new file mode 100644
index 00000000000..62b74fb778f
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both-ref.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" href="https://drafts.csswg.org/web-animations-2/#animation-trigger">
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ border: solid 1px;
+ place-self: center;
+ height: 300px;
+ width: 200px;
+ position: relative;
+ }
+ .target {
+ height: 100px;
+ width: 100%;
+ background-color: blue;
+ position: absolute;
+ left: -50px;
+ }
+ .space {
+ height: 250px;
+ width: 50%;
+ }
+ </style>
+ <div id="scroller" class="scroller">
+ <div class="space"></div>
+ <div id="target" class="target"></div>
+ <div class="space"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both.tentative.html
new file mode 100644
index 00000000000..237bbb99670
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-both.tentative.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" href="https://drafts.csswg.org/web-animations-2#animation-trigger">
+ <link rel="match" href="animation-trigger-fill-mode-both-ref.html">
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ border: solid 1px;
+ place-self: center;
+ height: 300px;
+ width: 200px;
+ position: relative;
+ }
+ @keyframes slide-in {
+ from {
+ transform: translateX(-50px);
+ }
+ }
+ .target {
+ height: 100px;
+ width: 100%;
+ background-color: blue;
+ animation: slide-in 0.3s both;
+ animation-trigger: view() alternate contain 0% contain 100%;
+ position: absolute;
+ }
+ .space {
+ height: 250px;
+ width: 50%;
+ }
+
+ </style>
+ <div id="scroller" class="scroller">
+ <div class="space"></div>
+ <div id="target" class="target"></div>
+ <div class="space"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none-ref.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none-ref.html
new file mode 100644
index 00000000000..229a31dec90
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none-ref.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ border: solid 1px;
+ place-self: center;
+ height: 300px;
+ width: 200px;
+ position: relative;
+ }
+ .target {
+ height: 100px;
+ width: 100%;
+ background-color: blue;
+ }
+ .space {
+ height: 250px;
+ width: 50%;
+ }
+
+ </style>
+ <div id="scroller" class="scroller">
+ <div class="space"></div>
+ <div id="target" class="target"></div>
+ <div class="space"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none.tentative.html
new file mode 100644
index 00000000000..81dae8a2f72
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-fill-mode-none.tentative.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" href="https://drafts.csswg.org/web-animations-2#animation-trigger">
+ <link rel="match" href="animation-trigger-fill-mode-none-ref.html">
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ border: solid 1px;
+ place-self: center;
+ height: 300px;
+ width: 200px;
+ }
+ @keyframes slide-in {
+ from {
+ transform: translateX(-50px);
+ }
+ }
+ .target {
+ height: 100px;
+ width: 100%;
+ background-color: blue;
+ animation: slide-in 3s none;
+ animation-trigger: view() alternate contain 0% contain 100%;
+ }
+ .space {
+ height: 250px;
+ width: 50%;
+ }
+
+ </style>
+ <div id="scroller" class="scroller">
+ <div class="space"></div>
+ <div id="target" class="target"></div>
+ <div class="space"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html
new file mode 100644
index 00000000000..23c6aa8ce9f
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once-play-state.tentative.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/web-animations/testcommon.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="support/support.js"></script>
+ </head>
+ <body>
+ <style>
+ @keyframes myAnim {
+ from { transform: scaleX(1); }
+ to { transform: scaleX(5); }
+ }
+ .subject, .target {
+ height: 50px;
+ width: 50px;
+ background-color: red;
+ }
+ .subject {
+ view-timeline: --viewtimeline;
+ }
+ .target {
+ animation: myAnim linear 0.5s forwards;
+ animation-trigger: once --viewtimeline 150px 200px;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 500px;
+ width: 500px;
+ border: solid 1px;
+ position: relative;
+ }
+ #wrapper {
+ timeline-scope: --viewtimeline;
+ }
+ #space {
+ width: 50px;
+ height: 600px;
+ }
+ </style>
+ <div id="wrapper">
+ <div id="scroller" class="scroller">
+ <div id="space"></div>
+ <div id="subject" class="subject"></div>
+ <div id="space"></div>
+ </div>
+ <div id="target" class="target"></div>
+ </div>
+ <script>
+ target = document.getElementById("target");
+
+ function changePlayStateTo(state) {
+ target.style.animationPlayState = state;
+ }
+
+ // The trigger and exit ranges are the same for this test.
+ const CSS_TRIGGER_START_PX = 150;
+ const CSS_TRIGGER_END_PX = 200;
+
+ async function testPlayStateChange(test, rangeBoundaries) {
+ const initial_transform = getComputedStyle(target).transform;
+ // This enters the trigger range and should play the animation. Changing
+ // animation-play-state to "paused" should pause the animation, so we
+ // should not see an animationend event.
+ await testAnimationTrigger(test, async () => {
+ await rangeBoundaries.enterTriggerRange();
+ // Make a little progess.
+ await waitForAnimationFrames(5);
+ changePlayStateTo("paused");
+ }, target, ["animationstart", "animationend"], [true, false]);
+ await waitForAnimationFrames(5);
+ const partial_transform = getComputedStyle(target).transform;
+ assert_not_equals(partial_transform, initial_transform,
+ "animation made progress before pause.");
+
+ await waitForAnimationFrames(5);
+ assert_equals(getComputedStyle(target).transform, partial_transform,
+ "animation is paused and progress is not being made.");
+
+ await testAnimationTrigger(test, async () => {
+ await rangeBoundaries.exitExitRangeAbove();
+ await waitForAnimationFrames(5);
+ // check that exiting the exit range did not affect the animation.
+ assert_equals(getComputedStyle(target).transform, partial_transform,
+ "animation still paused after exiting the exit range.");
+ changePlayStateTo("running");
+ }, target, ["animationstart", "animationend"], [false, true]);
+
+ const final_transform = getComputedStyle(target).transform;
+ assert_not_equals(final_transform, initial_transform,
+ "animation is at the end, not the start");
+ assert_not_equals(final_transform, partial_transform,
+ "animation is at the end, beyond partial progress.");
+ }
+
+ promise_test(async (test) => {
+ scroller = document.getElementById("scroller");
+ target = document.getElementById("target");
+
+ const COVER_START_OFFSET = 100;
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testPlayStateChange(test, rangeBoundaries);
+ }, "once trigger respects animation-play-state.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html
new file mode 100644
index 00000000000..e7603b458bc
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-once.tentative.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/web-animations/testcommon.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="support/support.js"></script>
+ </head>
+ <body>
+ <style>
+ @keyframes myAnim {
+ from { transform: scaleX(1); }
+ to { transform: scaleX(5); }
+ }
+ .subject, .target {
+ height: 50px;
+ width: 50px;
+ background-color: red;
+ }
+ .target {
+ animation: myAnim linear 0.5s forwards;
+ animation-trigger: once;
+ animation-trigger-range: 150px 200px;
+ }
+ .scroll {
+ animation-trigger-timeline: scroll();
+ }
+ .view {
+ animation-trigger-timeline: view();
+ }
+ .deferred {
+ animation-trigger-timeline: --viewtimeline;
+ }
+ .deferred.subject {
+ view-timeline: --viewtimeline;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 500px;
+ width: 500px;
+ border: solid 1px;
+ position: relative;
+ }
+ #wrapper {
+ timeline-scope: --viewtimeline;
+ }
+ #space {
+ width: 50px;
+ height: 600px;
+ }
+ </style>
+ <div id="wrapper">
+ <div id="scroll_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="scroll_target" class="scroll subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="view_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="view_target" class="view subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="deferred_subject" class="deferred subject" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_target" class="deferred target" tabindex="0"></div>
+ </div>
+ <script>
+ async function testOnceAnimationTrigger(test, rangeBoundaries) {
+ // Just short of the trigger range start, no trigger action expected.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeAbove();
+ }, target, ["animationstart", "animationend"],
+ [false, false]);
+
+ // This skips the trigger range and should not play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeBelow();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ // This enters the trigger range and should play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.enterTriggerRange();
+ }, target, ["animationstart", "animationend"], [true, true]);
+
+ // This is a once trigger, exiting the exit range has no effect.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitExitRangeAbove();
+ }, target, ["animationcancel", "animationend"], [false, false]);
+
+ // This is a once trigger, re-entering range has no effect.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.enterTriggerRange();
+ }, target, ["animationstart", "animationend"], [false, false]);
+ }
+
+ // The trigger and exit ranges are the same for this test.
+ const CSS_TRIGGER_START_PX = 150;
+ const CSS_TRIGGER_END_PX = 200;
+
+ promise_test(async (test) => {
+ scroller = scroll_scroller;
+ target = scroll_target;
+
+ const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ scroller);
+ await testOnceAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via scroll() timeline.");
+
+ promise_test(async (test) => {
+ scroller = view_scroller;
+ target = view_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testOnceAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via view() timeline.");
+
+ promise_test(async (test) => {
+ scroller = deferred_scroller;
+ target = deferred_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testOnceAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via deferred (view) timeline.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html
new file mode 100644
index 00000000000..cfbe9d3c933
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-repeat.tentative.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/web-animations/testcommon.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="support/support.js"></script>
+ </head>
+ <body>
+ <style>
+ @keyframes myAnim {
+ from { transform: scaleX(1); }
+ to { transform: scaleX(5); }
+ }
+ .subject, .target {
+ height: 50px;
+ width: 50px;
+ background-color: red;
+ }
+ .target {
+ animation: myAnim linear 0.5s both;
+ animation-trigger: repeat;
+ animation-trigger-range: 250px 300px;
+ animation-trigger-exit-range: 200px 350px;
+ }
+ .scroll {
+ animation-trigger-timeline: scroll();
+ }
+ .view {
+ animation-trigger-timeline: view();
+ }
+ .deferred {
+ animation-trigger-timeline: --viewtimeline;
+ }
+ .deferred.subject {
+ view-timeline: --viewtimeline;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 500px;
+ width: 500px;
+ border: solid 1px;
+ position: relative;
+ }
+ #wrapper {
+ timeline-scope: --viewtimeline;
+ }
+ #space {
+ width: 50px;
+ height: 600px;
+ }
+ </style>
+ <div id="wrapper">
+ <div id="scroll_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="scroll_target" class="scroll subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="view_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="view_target" class="view subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="deferred_subject" class="deferred subject" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_target" class="deferred target" tabindex="0"></div>
+ </div>
+ <script>
+ // // Each test case sets these.
+ // let scroller;
+ // let target;
+
+ async function testRepeatAnimationTrigger(test, rangeBoundaries) {
+ // Just short of the trigger range start, no trigger action expected.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeAbove();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ // This skips the trigger range and should not play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeBelow();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ // This enters the trigger range and should play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.enterTriggerRange();
+ }, target, ["animationstart", "animationend"], [true, true]);
+
+ // This is a repeat trigger, exiting the exit range resets the animation.
+ // We waited for an animationend event in the previous step so we won't
+ // see an animationcancel event here. But, by inspecting
+ // style.transform, we should see that the animation was reset.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitExitRangeAbove();
+ }, target, ["animationstart", "animationend", "animationcancel"],
+ [false, false, false]);
+ assert_equals(getComputedStyle(target).transform, "none");
+
+ // This is a repeat trigger, re-entering plays the animation.
+ await testAnimationTrigger(test, async () => {
+ // Enter the range.
+ await rangeBoundaries.enterTriggerRange();
+ await waitForAnimationFrames(5);
+ // Exit the range.
+ return rangeBoundaries.exitExitRangeBelow();
+ }, target, ["animationstart", "animationend", "animationcancel"],
+ [true, false, true]);
+ }
+
+ const CSS_TRIGGER_START_PX = 250;
+ const CSS_TRIGGER_END_PX = 300;
+ const CSS_EXIT_START_PX = 200;
+ const CSS_EXIT_END_PX = 350;
+
+ promise_test(async (test) => {
+ scroller = scroll_scroller;
+ target = scroll_target;
+
+ const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ CSS_EXIT_START_PX,
+ CSS_EXIT_END_PX,
+ scroller);
+ await testRepeatAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via scroll() timeline.");
+
+ promise_test(async (test) => {
+ scroller = view_scroller;
+ target = view_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_EXIT_START_PX,
+ COVER_START_OFFSET + CSS_EXIT_END_PX,
+ scroller);
+ await testRepeatAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via view() timeline.");
+
+ promise_test(async (test) => {
+ scroller = deferred_scroller;
+ target = deferred_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_EXIT_START_PX,
+ COVER_START_OFFSET + CSS_EXIT_END_PX,
+ scroller);
+ await testRepeatAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via deferred (view) timeline.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html
new file mode 100644
index 00000000000..a9d58ae4c32
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger-state.tentative.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/web-animations/testcommon.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="support/support.js"></script>
+ </head>
+ <body>
+ <style>
+ @keyframes myAnim {
+ from { transform: scaleX(1); }
+ to { transform: scaleX(5); }
+ }
+ .subject, .target {
+ height: 50px;
+ width: 50px;
+ background-color: red;
+ }
+ .target {
+ animation: myAnim linear 0.5s both;
+ animation-trigger: state;
+ animation-trigger-range: 150px 200px;
+ }
+ .scroll {
+ animation-trigger-timeline: scroll();
+ }
+ .view {
+ animation-trigger-timeline: view();
+ }
+ .deferred {
+ animation-trigger-timeline: --viewtimeline;
+ }
+ .deferred.subject {
+ view-timeline: --viewtimeline;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 500px;
+ width: 500px;
+ border: solid 1px;
+ position: relative;
+ }
+ #wrapper {
+ timeline-scope: --viewtimeline;
+ }
+ #space {
+ width: 50px;
+ height: 600px;
+ }
+ </style>
+ <div id="wrapper">
+ <div id="scroll_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="scroll_target" class="scroll subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="view_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="view_target" class="view subject target" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_scroller" class="scroller">
+ <div id="space"></div>
+ <div id="deferred_subject" class="deferred subject" tabindex="0"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_target" class="deferred target" tabindex="0"></div>
+ </div>
+ <script>
+ async function testStateAnimationTrigger(test, rangeBoundaries) {
+ // Just short of the trigger range start, no trigger action expected.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeAbove();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ // This skips the trigger range and should not play the animation.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.exitTriggerRangeBelow();
+ }, target, ["animationstart", "animationend"], [false, false]);
+
+ const initial_transform = getComputedStyle(target).transform;
+ // This is a state trigger, entering the trigger range plays the
+ // animation.
+ await testAnimationTrigger(test, async () => {
+ // Enter the range.
+ await rangeBoundaries.enterTriggerRange();
+ await waitForAnimationFrames(5);
+ // Expect some progress.
+ assert_not_equals(getComputedStyle(target).transform,
+ initial_transform);
+ // Exit the range, which should pause the animation.
+ return rangeBoundaries.exitExitRangeBelow();
+ }, target, ["animationstart", "animationend", "animationcancel"],
+ [true, false, false]);
+ let partial_transform = getComputedStyle(target).transform;
+
+ // Wait a few frames, then check that the animation is still paused.
+ await waitForAnimationFrames(5);
+ assert_equals(getComputedStyle(target).transform, partial_transform);
+
+ // This enters the trigger range and should continue the animation.
+ // Let it play till the end.
+ await testAnimationTrigger(test, () => {
+ return rangeBoundaries.enterTriggerRange();
+ }, target, ["animationstart", "animationend"], [false, true]);
+ let final_transform = getComputedStyle(target).transform;
+
+ // Exit the range. This should have no effect as the animation has
+ // already finished.
+ await testAnimationTrigger(test, async () => {
+ return rangeBoundaries.exitExitRangeAbove();
+ }, target, ["animationstart", "animationend", "animationcancel"],
+ [false, false, false]);
+
+ // Wait a few frames. Exiting the animation should make no difference;
+ // the animation is already finished.
+ await waitForAnimationFrames(5);
+ assert_equals(getComputedStyle(target).transform, final_transform);
+
+ // Enter the range again. This should make no difference. The animation
+ // is already finished.
+ await testAnimationTrigger(test, async () => {
+ return rangeBoundaries.enterTriggerRange();
+ }, target, ["animationstart", "animationend", "animationcancel"],
+ [false, false, false]);
+
+ // Wait a few frames. Check the animation is still at the end.
+ await waitForAnimationFrames(5);
+ assert_equals(getComputedStyle(target).transform, final_transform);
+ }
+
+ // The trigger and exit ranges are the same for this test.
+ const CSS_TRIGGER_START_PX = 150;
+ const CSS_TRIGGER_END_PX = 200;
+
+ promise_test(async (test) => {
+ scroller = scroll_scroller;
+ target = scroll_target;
+
+ const rangeBoundaries = getRangeBoundariesForTest(CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ CSS_TRIGGER_START_PX,
+ CSS_TRIGGER_END_PX,
+ scroller);
+ await testStateAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via scroll() timeline.");
+
+ promise_test(async (test) => {
+ scroller = view_scroller;
+ target = view_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testStateAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via view() timeline.");
+
+ promise_test(async (test) => {
+ scroller = deferred_scroller;
+ target = deferred_target;
+
+ const COVER_START_OFFSET = 100;
+
+ const rangeBoundaries = getRangeBoundariesForTest(
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_START_PX,
+ COVER_START_OFFSET + CSS_TRIGGER_END_PX,
+ scroller);
+ await testStateAnimationTrigger(test, rangeBoundaries);
+ }, "once animation triggered via deferred (view) timeline.");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html
new file mode 100644
index 00000000000..dd4820dfe5f
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/animation-trigger.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/web-animations/testcommon.js"></script>
+ <script src="/css/css-typed-om/resources/testhelper.js"></script>
+ </head>
+ <body>
+ <style>
+ @keyframes myAnim {
+ from { transform: scaleX(1); }
+ to { transform: scaleX(5); }
+ }
+ .subject, .target {
+ height: 50px;
+ width: 50px;
+ background-color: red;
+ }
+ .subject {
+ view-timeline: --viewtimeline;
+ }
+ .target {
+ animation: myAnim linear 0.5s forwards;
+ }
+ .scroll_target {
+ animation-trigger: repeat scroll(inline) 150px 200px 100px 250px;
+ }
+ .view_target {
+ animation-trigger: state view(x) contain 10% contain 90% cover 10% cover 90%;
+ }
+ .deferred_target {
+ animation-trigger: alternate --viewtimeline contain 5% contain 80% cover 5% cover 80%;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 500px;
+ width: 500px;
+ border: solid 1px;
+ position: relative;
+ }
+ #wrapper {
+ timeline-scope: --viewtimeline;
+ }
+ #space {
+ width: 50px;
+ height: 600px;
+ }
+ </style>
+ <div id="wrapper">
+ <div id="default_target" class="target"></div>
+ <div id="scroller" class="scroller">
+ <div id="space"></div>
+ <div id="scroll_target" class="target"></div>
+ <div id="space"></div>
+ <div id="view_target" class="target"></div>
+ <div id="space"></div>
+ <div id="deferred_subject" class="subject"></div>
+ <div id="space"></div>
+ </div>
+ <div id="deferred_target" class="target"></div>
+ </div>
+ <script>
+ function assert_timeline_offset(actual, expected, errorMessage) {
+ assert_equals(actual.rangeName, expected.rangeName, errorMessage);
+ assert_style_value_equals(actual.offset, expected.offset);
+ }
+
+ function testTrigger(trigger, expectation) {
+ assert_equals(trigger.type, expectation.type, "trigger type matches");
+ assert_timeline_offset(trigger.rangeStart, expectation.rangeStart,
+ "trigger rangeStart matches");
+ assert_timeline_offset(trigger.rangeEnd, expectation.rangeEnd,
+ "trigger rangeEnd matches");
+ assert_timeline_offset(trigger.exitRangeStart, expectation.exitRangeStart,
+ "trigger exitRangeStart matches");
+ assert_timeline_offset(trigger.exitRangeEnd, expectation.exitRangeEnd,
+ "trigger exitRangeEnd matches");
+ if (expectation.timeline === document.timeline) {
+ assert_equals(trigger.timeline, document.timeline, "timeline matches");
+ } else {
+ assert_equals(trigger.timeline.source, expectation.timelineSource,
+ "trigger timeline source matches");
+ assert_equals(trigger.timeline.axis, expectation.timelineAxis,
+ "trigger timeline axis matches");
+ assert_equals(trigger.timeline.subject, expectation.timelineSubject,
+ "trigger timeline subject matches");
+ }
+ }
+
+ promise_test(async() => {
+ await waitForNextFrame();
+ const animation = default_target.getAnimations()[0];
+ const trigger = animation.trigger;
+
+ const expectation = {
+ type: "once",
+ rangeStart: "normal",
+ rangeEnd: "normal",
+ exitRangeStart: "normal",
+ exitRangeEnd: "normal",
+ timeline: document.timeline
+ };
+
+ testTrigger(trigger, expectation);
+ }, "Default AnimationTrigger for CSS Animation");
+
+ promise_test(async() => {
+ await waitForNextFrame();
+ // Grabbing a reference to the animation and *then* adding the class
+ // which confers the trigger properties is a workaround to the fact that
+ // if the scroll-based trigger were already in place, the animation
+ // would be idle, getAnimations would not include it, and we would not
+ // be able to get a reference to it.
+ // TODO: if the definition for getAnimations changes such that it should
+ // include un-triggered animations, we should remove this workaround.
+ const animation = scroll_target.getAnimations()[0];
+ scroll_target.classList.add("scroll_target");
+ const trigger = animation.trigger;
+ await waitForNextFrame();
+
+ const expectation = {
+ type: "repeat",
+ rangeStart: { rangeName: "none", offset: CSS.px(150) },
+ rangeEnd: { rangeName: "none", offset: CSS.px(200) },
+ exitRangeStart: { rangeName: "none", offset: CSS.px(100) },
+ exitRangeEnd: { rangeName: "none", offset: CSS.px(250) },
+ timelineSource: scroller,
+ timelineAxis: "inline"
+ };
+
+ testTrigger(trigger, expectation);
+ }, "AnimationTrigger for CSS Animation with scroll() timeline");
+
+ promise_test(async() => {
+ await waitForNextFrame();
+ const animation = view_target.getAnimations()[0];
+ view_target.classList.add("view_target");
+ const trigger = animation.trigger;
+ await waitForNextFrame();
+
+ const expectation = {
+ type: "state",
+ rangeStart: { rangeName: 'contain', offset: CSS.percent(10) },
+ rangeEnd: { rangeName: 'contain', offset: CSS.percent(90) },
+ exitRangeStart: { rangeName: 'cover', offset: CSS.percent(10) },
+ exitRangeEnd: { rangeName: 'cover', offset: CSS.percent(90) },
+ timelineSource: scroller,
+ timelineAxis: "x",
+ timelineSubject: view_target
+ };
+
+ testTrigger(trigger, expectation);
+ }, "AnimationTrigger for CSS Animation with view() timeline");
+
+ promise_test(async() => {
+ await waitForNextFrame();
+ const animation = deferred_target.getAnimations()[0];
+ deferred_target.classList.add("deferred_target");
+ const trigger = animation.trigger;
+ await waitForNextFrame();
+
+ const expectation = {
+ type: "alternate",
+ rangeStart: { rangeName: 'contain', offset: CSS.percent(5) },
+ rangeEnd: { rangeName: 'contain', offset: CSS.percent(80) },
+ exitRangeStart: { rangeName: 'cover', offset: CSS.percent(5) },
+ exitRangeEnd: { rangeName: 'cover', offset: CSS.percent(80) },
+ timelineSource: scroller,
+ timelineAxis: "block",
+ timelineSubject: deferred_subject
+ };
+
+ testTrigger(trigger, expectation);
+ }, "AnimationTrigger for CSS Animation with deferred timeline");
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/scroll-animations/animation-trigger/support/support.js b/tests/wpt/tests/scroll-animations/animation-trigger/support/support.js
new file mode 100644
index 00000000000..f5aa18e82f1
--- /dev/null
+++ b/tests/wpt/tests/scroll-animations/animation-trigger/support/support.js
@@ -0,0 +1,86 @@
+
+// Assert that the user agent under test supports AnimationTrigger.
+// AnimationTrigger tests should do this sanity check before proceeding.
+function assertAnimationTriggerSupport() {
+ assert_true(document.documentElement.style.animationTrigger !== undefined);
+}
+
+const setScrollTop = (scroller, y) => {
+ const scrollend_promise =
+ waitForScrollEndFallbackToDelayWithoutScrollEvent(scroller);
+ scroller.scrollTop = y;
+ return scrollend_promise;
+}
+
+function getRangeBoundariesForTest(trigger_start, trigger_end,
+ exit_start, exit_end, scroller) {
+ let rangeBoundaries = {
+ scroller: scroller,
+ offsetWithinTriggerRange: (trigger_start + trigger_end) / 2,
+ offsetAboveTriggerRange: trigger_start - 10,
+ offsetBelowTriggerRange: trigger_end + 10,
+ offsetAboveExitRange: exit_start - 10,
+ offsetBelowExitRange: exit_end + 10,
+ };
+
+ rangeBoundaries.enterTriggerRange = async () => {
+ return setScrollTop(rangeBoundaries.scroller,
+ rangeBoundaries.offsetWithinTriggerRange);
+ };
+ rangeBoundaries.exitTriggerRangeAbove = async () => {
+ return setScrollTop(rangeBoundaries.scroller,
+ rangeBoundaries.offsetAboveTriggerRange);
+ };
+ rangeBoundaries.exitTriggerRangeBelow = async () => {
+ return setScrollTop(rangeBoundaries.scroller,
+ rangeBoundaries.offsetBelowTriggerRange);
+ };
+ rangeBoundaries.exitExitRangeAbove = async () => {
+ return setScrollTop(rangeBoundaries.scroller,
+ rangeBoundaries.offsetAboveExitRange);
+ };
+ rangeBoundaries.exitExitRangeBelow = async () => {
+ return setScrollTop(rangeBoundaries.scroller,
+ rangeBoundaries.offsetBelowExitRange);
+ };
+
+ return rangeBoundaries;
+}
+
+// Helper function for animation-trigger tests. Aims to perform a scroll and
+// observe the animation events indicated by |events_of_interest| and
+// |events_should_fire|
+async function testAnimationTrigger(test, scroll_fn, target,
+ events_of_interest, events_should_fire) {
+ assertAnimationTriggerSupport();
+
+ let evt_promises = [];
+ for (let idx = 0; idx < events_of_interest.length; idx++) {
+ const evt = events_of_interest[idx];
+ const animationevent_promise = new Promise((resolve) => {
+ const watcher_func = () => {
+ if (!events_should_fire[idx]) {
+ test.unreached_func(`received unexpected event: ${evt}.`)();
+ }
+ resolve();
+ }
+
+ target.addEventListener(evt, watcher_func,
+ { once: true });
+
+ // If we are not expecting the event, just wait for 3 frames before
+ // continuing the test.
+ if (!events_should_fire[idx]) {
+ waitForAnimationFrames(3).then(() => {
+ target.removeEventListener(evt, watcher_func);
+ resolve();
+ });
+ }
+ });
+
+ evt_promises.push(animationevent_promise);
+ }
+
+ await scroll_fn();
+ await Promise.all(evt_promises);
+}
diff --git a/tests/wpt/tests/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html b/tests/wpt/tests/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html
index 15f07305b0d..2e54b328f02 100644
--- a/tests/wpt/tests/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html
+++ b/tests/wpt/tests/selection/shadow-dom/tentative/Selection-getComposedRanges-range-update.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<body>
-<meta name="assert" content="Selection's getComposedRanges should be updated when its associated live range changes">
+<meta name="assert" content="Selection's composed range should be updated when its associated legacy uncomposed range changes">
<link rel="help" href="https://w3c.github.io/selection-api/#dom-selection-getcomposedranges">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -17,6 +17,7 @@
</div>
</template>
</div>
+<div id="lightEnd">End outside shadow DOM</div>
<script>
@@ -27,48 +28,150 @@ const innerHost = outerRoot.getElementById('innerHost');
const innerRoot = innerHost.shadowRoot;
test(() => {
- // Step 1: Setting a composed live range that crosses boundaries
+ // Setting a selction crossing to shadow tree
selection.setBaseAndExtent(light.firstChild, 10, innerHost.firstChild, 5);
+ assert_throws_dom("INDEX_SIZE_ERR", function () { selection.getRangeAt(0) });
+}, 'If selection crosses shadow boundaries, getRangeAt(0) should throw an IndexSizeError because the end is not in the document tree.');
+
+test(() => {
+ // Setting a selection within light tree
+ selection.setBaseAndExtent(light.firstChild, 10, lightEnd.firstChild, 20);
const liveRange = selection.getRangeAt(0);
- const composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ const newSpan = document.createElement("span");
+ liveRange.setStart(newSpan, 0);
+
+ assert_true(liveRange.collapsed);
+ assert_equals(liveRange.startContainer, newSpan);
+ assert_equals(liveRange.startOffset, 0);
+
+ assert_true(selection.isCollapsed);
+ assert_equals(selection.anchorNode, null);
+ assert_equals(selection.anchorOffset, 0);
+
+ assert_throws_dom("INDEX_SIZE_ERR", function () { selection.getRangeAt(0) });
+ assert_equals(selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] }).length, 0);
+
+}, 'modify getRangeAt() range: setStart() to disconnected node will collapse and remove the live range from the selection.');
+
+test(() => {
+ // Setting a selection within light tree
+ selection.setBaseAndExtent(light.firstChild, 10, light.firstChild, 20);
+ const liveRange = selection.getRangeAt(0);
+ let composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+
+ assert_equals(liveRange.startContainer, light.firstChild);
+ assert_equals(liveRange.startOffset, 10);
+ assert_equals(liveRange.endContainer, light.firstChild);
+ assert_equals(liveRange.endOffset, 20);
+
+ assert_equals(selection.anchorNode, light.firstChild);
+ assert_equals(selection.anchorOffset, 10);
+ assert_equals(selection.focusNode, light.firstChild);
+ assert_equals(selection.focusOffset, 20);
+
+ assert_equals(composedRange.startContainer, light.firstChild);
+ assert_equals(composedRange.startOffset, 10);
+ assert_equals(composedRange.endContainer, light.firstChild);
+ assert_equals(composedRange.endOffset, 20);
+ liveRange.setEnd(innerHost.firstChild, 5);
+ composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+
+ assert_true(liveRange.collapsed);
assert_equals(liveRange.startContainer, innerHost.firstChild);
assert_equals(liveRange.startOffset, 5);
- assert_equals(liveRange.endContainer, innerHost.firstChild);
- assert_equals(liveRange.endOffset, 5);
+ assert_true(selection.isCollapsed);
assert_equals(selection.anchorNode, innerHost.firstChild);
assert_equals(selection.anchorOffset, 5);
- assert_equals(selection.focusNode, innerHost.firstChild);
- assert_equals(selection.focusOffset, 5);
assert_equals(composedRange.startContainer, light.firstChild);
assert_equals(composedRange.startOffset, 10);
assert_equals(composedRange.endContainer, innerHost.firstChild);
assert_equals(composedRange.endOffset, 5);
+}, 'modify getRangeAt() range: setEnd() crosses shadow boundary into the shadow DOM and after start, which collapses live range. Composed selection range is not collapsed.');
+
+test(() => {
+ // Setting a selection within light tree
+ selection.setBaseAndExtent(lightEnd.firstChild, 10, lightEnd.firstChild, 20);
+ const liveRange = selection.getRangeAt(0);
+ let composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+
+ assert_equals(liveRange.startContainer, lightEnd.firstChild);
+ assert_equals(liveRange.startOffset, 10);
+ assert_equals(liveRange.endContainer, lightEnd.firstChild);
+ assert_equals(liveRange.endOffset, 20);
+
+ assert_equals(selection.anchorNode, lightEnd.firstChild);
+ assert_equals(selection.anchorOffset, 10);
+ assert_equals(selection.focusNode, lightEnd.firstChild);
+ assert_equals(selection.focusOffset, 20);
- // Step 2: Update the live range only using setEnd
- liveRange.setEnd(innerHost.firstChild, 6);
- const composedRange2 = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ assert_equals(composedRange.startContainer, lightEnd.firstChild);
+ assert_equals(composedRange.startOffset, 10);
+ assert_equals(composedRange.endContainer, lightEnd.firstChild);
+ assert_equals(composedRange.endOffset, 20);
+
+ liveRange.setStart(innerHost.firstChild, 5);
+ composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ assert_true(liveRange.collapsed);
assert_equals(liveRange.startContainer, innerHost.firstChild);
assert_equals(liveRange.startOffset, 5);
- assert_equals(liveRange.endContainer, innerHost.firstChild);
- assert_equals(liveRange.endOffset, 6);
+ assert_true(selection.isCollapsed);
+ assert_equals(selection.anchorNode, innerHost.firstChild);
+ assert_equals(selection.anchorOffset, 5);
+
+ assert_equals(composedRange.startContainer, innerHost.firstChild);
+ assert_equals(composedRange.startOffset, 5);
+ assert_equals(composedRange.endContainer, lightEnd.firstChild);
+ assert_equals(composedRange.endOffset, 20);
+}, 'modify getRangeAt() range: setStart() crosses shadow boundary into the shadow DOM and before end, which collapses live range. Composed selection range is not collapsed.');
+
+test(() => {
+ // Setting a selection within light tree
+ selection.setBaseAndExtent(light.firstChild, 10, light.firstChild, 20);
+ const liveRange = selection.getRangeAt(0);
+ let composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+
+ assert_equals(liveRange.startContainer, light.firstChild);
+ assert_equals(liveRange.startOffset, 10);
+ assert_equals(liveRange.endContainer, light.firstChild);
+ assert_equals(liveRange.endOffset, 20);
+
+ assert_equals(selection.anchorNode, light.firstChild);
+ assert_equals(selection.anchorOffset, 10);
+ assert_equals(selection.focusNode, light.firstChild);
+ assert_equals(selection.focusOffset, 20);
+
+ assert_equals(composedRange.startContainer, light.firstChild);
+ assert_equals(composedRange.startOffset, 10);
+ assert_equals(composedRange.endContainer, light.firstChild);
+ assert_equals(composedRange.endOffset, 20);
+
+ liveRange.setStart(innerHost.firstChild, 5);
+ composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+
+ assert_true(liveRange.collapsed);
+ assert_equals(liveRange.startContainer, innerHost.firstChild);
+ assert_equals(liveRange.startOffset, 5);
+
+ assert_true(selection.isCollapsed);
assert_equals(selection.anchorNode, innerHost.firstChild);
assert_equals(selection.anchorOffset, 5);
- assert_equals(selection.focusNode, innerHost.firstChild);
- assert_equals(selection.focusOffset, 6);
- assert_equals(composedRange2.startContainer, light.firstChild);
- assert_equals(composedRange2.startOffset, 10);
- assert_equals(composedRange2.endContainer, innerHost.firstChild);
- assert_equals(composedRange2.endOffset, 6);
+ assert_true(composedRange.collapsed);
+ assert_equals(composedRange.startContainer, innerHost.firstChild);
+ assert_equals(composedRange.startOffset, 5);
+}, 'modify getRangeAt() range: setStart() crosses shadow boundary into the shadow DOM and after end, which collapses both live range and composed selection range.');
- // Step 3: selectNode() calls both setStart/setEnd
+test(() => {
+ // Setting a selection within light tree
+ selection.setBaseAndExtent(light.firstChild, 10, lightEnd.firstChild, 20);
+ const liveRange = selection.getRangeAt(0);
liveRange.selectNode(innerHost);
- const composedRange3 = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ const composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
assert_equals(liveRange.startContainer, outerRoot);
assert_equals(liveRange.startOffset, 3);
@@ -80,30 +183,31 @@ test(() => {
assert_equals(selection.focusNode, outerRoot);
assert_equals(selection.focusOffset, 4);
- assert_equals(composedRange3.startContainer, outerRoot);
- assert_equals(composedRange3.startOffset, 3);
- assert_equals(composedRange3.endContainer, outerRoot);
- assert_equals(composedRange3.endOffset, 4);
+ assert_equals(composedRange.startContainer, outerRoot);
+ assert_equals(composedRange.startOffset, 3);
+ assert_equals(composedRange.endContainer, outerRoot);
+ assert_equals(composedRange.endOffset, 4);
+}, 'modify getRangeAt() range: selectNode() innerHost for all ranges.');
- // Step 4: collapse(false) calls setEnd only
+test(() => {
+ // Setting a selection within light tree
+ selection.setBaseAndExtent(light.firstChild, 10, lightEnd.firstChild, 20);
+ const liveRange = selection.getRangeAt(0);
liveRange.collapse();
- const composedRange4 = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ const composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
- assert_equals(liveRange.startContainer, outerRoot);
- assert_equals(liveRange.startOffset, 4);
- assert_equals(liveRange.endContainer, outerRoot);
- assert_equals(liveRange.endOffset, 4);
+ assert_true(liveRange.collapsed);
+ assert_equals(liveRange.startContainer, lightEnd.firstChild);
+ assert_equals(liveRange.startOffset, 20);
- assert_equals(selection.anchorNode, outerRoot);
- assert_equals(selection.anchorOffset, 4);
- assert_equals(selection.focusNode, outerRoot);
- assert_equals(selection.focusOffset, 4);
+ assert_true(selection.isCollapsed);
+ assert_equals(selection.anchorNode, lightEnd.firstChild);
+ assert_equals(selection.anchorOffset, 20);
- assert_equals(composedRange4.startContainer, outerRoot);
- assert_equals(composedRange4.startOffset, 4);
- assert_equals(composedRange4.endContainer, outerRoot);
- assert_equals(composedRange4.endOffset, 4);
-}, 'modify getRangeAt() range.');
+ assert_true(composedRange.collapsed);
+ assert_equals(composedRange.startContainer, lightEnd.firstChild);
+ assert_equals(composedRange.startOffset, 20);
+ }, 'modify getRangeAt() range: collapse() collapses all ranges.');
test(() => {
// Step 1: Creating a live range and only setting its end/anchor
@@ -112,37 +216,32 @@ test(() => {
liveRange.setEnd(innerHost.firstChild, 5);
const composedRanges = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] });
+ assert_true(liveRange.collapsed);
assert_equals(liveRange.startContainer, innerHost.firstChild);
assert_equals(liveRange.startOffset, 5);
- assert_equals(liveRange.endContainer, innerHost.firstChild);
- assert_equals(liveRange.endOffset, 5);
+ assert_true(selection.isCollapsed);
assert_equals(selection.anchorNode, null);
assert_equals(selection.anchorOffset, 0);
- assert_equals(selection.focusNode, null);
- assert_equals(selection.focusOffset, 0);
- assert_equals(composedRanges.length, 0);
+ assert_equals(composedRanges.length, 0, 'range is not added to selection yet.');
// Step 2: Add range to selection so range API updates will change selection
selection.addRange(liveRange);
const composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
- assert_equals(liveRange.startContainer, innerHost.firstChild);
- assert_equals(liveRange.startOffset, 5);
+ assert_true(liveRange.collapsed);
assert_equals(liveRange.endContainer, innerHost.firstChild);
assert_equals(liveRange.endOffset, 5);
+ assert_true(selection.isCollapsed);
assert_equals(selection.anchorNode, innerHost.firstChild);
assert_equals(selection.anchorOffset, 5);
- assert_equals(selection.focusNode, innerHost.firstChild);
- assert_equals(selection.focusOffset, 5);
+ assert_true(composedRange.collapsed);
assert_equals(composedRange.startContainer, innerHost.firstChild);
assert_equals(composedRange.startOffset, 5);
- assert_equals(composedRange.endContainer, innerHost.firstChild);
- assert_equals(composedRange.endOffset, 5);
-}, 'modify createRange() range added to selection after setEnd call.');
+}, 'modify createRange() range: adding to selection sets the selection');
test(() => {
// Step 1: Creating a live range and only setting its end/anchor
@@ -151,17 +250,15 @@ test(() => {
// Add range to selection so range API updates will change selection
selection.addRange(liveRange);
liveRange.setEnd(innerHost.firstChild, 5);
- const composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ let composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ assert_true(liveRange.collapsed);
assert_equals(liveRange.startContainer, innerHost.firstChild);
assert_equals(liveRange.startOffset, 5);
- assert_equals(liveRange.endContainer, innerHost.firstChild);
- assert_equals(liveRange.endOffset, 5);
+ assert_true(selection.isCollapsed);
assert_equals(selection.anchorNode, innerHost.firstChild);
assert_equals(selection.anchorOffset, 5);
- assert_equals(selection.focusNode, innerHost.firstChild);
- assert_equals(selection.focusOffset, 5);
assert_equals(composedRange.startContainer, document);
assert_equals(composedRange.startOffset, 0);
@@ -170,21 +267,19 @@ test(() => {
// Step 2: Update the live range by setting its start/focus
liveRange.setStart(light.firstChild, 10);
- const composedRangeAfter = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ composedRange = selection.getComposedRanges({ shadowRoots: [outerRoot, innerRoot] })[0];
+ assert_true(liveRange.collapsed);
assert_equals(liveRange.startContainer, light.firstChild);
assert_equals(liveRange.startOffset, 10);
- assert_equals(liveRange.endContainer, light.firstChild);
- assert_equals(liveRange.endOffset, 10);
+ assert_true(selection.isCollapsed);
assert_equals(selection.anchorNode, light.firstChild);
assert_equals(selection.anchorOffset, 10);
- assert_equals(selection.focusNode, light.firstChild);
- assert_equals(selection.focusOffset, 10);
- assert_equals(composedRangeAfter.startContainer, light.firstChild);
- assert_equals(composedRangeAfter.startOffset, 10);
- assert_equals(composedRangeAfter.endContainer, innerHost.firstChild);
- assert_equals(composedRangeAfter.endOffset, 5);
-}, 'modify createRange() range added to selection before setStart/setEnd calls.');
+ assert_equals(composedRange.startContainer, light.firstChild);
+ assert_equals(composedRange.startOffset, 10);
+ assert_equals(composedRange.endContainer, innerHost.firstChild);
+ assert_equals(composedRange.endOffset, 5);
+}, 'modify createRange() range: added to selection before setStart/setEnd calls.');
</script>
diff --git a/tests/wpt/tests/shadow-dom/WEB_FEATURES.yml b/tests/wpt/tests/shadow-dom/WEB_FEATURES.yml
index dcb21f38716..9bdf694256b 100644
--- a/tests/wpt/tests/shadow-dom/WEB_FEATURES.yml
+++ b/tests/wpt/tests/shadow-dom/WEB_FEATURES.yml
@@ -4,3 +4,6 @@ features:
- name: slot-assign
files:
- imperative-slot-*
+- name: document-caretpositionfrompoint
+ files:
+ - Document-caretPositionFromPoint.tentative.html
diff --git a/tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html b/tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html
new file mode 100644
index 00000000000..6474729b8b4
--- /dev/null
+++ b/tests/wpt/tests/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<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>
+
+<body>
+ <x-shadow id="xShadow"></x-shadow>
+</body>
+
+<script>
+'use strict';
+
+/**
+ * command to select text in shadow-root
+ */
+function selectText(element, start, end) {
+ getSelection().empty();
+ const actions = new test_driver.Actions();
+ actions.pointerMove(start, 0, {origin: element});
+ actions.pointerDown();
+ actions.pointerMove(end, 0, {origin: element});
+ actions.pointerUp();
+ return actions.send();
+}
+
+/**
+ * command to type foo.
+ */
+ function typeFoo() {
+ const actions = new test_driver.Actions();
+ actions.keyDown("F");
+ actions.keyUp("F");
+ actions.keyDown("O");
+ actions.keyUp("O");
+ actions.keyDown("O");
+ actions.keyUp("O");
+ return actions.send();
+}
+
+promise_test(async () => {
+ const xShadow = document.getElementById('xShadow');
+ const root = xShadow.attachShadow({ mode: 'open', delegatesFocus: true });
+ const span = document.createElement('span');
+ span.textContent = 'Example Text to Select ';
+ const br = document.createElement('br');
+ const input = document.createElement('input');
+ root.append(span, br, input);
+
+ await selectText(xShadow, 0, 0);
+ assert_equals(document.activeElement, xShadow);
+ assert_equals(xShadow.shadowRoot.activeElement, input, "click on shadow host with delegatesFocus focuses the input element.");
+
+ await typeFoo();
+ assert_equals(input.value, 'FOO', "keyboard typing will update the input value.");
+
+ await selectText(xShadow, 0, 50);
+ const s = getSelection();
+ assert_greater_than(s.toString().length, 0, "drag text will update selection.");
+}, 'shadow root has selectable text when focus is delegated. Selection goes to text control if it is the delegated focusable area.');
+
+</script>
diff --git a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
new file mode 100644
index 00000000000..a4a5f372838
--- /dev/null
+++ b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <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>
+</head>
+
+<body>
+ <button id="reset-button-1" type="reset" form="fancy-form-1"></button>
+ <fancy-form-1 id="fancy-form-1">
+ <template shadowrootmode="open" shadowrootreferencetarget="real-form">
+ <form id="real-form">
+ <input type="text" value="default value">
+ </form>
+ </template>
+ </fancy-form-1>
+
+ <button id="reset-button-2" type="reset" form="fancy-form-2"></button>
+ <fancy-form-2 id="fancy-form-2"></fancy-form-2>
+ <script>
+ const fancyForm2 = document.querySelector('fancy-form-2');
+ fancyForm2.attachShadow({ mode: 'open', referenceTarget: 'real-form' });
+ fancyForm2.shadowRoot.innerHTML = '<form id="real-form"><input type="text" value="default value"></form>';
+ </script>
+
+ <button id="reset-button-3" type="reset"></button>
+ <fancy-form-3 id="fancy-form-3">
+ <template shadowrootmode="open" shadowrootreferencetarget="real-form">
+ <form id="real-form">
+ <input type="text" value="default value">
+ </form>
+ </template>
+ </fancy-form-3>
+
+ <script>
+ function testFormWithReferenceTarget(formId, resetButtonId, name) {
+ test(function () {
+ const fancyForm = document.getElementById(formId);
+ const realForm = fancyForm.shadowRoot.getElementById("real-form");
+ const input = realForm.firstElementChild;
+
+ input.value = "new value";
+ const resetButton = document.getElementById(resetButtonId);
+ assert_equals(input.value, "new value", "The input value should be updated to the new value.");
+ resetButton.click();
+ assert_equals(input.value, "default value", "The input value should be reset to the default value.");
+ }, name);
+ }
+
+ testFormWithReferenceTarget('fancy-form-1', 'reset-button-1', "Reference target works with form attribute.");
+ testFormWithReferenceTarget('fancy-form-2', 'reset-button-2', "Reference target works with form attribute via options.");
+
+ document.getElementById('reset-button-3').setAttribute('form', "fancy-form-3");
+ testFormWithReferenceTarget('fancy-form-3', 'reset-button-3', "Reference target works with setAttribute('form')");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/shadow-dom/reference-target/tentative/property-reflection.html b/tests/wpt/tests/shadow-dom/reference-target/tentative/property-reflection.html
index a44baeaf4a3..6e8b77fb785 100644
--- a/tests/wpt/tests/shadow-dom/reference-target/tentative/property-reflection.html
+++ b/tests/wpt/tests/shadow-dom/reference-target/tentative/property-reflection.html
@@ -104,14 +104,18 @@
const expected_htmlFor_property_behavior = (referencing_element_type == "output") ? Behavior.ReflectsHostIDInDOMTokenList : Behavior.ReflectsHostID;
test_property_reflection(element_creation_method, referencing_element_type, referenced_element_type, "for", "htmlFor", expected_htmlFor_property_behavior);
- // It's unclear whether `form` and `list` should return null or should return the
- // shadow host. See https://github.com/WICG/webcomponents/issues/1072.
- test_property_reflection(element_creation_method, referencing_element_type, referenced_element_type, "form", "form", Behavior.IsNull);
- test_property_reflection(element_creation_method, referencing_element_type, referenced_element_type, "list", "list", Behavior.IsNull);
+ // The form property of <label>, <legend>, and <option> reflects the form property of the associated labelable element,
+ // the associated <fieldset>, and the associated <select>, respectively. Here since we don't have those associated elements,
+ // the form property would return null.
+ const expected_form_property_behavior = (referenced_element_type == 'form' &&
+ referencing_element_type != "label" &&
+ referencing_element_type != "legend" &&
+ referencing_element_type != "option") ? Behavior.ReflectsHost : Behavior.IsNull;
+ test_property_reflection(element_creation_method, referencing_element_type, referenced_element_type, "form", "form", expected_form_property_behavior);
+
+ const expected_list_property_behavior = (referenced_element_type == 'datalist') ? Behavior.ReflectsHost : Behavior.IsNull;
+ test_property_reflection(element_creation_method, referencing_element_type, referenced_element_type, "list", "list", expected_list_property_behavior);
- // It's unclear whether this should always reflect the host even if the underlying
- // referenced element isn't labelable. See
- // https://github.com/WICG/webcomponents/issues/1072#issuecomment-2305875929
const expected_control_property_behavior = HTML5_LABELABLE_ELEMENTS.includes(referenced_element_type) ? Behavior.ReflectsHost : Behavior.IsNull;
test_property_reflection(element_creation_method, referencing_element_type, referenced_element_type, "for", "control", expected_control_property_behavior);
}
diff --git a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-precommit.tentative.html
index ae17db7d59f..b5d6077e13d 100644
--- a/tests/wpt/tests/soft-navigation-heuristics/navigation-api-after-transition-commit.tentative.html
+++ b/tests/wpt/tests/soft-navigation-heuristics/navigation-api-precommit.tentative.html
@@ -15,11 +15,8 @@
</main>
<script>
const link = document.getElementById("link");
- testNavigationApi("Test soft navigation when navigate event intecepts with { commit: 'after-transition' }", e => {
- e.intercept({commit: "after-transition", handler: async () => {
- await addImageToMain();
- e.commit();
- }});
+ testNavigationApi("Test soft navigation when navigate event intecepts with a precommit handler", e => {
+ e.intercept({precommitHandler: async () => addImageToMain() });
timestamps[counter]["eventEnd"] = performance.now();
}, link);
</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html
new file mode 100644
index 00000000000..af2df0f12ab
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-register.https.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<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="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+
+<script>
+function getNextWindowMessageFromFrame(frame) {
+ return new Promise(resolve => {
+ window.addEventListener('message', event => {
+ if (event.source === frame.contentWindow) {
+ resolve(event.data);
+ }
+ });
+ });
+}
+
+promise_setup(async () => {
+ assertSpeculationRulesIsSupported()
+ await test_driver.set_rph_registration_mode('autoAccept');
+ await test_driver.bless('handler registration');
+});
+
+// The overall idea for this test is:
+// 1. Register a protocol handler for a custom URI scheme to target 1 (initial).
+// 2. Create a prerendered page that registers the same custom URI scheme to
+// target 2 (modified). But the registration will defer until after activation.
+// 3. Navigate an iframe to the custom URI scheme. It should go to target 1,
+// because the deferred registration hasn't yet been applied.
+// 4. Activate the prerendered page. This should run the deferred registration.
+// 5. Navigate the iframe to the custom URI scheme again. It should go to
+// target 2.
+promise_test(async t => {
+ const customUrlScheme = 'web+wptrphtest';
+ function getProtocolHandlerUrlTemplate(id) {
+ return new URL(
+ `resources/protocol-handler.html?id=${id}&s=%s`, location.href).href;
+ }
+
+ const initialUrlTemplate = getProtocolHandlerUrlTemplate('initial');
+ const modifiedUrlTemplate = getProtocolHandlerUrlTemplate('modified');
+
+ // To start we register the initial protocol handler. When there is nothing
+ // registered for a custom URI scheme, and we navigate to it, there's no
+ // good event to tell us that the navigation failed. So instead we
+ // have an initial handler so we can tell that the modified protocol handler
+ // hasn't been registered yet.
+ t.add_cleanup(() => {
+ navigator.unregisterProtocolHandler(
+ customUrlScheme, initialUrlTemplate);
+ });
+ navigator.registerProtocolHandler(customUrlScheme, initialUrlTemplate);
+
+ // Create a prerender page that attempts to register an invalid scheme.
+ const {exec, activate} = await create_prerendered_page(t);
+
+ t.add_cleanup(() => {
+ navigator.unregisterProtocolHandler(
+ customUrlScheme, modifiedUrlTemplate);
+ });
+ // First register protocol handler during prerender
+ const result = await exec(
+ (customUrlScheme, modifiedUrlTemplate) => {
+ try {
+ navigator.registerProtocolHandler(
+ customUrlScheme, modifiedUrlTemplate);
+ } catch (registerProtocolHandlerException) {
+ return 'registerProtocolHandler failed with \''
+ + registerProtocolHandlerException.name + '\'';
+ }
+ return 'success';
+ }, [customUrlScheme, modifiedUrlTemplate]);
+
+ assert_equals(result, 'success',
+ 'registerProtocolHandler should succeed.');
+
+ // Next create the iframe that we will navigate to the custom URI scheme so
+ // we can validate that the prerenderer registration hasn't yet been applied.
+ const frame = await with_iframe('about:blank');
+
+ // Navigate to the custom URI scheme. Even though the prerendered page
+ // registered a handler, registration shouldn't happen until after activation.
+ // So this navigation should go to the initial handler.
+ const beforeActivationMessagePromise = getNextWindowMessageFromFrame(frame);
+ frame.src = `${customUrlScheme}:1`;
+ assert_equals((await beforeActivationMessagePromise).id, 'initial',
+ 'Until activation, the initial handler should be registered.');
+
+ // Activate the prerendered page. This should run the deferred registration.
+ await activate();
+
+ // Now we listen for messages and again navigate to the custom URI scheme
+ // and by now the prerenderer registration should have applied and we should
+ // get the modified handler's id.
+ const afterActivationMessagePromise = getNextWindowMessageFromFrame(frame);
+ frame.src = `${customUrlScheme}:2`;
+ assert_equals((await afterActivationMessagePromise).id, 'modified',
+ 'After activation, the modified handler should be registered.');
+}, 'prerendering page registerProtocolHandler call defers registration until activation.');
+
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html
new file mode 100644
index 00000000000..586ce433854
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-unregister.https.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<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="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+
+<script>
+
+function getNextWindowMessageFromFrame(frame) {
+ return new Promise(resolve => {
+ window.addEventListener('message', event => {
+ if (event.source === frame.contentWindow) {
+ resolve(event.data);
+ }
+ });
+ });
+}
+
+function getNextMessageFromServiceWorker(serviceWorker) {
+ return new Promise(resolve => {
+ serviceWorker.addEventListener('message', event => {
+ resolve(event.data);
+ }, {once: true});
+ });
+}
+
+promise_setup(async () => {
+ assertSpeculationRulesIsSupported()
+ await test_driver.set_rph_registration_mode('autoAccept');
+ await test_driver.bless('handler registration');
+});
+
+// The overall idea for this test is:
+// 1. Register a protocol handler for a custom URI scheme.
+// 2. Create a prerendered page that unregisters the protocol handler.
+// 3. Navigate an iframe to the custom URI scheme. It should navigate
+// successfully.
+// 4. Activate the prerendered page. This should run the deferred unregistration
+// work.
+// 5. Navigate the iframe to the custom URI scheme again. It should fail to
+// navigate.
+// To detect the navigation failure, we use a service worker to perform the
+// navigation via client.navigate and report the result back to
+// the test. This is because the service worker's client.navigate method
+// actually reports if the navigation failed, unlike other mechanisms which
+// tell us nothing in this case.
+promise_test(async t => {
+ const customUrlScheme = 'web+wptrphtest';
+ function getProtocolHandlerUrlTemplate(id) {
+ return new URL(
+ `resources/protocol-handler.html?id=${id}&s=%s`, location.href).href;
+ }
+
+ const urlTemplate = getProtocolHandlerUrlTemplate('unregister');
+
+ t.add_cleanup(() => {
+ navigator.unregisterProtocolHandler(
+ customUrlScheme, urlTemplate);
+ });
+ navigator.registerProtocolHandler(customUrlScheme, urlTemplate);
+
+ const {exec, activate} = await create_prerendered_page(t);
+
+ const result = await exec(
+ (customUrlScheme, urlTemplate) => {
+ try {
+ navigator.unregisterProtocolHandler(
+ customUrlScheme, urlTemplate);
+ } catch (registerProtocolHandlerException) {
+ return 'registerProtocolHandler failed with \'' +
+ registerProtocolHandlerException.name + '\'';
+ }
+ return 'success';
+ }, [customUrlScheme, urlTemplate]);
+ assert_equals(result, 'success', 'unregisterProtocolHandler should succeed.');
+
+ const frame1 = await with_iframe('about:blank');
+
+ const frame1MessagePromise = getNextWindowMessageFromFrame(frame1);
+ frame1.src = `${customUrlScheme}:1`;
+ assert_equals((await frame1MessagePromise).id, 'unregister',
+ 'Until activation, the initial handler should be registered.');
+
+ frame1.remove();
+
+ // Activate the prerendered page.
+ await activate();
+
+ // At this point the deferred unregistration work has run during activation
+ // and the protocol handler is no longer registered.
+ // We use Service Worker client.navigate to detect the failed navigation since
+ // it is well supported and reliably reports error for unknown URL schemes.
+ const serviceWorkerScope =
+ 'resources/protocol-handler.html?service_worker_client';
+ const frame2Url = serviceWorkerScope + '&id=communication';
+ const frame3Url = serviceWorkerScope + '&id=nav_target';
+ const serviceWorkerUrl = 'resources/protocol-handler-service-worker.js';
+ const serviceWorkerRegistration =
+ await service_worker_unregister_and_register(
+ t, serviceWorkerUrl, serviceWorkerScope);
+
+ t.add_cleanup(async () => {
+ await serviceWorkerRegistration.unregister();
+ });
+
+ await wait_for_state(t, serviceWorkerRegistration.installing, 'activated');
+
+ // We use frame2 to communicate with the service worker.
+ const frame2 = await with_iframe(frame2Url);
+
+ // Frame3 is used by the service worker to attempt navigation.
+ const frame3 = await with_iframe(frame3Url);
+
+ const serviceWorkerMessagePromise = getNextMessageFromServiceWorker(
+ frame2.contentWindow.navigator.serviceWorker);
+
+ // Post message via frame2 to the service worker to tell it to navigate frame3
+ // to the custom URI.
+ frame2.contentWindow.navigator.serviceWorker.controller.postMessage(
+ {clientUrlMatch: new URL(frame3Url, location.href).href,
+ navigationUrl: `${customUrlScheme}:3`});
+
+ // The service worker will post message back the result of the navigation.
+ const navigationResult = await serviceWorkerMessagePromise;
+
+ frame2.remove();
+ frame3.remove();
+
+ assert_false(navigationResult.success, 'Navigation to unregistered URI should fail');
+ assert_equals(navigationResult.message, 'navigate failure: TypeError',
+ 'unregisterProtocolHandler should have completed.');
+}, 'prerendering page unregisterProtocolHandler call defers registration until activation.');
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html
new file mode 100644
index 00000000000..613b9bfad08
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/protocol-handler-validation.https.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<title>prerendered page calls to registerProtocolHandler should validate input synchronously</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.js"></script>
+
+<script>
+// Create a prerender page that attempts to use either registerProtocolHandler
+// or unregisterProtocolHandler with either an invalid scheme or an invalid
+// URL template. Validation of invalid parameters for both should happen
+// synchronously in prerendered pages.
+async function registerProtocolHandlerTestHelper(
+ t, fn_name, scheme, url_template, expected_result) {
+ const {exec} = await create_prerendered_page(t);
+
+ const result = await exec((fn_name, scheme, url_template) => {
+ try {
+ navigator[fn_name](scheme, url_template);
+ } catch (registerProtocolHandlerException) {
+ return `failed with '${registerProtocolHandlerException.name}'`;
+ }
+ return 'success';
+ }, [fn_name, scheme, url_template]);
+
+ assert_equals(result, expected_result);
+}
+
+setup(() => assertSpeculationRulesIsSupported());
+
+promise_test(async t => {
+ await registerProtocolHandlerTestHelper(
+ t, 'registerProtocolHandler', 'notallowed', 'https://example.com/?%s',
+ 'failed with \'SecurityError\'');
+}, 'prerendering page registerProtocolHandler calls with invalid URI scheme should fail synchronously.');
+
+promise_test(async t => {
+ await registerProtocolHandlerTestHelper(
+ t, 'registerProtocolHandler', 'news', 'https://example.com/?',
+ 'failed with \'SyntaxError\'');
+}, 'prerendering page registerProtocolHandler calls with invalid URI template should fail synchronously.');
+
+promise_test(async t => {
+ await registerProtocolHandlerTestHelper(
+ t, 'unregisterProtocolHandler', 'notallowed', 'https://example.com/?%s',
+ 'failed with \'SecurityError\'');
+}, 'prerendering page unregisterProtocolHandler calls with invalid URI scheme should fail synchronously.');
+
+promise_test(async t => {
+ await registerProtocolHandlerTestHelper(
+ t, 'unregisterProtocolHandler', 'news', 'https://example.com/?',
+ 'failed with \'SyntaxError\'');
+}, 'prerendering page unregisterProtocolHandler calls with invalid URI template should fail synchronously.');
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js
new file mode 100644
index 00000000000..cb6142db0e3
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler-service-worker.js
@@ -0,0 +1,28 @@
+// This service worker script should be used by the
+// protocol-handler-unregister.https.html test to detect unregistered URL
+// schemes.
+self.addEventListener('message', async eventInfo => {
+ let success = false;
+ let message = null;
+
+ try {
+ const {clientUrlMatch, navigationUrl} = eventInfo.data;
+ const client = (await clients.matchAll()).find(
+ client => client.url === clientUrlMatch);
+
+ if (client) {
+ try {
+ await client.navigate(navigationUrl);
+ success = true;
+ } catch (navigateException) {
+ message = `navigate failure: ${navigateException.name}`;
+ }
+ } else {
+ message = `no client found matching ${clientUrlMatch}`;
+ }
+ } catch (otherException) {
+ message = `other failure: ${otherException.name}`;
+ }
+
+ eventInfo.source.postMessage({success, message});
+}); \ No newline at end of file
diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html
new file mode 100644
index 00000000000..210b23aae21
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/resources/protocol-handler.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>Prerendering custom protocol handler</title>
+<script>
+ // This page should be used by the protocol-handler-*register.https.html
+ // tests as the handler for their test custom protocols.
+
+ // Get URL parameters
+ const urlParams = new URLSearchParams(window.location.search);
+ const id = urlParams.get('id');
+ const s = urlParams.get('s');
+ // This page will be hosted in an iframe. Post message to parent window.
+ window.parent.postMessage({id: id, s: s}, '*');
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js
new file mode 100644
index 00000000000..92a1a7325bb
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage-worklet.js
@@ -0,0 +1,5 @@
+class ReadOperation {
+ async run() {
+ return await this.sharedStorage.get("prerender");
+ }
+}
diff --git a/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html
index 53edf109698..408168e4c4c 100644
--- a/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html
+++ b/tests/wpt/tests/speculation-rules/prerender/resources/shared-storage.https.html
@@ -19,9 +19,20 @@ if (!isPrerendering) {
loadInitiatorPage();
} else {
const prerenderEventCollector = new PrerenderEventCollector();
- prerenderEventCollector.start(
- window.sharedStorage.set('prerender', 'yes'), 'window.sharedStorage.set');
+
+ if (params.get('type') === 'worklet') {
+ async function register() {
+ return window.sharedStorage.worklet.addModule(
+ "shared-storage-worklet.js");
+ }
+ prerenderEventCollector.start(
+ register(), 'window.sharedStorage.worklet.addModule');
+ } else {
+ prerenderEventCollector.start(
+ window.sharedStorage.set('prerender', 'yes'),
+ 'window.sharedStorage.set');
}
+}
</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html b/tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html
new file mode 100644
index 00000000000..72a46c3137f
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prerender/restrictions_shared_storage_worklet.https.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<title>Worklet operations to Shared Storage API is deferred</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.js"></script>
+
+<body>
+<script>
+setup(() => assertSpeculationRulesIsSupported());
+promise_test(async t => {
+ const uid = token();
+ const bc = new PrerenderChannel('test-channel', uid);
+
+ const gotMessage = new Promise(resolve => {
+ bc.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+
+ const url =
+ `resources/shared-storage.https.html?uid=${uid}&type=worklet`;
+ window.open(url, '_blank', 'noopener');
+
+ const result = await gotMessage;
+ const expected = [
+ {
+ event: 'started waiting window.sharedStorage.worklet.addModule',
+ prerendering: true
+ },
+ {
+ event: 'prerendering change',
+ prerendering: false
+ },
+ {
+ event: 'finished waiting window.sharedStorage.worklet.addModule',
+ prerendering: false
+ }
+ ];
+ assert_equals(result.length, expected.length);
+ for (let i = 0; i < result.length; i++) {
+ assert_equals(result[i].event, expected[i].event,
+ `event[${i}]`);
+ assert_equals(result[i].prerendering, expected[i].prerendering,
+ `prerendering[${i}]`);
+ }
+ bc.close();
+
+ // Send a close signal to PrerenderEventCollector on the prerendered page.
+ new PrerenderChannel('close', uid).postMessage('');
+ },
+ `add module for the Shared Storage API should be deferred until the
+ prerendered page is activated`);
+</script>
diff --git a/tests/wpt/tests/streams/readable-byte-streams/WEB_FEATURES.yml b/tests/wpt/tests/streams/readable-byte-streams/WEB_FEATURES.yml
new file mode 100644
index 00000000000..a35508fc0dc
--- /dev/null
+++ b/tests/wpt/tests/streams/readable-byte-streams/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: readable-byte-streams
+ files: "**"
diff --git a/tests/wpt/tests/streams/transferable/WEB_FEATURES.yml b/tests/wpt/tests/streams/transferable/WEB_FEATURES.yml
new file mode 100644
index 00000000000..4ecacf5edbc
--- /dev/null
+++ b/tests/wpt/tests/streams/transferable/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: transferable-streams
+ files: "**"
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
index efcbf0cdad6..97e817e328c 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/accept-signature.window.js
@@ -13,15 +13,29 @@ let test_cases = [
header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
},
{
+ integrity: `ed25519-${kValidKeys['rfc']} ed25519-${kValidKeys['rfc']}`,
+ 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['rfc']} ed25519-${kValidKeys['arbitrary']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri", ` +
+ `sig1=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";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"`,
},
+ {
+ integrity: `ed25519-${kValidKeys['rfc']} malformed-thing ed25519-${kValidKeys['arbitrary']}`,
+ header: `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri", ` +
+ `sig1=("unencoded-digest";sf);keyid="${kValidKeys['arbitrary']}";tag="sri"`,
+ },
];
let test_counter = 0;
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/client-initiated.cross-origin.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/client-initiated.cross-origin.window.js
index ce7b817f7e8..26e1a3090eb 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/client-initiated.cross-origin.window.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/client-initiated.cross-origin.window.js
@@ -26,14 +26,14 @@
// Unsigned responses are blocked when integrity is asserted:
generate_fetch_test({},
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kValidKeys['rfc']}`,
},
EXPECT_BLOCKED,
"No signature, valid integrity check, w/o cors: blocked.");
generate_fetch_test({ cors: true },
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: 'cors',
integrity: `ed25519-${kValidKeys['rfc']}`,
},
@@ -51,7 +51,7 @@ const kRequestWithValidSignature = {
};
generate_fetch_test(kRequestWithValidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kValidKeys['rfc']}`,
},
EXPECT_BLOCKED,
@@ -59,7 +59,7 @@ generate_fetch_test(kRequestWithValidSignature,
generate_fetch_test(kRequestWithValidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kInvalidKey}`,
},
EXPECT_BLOCKED,
@@ -67,7 +67,7 @@ generate_fetch_test(kRequestWithValidSignature,
generate_fetch_test(kRequestWithValidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity:`ed25519-${kValidKeys['rfc']} ed25519-${kInvalidKey}`
},
EXPECT_BLOCKED,
@@ -83,7 +83,7 @@ const kRequestWithValidSignatureAndCORS = {
};
generate_fetch_test(kRequestWithValidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
integrity: `ed25519-${kValidKeys['rfc']}`,
},
@@ -92,7 +92,7 @@ generate_fetch_test(kRequestWithValidSignatureAndCORS,
generate_fetch_test(kRequestWithValidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
integrity: `ed25519-${kInvalidKey}`,
},
@@ -101,7 +101,7 @@ generate_fetch_test(kRequestWithValidSignatureAndCORS,
generate_fetch_test(kRequestWithValidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
integrity:`ed25519-${kValidKeys['rfc']} ed25519-${kInvalidKey}`
},
@@ -118,7 +118,7 @@ const kRequestWithInvalidSignature = {
};
generate_fetch_test(kRequestWithInvalidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kValidKeys['rfc']}`,
},
EXPECT_BLOCKED,
@@ -126,7 +126,7 @@ generate_fetch_test(kRequestWithInvalidSignature,
generate_fetch_test(kRequestWithInvalidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kInvalidKey}`,
},
EXPECT_BLOCKED,
@@ -134,7 +134,7 @@ generate_fetch_test(kRequestWithInvalidSignature,
generate_fetch_test(kRequestWithInvalidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity:`ed25519-${kValidKeys['rfc']} ed25519-${kInvalidKey}`
},
EXPECT_BLOCKED,
@@ -149,7 +149,7 @@ const kRequestWithInvalidSignatureAndCORS = {
};
generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kValidKeys['rfc']}`,
mode: "cors",
},
@@ -158,7 +158,7 @@ generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity: `ed25519-${kInvalidKey}`,
mode: "cors",
},
@@ -167,7 +167,7 @@ generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
integrity:`ed25519-${kValidKeys['rfc']} ed25519-${kInvalidKey}`,
mode: "cors",
},
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
index e5e00ec7b53..c5b7de60747 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
@@ -53,15 +53,12 @@ const kAcceptSignature = "accept-signature";
// Given `{ digest: "...", body: "...", cors: true, type: "..." }`, generates
// the URL to a script resource that has the given characteristics.
let counter = 0;
-function resourceURL(data, host) {
+function resourceURL(data, server_origin) {
counter++;
data.type ??= "application/javascript";
data.counter = counter;
let params = new URLSearchParams(data);
- let result = new URL("/subresource-integrity/signatures/resource.py?" + params.toString(), self.location);
- if (host) {
- result.host = host;
- }
+ let result = new URL("/subresource-integrity/signatures/resource.py?" + params.toString(), server_origin ?? self.location.origin);
return result.href;
}
@@ -92,10 +89,12 @@ async function signSignatureBase(signatureBase, privateKeyJWK) {
function generate_fetch_test(request_data, options, expectation, description) {
promise_test(test => {
- const url = resourceURL(request_data, options.host);
+ const url = resourceURL(request_data, options.origin);
let fetch_options = {};
if (options.mode) {
fetch_options.mode = options.mode;
+ } else if (options.origin) {
+ fetch_options.mode = "cors";
}
if (options.integrity) {
fetch_options.integrity = options.integrity;
@@ -112,7 +111,7 @@ function generate_fetch_test(request_data, options, expectation, description) {
// in the header.
if (options.integrity?.includes(`ed25519-${kInvalidKey}`)) {
assert_equals(r.headers.get(kAcceptSignature),
- `sig0=("unencoded-digest";sf);keyid="${kInvalidKey}";tag="sri", sig1=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ `sig0=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri", sig1=("unencoded-digest";sf);keyid="${kInvalidKey}";tag="sri"`,
"`accept-signature` was set.");
} else if (options.integrity?.includes(`ed25519-${kValidKeys['rfc']}`)) {
assert_equals(r.headers.get(kAcceptSignature),
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/scheme.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/scheme.window.js
new file mode 100644
index 00000000000..69ff21de3c7
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/scheme.window.js
@@ -0,0 +1,73 @@
+// META: script=/common/get-host-info.sub.js
+// META: script=helper.js
+
+// The following tests validate the behavior of the `@scheme` derived component.
+// They'll 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=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+// Content-Length: 18
+// Signature-Input: signature=("unencoded-digest";sf "@scheme";req); \
+// keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; \
+// tag="sri"
+// Signature: signature=:oVQ+s/OqXLAVdfvgZ3HaPiyzkpNXZSit9l6e1FB/gOOL3t8FOrIRDV \
+// CkcIEcJjd3MA1mROn39/WQShTmnKmlDg==:
+//
+//
+// window.hello = `world`;
+// ```
+
+const test_cases = [
+ // ```
+ // "unencoded-digest";sf: sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+ // "@scheme";req: http
+ // "@signature-params": ("unencoded-digest";sf "@scheme";req);keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"
+ // ```
+ {
+ origin: get_host_info().HTTP_REMOTE_ORIGIN,
+ signature: `signature=:WZp87p7X3ELfgIKL/qxsY/CT6XArMvZRaxcJ3uy1QklEcLf0c8tol2+W2pvaXX4jnd7hGevFVkzWE77rCOIzAA==:`,
+ },
+ // ```
+ // "unencoded-digest";sf: sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+ // "@scheme";req: https
+ // "@signature-params": ("unencoded-digest";sf "@scheme";req);keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"
+ // ```
+ {
+ origin: get_host_info().HTTPS_REMOTE_ORIGIN,
+ signature: `signature=:lMzR8lIXYG0Iz0MmTXcRTcBfNw6TgBAPfaNLAU1LzsxWC5dlez8SNe7aCW7avHTWKgaqTGBCMW1LgxkHlijgDA==:`,
+ }
+]
+
+// 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 `@scheme` components load at all (no integrity check),
+// load when integrity checks match, and fail when integrity checks mismatch.
+for (const test_case of test_cases) {
+ const request = {
+ cors: true,
+ body: "window.hello = `world`;",
+ digest: "sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:",
+ signatureInput: `signature=("unencoded-digest";sf "@scheme";req);keyid="${kValidKeys['rfc']}";tag="sri"`,
+ signature: test_case.signature
+ };
+
+ // fetch():
+ generate_fetch_test(request, {origin: test_case.origin}, EXPECT_LOADED,
+ `Valid signature (${request.signature}), no integrity check: loads.`);
+ generate_fetch_test(request, {origin: test_case.origin,
+ integrity:`ed25519-${kValidKeys['rfc']}`}, EXPECT_LOADED,
+ `Valid signature (${request.signature}), matching integrity check: loads.`);
+
+ generate_fetch_test(request, {origin: test_case.origin,
+ integrity:`ed25519-${kInvalidKey}`}, EXPECT_BLOCKED,
+ `Valid signature (${request.signature}), mismatched integrity check: blocked.`);
+}
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/server-initiated.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/server-initiated.window.js
index e2b3e78ac11..8dec3daaded 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/server-initiated.window.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/server-initiated.window.js
@@ -38,14 +38,14 @@ generate_fetch_test(kRequestWithValidSignature,
"Valid signature, same-origin: loads.");
generate_fetch_test(kRequestWithValidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "no-cors",
},
EXPECT_LOADED,
"Valid signature, cross-origin w/o cors, mode: no-cors: loads.");
generate_fetch_test(kRequestWithValidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
},
EXPECT_BLOCKED,
@@ -65,14 +65,14 @@ generate_fetch_test(kRequestWithValidSignatureAndCORS,
"Valid signature, same-origin w/ cors: loads.");
generate_fetch_test(kRequestWithValidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "no-cors",
},
EXPECT_LOADED,
"Valid signature, cross-origin w/ cors, mode: no-cors: loads.");
generate_fetch_test(kRequestWithValidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
},
EXPECT_LOADED,
@@ -91,14 +91,14 @@ generate_fetch_test(kRequestWithInvalidSignature,
"Invalid signature, same-origin: blocked.");
generate_fetch_test(kRequestWithInvalidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "no-cors",
},
EXPECT_BLOCKED,
"Invalid signature, cross-origin w/o cors, mode: no-cors: blocked.");
generate_fetch_test(kRequestWithInvalidSignature,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
},
EXPECT_BLOCKED,
@@ -118,14 +118,14 @@ generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
"Invalid signature, same-origin w/ cors: blocked.");
generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "no-cors",
},
EXPECT_BLOCKED,
"Invalid signature, cross-origin w/ cors, mode: no-cors: blocked.");
generate_fetch_test(kRequestWithInvalidSignatureAndCORS,
{
- host: get_host_info().REMOTE_HOST,
+ origin: get_host_info().REMOTE_ORIGIN,
mode: "cors",
},
EXPECT_BLOCKED,
diff --git a/tests/wpt/tests/subresource-integrity/signatures/tentative/unknown-parameter.window.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/unknown-parameter.window.js
new file mode 100644
index 00000000000..2b4df54c6ed
--- /dev/null
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/unknown-parameter.window.js
@@ -0,0 +1,73 @@
+// META: script=helper.js
+
+// The following tests validate the behavior of unknown signature parameters.
+// They'll 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 "@status"); \
+// keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; \
+// tag="sri"
+// Signature: signature=:oVQ+s/OqXLAVdfvgZ3HaPiyzkpNXZSit9l6e1FB/gOOL3t8FOrIRDV \
+// CkcIEcJjd3MA1mROn39/WQShTmnKmlDg==:
+//
+//
+// {"hello": "world"}
+// ```
+
+// Metadata from the response above:
+const kRequestsWithValidSignature = [
+ // ```
+ // "unencoded-digest";sf: sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+ // "@signature-params": ("unencoded-digest";sf "@status");keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri";unknown=1
+ // ```
+ {
+ body: "window.hello = `world`;",
+ digest: "sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:",
+ signature: `signature=:eZ2DGIHUsTNMxFReOMkbOrTmn+CqDckCZ5/635x1Apl2ws0nA+qZcHqZFMdjBvcGw0WElh3zYD0ynkQ+cHiWCA==:`,
+ signatureInput: `signature=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri";unknown=1`
+ },
+ // ```
+ // "unencoded-digest";sf: sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:
+ // "@signature-params": ("unencoded-digest";sf "@status");unknown=1;keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs=";tag="sri"
+ // ```
+ {
+ body: "window.hello = `world`;",
+ digest: "sha-256=:PZJ+9CdAAIacg7wfUe4t/RkDQJVKM0mCZ2K7qiRhHFc=:",
+ signature: `signature=:YXQH8lkKBcGOMNSFbS56j3d5nK3j15HbFPIdsljzQVGFFd93T6FmXb2cLsoINYQbnMUOQBSROIzFZpgUQTBTBA==:`,
+ signatureInput: `signature=("unencoded-digest";sf);unknown=1;keyid="${kValidKeys['rfc']}";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 unknown parameters load at all (no integrity check),
+// load when integrity checks match, and fail when integrity checks mismatch.
+for (const request of kRequestsWithValidSignature) {
+ // 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.`);
+ generate_script_test(request, `ed25519-${kValidKeys['rfc']}`, EXPECT_LOADED,
+ `Valid signature (${request.signature}), matching integrity check: loads.`);
+ generate_script_test(request, `ed25519-${kInvalidKey}`, EXPECT_BLOCKED,
+ `Valid signature (${request.signature}), mismatched integrity check: blocked.`);
+}
diff --git a/tests/wpt/tests/svg-aam/META.yml b/tests/wpt/tests/svg-aam/META.yml
index b0a59c18030..c55d09e15c2 100644
--- a/tests/wpt/tests/svg-aam/META.yml
+++ b/tests/wpt/tests/svg-aam/META.yml
@@ -1,3 +1,4 @@
spec: https://w3c.github.io/svg-aam/
suggested_reviewers:
- cookiecrook
+ - sideshowbarker
diff --git a/tests/wpt/tests/svg/embedded/image-embedding-nested-data-url-png.html b/tests/wpt/tests/svg/embedded/image-embedding-nested-data-url-png.html
new file mode 100644
index 00000000000..ff54e38b1a4
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/image-embedding-nested-data-url-png.html
@@ -0,0 +1,8 @@
+<!doctype html>
+<title>SVG image that uses a PNG data: URL</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<img src="data:image/svg+xml,
+ <svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'>
+ <image href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAZKADAAQAAAABAAAAZAAAAAAvu95BAAABbElEQVR4Ae3TUQ0AIAzE0IFynEOCivfRKWja3ZozdzrGwGZIAvkGCoI9QkEKghnAcFpIQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00IKghnAcFpIQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00KwIA8ybAJHOjWoiwAAAABJRU5ErkJggg=='/>
+ </svg>
+">
diff --git a/tests/wpt/tests/svg/embedded/image-embedding-nested-data-url.html b/tests/wpt/tests/svg/embedded/image-embedding-nested-data-url.html
new file mode 100644
index 00000000000..7e58c3e7e10
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/image-embedding-nested-data-url.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<title>SVG image that uses a data: URL</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<img src="data:image/svg+xml,
+ <svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'>
+ <image href='data:image/svg+xml,
+ &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;>
+ &amp;lt;rect width=&quot;100&quot; height=&quot;100&quot; fill=&quot;green&quot;/>
+ &amp;lt;/svg>
+ '/>
+ </svg>
+">
diff --git a/tests/wpt/tests/svg/embedded/image-embedding-nested-external-data-url-png.html b/tests/wpt/tests/svg/embedded/image-embedding-nested-external-data-url-png.html
new file mode 100644
index 00000000000..0935507c045
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/image-embedding-nested-external-data-url-png.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<title>SVG image that uses a PNG data: URL</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<img src="support/external-with-data-url.svg">
diff --git a/tests/wpt/tests/svg/embedded/image-embedding-nested-http-url.sub.html b/tests/wpt/tests/svg/embedded/image-embedding-nested-http-url.sub.html
new file mode 100644
index 00000000000..f3d8a79b999
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/image-embedding-nested-http-url.sub.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<title>SVG image that uses an HTTP URL</title>
+<link rel="mismatch" href="../struct/reftests/reference/green-100x100.html">
+<!-- Even better would be a blank page expected match. -->
+<img src="data:image/svg+xml,
+ <svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'>
+ <image href='{{location[scheme]}}://{{location[host]}}/svg/embedded/reference/green-rect-100x100.svg'/>
+ </svg>
+">
diff --git a/tests/wpt/tests/svg/embedded/image-embedding-nesteder-data-url.html b/tests/wpt/tests/svg/embedded/image-embedding-nesteder-data-url.html
new file mode 100644
index 00000000000..48fb4fa48b7
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/image-embedding-nesteder-data-url.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<title>SVG image that uses a data: URL and then again</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<img src="data:image/svg+xml,
+ <svg xmlns='http://www.w3.org/2000/svg' width='100' height='100'>
+ <image href='data:image/svg+xml,
+ &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;>
+ &amp;lt;image href=&quot;data:image/svg+xml,
+ &amp;amp;lt;svg xmlns=&amp;amp;quot;http://www.w3.org/2000/svg&amp;amp;quot;>
+ &amp;amp;lt;rect width=&amp;amp;quot;100&amp;amp;quot; height=&amp;amp;quot;100&amp;amp;quot; fill=&amp;amp;quot;green&amp;amp;quot;/>
+ &amp;amp;lt;/svg>
+ &quot;/>
+ &amp;lt;/svg>
+ '/>
+ </svg>
+">
diff --git a/tests/wpt/tests/svg/embedded/support/external-with-data-url.svg b/tests/wpt/tests/svg/embedded/support/external-with-data-url.svg
new file mode 100644
index 00000000000..e5f707c7980
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/support/external-with-data-url.svg
@@ -0,0 +1,15 @@
+<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g clip-path="url(#clip)">
+ <rect width="100" height="100" fill="white"/>
+ <rect width="100" height="100" fill="url(#pattern)"/>
+ </g>
+ <defs>
+ <pattern id="pattern" patternContentUnits="objectBoundingBox" width="1" height="1">
+ <use xlink:href="#img" transform="scale(0.005)"/>
+ </pattern>
+ <clipPath id="clip">
+ <rect width="100" height="100" fill="white"/>
+ </clipPath>
+ <image id="img" width="200" height="200" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAZKADAAQAAAABAAAAZAAAAAAvu95BAAABbElEQVR4Ae3TUQ0AIAzE0IFynEOCivfRKWja3ZozdzrGwGZIAvkGCoI9QkEKghnAcFpIQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00IKghnAcFpIQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00KwIA8ybAJHOjWoiwAAAABJRU5ErkJggg=="/>
+ </defs>
+</svg>
diff --git a/tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-font.html b/tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-font.html
new file mode 100644
index 00000000000..b1783af474c
--- /dev/null
+++ b/tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-font.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Verify effect of font-size-adjust: 0 on a SVG Font without glyphs</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ pre { font-size-adjust: 0; font-family: CustomMonospace }
+</style>
+<svg>
+ <font>
+ <font-face font-family="CustomMonospace"/>
+ </font>
+</svg>
+<pre id="pre">Text
+</pre>
+<script>
+ test((t) => {
+ assert_equals(pre.getBoundingClientRect().height, 0);
+ }, "Verify effect of font-size-adjust: 0 on no glyphs SVG Font");
+</script>
diff --git a/tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-zero-height-font.html b/tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-zero-height-font.html
new file mode 100644
index 00000000000..25839e0ef5f
--- /dev/null
+++ b/tests/wpt/tests/svg/fonts/zero-font-size-adjust-no-glyphs-zero-height-font.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Verify effect of font-size-adjust: 0 on a zero height no glyphs SVG Font</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ pre { font-size-adjust: 0; font-family: CustomMonospace }
+</style>
+<svg>
+ <font>
+ <font-face font-family="CustomMonospace" ascent="0"/>
+ </font>
+</svg>
+<pre id="pre">Text
+</pre>
+<script>
+ test((t) => {
+ assert_equals(pre.getBoundingClientRect().height, 0);
+ }, "Verify effect of font-size-adjust: 0 on zero height no glyphs SVG Font");
+</script>
diff --git a/tests/wpt/tests/svg/fonts/zero-font-size-adjust.html b/tests/wpt/tests/svg/fonts/zero-font-size-adjust.html
new file mode 100644
index 00000000000..7e7a226c6b3
--- /dev/null
+++ b/tests/wpt/tests/svg/fonts/zero-font-size-adjust.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Verify effect of font-size-adjust: 0 on a SVG Font</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ pre { font-size-adjust: 0; font-family: CustomMonospace }
+</style>
+<svg>
+ <font>
+ <font-face font-family="CustomMonospace"/>
+ <glyph unicode="e" glyph-name="e" horiz-adv-x="530" d="M500 192V227Q500 296 480 346T428 427T354 474T271 489Q221 489 178 470T101 418T49 340T30 243Q30 204 43 161T87 83T171 24T303 0H482V94H298Q250 94 217 108T165 144T137 192T128 244Q128 276 139 303T171 351T218 383T275 395Q301 395 322 386T360 362T386 327T402 286H277Q253 286 240 272T226 239Q226 223 237 208T277 192H500Z"/>
+ </font>
+</svg>
+<pre id="pre">Text
+</pre>
+<script>
+ test((t) => {
+ assert_equals(pre.getBoundingClientRect().height, 0);
+ }, "Verify effect of font-size-adjust: 0 on normal size SVG Font");
+</script>
diff --git a/tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg b/tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg
new file mode 100644
index 00000000000..7bf47767a52
--- /dev/null
+++ b/tests/wpt/tests/svg/types/scripted/SVGGraphicsElement-padding.svg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+ xmlns:h="http://www.w3.org/1999/xhtml">
+ <title>SVGGraphicsElement with padding</title>
+ <metadata>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/types.html#InterfaceSVGGraphicsElement"/>
+ </metadata>
+ <h:script src="/resources/testharness.js"/>
+ <h:script src="/resources/testharnessreport.js"/>
+
+ <foreignObject width="100px" height="100px">
+ <svg id="svg" width="100px" height="100px">
+ <circle cx="50" cy="0" r="44"
+ fill="blue"></circle>
+ </svg>
+ </foreignObject>
+
+ <script><![CDATA[
+ test(function() {
+ let svg = document.getElementById("svg");
+ svg.setAttribute("style", "padding-left: 12px; transform: rotate(180deg);");
+ let ctm = svg.getScreenCTM();
+ let pt = DOMPoint.fromPoint({x: 50, y: 50});
+ let transformedPoint = pt.matrixTransform(ctm.inverse());
+ svg.removeAttribute("style");
+ assert_equals(transformedPoint.x, pt.x);
+ assert_equals(transformedPoint.y, pt.y);
+ }, 'getScreenCTM with padding-left and rotation');
+
+ test(function() {
+ let svg = document.getElementById("svg");
+ svg.setAttribute("style", "padding-top: 12px; transform: rotate(180deg);");
+ let ctm = svg.getScreenCTM();
+ let pt = DOMPoint.fromPoint({x: 50, y: 50});
+ let transformedPoint = pt.matrixTransform(ctm.inverse());
+ svg.removeAttribute("style");
+ assert_equals(transformedPoint.x, pt.x);
+ assert_equals(transformedPoint.y, pt.y);
+ }, 'getScreenCTM with padding-top and rotation');
+
+ test(function() {
+ let svg = document.getElementById("svg");
+ svg.setAttribute("style", "padding-right: 12px; transform: rotate(180deg);");
+ let ctm = svg.getScreenCTM();
+ let pt = DOMPoint.fromPoint({x: 50, y: 50});
+ let transformedPoint = pt.matrixTransform(ctm.inverse());
+ svg.removeAttribute("style");
+ assert_equals(transformedPoint.x, pt.x + 12);
+ assert_equals(transformedPoint.y, pt.y);
+ }, 'getScreenCTM with padding-right and rotation');
+
+ test(function() {
+ let svg = document.getElementById("svg");
+ svg.setAttribute("style", "padding-left: 12px; transform: rotate(180deg); transform-box: content-box");
+ let ctm = svg.getScreenCTM();
+ let pt = DOMPoint.fromPoint({x: 50, y: 50});
+ let transformedPoint = pt.matrixTransform(ctm.inverse());
+ svg.removeAttribute("style");
+ assert_equals(transformedPoint.x, pt.x + 12);
+ assert_equals(transformedPoint.y, pt.y);
+ }, 'getScreenCTM with padding-left, rotation and content-box');
+
+ ]]></script>
+</svg>
diff --git a/tests/wpt/tests/tools/ci/requirements_build.txt b/tests/wpt/tests/tools/ci/requirements_build.txt
index e74e4e5302d..60c09170a98 100644
--- a/tests/wpt/tests/tools/ci/requirements_build.txt
+++ b/tests/wpt/tests/tools/ci/requirements_build.txt
@@ -1,5 +1,5 @@
cairocffi==1.7.0
fonttools==4.51.0
genshi==0.7.7
-jinja2==3.1.4
+jinja2==3.1.6
pyyaml==6.0.1
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
index 76bc652075e..b3f1fe2af8f 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -158,14 +158,12 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite
chrome_options["args"].append(
"--ip-address-space-overrides=" + address_space_overrides_arg)
- # Always disable antialiasing on the Ahem font.
- blink_features = ['DisableAhemAntialias']
+ # Disable overlay scrollbar animations to prevent flaky wpt screenshots based on timing.
+ chrome_options["args"].append("--disable-features=ScrollbarAnimations")
if kwargs["enable_mojojs"]:
- blink_features.append('MojoJS')
- blink_features.append('MojoJSTest')
-
- chrome_options["args"].append("--enable-blink-features=" + ','.join(blink_features))
+ blink_features = ['MojoJS', 'MojoJSTest']
+ chrome_options["args"].append("--enable-blink-features=" + ','.join(blink_features))
if kwargs["enable_swiftshader"]:
# https://chromium.googlesource.com/chromium/src/+/HEAD/docs/gpu/swiftshader.md
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
index 42311d9f4d6..b4262ace8c9 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -377,7 +377,8 @@ class FirefoxInstanceManager:
self.e10s)
args = self.binary_args[:] if self.binary_args else []
- args += [cmd_arg("marionette"), "about:blank"]
+ args += [cmd_arg("marionette"),
+ cmd_arg("remote-allow-system-access"), "about:blank"]
debug_args, cmd = browser_command(self.binary,
args,
@@ -906,7 +907,8 @@ class FirefoxBrowser(Browser):
extensions.append(self.specialpowers_path)
return ExecutorBrowser, {"marionette_port": self.instance.marionette_port,
"extensions": extensions,
- "supports_devtools": True}
+ "supports_devtools": True,
+ "supports_window_resize": True}
def check_crash(self, process, test):
return log_gecko_crashes(self.logger,
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
index 5ad270ef114..32a82d7ccc4 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -280,10 +280,12 @@ class FirefoxAndroidBrowser(Browser):
self.leak_report_file = None
- debug_args, cmd = browser_command(self.package_name,
- self.binary_args if self.binary_args else [] +
- [cmd_arg("marionette"), "about:blank"],
- self.debug_info)
+ args = self.binary_args[:] if self.binary_args else []
+ args += [cmd_arg("marionette"),
+ cmd_arg("remote-allow-system-access"), "about:blank"]
+
+ debug_args, cmd = browser_command(
+ self.package_name, args, self.debug_info)
env = get_environ(self.chaos_mode_flags, self.env_extras)
@@ -354,7 +356,8 @@ class FirefoxAndroidBrowser(Browser):
# We never want marionette to install extensions because
# that doesn't work on Android; instead they are in the profile
"extensions": [],
- "supports_devtools": False}
+ "supports_devtools": False,
+ "supports_window_resize": False}
def check_crash(self, process, test):
if not os.environ.get("MINIDUMP_STACKWALK", "") and self.stackwalk_binary:
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py
index 859ce8f4fa6..06d58e7e87b 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py
@@ -498,7 +498,8 @@ class UpdateVirtualPressureSourceAction:
def __call__(self, payload):
source_type = payload["source_type"]
sample = payload["sample"]
- return self.protocol.pressure.update_virtual_pressure_source(source_type, sample)
+ estimate = payload["estimate"]
+ return self.protocol.pressure.update_virtual_pressure_source(source_type, sample, estimate)
class RemoveVirtualPressureSourceAction:
name = "remove_virtual_pressure_source"
@@ -511,6 +512,17 @@ class RemoveVirtualPressureSourceAction:
source_type = payload["source_type"]
return self.protocol.pressure.remove_virtual_pressure_source(source_type)
+class SetProtectedAudienceKAnonymityAction:
+ name = "set_protected_audience_k_anonymity"
+
+ def __init__(self, logger, protocol):
+ self.logger = logger
+ self.protocol = protocol
+
+ def __call__(self, payload):
+ owner, name, hashes = payload["owner"], payload["name"], payload["hashes"]
+ return self.protocol.protected_audience.set_k_anonymity(owner, name, hashes)
+
actions = [ClickAction,
DeleteAllCookiesAction,
GetAllCookiesAction,
@@ -550,4 +562,5 @@ actions = [ClickAction,
RunBounceTrackingMitigationsAction,
CreateVirtualPressureSourceAction,
UpdateVirtualPressureSourceAction,
- RemoveVirtualPressureSourceAction]
+ RemoveVirtualPressureSourceAction,
+ SetProtectedAudienceKAnonymityAction]
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index ebc4a4a5656..67f11aefa00 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -721,7 +721,7 @@ class MarionetteVirtualPressureSourceProtocolPart(VirtualPressureSourceProtocolP
def create_virtual_pressure_source(self, source_type, metadata):
raise NotImplementedError("create_virtual_pressure_source not yet implemented")
- def update_virtual_pressure_source(self, source_type, sample):
+ def update_virtual_pressure_source(self, source_type, sample, estimate):
raise NotImplementedError("update_virtual_pressure_source not yet implemented")
def remove_virtual_pressure_source(self, source_type):
@@ -914,6 +914,7 @@ class MarionetteTestharnessExecutor(TestharnessExecutor):
self.debug_test = debug_test
self.install_extensions = browser.extensions
+ self.initial_window_size = None
self.original_pref_values = {}
@@ -928,6 +929,10 @@ class MarionetteTestharnessExecutor(TestharnessExecutor):
addons.install(extension_path)
self.protocol.testharness.load_runner(self.last_environment["protocol"])
+ try:
+ self.initial_window_size = self.protocol.window.get_rect()
+ except Exception:
+ pass
def is_alive(self):
return self.protocol.is_alive()
@@ -974,6 +979,9 @@ class MarionetteTestharnessExecutor(TestharnessExecutor):
test_window = protocol.base.create_window()
self.protocol.base.set_window(test_window)
+ # Restore the window to the initial position
+ if self.browser.supports_window_resize and self.initial_window_size:
+ self.protocol.window.set_rect(self.initial_window_size)
if self.debug_test and self.browser.supports_devtools:
self.protocol.debug.load_devtools()
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 95667480afe..d0c1f9e64a4 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -45,6 +45,7 @@ from .protocol import (BaseProtocolPart,
DevicePostureProtocolPart,
StorageProtocolPart,
VirtualPressureSourceProtocolPart,
+ ProtectedAudienceProtocolPart,
merge_dicts)
from typing import Any, List, Optional, Tuple
@@ -684,13 +685,20 @@ class WebDriverVirtualPressureSourceProtocolPart(VirtualPressureSourceProtocolPa
body.update(metadata)
return self.webdriver.send_session_command("POST", "pressuresource", body)
- def update_virtual_pressure_source(self, source_type, sample):
- body = {"sample": sample}
+ def update_virtual_pressure_source(self, source_type, sample, estimate):
+ body = {"sample": sample, "estimate": estimate}
return self.webdriver.send_session_command("POST", "pressuresource/%s" % source_type, body)
def remove_virtual_pressure_source(self, source_type):
return self.webdriver.send_session_command("DELETE", "pressuresource/%s" % source_type)
+class WebDriverProtectedAudienceProtocolPart(ProtectedAudienceProtocolPart):
+ def setup(self):
+ self.webdriver = self.parent.webdriver
+
+ def set_k_anonymity(self, owner, name, hashes):
+ body = {"owner": owner, "name": name, "hashes": hashes}
+ return self.webdriver.send_session_command("POST", "protected_audience/set_k_anonymity", body)
class WebDriverProtocol(Protocol):
enable_bidi = False
@@ -715,7 +723,8 @@ class WebDriverProtocol(Protocol):
WebDriverVirtualSensorPart,
WebDriverDevicePostureProtocolPart,
WebDriverStorageProtocolPart,
- WebDriverVirtualPressureSourceProtocolPart]
+ WebDriverVirtualPressureSourceProtocolPart,
+ WebDriverProtectedAudienceProtocolPart]
def __init__(self, executor, browser, capabilities, **kwargs):
super().__init__(executor, browser)
@@ -987,6 +996,14 @@ class WebDriverTestharnessExecutor(TestharnessExecutor, TestDriverExecutorMixin)
self.close_after_done = close_after_done
self.cleanup_after_test = cleanup_after_test
+ self.initial_window_size = None
+
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
+ try:
+ self.initial_window_size = self.protocol.window.get_rect()
+ except Exception:
+ pass
def on_environment_change(self, new_environment):
if new_environment["protocol"] != self.last_environment["protocol"]:
@@ -1016,6 +1033,13 @@ class WebDriverTestharnessExecutor(TestharnessExecutor, TestDriverExecutorMixin)
# The previous test may not have closed its old windows (if something
# went wrong or if cleanup_after_test was False), so clean up here.
protocol.testharness.close_old_windows()
+ # Restore the window to the initial position
+ if self.initial_window_size:
+ try:
+ self.protocol.window.set_rect(self.initial_window_size)
+ except Exception:
+ pass
+
raw_results = self.run_testdriver(protocol, url, timeout)
extra = {}
if counters := self._check_for_leaks(protocol):
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
index 0940e87cdbd..53a7b437848 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
@@ -1009,9 +1009,19 @@ class VirtualPressureSourceProtocolPart(ProtocolPart):
pass
@abstractmethod
- def update_virtual_pressure_source(self, source_type, sample):
+ def update_virtual_pressure_source(self, source_type, sample, estimate):
pass
@abstractmethod
def remove_virtual_pressure_source(self, source_type):
pass
+
+class ProtectedAudienceProtocolPart(ProtocolPart):
+ """Protocol part for Protected Audience"""
+ __metaclass__ = ABCMeta
+
+ name = "protected_audience"
+
+ @abstractmethod
+ def set_k_anonymity(self, owner, name, hashes):
+ pass
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
index 9ddbe2e8df5..71c1be2732f 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
@@ -468,11 +468,17 @@
return create_context_action("create_virtual_pressure_source", context, {source_type, metadata});
};
- window.test_driver_internal.update_virtual_pressure_source = function(source_type, sample, context=null) {
- return create_context_action("update_virtual_pressure_source", context, {source_type, sample});
+ window.test_driver_internal.update_virtual_pressure_source = function(source_type, sample, estimate, context=null) {
+ return create_context_action("update_virtual_pressure_source", context, {source_type, sample, estimate});
};
window.test_driver_internal.remove_virtual_pressure_source = function(source_type, context=null) {
return create_context_action("remove_virtual_pressure_source", context, {source_type});
};
+
+ window.test_driver_internal.set_protected_audience_k_anonymity = function(
+ owner, name, hashes, context=null) {
+ return create_context_action(
+ 'set_protected_audience_k_anonymity', context, {owner, name, hashes});
+ }
})();
diff --git a/tests/wpt/tests/trusted-types/ServiceWorkerContainer-register-from-ServiceWorker.https.html b/tests/wpt/tests/trusted-types/ServiceWorkerContainer-register-from-ServiceWorker.https.html
index 7bc1ee7469d..23020096383 100644
--- a/tests/wpt/tests/trusted-types/ServiceWorkerContainer-register-from-ServiceWorker.https.html
+++ b/tests/wpt/tests/trusted-types/ServiceWorkerContainer-register-from-ServiceWorker.https.html
@@ -1,6 +1,7 @@
<!doctype html>
<html>
<head>
+ <meta name="timeout" content="long">
<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script';">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html
index 5662c64ac4e..add14466e57 100644
--- a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html
+++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-001.html
@@ -130,4 +130,24 @@ header(Content-Security-Policy-Report-Only,require-trusted-types-for 'script',Tr
assert_true(results[0].exception instanceof TypeError);
assert_equals(results[0].violatedPolicies.length, 1);
}, `directive "require-trusted-types-for 'script' 'invalid'" (unknown sink group)`);
+
+ promise_test(async t => {
+ let results = await trySendingPlainStringToTrustedTypeSink(
+ ["script"],
+ "header(Content-Security-Policy,require-trusted-types-for 'invalid' 'script',True)",
+ );
+ assert_equals(results.length, 1);
+ assert_true(results[0].exception instanceof TypeError);
+ assert_equals(results[0].violatedPolicies.length, 1);
+ }, `directive "require-trusted-types-for 'invalid' 'script'" (unknown sink group)`);
+
+ promise_test(async t => {
+ let results = await trySendingPlainStringToTrustedTypeSink(
+ ["script"],
+ "header(Content-Security-Policy,require-trusted-types-for 'invalid' 'script' 'also-invalid',True)",
+ );
+ assert_equals(results.length, 1);
+ assert_true(results[0].exception instanceof TypeError);
+ assert_equals(results[0].violatedPolicies.length, 1);
+ }, `directive "require-trusted-types-for 'invalid' 'script' 'also-invalid" (unknown sink group)`);
</script>
diff --git a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html
new file mode 100644
index 00000000000..55e4c57bdeb
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ // WebKit test runner assumes the tests always run in the same order, so make
+ // sure fetch_tests_from_worker tests run sequentially.
+ setup({explicit_done: true});
+ (async function() {
+ await fetch_tests_from_worker(new Worker(
+ "support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js"
+ ));
+ done();
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html
new file mode 100644
index 00000000000..d5bbf704443
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/csp-violations.js"></script>
+<script src="./support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js"></script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html.headers
index 1e57f8bf585..b48df2b0ccc 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers
+++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-003.html.headers
@@ -1,4 +1,2 @@
-Content-Security-Policy: script-src http: https: 'nonce-123' 'unsafe-eval'
Content-Security-Policy: connect-src 'none'
Content-Security-Policy: require-trusted-types-for 'script'
-
diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-001.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-001.html
index 6e51bd5ef19..1816a34746f 100644
--- a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-001.html
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-001.html
@@ -345,4 +345,19 @@
});
}, `single report-only policy with directive "trusted-type tt-policy-name1 tt-policy-name2 tt-policy-name3"`);
+ // Verify unquoted none is treated as a tt-policy-names.
+ ['none', 'allow-duplicates'].forEach(unquoted_keyword => {
+ promise_test(async t => {
+ let results = await tryCreatingTrustedTypePoliciesWithCSP(
+ [unquoted_keyword, "other-tt-policy-name"],
+ `header(Content-Security-Policy,trusted-types ${unquoted_keyword},True)`
+ );
+ assert_equals(results.length, 2);
+ assert_equals(results[0].exception, null);
+ assert_equals(results[0].violatedPolicies.length, 0);
+ assert_true(results[1].exception instanceof TypeError);
+ assert_equals(results[1].violatedPolicies.length, 1);
+ }, `Single enforce policy with directive "trusted-type ${unquoted_keyword}"`);
+ });
+
</script>
diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html
index ef1a4bde378..fc1906a7c99 100644
--- a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-002.html
@@ -50,7 +50,6 @@
"policy$name",
"policy?name",
"policy!name",
- "política",
];
invalidTrustedTypePolicyNames.forEach(trustedTypePolicyName => {
promise_test(async t => {
@@ -72,15 +71,15 @@
// https://w3c.github.io/webappsec-csp/#grammardef-required-ascii-whitespace
promise_test(async t => {
let results = await tryCreatingTrustedTypePoliciesWithCSP(
- ["_TTP1_", "_TTP2_", "_TTP3_", "_TTP4_", "_TTP5_", "_TTP6_"],
- "header(Content-Security-Policy,trusted-types _TTP1_%09_TTP2_%0A_TTP3_%0C_TTP4_%0D_TTP5_%20_TTP6_,True)"
+ ["_TTP1_", "_TTP2_", "_TTP3_", "_TTP4_", "_TTP5_"],
+ "header(Content-Security-Policy,trusted-types _TTP1_%09_TTP2_%0C_TTP3_%0D_TTP4_%20_TTP5_,True)"
);
- assert_equals(results.length, 6);
+ assert_equals(results.length, 5);
results.forEach((result, index) => {
assert_equals(result.exception, null);
assert_equals(result.violatedPolicies.length, 0);
});
- }, `directive "trusted-type _TTP1_%09_TTP2_%0A_TTP3_%0C_TTP4_%0D_TTP5_%20_TTP6_" (required-ascii-whitespace)`);
+ }, `directive "trusted-type _TTP1_%09_TTP2_%0C_TTP3_%0D_TTP4_%20_TTP5_" (required-ascii-whitespace)`);
// tt-expressions must be separated by a required-ascii-whitespace:
promise_test(async t => {
diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-003.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-003.html
index 55f1479e3db..052fbb8cbfb 100644
--- a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-003.html
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-003.html
@@ -16,10 +16,10 @@ header(Content-Security-Policy,trusted-types tt-policy-name tt-policy-name,True)
header(Content-Security-Policy,trusted-types tt-policy-name *,True)|\
header(Content-Security-Policy,trusted-types * tt-policy-name,True)|\
header(Content-Security-Policy,trusted-types * *,True)|\
-header(Content-Security-Policy,trusted-types tt-policy-name none,True)|\
-header(Content-Security-Policy,trusted-types none tt-policy-name,True)|\
-header(Content-Security-Policy,trusted-types * none,True)|\
-header(Content-Security-Policy,trusted-types none *,True)|\
+header(Content-Security-Policy,trusted-types tt-policy-name 'none',True)|\
+header(Content-Security-Policy,trusted-types 'none' tt-policy-name,True)|\
+header(Content-Security-Policy,trusted-types * 'none',True)|\
+header(Content-Security-Policy,trusted-types 'none' *,True)|\
`
);
assert_equals(results.length, 1);
diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html
new file mode 100644
index 00000000000..5726db94bf3
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="timeout" content="long">
+<link rel="help" href="https://w3c.github.io/trusted-types/dist/spec/#should-block-create-policy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ // WebKit test runner assumes the tests always run in the same order, so make
+ // sure fetch_tests_from_worker tests run sequentially.
+ setup({explicit_done: true});
+ (async function() {
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js"
+ ));
+ await fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js"
+ ));
+ done();
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html
new file mode 100644
index 00000000000..8d10bcb3013
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="timeout" content="long">
+<link rel="help" href="https://w3c.github.io/trusted-types/dist/spec/#should-block-create-policy">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/csp-violations.js"></script>
+<script src="./support/should-trusted-type-policy-creation-be-blocked-by-csp-location.js"></script>
diff --git a/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html.headers b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html.headers
new file mode 100644
index 00000000000..7e28a4dbc8e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-005.html.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types 'none'
diff --git a/tests/wpt/tests/trusted-types/support/csp-violations.js b/tests/wpt/tests/trusted-types/support/csp-violations.js
index 49649f45cd6..46c2ca1b30f 100644
--- a/tests/wpt/tests/trusted-types/support/csp-violations.js
+++ b/tests/wpt/tests/trusted-types/support/csp-violations.js
@@ -15,7 +15,7 @@ const cspDirectives = [
// the CSP directive connect-src 'none' and that fn is not itself triggering
// a "connect-src" violation report.
function trusted_type_violations_and_exception_for(fn) {
- return new Promise((resolve, reject) => {
+ return new Promise(async (resolve, reject) => {
// Listen for security policy violations.
let result = { violations: [], exception: null };
let handler = e => {
@@ -33,7 +33,7 @@ function trusted_type_violations_and_exception_for(fn) {
// Run the specified function and record any exception.
try {
- fn();
+ await fn();
} catch(e) {
result.exception = e;
}
diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js
new file mode 100644
index 00000000000..ff0e26bbc3a
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js
@@ -0,0 +1,12 @@
+const testSetupPolicy = trustedTypes.createPolicy("testSetupPolicy", {
+ createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+// For CSP applying to this file, please refer to
+// should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js.headers
+
+importScripts(testSetupPolicy.createScriptURL("should-sink-type-mismatch-violation-be-blocked-by-csp-location.js"));
+
+done();
diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js.headers
index 72cebc03552..b48df2b0ccc 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers
+++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-location.js.headers
@@ -1,3 +1,2 @@
-Content-Security-Policy: script-src http: https: 'nonce-123' 'report-sample'
Content-Security-Policy: connect-src 'none'
Content-Security-Policy: require-trusted-types-for 'script'
diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js
new file mode 100644
index 00000000000..4979b7fc51e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js
@@ -0,0 +1,35 @@
+const testSetupPolicy = trustedTypes.createPolicy("testSetupPolicy", {
+ createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+// For CSP applying to this file, please refer to
+// should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js.headers
+
+promise_test(async () => {
+ let {violations, exception} = await trusted_type_violations_and_exception_for(_ => setTimeout(";;;;;"));
+
+ // An exception is thrown for the violated enforced policies.
+ assert_true(exception instanceof TypeError, "TypeError is thrown");
+
+ // This violates all 'script' directives.
+ let sorted_violations = violations.map(v => {
+ return { policy: v.originalPolicy, disposition: v.disposition};
+ }).sort();
+ assert_equals(sorted_violations.length, 6);
+ assert_equals(sorted_violations[0].policy, "require-trusted-types-for 'script'");
+ assert_equals(sorted_violations[0].disposition, "enforce");
+ assert_equals(sorted_violations[1].policy, "require-trusted-types-for 'script' 'invalid'");
+ assert_equals(sorted_violations[1].disposition, "enforce");
+ assert_equals(sorted_violations[2].policy, "require-trusted-types-for 'invalid' 'script'");
+ assert_equals(sorted_violations[2].disposition, "enforce");
+ assert_equals(sorted_violations[3].policy, "require-trusted-types-for 'script'");
+ assert_equals(sorted_violations[3].disposition, "report");
+ assert_equals(sorted_violations[4].policy, "require-trusted-types-for 'script' 'invalid'");
+ assert_equals(sorted_violations[4].disposition, "report");
+ assert_equals(sorted_violations[5].policy, "require-trusted-types-for 'invalid' 'script'");
+ assert_equals(sorted_violations[5].disposition, "report");
+}, "Checking reported violations for setTimeout(';;;;;') from DedicatedWorker");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js.headers b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js.headers
new file mode 100644
index 00000000000..c17d57d19ae
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker-multiple-violations.js.headers
@@ -0,0 +1,7 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: require-trusted-types-for 'script'
+Content-Security-Policy-Report-Only: require-trusted-types-for 'script'
+Content-Security-Policy: require-trusted-types-for 'script' 'invalid'
+Content-Security-Policy-Report-Only: require-trusted-types-for 'script' 'invalid'
+Content-Security-Policy: require-trusted-types-for 'invalid' 'script'
+Content-Security-Policy-Report-Only: require-trusted-types-for 'invalid' 'script'
diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js
new file mode 100644
index 00000000000..8568b960aa3
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js
@@ -0,0 +1,21 @@
+function passPlainStringToTrustedTypeSink() { // 1
+ return trusted_type_violation_for(TypeError, _ => // 2
+ setTimeout (";;;;;;;;;;;;;;;;;;;;;;;;;;;;;") //_3
+/* |
+12345678901234567890
+*/
+ );
+}
+
+promise_test(async () => {
+ let violation = await passPlainStringToTrustedTypeSink();
+ let baseURL = (new URL(location.href)).origin;
+ let sourceFile = new URL("/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-location.js", baseURL).toString();
+ assert_equals(violation.sourceFile, sourceFile, "source file");
+ assert_equals(violation.lineNumber, 3, "line number");
+ // https://w3c.github.io/webappsec-csp/#create-violation-for-global does not
+ // say how to determine the location and browsers provide inconsistent values
+ // for column number, so just check it's at least the offset of the 's'
+ // character of setTimeout.
+ assert_greater_than_equal(violation.columnNumber, 5, "column number");
+} , `Location of required-trusted-types-for violations.`);
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js
new file mode 100644
index 00000000000..59d9711f122
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js
@@ -0,0 +1,20 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js.headers
+const tt_directive = `'allow-duplicates' tt-policy-name`;
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name"));
+} , `No violation/exception for allowed policy name (${tt_directive}).`);
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name"));
+} , `No violation/exception for duplicate policy name (${tt_directive}).`);
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("duplicate"));
+}, `Violation and exception for forbidden policy name 'duplicate' ${tt_directive}.`);
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js.headers
new file mode 100644
index 00000000000..9fa44d4200b
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-allow-duplicates-tt-policy-name.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types 'allow-duplicates' tt-policy-name
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js
new file mode 100644
index 00000000000..fc4773f9238
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js
@@ -0,0 +1,9 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js.headers
+
+importScripts("should-trusted-type-policy-creation-be-blocked-by-csp-location.js");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js.headers
new file mode 100644
index 00000000000..7e28a4dbc8e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-location.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types 'none'
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js
new file mode 100644
index 00000000000..74d4429c394
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js
@@ -0,0 +1,28 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violation.js.headers
+
+promise_test(async () => {
+ let {violations, exception} = await trusted_type_violations_and_exception_for(_ => trustedTypes.createPolicy("tt-policy-name"));
+
+ // An exception is thrown for the violated enforced policies.
+ assert_true(exception instanceof TypeError, "TypeError is thrown");
+
+ // This violates other-policy-name and none directives.
+ let sorted_violations = violations.map(v => {
+ return { policy: v.originalPolicy, disposition: v.disposition};
+ }).sort();
+ assert_equals(sorted_violations.length, 4);
+ assert_equals(sorted_violations[0].policy, "trusted-types other-policy-name");
+ assert_equals(sorted_violations[0].disposition, "enforce");
+ assert_equals(sorted_violations[1].policy, "trusted-types 'none'");
+ assert_equals(sorted_violations[1].disposition, "enforce");
+ assert_equals(sorted_violations[2].policy, "trusted-types other-policy-name");
+ assert_equals(sorted_violations[2].disposition, "report");
+ assert_equals(sorted_violations[3].policy, "trusted-types 'none'");
+ assert_equals(sorted_violations[3].disposition, "report");
+}, "Exception and violations for CSP with multiple enforce and report-only policies.");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js.headers
new file mode 100644
index 00000000000..5edaafc1ff6
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-multiple-violations.js.headers
@@ -0,0 +1,9 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types tt-policy-name
+Content-Security-Policy-Report-Only: trusted-types tt-policy-name
+Content-Security-Policy: trusted-types other-policy-name
+Content-Security-Policy-Report-Only: trusted-types other-policy-name
+Content-Security-Policy: trusted-types *
+Content-Security-Policy-Report-Only: trusted-types *
+Content-Security-Policy: trusted-types 'none'
+Content-Security-Policy-Report-Only: trusted-types 'none'
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js
new file mode 100644
index 00000000000..8d0ba3da646
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js
@@ -0,0 +1,16 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js.headers
+const tt_directive = `'none'`;
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name"));
+} , `Violation and exception for policy name "tt-policy-name" (${tt_directive}).`);
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("none"));
+} , `Violation and exception for policy name "none" (${tt_directive}).`);
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js.headers
new file mode 100644
index 00000000000..7e28a4dbc8e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-none.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types 'none'
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js
new file mode 100644
index 00000000000..ed3524005ea
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js
@@ -0,0 +1,23 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// This test is similar to allow-duplicates-tt-policy-name.js but with a
+// different ordering of tt-expressions.
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js.headers
+const tt_directive = `tt-policy-name 'allow-duplicates'`;
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name"));
+} , `No violation/exception for allowed policy name (${tt_directive}).`);
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name"));
+} , `No violation/exception for duplicate policy name (${tt_directive}).`);
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("duplicate"));
+}, `Violation and exception for forbidden policy name 'duplicate' ${tt_directive}.`);
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js.headers
new file mode 100644
index 00000000000..673b3270862
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-allow-duplicates.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types tt-policy-name 'allow-duplicates'
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js
new file mode 100644
index 00000000000..d34bd04eaeb
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js
@@ -0,0 +1,19 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// This test verifies that 'none' keyword is ignored if other tt-expression is
+// present.
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js.headers
+const tt_directive = `tt-policy-name 'none'`;
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name"));
+} , `No violation/exception for allowed policy names (${tt_directive}).`);
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("other-policy-name"));
+}, `Violation and exception for forbidden policy name (${tt_directive}).`);
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js.headers
new file mode 100644
index 00000000000..55cf94e10e6
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name-none.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types tt-policy-name 'none'
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js
new file mode 100644
index 00000000000..985ee43e833
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js
@@ -0,0 +1,24 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js.headers
+const tt_directive = `tt-policy-name-1 tt-policy-name-2 tt-policy-name-3`;
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name-1"));
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name-2"));
+ await no_trusted_type_violation_for(_ => trustedTypes.createPolicy("tt-policy-name-3"));
+} , `No violation/exception for allowed policy names (${tt_directive}).`);
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-1"));
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-2"));
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-3"));
+}, `Violation and exception for duplicate policy names (${tt_directive}).`);
+
+promise_test(async () => {
+ await trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-4"));
+}, `Violation and exception for forbidden policy name (${tt_directive}).`);
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js.headers
new file mode 100644
index 00000000000..96b79d71c5d
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-tt-policy-name.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types tt-policy-name-1 tt-policy-name-2 tt-policy-name-3
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js
new file mode 100644
index 00000000000..004530def32
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js
@@ -0,0 +1,15 @@
+importScripts("/resources/testharness.js");
+importScripts("csp-violations.js");
+
+// For CSP applying to this file, please refer to
+// should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js.headers
+const tt_directive = `tt-policy-name-1 * tt-policy-name-3`;
+
+promise_test(async () => {
+ await no_trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-1"));
+ await no_trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-2"));
+ await no_trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("tt-policy-name-3"));
+ await no_trusted_type_violation_for(TypeError, _ => trustedTypes.createPolicy("other-policy-name"));
+} , `No violation and exception for allowed policy names (${tt_directive}).`);
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js.headers
new file mode 100644
index 00000000000..b93b85d4a35
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker-wildcard.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: connect-src 'none'
+Content-Security-Policy: trusted-types tt-policy-name-1 * tt-policy-name-3
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-location.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-location.js
new file mode 100644
index 00000000000..11390a63184
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-location.js
@@ -0,0 +1,22 @@
+function createForbiddenPolicy() { // 1
+ return trusted_type_violation_for(TypeError, _ => // 2
+ trustedTypes. // 3
+ createPolicy ("tt-policy-name") //_4
+/* |
+1234567890123456789012345
+*/
+ );
+}
+
+promise_test(async () => {
+ let violation = await createForbiddenPolicy();
+ let baseURL = (new URL(location.href)).origin;
+ let sourceFile = new URL("/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-location.js", baseURL).toString();
+ assert_equals(violation.sourceFile, sourceFile, "source file");
+ assert_equals(violation.lineNumber, 4, "line number");
+ // https://w3c.github.io/webappsec-csp/#create-violation-for-global does not
+ // say how to determine the location and browsers provide inconsistent values
+ // for column number, so just check it's at least the offset of the 'c'
+ // character of createPolicy.
+ assert_greater_than_equal(violation.columnNumber, 7, "column number");
+} , `Location of trusted-types violations.`);
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js
new file mode 100644
index 00000000000..6bb346e3195
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js
@@ -0,0 +1,5 @@
+importScripts("/resources/testharness.js");
+
+importScripts("trusted-types-reporting-check-report-create-policy.js");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.headers
new file mode 100644
index 00000000000..58beda24183
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy-worker.js.sub.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
+Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-create-policy={{$id:uuid()}}; Path=/trusted-types/
+Content-Security-Policy-Report-Only: trusted-types one two; report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js
new file mode 100644
index 00000000000..5d96829727b
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-create-policy.js
@@ -0,0 +1,15 @@
+test(() => {
+ const p1 = trustedTypes.createPolicy("one", {}); // allowed policy name
+ assert_equals(p1.name, "one");
+
+ const p2 = trustedTypes.createPolicy("two", {}); // allowed policy name
+ assert_equals(p2.name, "two");
+}, "Creating policy works for policy in the allowlist.");
+
+test(() => {
+ const p3 = trustedTypes.createPolicy("three", {}); // forbidden policy name
+ assert_equals(p3.name, "three");
+
+ const p4 = trustedTypes.createPolicy("four", {}); // forbidden policy name
+ assert_equals(p4.name, "four");
+}, "Creating policy works for policy in the blocklist, since it's report-only.");
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js
new file mode 100644
index 00000000000..85910e2e926
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js
@@ -0,0 +1,7 @@
+const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+
+importScripts(testSetupPolicy.createScriptURL("trusted-types-reporting-check-report-sink-mismatch.js"));
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers
new file mode 100644
index 00000000000..5fcdf6ccbfc
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch-worker.js.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/
+Content-Security-Policy: script-src http: https:
+Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js
new file mode 100644
index 00000000000..96ad9c116b4
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-check-report-sink-mismatch.js
@@ -0,0 +1,13 @@
+test(() => {
+ setTimeout(";"); // violation reported
+ setTimeout(";;"); // another violation reported
+}, "Passing a plain string to setTimeout works since it's report-only.");
+
+test(() => {
+ let p = trustedTypes.createPolicy("dummy", {createScript: x => x});
+ setTimeout(p.createScript(";;;")); // no violation reported
+}, "Passing a TrustedScript to setTimeout works.");
+
+test(_ => {
+ assert_throws_js(EvalError, _ => eval(";;;;")); // violation reported
+}, "Passing a plain string to eval throws.");
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js
new file mode 100644
index 00000000000..e5b09eb3707
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js
@@ -0,0 +1,11 @@
+const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("helper.sub.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+importScripts(testSetupPolicy.createScriptURL(
+ "trusted-types-reporting-for-DedicatedWorker-constructor.js"
+));
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers
new file mode 100644
index 00000000000..54d8b1d4c12
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: require-trusted-types-for 'script';
+Content-Security-Policy: connect-src 'none' \ No newline at end of file
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js
new file mode 100644
index 00000000000..cb5ae4c8e2c
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-DedicatedWorker-constructor.js
@@ -0,0 +1,16 @@
+const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x });
+const input = `data:text/javascript,${';'.repeat(100)}`;
+
+promise_test(async t => {
+ await no_trusted_type_violation_for(_ =>
+ new Worker(policy.createScriptURL(input))
+ );
+}, "No violation reported for Worker constructor with TrustedScriptURL.");
+
+promise_test(async t => {
+ let violation = await trusted_type_violation_for(TypeError, _ =>
+ new Worker(input)
+ );
+ assert_equals(violation.blockedURI, "trusted-types-sink");
+ assert_equals(violation.sample, `Worker constructor|${clipSampleIfNeeded(input)}`);
+}, "Violation report for Worker constructor with plain string.");
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js
new file mode 100644
index 00000000000..cce29cb2f7b
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js
@@ -0,0 +1,11 @@
+const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("helper.sub.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+importScripts(testSetupPolicy.createScriptURL(
+ "trusted-types-reporting-for-ServiceWorkerContainer-register.https.js"
+));
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers
new file mode 100644
index 00000000000..54d8b1d4c12
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: require-trusted-types-for 'script';
+Content-Security-Policy: connect-src 'none' \ No newline at end of file
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js
new file mode 100644
index 00000000000..f59799d4776
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js
@@ -0,0 +1,27 @@
+const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x });
+let worker_url = "worker.https.js";
+let scope = `scope1/`;
+
+if (getGlobalThisStr().includes("Window")) {
+ worker_url = `support/${worker_url}`;
+ scope = `support/${scope}`;
+}
+
+promise_test(async t => {
+ await no_trusted_type_violation_for(async _ => {
+ let reg = await self.navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ reg = await self.navigator.serviceWorker.register(policy.createScriptURL(worker_url), {scope});
+ await new Promise(r => reg.addEventListener("updatefound", r));
+ });
+}, "No violation reported for ServiceWorkerContainer register with TrustedScriptURL.");
+
+promise_test(async t => {
+ let violation = await trusted_type_violation_for(TypeError, async _ => {
+ let reg = await self.navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ await self.navigator.serviceWorker.register(worker_url, {scope});
+ });
+ assert_equals(violation.blockedURI, "trusted-types-sink");
+ assert_equals(violation.sample, `ServiceWorkerContainer register|${clipSampleIfNeeded(worker_url)}`);
+}, "Violation report for ServiceWorkerContainer register with plain string.");
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js
new file mode 100644
index 00000000000..a65731a2f9c
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-SharedWorker-constructor.js
@@ -0,0 +1,16 @@
+const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x });
+const input = `data:text/javascript,${';'.repeat(100)}`;
+
+promise_test(async t => {
+ await no_trusted_type_violation_for(_ =>
+ new SharedWorker(policy.createScriptURL(input))
+ );
+}, "No violation reported for SharedWorker constructor with TrustedScriptURL.");
+
+promise_test(async t => {
+ let violation = await trusted_type_violation_for(TypeError, _ =>
+ new SharedWorker(input)
+ );
+ assert_equals(violation.blockedURI, "trusted-types-sink");
+ assert_equals(violation.sample, `SharedWorker constructor|${clipSampleIfNeeded(input)}`);
+}, "Violation report for SharedWorker constructor with plain string.");
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js
new file mode 100644
index 00000000000..2a4780dcbad
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js
@@ -0,0 +1,11 @@
+const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("helper.sub.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+importScripts(testSetupPolicy.createScriptURL(
+ "trusted-types-reporting-for-eval.js"
+));
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers
new file mode 100644
index 00000000000..54d8b1d4c12
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval-worker.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: require-trusted-types-for 'script';
+Content-Security-Policy: connect-src 'none' \ No newline at end of file
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js
new file mode 100644
index 00000000000..0f8120a7a1f
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-eval.js
@@ -0,0 +1,21 @@
+const policy = trustedTypes.createPolicy("dummy", { createScript: x => x });
+
+promise_test(async t => {
+ let beacon = 'never_overwritten2';
+ await no_trusted_type_violation_for(_ =>
+ eval(policy.createScript('beacon="i ran"'))
+ );
+ assert_equals(beacon, 'i ran');
+}, "No violation reported for eval with TrustedScript.");
+
+promise_test(async t => {
+ const input = 'beacon="should not run"';
+ let beacon = 'never_overwritten';
+ let violation = await trusted_type_violation_for(EvalError, _ =>
+ eval(input)
+ );
+ assert_true(violation.originalPolicy.includes("require-trusted-types-for 'script'"));
+ assert_equals(violation.blockedURI, "trusted-types-sink");
+ assert_equals(violation.sample, `eval|${clipSampleIfNeeded(input)}`);
+ assert_equals(beacon, 'never_overwritten');
+}, "Violation report for eval with plain string."); \ No newline at end of file
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js
new file mode 100644
index 00000000000..ce73b913689
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js
@@ -0,0 +1,11 @@
+const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("helper.sub.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+importScripts(testSetupPolicy.createScriptURL(
+ "trusted-types-reporting-for-function-constructor.js"
+));
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers
new file mode 100644
index 00000000000..54d8b1d4c12
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor-worker.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: require-trusted-types-for 'script';
+Content-Security-Policy: connect-src 'none' \ No newline at end of file
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js
new file mode 100644
index 00000000000..51d04b661f4
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-function-constructor.js
@@ -0,0 +1,29 @@
+const policy = trustedTypes.createPolicy("dummy", { createScript: x => x });
+
+const AsyncFunction = async function() {}.constructor;
+const GeneratorFunction = function*() {}.constructor;
+const AsyncGeneratorFunction = async function*() {}.constructor;
+
+const input = `return${';'.repeat(100)}`;
+[Function, AsyncFunction, GeneratorFunction, AsyncGeneratorFunction].forEach(functionConstructor => {
+ promise_test(async t => {
+ await no_trusted_type_violation_for(_ =>
+ new functionConstructor(policy.createScript(input))
+ );
+ }, `No violation reported for ${functionConstructor.name} with TrustedScript.`);
+
+ promise_test(async t => {
+ await no_trusted_type_violation_for(_ =>
+ new functionConstructor(policy.createScript('a'), policy.createScript(input))
+ );
+ }, `No violation reported for ${functionConstructor.name} with multiple TrustedScript args.`);
+
+ promise_test(async t => {
+ let violation = await trusted_type_violation_for(EvalError, _ =>
+ new functionConstructor(input)
+ );
+ assert_true(violation.originalPolicy.includes("require-trusted-types-for 'script'"));
+ assert_equals(violation.blockedURI, "trusted-types-sink");
+ assert_equals(violation.sample, `Function|${clipSampleIfNeeded(`(\n) {\n${input}\n}`)}`);
+ }, `Violation report for ${functionConstructor.name} with plain string.`);
+});
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js
new file mode 100644
index 00000000000..c03c29a4e9e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js
@@ -0,0 +1,24 @@
+const testSetupPolicy = trustedTypes.createPolicy("p", { createScriptURL: s => s });
+
+importScripts(testSetupPolicy.createScriptURL("/resources/testharness.js"));
+importScripts(testSetupPolicy.createScriptURL("helper.sub.js"));
+importScripts(testSetupPolicy.createScriptURL("csp-violations.js"));
+
+const policy = trustedTypes.createPolicy("dummy", { createScriptURL: x => x });
+const input = `./namespaces.js?${'A'.repeat(100)}`;
+
+promise_test(async t => {
+ await no_trusted_type_violation_for(_ =>
+ importScripts(policy.createScriptURL(input))
+ );
+}, "No violation reported for importScripts with TrustedScriptURL.");
+
+promise_test(async t => {
+ let violation = await trusted_type_violation_for(TypeError, _ =>
+ importScripts(input)
+ );
+ assert_equals(violation.blockedURI, "trusted-types-sink");
+ assert_equals(violation.sample, `WorkerGlobalScope importScripts|${clipSampleIfNeeded(input)}`);
+}, "Violation report for importScripts with plain string.");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers
new file mode 100644
index 00000000000..54d8b1d4c12
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-reporting-for-importScripts.js.headers
@@ -0,0 +1,2 @@
+Content-Security-Policy: require-trusted-types-for 'script';
+Content-Security-Policy: connect-src 'none' \ No newline at end of file
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html
new file mode 100644
index 00000000000..11967a4d97f
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<!-- The CSP spec says a sandbox directive in a <meta> tag is ignored, so we set
+ it and other rules in the .headers file. Please refer to that file. -->
+<p>Sandboxed frame without allow-scripts</p>
+<script>
+ parent.postMessage("I can execute scripts", "*");
+</script>
diff --git a/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers
new file mode 100644
index 00000000000..da0823c6bc5
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/trusted-types-sandbox-no-allow-scripts.html.headers
@@ -0,0 +1,3 @@
+Content-Security-Policy: sandbox;
+Content-Security-Policy: trusted-types AllowedPolicyName default;
+Content-Security-Policy: require-trusted-types-for 'script';
diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html
index 69b5bf3c1d1..27bd4644496 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html
+++ b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html
@@ -3,24 +3,12 @@
<script nonce="123" src="/resources/testharness.js"></script>
<script nonce="123"src="/resources/testharnessreport.js"></script>
<script src="./support/csp-violations.js"></script>
+ <meta http-equiv="Content-Security-Policy" content="script-src http: https: 'nonce-123' 'report-sample'">
+ <meta http-equiv="Content-Security-Policy" content="connect-src 'none'">
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
</head>
<body>
<script nonce="123">
- // CSP insists the "trusted-types: ..." directives are deliverd as headers
- // (rather than as "<meta http-equiv" tags). This test assumes the following
- // headers are set in the .headers file:
- //
- // Content-Security-Policy: script-src 'unsafe-inline'; report-uri ...
- // Content-Security-Policy: connect-src 'none'
- // Content-Security-Policy: require-trusted-types-for 'script'
- //
- // The second rule is there so we can provoke a CSP violation report at will.
- // The intent is that in order to test that a violation has *not* been thrown
- // (and without resorting to abominations like timeouts), we force a *another*
- // CSP violation (by violating the connect-src rule) and when that event is
- // processed we can we sure that an earlier event - if it indeed occurred -
- // must have already been processed.
-
// A sample policy we use to test trustedTypes.createPolicy behaviour.
const id = x => x;
const a_policy = {
diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html
index a9e14f09e4a..09b2f1c2585 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html
+++ b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-report-only.html
@@ -3,23 +3,13 @@
<script nonce="123" src="/resources/testharness.js"></script>
<script nonce="123" src="/resources/testharnessreport.js"></script>
<script nonce="123" src="./support/csp-violations.js"></script>
+ <!-- Content-Security-Policy-Report-Only directives are not supported on meta
+ tags per https://www.w3.org/TR/CSP3/#cspro-header. This test sets at
+ least one such directive in a .headers file. Please refer to that file
+ for the complete set of CSP rules that apply to this test. -->
</head>
<body>
<script nonce="123">
- // CSP insists the "trusted-types: ..." directives are delivered as headers
- // (rather than as "<meta http-equiv" tags). This test assumes the following
- // headers are set in the .headers file:
- //
- // Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval'; report-uri ...
- // Content-Security-Policy: connect-src 'none'
- // Content-Security-Policy-Report-Only: require-trusted-types-for 'script'
- //
- // The last rule is there so we can provoke a CSP violation report at will.
- // The intent is that in order to test that a violation has *not* been thrown
- // (and without resorting to abominations like timeouts), we force a *another*
- // CSP violation (by violating the img-src rule) and when that event is
- // processed we can we sure that an earlier event - if it indeed occurred -
- // must have already been processed.
// A sample policy we use to test trustedTypes.createPolicy behaviour.
const id = x => x;
diff --git a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html
deleted file mode 100644
index d037c058d9b..00000000000
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<head>
- <script nonce="123" src="/resources/testharness.js"></script>
- <script nonce="123" src="/resources/testharnessreport.js"></script>
- <script nonce="123" src="./support/csp-violations.js"></script>
-</head>
-<body>
- <script nonce="123">
- // CSP insists the "trusted-types: ..." directives are delivered as headers
- // (rather than as "<meta http-equiv" tags). This test assumes the following
- // headers are set in the .headers file:
- //
- // Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval'; report-uri ...
- // Content-Security-Policy: connect-src 'none'
- // Content-Security-Policy: require-trusted-types-for 'script'
- //
- // The last rule is there so we can provoke a CSP violation report at will.
- // The intent is that in order to test that a violation has *not* been thrown
- // (and without resorting to abominations like timeouts), we force a *another*
- // CSP violation (by violating the img-src rule) and when that event is
- // processed we can we sure that an earlier event - if it indeed occurred -
- // must have already been processed.
-
- // A sample policy we use to test trustedTypes.createPolicy behaviour.
- const id = x => x;
- const a_policy = {
- createHTML: id,
- createScriptURL: id,
- createScript: id,
- };
- const scriptyPolicy = trustedTypes.createPolicy('allowEval', a_policy);
-
- promise_test(async t => {
- const input = 'beacon="should not run"';
- let beacon = 'never_overwritten';
- let violation = await trusted_type_violation_for(EvalError, _ =>
- eval(input)
- );
- assert_true(violation.originalPolicy.includes("require-trusted-types-for 'script'"));
- assert_equals(violation.sample, `eval|${clipSampleIfNeeded(input)}`);
- assert_equals(beacon, 'never_overwritten');
- }, "Trusted Type violation report: evaluating a string.");
-
- promise_test(async t => {
- let beacon = 'never_overwritten2';
- await no_trusted_type_violation_for(_ =>
- eval(scriptyPolicy.createScript('beacon="i ran"'))
- );
- assert_equals(beacon, 'i ran');
- }, "Trusted Type violation report: evaluating a Trusted Script.");
-
- </script>
-</body>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-report-only.html b/tests/wpt/tests/trusted-types/trusted-types-report-only.html
index f4386f832f4..7b1a9c7e302 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-report-only.html
+++ b/tests/wpt/tests/trusted-types/trusted-types-report-only.html
@@ -3,7 +3,11 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/content-security-policy/support/testharness-helper.js"></script>
-<script src="./support/csp-violations.js"></script>
+ <script src="./support/csp-violations.js"></script>
+ <!-- Content-Security-Policy-Report-Only directives are not supported on meta
+ tags per https://www.w3.org/TR/CSP3/#cspro-header. This test sets at
+ least one such directive in a .headers file. Please refer to that file
+ for the complete set of CSP rules that apply to this test. -->
</head>
<body>
@@ -14,12 +18,6 @@
<script id="script2"></script>
<script>
- // CSP insists the "trusted-types: ..." directives are delivered as headers
- // (rather than as "meta http-equiv" tags). This test assumes the following
- // headers are set in the .headers file:
- //
- // Content-Security-Policy-Report-Only: trusted-types ...; report-uri ...
-
// A sample policy we use to test trustedTypes.createPolicy behaviour.
const id = x => x;
const policy = trustedTypes.createPolicy("two", {
@@ -30,10 +28,10 @@
promise_test(async t => {
let violation = await trusted_type_violation_without_exception_for(_ =>
- document.getElementById("script").src = "// #abc"
+ document.getElementById("script").src = "support/namespaces.js#abc"
);
assert_true(violation.originalPolicy.includes("trusted-types two"));
- assert_true(document.getElementById("script").src.endsWith("// #abc"));
+ assert_true(document.getElementById("script").src.endsWith("#abc"));
}, "Trusted Type violation report-only: assign string to script url");
promise_test(async t => {
diff --git a/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers b/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers
index 602186027d0..096c0b40195 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers
+++ b/tests/wpt/tests/trusted-types/trusted-types-report-only.html.headers
@@ -1,2 +1,2 @@
-Content-Security-Policy-Report-Only: trusted-types two; report-uri /content-security-policy/resources/dummy-report.php; require-trusted-types-for 'script';
+Content-Security-Policy-Report-Only: trusted-types two; require-trusted-types-for 'script';
Content-Security-Policy: connect-src 'none'
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html
new file mode 100644
index 00000000000..71576c4ecc1
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-create-policy.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Check Trusted Type violation reports (DedicatedWorker, createPolicy)</title>
+
+<!-- We assume these HTTP headers are set on the request:
+
+ Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-create-policy={{$id:uuid()}}; Path=/trusted-types/
+ Content-Security-Policy-Report-Only: \
+ trusted-types one two; \
+ report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
+-->
+</head>
+<body>
+ <script>
+ // Make sure checkReport.sub.js tests are executed after the worker tests,
+ // otherwise the violation reports may not have been sent yet.
+ setup({explicit_done: true});
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-check-report-create-policy-worker.js"
+ )).then(() => {
+ let script = document.createElement("script");
+ script.src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=trusted-types&testName=Test report-uri works with trusted-types violation.&reportCount=2';
+ script.onload = done;
+ document.body.appendChild(script);
+ });
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html
new file mode 100644
index 00000000000..72354a99eed
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Check Trusted Type violation reports (DedicatedWorker, sink mismatch)</title>
+
+<!-- We assume these HTTP headers are set on the request:
+
+ Set-Cookie: trusted-types-reporting-check-report-DedicatedWorker-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/
+ Content-Security-Policy-Report-Only: \
+ require-trusted-type-for 'script'; \
+ report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
+-->
+</head>
+<body>
+ <script>
+ // Make sure checkReport.sub.js tests are executed after the worker tests,
+ // otherwise the violation reports may not have been sent yet.
+ setup({explicit_done: true});
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-check-report-sink-mismatch-worker.js"
+ )).then(() => {
+ let script = document.createElement("script");
+ script.src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=require-trusted-types-for&testName=Test report-uri works with require-trusted-types-for violation.&reportCount=3';
+ script.onload = done;
+ document.body.appendChild(script);
+ });
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html
index ae5ac25052d..4c9506c5b43 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html
@@ -3,20 +3,18 @@
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <title>Check Trusted Type violation reports</title>
+ <title>Check Trusted Type violation reports (Window, createPolicy)</title>
<!-- We assume these HTTP headers are set on the request:
- Set-Cookie: trusted-types-reporting-check-report={{$id:uuid()}}; Path=/trusted-types/
+ Set-Cookie: trusted-types-reporting-check-report-Window-create-policy={{$id:uuid()}}; Path=/trusted-types/
Content-Security-Policy-Report-Only: \
trusted-types one two; \
report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
-->
</head>
<body>
- <script>
- trustedTypes.createPolicy("three", {});
- </script>
- <script async defer src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=trusted-types'></script>
+ <script src="support/trusted-types-reporting-check-report-create-policy.js"></script>
+ <script async defer src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=trusted-types&testName=Test report-uri works with trusted-types violation.&reportCount=2'></script>
</body>
</html>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html.sub.headers b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html.sub.headers
index c055bdc6563..4653c9d7031 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report.html.sub.headers
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-create-policy.html.sub.headers
@@ -2,5 +2,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
-Set-Cookie: trusted-types-reporting-check-report={{$id:uuid()}}; Path=/trusted-types/
+Set-Cookie: trusted-types-reporting-check-report-Window-create-policy={{$id:uuid()}}; Path=/trusted-types/
Content-Security-Policy-Report-Only: trusted-types one two; report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html
new file mode 100644
index 00000000000..ad855dfb2f1
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <title>Check Trusted Type violation reports (DedicatedWorker, sink mismatch)</title>
+
+<!-- We assume these HTTP headers are set on the request:
+
+ Set-Cookie: trusted-types-reporting-check-report-Window-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/
+ Content-Security-Policy-Report-Only: \
+ require-trusted-type-for 'script'; \
+ report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
+-->
+</head>
+<body>
+ <script nonce="123" src="support/trusted-types-reporting-check-report-sink-mismatch.js"></script>
+ <script async defer src='../content-security-policy/support/checkReport.sub.js?reportField=violated-directive&reportValue=require-trusted-types-for&testName=Test report-uri works with require-trusted-types-for violation.&reportCount=3'></script>
+</body>
+</html>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers
new file mode 100644
index 00000000000..62a0c13f0a3
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-check-report-Window-sink-mismatch.html.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: trusted-types-reporting-check-report-Window-sink-mismatch={{$id:uuid()}}; Path=/trusted-types/
+Content-Security-Policy: script-src http: https: 'nonce-123'
+Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html
new file mode 100644
index 00000000000..b70a074fc7f
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-DedicatedWorker-constructor.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html
new file mode 100644
index 00000000000..9db187a2f91
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-ServiceWorkerContainer-register.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html
new file mode 100644
index 00000000000..184bc8ad333
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-eval.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-for-eval-worker.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html
new file mode 100644
index 00000000000..26d4e54634a
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-function-constructor.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-for-function-constructor-worker.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html
new file mode 100644
index 00000000000..5db284f715c
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-DedicatedWorker-importScripts.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker(
+ "support/trusted-types-reporting-for-importScripts.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html
new file mode 100644
index 00000000000..ac853cd8f6e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-ServiceWorkerContainer-register.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ // Cargo-culted from code generated from "META: worker".
+ (async function() {
+ const scope = 'support/some/scope/for/this/test';
+ let reg = await navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ reg = await navigator.serviceWorker.register(
+ "support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js", {scope});
+ fetch_tests_from_worker(reg.installing);
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html
new file mode 100644
index 00000000000..2d0b6315fb9
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-eval.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ // Cargo-culted from code generated from "META: worker".
+ (async function() {
+ const scope = 'support/some/scope/for/this/test';
+ let reg = await navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ reg = await navigator.serviceWorker.register(
+ "support/trusted-types-reporting-for-eval-worker.js", {scope});
+ fetch_tests_from_worker(reg.installing);
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.https.html
new file mode 100644
index 00000000000..791663dfc79
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ // Cargo-culted from code generated from "META: worker".
+ (async function() {
+ const scope = 'support/some/scope/for/this/test';
+ let reg = await navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ reg = await navigator.serviceWorker.register(
+ "support/trusted-types-reporting-for-function-constructor-worker.js", {scope});
+ fetch_tests_from_worker(reg.installing);
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html
new file mode 100644
index 00000000000..865409aca1b
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-importScripts.https.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ // Cargo-culted from code generated from "META: worker".
+ (async function() {
+ const scope = 'support/some/scope/for/this/test';
+ let reg = await navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ reg = await navigator.serviceWorker.register("support/trusted-types-reporting-for-importScripts.js", {scope});
+ fetch_tests_from_worker(reg.installing);
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html
new file mode 100644
index 00000000000..34b962df085
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-setTimeout-setInterval.https.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ // Cargo-culted from code generated from "META: worker".
+ (async function() {
+ const scope = 'support/some/scope/for/this/test';
+ let reg = await navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+ reg = await navigator.serviceWorker.register("support/trusted-types-reporting-for-setTimeout-setInterval-worker.js", {scope});
+ fetch_tests_from_worker(reg.installing);
+ })();
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html
new file mode 100644
index 00000000000..3b382d8774a
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-DedicatedWorker-constructor.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new SharedWorker(
+ "support/trusted-types-reporting-for-DedicatedWorker-constructor-worker.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html
new file mode 100644
index 00000000000..00e9a75dfb0
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-ServiceWorkerContainer-register.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new SharedWorker(
+ "support/trusted-types-reporting-for-ServiceWorkerContainer-register-worker.https.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html
new file mode 100644
index 00000000000..6ae0f60351f
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-eval.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new SharedWorker(
+ "support/trusted-types-reporting-for-eval-worker.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html
new file mode 100644
index 00000000000..dc77be79640
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-function-constructor.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new SharedWorker(
+ "support/trusted-types-reporting-for-function-constructor-worker.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html
new file mode 100644
index 00000000000..fb01333dd46
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-SharedWorker-importScripts.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ fetch_tests_from_worker(new SharedWorker(
+ "support/trusted-types-reporting-for-importScripts.js"
+ ));
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html
new file mode 100644
index 00000000000..3d2a91d74ca
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-DedicatedWorker-constructor.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.sub.js"></script>
+<script src="support/csp-violations.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';">
+<body>
+<script src="support/trusted-types-reporting-for-DedicatedWorker-constructor.js">
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html
new file mode 100644
index 00000000000..482b9c333e3
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-ServiceWorkerContainer-register.https.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.sub.js"></script>
+<script src="support/csp-violations.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';">
+<body>
+<script src="support/trusted-types-reporting-for-ServiceWorkerContainer-register.https.js">
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html
new file mode 100644
index 00000000000..a03dd21be97
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-SharedWorker-constructor.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.sub.js"></script>
+<script src="support/csp-violations.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';">
+<body>
+<script src="support/trusted-types-reporting-for-SharedWorker-constructor.js">
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html
new file mode 100644
index 00000000000..7f4772aed14
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-eval.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.sub.js"></script>
+<script src="support/csp-violations.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';">
+<body>
+<script src="support/trusted-types-reporting-for-eval.js">
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html
new file mode 100644
index 00000000000..9b9617a9b5d
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-Window-function-constructor.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.sub.js"></script>
+<script src="support/csp-violations.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'; connect-src 'none';">
+<body>
+<script src="support/trusted-types-reporting-for-function-constructor.js">
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting.html b/tests/wpt/tests/trusted-types/trusted-types-reporting.html
index 5e7930382ad..7432d3bded8 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-reporting.html
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting.html
@@ -4,30 +4,18 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./support/csp-violations.js"></script>
+ <!-- Content-Security-Policy-Report-Only directives are not supported on meta
+ tags per https://www.w3.org/TR/CSP3/#cspro-header. This test sets at
+ least one such directive in a .headers file. It also sets a default-src
+ rule to allow all scripting except 'unsafe-eval', so we can also test
+ reporting of this case. Please refer to that file for the complete set of
+ CSP rules that apply to this test. -->
</head>
<body>
<!-- Some elements for the tests to act on. -->
<script id="customscript" is="custom-script" src="a"></script>
<svg><script id="svgscript"></script></svg>
<script>
- // CSP insists the "trusted-types: ..." directives are delivered as headers
- // (rather than as "<meta http-equiv" tags). This test assumes the following
- // headers are set in the .headers file:
- //
- // Content-Security-Policy: trusted-types one
- // Content-Security-Policy-Report-Only: trusted-types two; report-uri ...
- // Content-Security-Policy: connect-src 'none'
- // Content-Security-Policy: default-src * 'unsafe-inline'
- //
- // The third rule is there so we can provoke a CSP violation report at will.
- // The intent is that in order to test that a violation has *not* been thrown
- // (and without resorting to abominations like timeouts), we force a *another*
- // CSP violation (by violating the connect-src rule) and when that event is
- // processed we can we sure that an earlier event - if it indeed occurred -
- // must have already been processed.
- //
- // The last rule allows all scripting except 'unsafe-eval', so we can also
- // test reporting of this case.
const url = "" + document.location;
diff --git a/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers b/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers
index 7076f4106f7..5809a919913 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting.html.headers
@@ -1,5 +1,5 @@
Content-Security-Policy: trusted-types one
-Content-Security-Policy-Report-Only: trusted-types two; report-uri /content-security-policy/resources/dummy-report.php
+Content-Security-Policy-Report-Only: trusted-types two;
Content-Security-Policy: connect-src 'none'
Content-Security-Policy: default-src * 'unsafe-inline'
Content-Security-Policy: require-trusted-types-for 'script'
diff --git a/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html
new file mode 100644
index 00000000000..b89cb567102
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js" ></script>
+<script src="/resources/testharnessreport.js"></script>
+<!-- The CSP spec says a sandbox directive in a <meta> tag is ignored, so we set
+ it and other rules in the .headers file. Please refer to that file. -->
+<link rel="help" href="https://github.com/w3c/trusted-types/issues/513">
+<script>
+ test(_ => {
+ assert_throws_js(TypeError, _ => {
+ window.trustedTypes.createPolicy("ForbiddenPolicyName",
+ { createHTML: x => x});
+ });
+ let p = window.trustedTypes.createPolicy("AllowedPolicyName",
+ { createHTML: x => `[${x}]`});
+ assert_equals(p.name, "AllowedPolicyName");
+ assert_equals(p.createHTML("Hello World!").toString(), "[Hello World!]");
+ }, "window.trustedTypes.createPolicy() in a sandboxed page with allow-scripts.");
+
+ test(_ => {
+ let div = document.createElement("div");
+ assert_throws_js(TypeError, _ => div.innerHTML = "abcd");
+ window.trustedTypes.createPolicy("default",
+ { createHTML: x => x.toUpperCase()});
+ div.innerHTML = "abcd";
+ assert_equals(div.innerHTML, "ABCD");
+ }, "Default Trusted Types policy in a sandboxed page with allow-scripts.");
+</script>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers
new file mode 100644
index 00000000000..6bd66164613
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-sandbox-allow-scripts.html.headers
@@ -0,0 +1,3 @@
+Content-Security-Policy: sandbox allow-scripts;
+Content-Security-Policy: trusted-types AllowedPolicyName default;
+Content-Security-Policy: require-trusted-types-for 'script';
diff --git a/tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html b/tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html
new file mode 100644
index 00000000000..c4e4683934e
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-sandbox-no-allow-scripts.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js" ></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://github.com/w3c/trusted-types/issues/513">
+<script>
+ let scriptExecutedInSubFrame = false;
+ window.addEventListener("message", _ => {
+ scriptExecutedInSubFrame = true
+ });
+</script>
+<iframe id="sandboxedFrame"
+ src="support/trusted-types-sandbox-no-allow-scripts.html"></iframe>
+<script>
+ promise_test(async () => {
+ await new Promise(resolve => window.addEventListener("load", resolve));
+ assert_equals(scriptExecutedInSubFrame, false);
+ }, "Trusted Types CSP directives don't affect the behavior of sandboxed page without allow-scripts.");
+</script>
diff --git a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json
index f92ab76b71d..a613b6a74b5 100644
--- a/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json
+++ b/tests/wpt/tests/urlpattern/resources/urlpatterntestdata.json
@@ -1202,10 +1202,11 @@
{
"pattern": [{ "protocol": "http", "port": "80 " }],
"inputs": [{ "protocol": "http", "port": "80" }],
- "exactly_empty_components": ["port"],
- "expected_match": {
- "protocol": { "input": "http", "groups": {} }
- }
+ "expected_obj": {
+ "protocol": "http",
+ "port": "80"
+ },
+ "expected_match": null
},
{
"pattern": [{ "protocol": "http", "port": "100000" }],
@@ -1230,6 +1231,34 @@
}
},
{
+ "pattern": [{ "port": "80" }],
+ "inputs": [{ "port": "8\t0" }],
+ "expected_match": {
+ "port": { "input": "80", "groups": {}}
+ }
+ },
+ {
+ "pattern": [{ "port": "80" }],
+ "inputs": [{ "port": "80x" }],
+ "expected_match": {
+ "port": { "input": "80", "groups": {}}
+ }
+ },
+ {
+ "pattern": [{ "port": "80" }],
+ "inputs": [{ "port": "80?x" }],
+ "expected_match": {
+ "port": { "input": "80", "groups": {}}
+ }
+ },
+ {
+ "pattern": [{ "port": "80" }],
+ "inputs": [{ "port": "80\\x" }],
+ "expected_match": {
+ "port": { "input": "80", "groups": {}}
+ }
+ },
+ {
"pattern": [{ "port": "(.*)" }],
"inputs": [{ "port": "invalid80" }],
"expected_obj": {
@@ -1874,7 +1903,17 @@
{
"pattern": [ "https://{sub.}?example{.com/}foo" ],
"inputs": [ "https://example.com/foo" ],
- "expected_obj": "error"
+ "exactly_empty_components": [ "port" ],
+ "expected_obj": {
+ "protocol": "https",
+ "hostname": "{sub.}?example.com",
+ "pathname": "*"
+ },
+ "expected_match": {
+ "protocol": { "input": "https", "groups": {} },
+ "hostname": { "input": "example.com", "groups": {} },
+ "pathname": { "input": "/foo", "groups": { "0": "/foo" } }
+ }
},
{
"pattern": [ "{https://}example.com/foo" ],
diff --git a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js
index f31ee8e4ccf..9cfd90d17f2 100644
--- a/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js
+++ b/tests/wpt/tests/web-animations/animation-model/animation-types/property-list.js
@@ -439,6 +439,12 @@ const gCSSProperties1 = {
{ type: 'discrete', options: [ [ 'auto', 'balance' ] ] }
]
},
+ 'column-wrap': {
+ // https://drafts.csswg.org/css-multicol-2/#cwr
+ types: [
+ { type: 'discrete', options: [ [ 'nowrap', 'wrap' ] ] }
+ ]
+ },
'column-rule-style': {
// https://drafts.csswg.org/css-multicol/#propdef-column-rule-style
types: [
@@ -460,6 +466,12 @@ const gCSSProperties1 = {
{ type: 'discrete', options: [ [ 'auto', '1px' ] ] }
]
},
+ 'column-height': {
+ // https://drafts.csswg.org/css-multicol-2/#ch
+ types: [ 'length',
+ { type: 'discrete', options: [ [ 'auto', '1px' ] ] }
+ ]
+ },
'counter-increment': {
// https://drafts.csswg.org/css-lists-3/#propdef-counter-increment
types: [
diff --git a/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html b/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html
index d1c1c96f7b0..c64400e869d 100644
--- a/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html
+++ b/tests/wpt/tests/web-animations/interfaces/Animation/style-change-events.html
@@ -306,6 +306,13 @@ const tests = {
),
});
},
+ trigger: UsePropertyTest(animation => {
+ // Get the trigger property.
+ animation.trigger;
+
+ // Set the trigger property.
+ animation.trigger = new AnimationTrigger();
+ })
};
// Check that each enumerable property and the constructor follow the
diff --git a/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js b/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js
index 3481b465f9e..2ad7040e08b 100644
--- a/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js
+++ b/tests/wpt/tests/webcodecs/video-decoder-no-size-in-configure.https.any.js
@@ -72,6 +72,11 @@ promise_test(async t => {
decoder.decode(encodedResult.chunk);
await decoder.flush();
- assert_equals(decodedResult.codedWidth, encoderConfig.width, 'decoded frame width');
- assert_equals(decodedResult.codedHeight, encoderConfig.height, 'decoded frame height');
+ // Note: Coded size may vary based on decoder requirements.
+ assert_equals(
+ decodedResult.visibleRect.width, encoderConfig.width,
+ 'decoded frame width');
+ assert_equals(
+ decodedResult.visibleRect.height, encoderConfig.height,
+ 'decoded frame height');
}, 'Test configure() without setting width and height');
diff --git a/tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js b/tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js
new file mode 100644
index 00000000000..de687f11498
--- /dev/null
+++ b/tests/wpt/tests/webcodecs/video-encoder-orientation.https.any.js
@@ -0,0 +1,107 @@
+// META: global=window,dedicatedworker
+// META: script=/common/media.js
+// META: script=/webcodecs/utils.js
+// META: script=/webcodecs/video-encoder-utils.js
+
+const defaultConfig = {
+ codec: 'vp8',
+ width: 640,
+ height: 480
+};
+
+promise_test(async t => {
+ let output_chunks = [];
+ let codecInit = getDefaultCodecInit(t);
+ let decoderConfig = null;
+ codecInit.output = (chunk, metadata) => {
+ assert_not_equals(metadata, null);
+ if (metadata.decoderConfig)
+ decoderConfig = metadata.decoderConfig;
+ output_chunks.push(chunk);
+ }
+
+ let encoder = new VideoEncoder(codecInit);
+ let config = defaultConfig;
+ encoder.configure(config);
+
+ let frame = createFrame(640, 480, 0, {rotation: 90, flip: true});
+ encoder.encode(frame);
+ frame.close();
+ await encoder.flush();
+ encoder.close();
+ assert_equals(output_chunks.length, 1);
+ assert_equals(decoderConfig.rotation, 90);
+ assert_equals(decoderConfig.flip, true);
+}, 'Encode video frame with orientation');
+
+promise_test(async t => {
+ let output_chunks = [];
+ let codecInit = getDefaultCodecInit(t);
+ let decoderConfig = null;
+ codecInit.output = (chunk, metadata) => {
+ assert_not_equals(metadata, null);
+ if (metadata.decoderConfig)
+ decoderConfig = metadata.decoderConfig;
+ output_chunks.push(chunk);
+ }
+
+ let encoder = new VideoEncoder(codecInit);
+ let config = defaultConfig;
+ encoder.configure(config);
+
+ let frame1 = createFrame(640, 480, 0, {rotation: 90, flip: true});
+ let frame2 = createFrame(640, 480, 33333, {rotation: 90, flip: false});
+ let frame3 = createFrame(640, 480, 66666, {rotation: 180, flip: true});
+ let frame4 = createFrame(640, 480, 99999, {rotation: 90, flip: true});
+
+ encoder.encode(frame1);
+ assert_throws_dom('DataError', () => encoder.encode(frame2));
+ assert_throws_dom('DataError', () => encoder.encode(frame3));
+ encoder.encode(frame4);
+
+ frame1.close();
+ frame2.close();
+ frame3.close();
+ frame4.close();
+
+ await encoder.flush();
+ encoder.close();
+ assert_equals(output_chunks.length, 2);
+ assert_equals(decoderConfig.rotation, 90);
+ assert_equals(decoderConfig.flip, true);
+}, 'Encode video frames with different orientation has non-fatal failures');
+
+promise_test(async t => {
+ let output_chunks = [];
+ let codecInit = getDefaultCodecInit(t);
+ let decoderConfig = null;
+ codecInit.output = (chunk, metadata) => {
+ assert_not_equals(metadata, null);
+ if (metadata.decoderConfig)
+ decoderConfig = metadata.decoderConfig;
+ output_chunks.push(chunk);
+ }
+
+ let encoder = new VideoEncoder(codecInit);
+ let config = defaultConfig;
+ encoder.configure(config);
+
+ let frame = createFrame(640, 480, 0, {rotation: 90, flip: true});
+ encoder.encode(frame);
+ frame.close();
+ await encoder.flush();
+ assert_equals(output_chunks.length, 1);
+ assert_equals(decoderConfig.rotation, 90);
+ assert_equals(decoderConfig.flip, true);
+
+ encoder.configure(config);
+ frame = createFrame(640, 480, 0, {rotation: 270, flip: false});
+ encoder.encode(frame);
+ frame.close();
+ await encoder.flush();
+ assert_equals(output_chunks.length, 2);
+ assert_equals(decoderConfig.rotation, 270);
+ assert_equals(decoderConfig.flip, false);
+
+ encoder.close();
+}, 'Encode video frames with different orientations after reconfigure');
diff --git a/tests/wpt/tests/webcodecs/video-encoder-rescaling.https.any.js b/tests/wpt/tests/webcodecs/video-encoder-rescaling.https.any.js
index 70bafa04964..a7f89da67bc 100644
--- a/tests/wpt/tests/webcodecs/video-encoder-rescaling.https.any.js
+++ b/tests/wpt/tests/webcodecs/video-encoder-rescaling.https.any.js
@@ -216,10 +216,16 @@ for (const scale of scaleTests) {
const error = testImageData(outputArrayBuffer, {
channelOffsets: [offset, offset + 1, offset + 2],
- channelWidths: [outputFrame.codedWidth, outputFrame.codedWidth, outputFrame.codedWidth],
+ channelWidths: [
+ outputFrame.visibleRect.width, outputFrame.visibleRect.width,
+ outputFrame.visibleRect.width
+ ],
channelStrides: [stride, stride, stride],
channelSteps: [4, 4, 4],
- channelHeights: [outputFrame.codedHeight, outputFrame.codedHeight, outputFrame.codedHeight],
+ channelHeights: [
+ outputFrame.visibleRect.height, outputFrame.visibleRect.height,
+ outputFrame.visibleRect.height
+ ],
channelFourColors: fourColors.map((col) => col)
});
outputFrame.close();
diff --git a/tests/wpt/tests/webcodecs/video-encoder-utils.js b/tests/wpt/tests/webcodecs/video-encoder-utils.js
index 916f995156e..5c8d17e5bfe 100644
--- a/tests/wpt/tests/webcodecs/video-encoder-utils.js
+++ b/tests/wpt/tests/webcodecs/video-encoder-utils.js
@@ -81,13 +81,21 @@ function validateBlackDots(frame, count) {
return true;
}
-function createFrame(width, height, ts = 0) {
+function createFrame(width, height, ts = 0, additionalOptions = {}) {
let duration = 33333; // 30fps
let text = ts.toString();
let cnv = new OffscreenCanvas(width, height);
var ctx = cnv.getContext('2d');
fourColorsFrame(ctx, width, height, text);
- return new VideoFrame(cnv, { timestamp: ts, duration });
+
+ // Merge the default options with the provided additionalOptions
+ const videoFrameOptions = {
+ timestamp: ts,
+ duration,
+ ...additionalOptions, // Spread the additional options to merge them
+ };
+
+ return new VideoFrame(cnv, videoFrameOptions);
}
function createDottedFrame(width, height, dots, ts) {
diff --git a/tests/wpt/tests/webdriver/tests/bidi/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/__init__.py
index 8e45c0f7265..b0562d22b56 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/__init__.py
@@ -68,6 +68,14 @@ def any_list_or_null(actual: Any) -> None:
any_list(actual)
+def any_positive_int(actual):
+ def _(actual: Any) -> None:
+ any_int(actual)
+ assert actual > 0
+
+ return _
+
+
def any_string(actual: Any) -> None:
assert isinstance(actual, str)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
index 606ac071ed7..8987e12a967 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
@@ -19,6 +19,7 @@ def assert_browsing_context(
parent=None,
url=None,
user_context="default",
+ client_window=None
):
assert "children" in info
if children is not None:
@@ -53,6 +54,8 @@ def assert_browsing_context(
assert info["url"] == url
assert info["userContext"] == user_context
assert info["originalOpener"] == original_opener
+ if client_window is not None:
+ assert info["clientWindow"] == client_window
async def assert_document_status(bidi_session, context, visible, focused):
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
index 152bcdb018b..2982f78d991 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
@@ -346,3 +346,23 @@ async def test_existing_context_via_user_context(bidi_session, create_user_conte
parent=None,
user_context=user_context
)
+
+
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+async def test_client_window(bidi_session, wait_for_event, wait_for_future_safe, subscribe_events, type_hint):
+ await subscribe_events([CONTEXT_CREATED_EVENT])
+
+ on_entry = wait_for_event(CONTEXT_CREATED_EVENT)
+ top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint)
+ context_info = await wait_for_future_safe(on_entry)
+ contexts = await bidi_session.browsing_context.get_tree(root=top_level_context["context"])
+
+ assert_browsing_context(
+ context_info,
+ top_level_context["context"],
+ children=None,
+ url="about:blank",
+ parent=None,
+ user_context="default",
+ client_window=contexts[0]["clientWindow"]
+ )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_destroyed/context_destroyed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_destroyed/context_destroyed.py
index 254708c725a..8492a4c1a96 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_destroyed/context_destroyed.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_destroyed/context_destroyed.py
@@ -363,3 +363,25 @@ async def test_with_user_context_subscription(
parent=None,
user_context=user_context,
)
+
+
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+async def test_client_window(bidi_session, wait_for_event, wait_for_future_safe, subscribe_events, type_hint):
+ await subscribe_events([CONTEXT_DESTROYED_EVENT])
+
+ on_entry = wait_for_event(CONTEXT_DESTROYED_EVENT)
+ top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint)
+ contexts = await bidi_session.browsing_context.get_tree(root=top_level_context["context"])
+
+ await bidi_session.browsing_context.close(context=top_level_context["context"])
+ context_info = await wait_for_future_safe(on_entry)
+
+ assert_browsing_context(
+ context_info,
+ top_level_context["context"],
+ children=None,
+ url="about:blank",
+ parent=None,
+ user_context="default",
+ client_window=contexts[0]["clientWindow"]
+ )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/__init__.py
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/download_will_begin.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/download_will_begin.py
new file mode 100644
index 00000000000..7e402783aad
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/download_will_begin/download_will_begin.py
@@ -0,0 +1,78 @@
+import pytest
+from tests.support.sync import AsyncPoll
+from webdriver.bidi.modules.script import ContextTarget
+from webdriver.error import TimeoutException
+
+from ... import (any_int, any_string, recursive_compare)
+
+pytestmark = pytest.mark.asyncio
+
+DOWNLOAD_WILL_BEGIN = "browsingContext.downloadWillBegin"
+
+
+async def test_unsubscribe(bidi_session, inline, new_tab, wait_for_event,
+ wait_for_future_safe):
+ filename = 'some_file_name.txt'
+ download_link = "data:text/plain;charset=utf-8,"
+ url = inline(
+ f"""<a id="download_link" href="{download_link}" download="{filename}">download</a>""")
+
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"], url=url, wait="complete"
+ )
+
+ await bidi_session.session.subscribe(events=[DOWNLOAD_WILL_BEGIN])
+ await bidi_session.session.unsubscribe(events=[DOWNLOAD_WILL_BEGIN])
+
+ # Track all received events in the events array
+ events = []
+
+ async def on_event(method, data):
+ events.append(data)
+
+ remove_listener = bidi_session.add_event_listener(DOWNLOAD_WILL_BEGIN,
+ on_event)
+
+ await bidi_session.script.evaluate(
+ expression=
+ "download_link.click()",
+ target=ContextTarget(new_tab["context"]),
+ await_promise=True,
+ 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, new_tab, inline,
+ wait_for_event, wait_for_future_safe):
+ filename = 'some_file_name.txt'
+ download_link = "data:text/plain;charset=utf-8,"
+ url = inline(
+ f"""<a id="download_link" href="{download_link}" download="{filename}">download</a>""")
+
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"], url=url, wait="complete"
+ )
+
+ await bidi_session.session.subscribe(events=[DOWNLOAD_WILL_BEGIN])
+ on_entry = wait_for_event(DOWNLOAD_WILL_BEGIN)
+
+ await bidi_session.script.evaluate(
+ expression=
+ "download_link.click()",
+ target=ContextTarget(new_tab["context"]),
+ await_promise=True,
+ user_activation=True)
+
+ event = await wait_for_future_safe(on_entry)
+ recursive_compare({
+ 'context': new_tab["context"],
+ 'navigation': any_string,
+ 'suggestedFilename': filename,
+ 'timestamp': any_int,
+ 'url': download_link,
+ }, event)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/frames.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/frames.py
index 4fd220ed8fc..df4ff899e90 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/frames.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/frames.py
@@ -29,6 +29,7 @@ async def test_multiple_frames(
children=2,
parent=None,
url=test_page_multiple_frames,
+ client_window=top_context["clientWindow"],
)
child1_info = root_info["children"][0]
@@ -39,6 +40,7 @@ async def test_multiple_frames(
parent_expected=False,
parent=None,
url=test_page,
+ client_window=top_context["clientWindow"],
)
assert child1_info["context"] != root_info["context"]
@@ -50,6 +52,7 @@ async def test_multiple_frames(
parent_expected=False,
parent=None,
url=test_page2,
+ client_window=top_context["clientWindow"],
)
assert child2_info["context"] != root_info["context"]
assert child2_info["context"] != child1_info["context"]
@@ -77,6 +80,7 @@ async def test_cross_origin(
children=1,
parent=None,
url=test_page_cross_origin_frame,
+ client_window=top_context["clientWindow"],
)
child1_info = root_info["children"][0]
@@ -87,6 +91,7 @@ async def test_cross_origin(
parent_expected=False,
parent=None,
url=test_page_cross_origin,
+ client_window=top_context["clientWindow"],
)
assert child1_info["context"] != root_info["context"]
@@ -98,11 +103,12 @@ async def test_user_context(
create_user_context,
subscribe_events,
wait_for_event,
+ wait_for_future_safe,
inline,
user_context,
domain,
):
- await subscribe_events(["browsingContext.load"])
+ await subscribe_events(["browsingContext.contextCreated", "browsingContext.load"])
user_context_id = (
await create_user_context() if user_context == "new" else user_context
@@ -114,9 +120,11 @@ async def test_user_context(
f"<iframe src='{iframe_url_1}'></iframe><iframe src='{iframe_url_2}'></iframe>"
)
+ on_context_created = wait_for_event("browsingContext.contextCreated")
context = await bidi_session.browsing_context.create(
type_hint="tab", user_context=user_context_id
)
+ context_info = await wait_for_future_safe(on_context_created)
# Record all load events.
events = []
@@ -146,6 +154,7 @@ async def test_user_context(
parent=None,
url=page_url,
user_context=user_context_id,
+ client_window=context_info["clientWindow"],
)
# The contexts can be returned in any order, find the info matching iframe_url_1
@@ -162,6 +171,7 @@ async def test_user_context(
parent=None,
url=iframe_url_1,
user_context=user_context_id,
+ client_window=context_info["clientWindow"],
)
assert child1_info["context"] != root_info["context"]
@@ -178,6 +188,7 @@ async def test_user_context(
parent=None,
url=iframe_url_2,
user_context=user_context_id,
+ client_window=context_info["clientWindow"],
)
assert child2_info["context"] != root_info["context"]
assert child2_info["context"] != child1_info["context"]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/max_depth.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/max_depth.py
index b855b8e7eba..9f7130f59c9 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/max_depth.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/max_depth.py
@@ -33,6 +33,7 @@ async def test_null(
children=1,
parent=None,
url=test_page_nested_frames,
+ client_window=top_context["clientWindow"],
)
child1_info = root_info["children"][0]
@@ -43,6 +44,7 @@ async def test_null(
parent_expected=False,
parent=None,
url=test_page_same_origin_frame,
+ client_window=top_context["clientWindow"],
)
assert child1_info["context"] != root_info["context"]
@@ -54,6 +56,7 @@ async def test_null(
parent_expected=False,
parent=None,
url=test_page,
+ client_window=top_context["clientWindow"],
)
assert child2_info["context"] != root_info["context"]
assert child2_info["context"] != child1_info["context"]
@@ -79,6 +82,7 @@ async def test_top_level_only(bidi_session, top_context, test_page_nested_frames
children=None,
parent=None,
url=test_page_nested_frames,
+ client_window=top_context["clientWindow"],
)
@@ -107,6 +111,7 @@ async def test_top_level_and_one_child(
children=1,
parent=None,
url=test_page_nested_frames,
+ client_window=top_context["clientWindow"],
)
child1_info = root_info["children"][0]
@@ -117,5 +122,6 @@ async def test_top_level_and_one_child(
parent_expected=False,
parent=None,
url=test_page_same_origin_frame,
+ client_window=top_context["clientWindow"],
)
assert child1_info["context"] != root_info["context"]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/root.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/root.py
index 40e9f8ac93b..171cc0eb607 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/root.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/get_tree/root.py
@@ -6,13 +6,17 @@ pytestmark = pytest.mark.asyncio
@pytest.mark.parametrize("type_hint", ["tab", "window"])
-async def test_null(bidi_session, top_context, test_page, type_hint):
+async def test_null(bidi_session, top_context, test_page, wait_for_event, wait_for_future_safe, subscribe_events, type_hint):
+ await subscribe_events(["browsingContext.contextCreated"])
+
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=test_page, wait="complete"
)
current_top_level_context_id = top_context["context"]
+ on_context_created = wait_for_event("browsingContext.contextCreated")
other_top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint)
+ context_info = await wait_for_future_safe(on_context_created)
other_top_level_context_id = other_top_level_context["context"]
# Retrieve all top-level browsing contexts
@@ -32,6 +36,7 @@ async def test_null(bidi_session, top_context, test_page, type_hint):
children=0,
parent=None,
url=test_page,
+ client_window=top_context["clientWindow"],
)
assert_browsing_context(
@@ -40,16 +45,22 @@ async def test_null(bidi_session, top_context, test_page, type_hint):
children=0,
parent=None,
url="about:blank",
+ client_window=context_info["clientWindow"],
)
@pytest.mark.parametrize("type_hint", ["tab", "window"])
-async def test_top_level_context(bidi_session, top_context, test_page, type_hint):
+async def test_top_level_context(bidi_session, top_context, test_page, wait_for_event, wait_for_future_safe, subscribe_events, type_hint):
+
+ await subscribe_events(["browsingContext.contextCreated"])
+
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=test_page, wait="complete"
)
+ on_context_created = wait_for_event("browsingContext.contextCreated")
other_top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint)
+ context_info = await wait_for_future_safe(on_context_created)
other_top_level_context_id = other_top_level_context["context"]
# Retrieve all browsing contexts of the newly opened tab/window
contexts = await bidi_session.browsing_context.get_tree(root=other_top_level_context_id)
@@ -61,6 +72,7 @@ async def test_top_level_context(bidi_session, top_context, test_page, type_hint
children=0,
parent=None,
url="about:blank",
+ client_window=context_info["clientWindow"],
)
@@ -86,6 +98,7 @@ async def test_child_context(
children=1,
parent=None,
url=test_page_nested_frames,
+ client_window=top_context["clientWindow"],
)
child1_info = root_info["children"][0]
@@ -96,6 +109,7 @@ async def test_child_context(
parent_expected=False,
parent=None,
url=test_page_same_origin_frame,
+ client_window=top_context["clientWindow"],
)
# Now retrieve all browsing contexts for the first browsing context child
@@ -108,6 +122,7 @@ async def test_child_context(
children=1,
parent=root_info["context"],
url=test_page_same_origin_frame,
+ client_window=top_context["clientWindow"],
)
assert child1_info["children"][0] == child_contexts[0]["children"][0]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py
index 840b8086d13..46146d52eb9 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py
@@ -350,6 +350,16 @@ def get_network_event_timerange(start, end, bidi_session):
return number_interval(start - 1, end + 1)
+def get_next_event_for_url(network_events, url):
+ """
+ Retrieve the next network event in the network_events list matching the
+ provided url.
+ """
+ return next(
+ e for e in network_events if e["request"]["url"] == url
+ )
+
+
# Array of status and status text expected to be available in network events
HTTP_STATUS_AND_STATUS_TEXT = [
(101, "Switching Protocols"),
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py
index 127416d8de4..6f53572a341 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py
@@ -1,4 +1,5 @@
import asyncio
+import random
from urllib.parse import quote
import pytest
@@ -23,6 +24,8 @@ from .. import (
RESPONSE_COMPLETED_EVENT,
)
+from ... import any_positive_int
+
@pytest.mark.asyncio
async def test_subscribe_status(bidi_session, subscribe_events, top_context, wait_for_event, wait_for_future_safe, url, fetch):
@@ -212,7 +215,7 @@ async def test_response_status(
wait_for_event, wait_for_future_safe, url, fetch, setup_network_test, status, status_text
):
status_url = url(
- f"/webdriver/tests/support/http_handlers/status.py?status={status}&nocache={RESPONSE_COMPLETED_EVENT}"
+ f"/webdriver/tests/support/http_handlers/status.py?status={status}&nocache={random.random()}"
)
network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT])
@@ -241,6 +244,37 @@ async def test_response_status(
@pytest.mark.asyncio
+async def test_content_size(
+ wait_for_event, wait_for_future_safe, inline, fetch, setup_network_test
+):
+ url = f"{inline('<div>bar</div>')}&pipe=gzip"
+
+ network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT])
+ events = network_events[RESPONSE_COMPLETED_EVENT]
+
+ on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT)
+ await fetch(url)
+ await wait_for_future_safe(on_response_completed)
+
+ assert len(events) == 1
+ expected_request = {"method": "GET", "url": url}
+ expected_response = {
+ "url": url,
+ "content": {
+ # TODO: At the moment, only Firefox returns a non-zero size here.
+ # Once other implementations start supporting this we should update
+ # to compare to a specific value if possible.
+ "size": any_positive_int
+ },
+ }
+ assert_response_event(
+ events[0],
+ expected_request=expected_request,
+ expected_response=expected_response,
+ redirect_count=0,
+ )
+
+@pytest.mark.asyncio
async def test_response_headers(wait_for_event, wait_for_future_safe, url, fetch, setup_network_test):
headers_url = url(
"/webdriver/tests/support/http_handlers/headers.py?header=foo:bar&header=baz:biz"
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py
index 5b1e3592e09..3f5cbad1047 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed_cached.py
@@ -6,6 +6,7 @@ from tests.support.sync import AsyncPoll
from .. import (
assert_response_event,
get_cached_url,
+ get_next_event_for_url,
IMAGE_RESPONSE_BODY,
PAGE_EMPTY_TEXT,
RESPONSE_COMPLETED_EVENT,
@@ -255,13 +256,16 @@ async def test_page_with_cached_link_stylesheet(
await wait.until(lambda _: len(events) >= 4)
assert len(events) == 4
+ # Assert only cached events after reload.
+ cached_events = events[2:]
+
assert_response_event(
- events[2],
+ get_next_event_for_url(cached_events, page_with_cached_css),
expected_request={"method": "GET", "url": page_with_cached_css},
expected_response={"url": page_with_cached_css, "fromCache": False},
)
assert_response_event(
- events[3],
+ get_next_event_for_url(cached_events, cached_link_css_url),
expected_request={"method": "GET", "url": cached_link_css_url},
expected_response={"url": cached_link_css_url, "fromCache": True},
)
@@ -327,13 +331,16 @@ async def test_page_with_cached_import_stylesheet(
await wait.until(lambda _: len(events) >= 4)
assert len(events) == 4
+ # Assert only cached events after reload.
+ cached_events = events[2:]
+
assert_response_event(
- events[2],
+ get_next_event_for_url(cached_events, page_with_cached_css),
expected_request={"method": "GET", "url": page_with_cached_css},
expected_response={"url": page_with_cached_css, "fromCache": False},
)
assert_response_event(
- events[3],
+ get_next_event_for_url(cached_events, cached_import_css_url),
expected_request={"method": "GET", "url": cached_import_css_url},
expected_response={"url": cached_import_css_url, "fromCache": True},
)
@@ -398,20 +405,14 @@ async def test_page_with_cached_duplicated_stylesheets(
expected_response={"url": page_with_cached_css, "fromCache": False},
)
- link_css_event = next(
- e for e in events if cached_link_css_url == e["request"]["url"]
- )
assert_response_event(
- link_css_event,
+ get_next_event_for_url(events, cached_link_css_url),
expected_request={"method": "GET", "url": cached_link_css_url},
expected_response={"url": cached_link_css_url, "fromCache": False},
)
- import_css_event = next(
- e for e in events if cached_import_css_url == e["request"]["url"]
- )
assert_response_event(
- import_css_event,
+ get_next_event_for_url(events, cached_import_css_url),
expected_request={"method": "GET", "url": cached_import_css_url},
expected_response={"url": cached_import_css_url, "fromCache": False},
)
@@ -428,23 +429,17 @@ async def test_page_with_cached_duplicated_stylesheets(
cached_events = events[3:]
assert_response_event(
- cached_events[0],
+ get_next_event_for_url(cached_events, page_with_cached_css),
expected_request={"method": "GET", "url": page_with_cached_css},
expected_response={"url": page_with_cached_css, "fromCache": False},
)
- cached_link_css_event = next(
- e for e in cached_events if cached_link_css_url == e["request"]["url"]
- )
assert_response_event(
- cached_link_css_event,
+ get_next_event_for_url(cached_events, cached_link_css_url),
expected_request={"method": "GET", "url": cached_link_css_url},
expected_response={"url": cached_link_css_url, "fromCache": True},
)
- cached_import_css_event = next(
- e for e in cached_events if cached_import_css_url == e["request"]["url"]
- )
assert_response_event(
- cached_import_css_event,
+ get_next_event_for_url(cached_events, cached_import_css_url),
expected_request={"method": "GET", "url": cached_import_css_url},
expected_response={"url": cached_import_css_url, "fromCache": True},
)
@@ -503,13 +498,17 @@ async def test_page_with_cached_script_javascript(
await wait.until(lambda _: len(events) >= 4)
assert len(events) == 4
+ # Assert only cached events after reload.
+ cached_events = events[2:]
+
assert_response_event(
- events[2],
+ get_next_event_for_url(cached_events, page_with_cached_js),
expected_request={"method": "GET", "url": page_with_cached_js},
expected_response={"url": page_with_cached_js, "fromCache": False},
)
+
assert_response_event(
- events[3],
+ get_next_event_for_url(cached_events, cached_script_js_url),
expected_request={"method": "GET", "url": cached_script_js_url},
expected_response={"url": cached_script_js_url, "fromCache": True},
)
@@ -541,18 +540,22 @@ async def test_page_with_cached_script_javascript(
cached_events = events[4:]
assert_response_event(
- cached_events[0],
+ get_next_event_for_url(cached_events, page_with_2_cached_js),
expected_request={"method": "GET", "url": page_with_2_cached_js},
expected_response={"url": page_with_2_cached_js, "fromCache": False},
)
+
+ cached_script_js_events = list(
+ e for e in cached_events if cached_script_js_url == e["request"]["url"]
+ )
assert_response_event(
- cached_events[1],
+ cached_script_js_events[0],
expected_request={"method": "GET", "url": cached_script_js_url},
expected_response={"url": cached_script_js_url, "fromCache": True},
)
- if len(events) > 6:
+ if len(cached_script_js_events) > 1:
assert_response_event(
- cached_events[2],
+ cached_script_js_events[1],
expected_request={"method": "GET", "url": cached_script_js_url},
expected_response={"url": cached_script_js_url, "fromCache": True},
)
@@ -618,13 +621,16 @@ async def test_page_with_cached_javascript_module(
await wait.until(lambda _: len(events) >= 4)
assert len(events) == 4
+ # Assert only cached events after reload.
+ cached_events = events[2:]
+
assert_response_event(
- events[2],
+ get_next_event_for_url(cached_events, page_with_cached_js_module),
expected_request={"method": "GET", "url": page_with_cached_js_module},
expected_response={"url": page_with_cached_js_module, "fromCache": False},
)
assert_response_event(
- events[3],
+ get_next_event_for_url(cached_events, cached_js_module_url),
expected_request={"method": "GET", "url": cached_js_module_url},
expected_response={"url": cached_js_module_url, "fromCache": True},
)
@@ -660,12 +666,12 @@ async def test_page_with_cached_javascript_module(
cached_events = events[4:]
assert_response_event(
- cached_events[0],
+ get_next_event_for_url(cached_events, page_with_2_cached_js_modules),
expected_request={"method": "GET", "url": page_with_2_cached_js_modules},
expected_response={"url": page_with_2_cached_js_modules, "fromCache": False},
)
assert_response_event(
- cached_events[1],
+ get_next_event_for_url(cached_events, cached_js_module_url),
expected_request={"method": "GET", "url": cached_js_module_url},
expected_response={"url": cached_js_module_url, "fromCache": True},
)
@@ -726,13 +732,16 @@ async def test_page_with_cached_image(
await wait.until(lambda _: len(events) >= 4)
assert len(events) == 4
+ # Assert only cached events after reload.
+ cached_events = events[2:]
+
assert_response_event(
- events[2],
+ get_next_event_for_url(cached_events, page_with_cached_image),
expected_request={"method": "GET", "url": page_with_cached_image},
expected_response={"url": page_with_cached_image, "fromCache": False},
)
assert_response_event(
- events[3],
+ get_next_event_for_url(cached_events, cached_image_url),
expected_request={"method": "GET", "url": cached_image_url},
expected_response={"url": cached_image_url, "fromCache": True},
)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py
index 6ab3e1c3cac..324105197f0 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py
@@ -1,6 +1,7 @@
import asyncio
import pytest
+import random
from webdriver.bidi.modules.script import ContextTarget
@@ -216,7 +217,7 @@ async def test_response_status(
wait_for_event, wait_for_future_safe, url, fetch, setup_network_test, status, status_text
):
status_url = url(
- f"/webdriver/tests/support/http_handlers/status.py?status={status}&nocache={RESPONSE_STARTED_EVENT}"
+ f"/webdriver/tests/support/http_handlers/status.py?status={status}&nocache={random.random()}"
)
network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT])
diff --git a/tests/wpt/tests/webdriver/tests/support/fixtures.py b/tests/wpt/tests/webdriver/tests/support/fixtures.py
index a8f1f2959d4..21dbfcc25bc 100644
--- a/tests/wpt/tests/webdriver/tests/support/fixtures.py
+++ b/tests/wpt/tests/webdriver/tests/support/fixtures.py
@@ -41,16 +41,24 @@ def pytest_sessionfinish():
@pytest.fixture
-def capabilities():
+def default_capabilities():
"""Default capabilities to use for a new WebDriver session."""
return {}
-def pytest_generate_tests(metafunc):
- if "capabilities" in metafunc.fixturenames:
- marker = metafunc.definition.get_closest_marker(name="capabilities")
- if marker:
- metafunc.parametrize("capabilities", marker.args, ids=None)
+@pytest.fixture
+def capabilities(request, default_capabilities):
+ """Merges default capabilities with any test-specific capabilities from a marker."""
+ marker = request.node.get_closest_marker("capabilities")
+ if marker and marker.args:
+ # Ensure the first positional argument is a dictionary
+ assert isinstance(
+ marker.args[0], dict), "capabilities marker must use a dictionary"
+ caps = copy.deepcopy(default_capabilities)
+ deep_update(caps, marker.args[0])
+ return caps
+
+ return default_capabilities # Use defaults if no marker is present
@pytest.fixture
diff --git a/tests/wpt/tests/webdriver/tests/support/helpers.py b/tests/wpt/tests/webdriver/tests/support/helpers.py
index 8baa895adf2..0bd27a39acd 100644
--- a/tests/wpt/tests/webdriver/tests/support/helpers.py
+++ b/tests/wpt/tests/webdriver/tests/support/helpers.py
@@ -119,10 +119,13 @@ def deep_update(source, overrides):
"""
for key, value in overrides.items():
if isinstance(value, collections.abc.Mapping) and value:
- returned = deep_update(source.get(key, {}), value)
- source[key] = returned
+ source[key] = deep_update(source.get(key, {}), value)
+ elif isinstance(value, list) and isinstance(source.get(key), list) and value:
+ # Concatenate lists, ensuring all elements are kept without duplicates
+ source[key] = list(dict.fromkeys(source[key] + value))
else:
- source[key] = overrides[key]
+ source[key] = value
+
return source
diff --git a/tests/wpt/tests/webnn/conformance_tests/batch_normalization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/batch_normalization.https.any.js
index b8fa3f026bc..1da85777342 100644
--- a/tests/wpt/tests/webnn/conformance_tests/batch_normalization.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/batch_normalization.https.any.js
@@ -81,7 +81,7 @@ const batchNormTests = [
}
},
{
- 'name': 'batchNormalization float32 2D constant tensor default options',
+ 'name': 'batchNormalization float32 2D constant tensors default options',
'graph': {
'inputs': {
'bnInput': {
@@ -697,6 +697,590 @@ const batchNormTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name':
+ 'batchNormalization float16 2D tensor (mean and variance are non-constant) default options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [-7.8125, -95.625, 38.15625, -55.9375, -87.875, -41.625],
+ 'descriptor': {shape: [6], dataType: 'float16'}
+ },
+ 'bnVariance': {
+ 'data': [60.3125, 26.4375, 53.28125, 40.15625, 59.40625, 36],
+ 'descriptor': {shape: [6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -4.3125, 31.0625, -13.90625, 1.4453125, 22.171875,
+ -6.40625, -6.99609375, 18.578125, -10.828125, 17.8125,
+ 16.25, 16.4375, 11.5703125, 1.84765625, 5.3046875,
+ 24.140625, 8.6328125, -9.21875, -0.19921875, 34.1875,
+ -16.921875, 18.671875, 2.513671875, 4.91796875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 2D constant tensors default options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnMean': {
+ 'data': [-7.8125, -95.625, 38.15625, -55.9375, -87.875, -41.625],
+ 'descriptor': {shape: [6], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [60.3125, 26.4375, 53.28125, 40.15625, 59.40625, 36],
+ 'descriptor': {shape: [6], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -4.3125, 31.0625, -13.90625, 1.4453125, 22.171875,
+ -6.40625, -6.99609375, 18.578125, -10.828125, 17.8125,
+ 16.25, 16.4375, 11.5703125, 1.84765625, 5.3046875,
+ 24.140625, 8.6328125, -9.21875, -0.19921875, 34.1875,
+ -16.921875, 18.671875, 2.513671875, 4.91796875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 2D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [-7.8125, -95.625, 38.15625, -55.9375, -87.875, -41.625],
+ 'descriptor': {shape: [6], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [60.3125, 26.4375, 53.28125, 40.15625, 59.40625, 36],
+ 'descriptor': {shape: [6], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -4.3125, 31.0625, -13.90625, 1.4453125, 22.171875,
+ -6.40625, -6.99609375, 18.578125, -10.828125, 17.8125,
+ 16.25, 16.4375, 11.5703125, 1.84765625, 5.3046875,
+ 24.140625, 8.6328125, -9.21875, -0.19921875, 34.1875,
+ -16.921875, 18.671875, 2.513671875, 4.91796875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 3D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [12.8125, 63.125, -61.625],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [18.359375, 41.84375, 16.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -12.6328125, 11.9609375, -17.78125, -13.90625, 3.072265625,
+ -22.140625, -19.375, -9.7734375, 5.16015625, 29.53125,
+ 24.65625, 29.546875, 16.15625, -23.09375, 14.953125,
+ 19.65625, -13.0546875, -24.75, -11.203125, 2.638671875,
+ -5.9140625, 30.875, -1.7119140625, 12.328125
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -16.84375, 2.25390625, -20.84375, -17.828125, -1.76171875,
+ -19.3125, -17.375, -10.703125, 6.42578125, 17.8125,
+ 15.53125, 17.8125, 5.515625, -24.96875, 4.57421875,
+ 8.234375, -12.9921875, -21.125, -11.703125, -2.064453125,
+ 1.2509765625, 18.4375, 3.21484375, 9.7734375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 5D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [6, 1, 1, 2, 2], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [35.40625],
+ 'descriptor': {shape: [1], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [40.9375],
+ 'descriptor': {shape: [1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -11.9921875, 4.48046875, -15.4375, -12.84375, 7.4375,
+ -18.046875, -15.25, -5.55078125, -11.9296875, 3.369140625,
+ 0.3076171875, 3.37890625, 7.29296875, -19, 6.48046875,
+ 9.6328125, -8.8671875, -20.6875, -6.99609375, 7,
+ -18.875, 4.2109375, -16.234375, -7.42578125
+ ],
+ 'descriptor': {shape: [6, 1, 1, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D NCHW tensor options.axis=1',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'},
+ {'options': {'axis': 1}}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -16.84375, 2.25390625, -20.84375, -17.828125, -1.76171875,
+ -19.3125, -17.375, -10.703125, 6.42578125, 17.8125,
+ 15.53125, 17.8125, 5.515625, -24.96875, 4.57421875,
+ 8.234375, -12.9921875, -21.125, -11.703125, -2.064453125,
+ 1.2509765625, 18.4375, 3.21484375, 9.7734375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D NHWC tensor options.axis=3',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 83, -40.90625, 64.0625, -80.0625,
+ 56.96875, -63.375, -62.15625, 37.375, -46.78125,
+ -0.10009765625, 57.03125, 82.0625, -21.34375, -85.375,
+ -86.125, -96.9375, 62.34375, 76.875, -9.359375,
+ -68.5, 97.0625, 80.1875, -12.109375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'},
+ {'options': {'axis': 3}}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -16.84375, -1.76171875, 6.42578125, 2.25390625, -19.3125,
+ 17.8125, -20.84375, -17.375, 15.53125, -17.828125,
+ -10.703125, 17.8125, 5.515625, -12.9921875, 1.2509765625,
+ -24.96875, -21.125, 18.4375, 4.57421875, -11.703125,
+ 3.21484375, 8.234375, -2.064453125, 9.7734375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D NCHW tensor options.scale',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnScale': {
+ 'data': [65.5, -71, -5.5703125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'},
+ {'options': {'scale': 'bnScale'}}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -1103, 147.625, -1365, -1168, 125.125, 1371,
+ 1234, 760, -35.78125, -99.1875, -86.5, -99.25,
+ 361.25, -1635, 299.75, 539.5, 922, 1500,
+ 830.5, 146.625, -6.96875, -102.6875, -17.90625, -54.4375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D NCHW tensor options.bias',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnBias': {
+ 'data': [64.1875, 75.3125, -84.5625],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'},
+ {'options': {'bias': 'bnBias'}}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ 47.34375, 66.4375, 43.34375, 46.34375, 73.5625, 56,
+ 57.9375, 64.625, -78.125, -66.75, -69, -66.75,
+ 69.6875, 39.21875, 68.75, 72.4375, 62.3125, 54.1875,
+ 63.625, 73.25, -83.3125, -66.125, -81.375, -74.8125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D NCHW tensor options.epsilon',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 64.0625, -63.375, -46.78125, 83,
+ -80.0625, -62.15625, -0.10009765625, -40.90625, 56.96875,
+ 37.375, 57.03125, 82.0625, -86.125, 76.875,
+ 97.0625, -21.34375, -96.9375, -9.359375, 80.1875,
+ -85.375, 62.34375, -68.5, -12.109375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'},
+ {'options': {'epsilon': 0.000001}}
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -16.84375, 2.25390625, -20.84375, -17.828125, -1.76171875,
+ -19.3125, -17.375, -10.703125, 6.42578125, 17.8125,
+ 15.53125, 17.8125, 5.515625, -24.96875, 4.57421875,
+ 8.234375, -12.9921875, -21.125, -11.703125, -2.064453125,
+ 1.2509765625, 18.4375, 3.21484375, 9.7734375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'batchNormalization float16 4D NHWC tensor all options',
+ 'graph': {
+ 'inputs': {
+ 'bnInput': {
+ 'data': [
+ -41.3125, 83, -40.90625, 64.0625, -80.0625,
+ 56.96875, -63.375, -62.15625, 37.375, -46.78125,
+ -0.10009765625, 57.03125, 82.0625, -21.34375, -85.375,
+ -86.125, -96.9375, 62.34375, 76.875, -9.359375,
+ -68.5, 97.0625, 80.1875, -12.109375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ },
+ 'bnMean': {
+ 'data': [51.625, 99.375, -96.125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnVariance': {
+ 'data': [30.453125, 86.375, 73.875],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnScale': {
+ 'data': [65.5, -71, -5.5703125],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'bnBias': {
+ 'data': [64.1875, 75.3125, -84.5625],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'batchNormalization',
+ 'arguments': [
+ {'input': 'bnInput'}, {'mean': 'bnMean'}, {'variance': 'bnVariance'},
+ {
+ 'options': {
+ 'scale': 'bnScale',
+ 'bias': 'bnBias',
+ 'axis': 3,
+ 'epsilon': 0.000001
+ }
+ }
+ ],
+ 'outputs': 'bnOutput'
+ }],
+ 'expectedOutputs': {
+ 'bnOutput': {
+ 'data': [
+ -1039, 200.375, -120.375, 211.75, 1446, -183.75,
+ -1301, 1309, -171.125, -1104, 835.5, -183.875,
+ 425.5, 997.5, -91.5, -1571, 1575, -187.25,
+ 364, 906, -102.4375, 603.5, 221.875, -139
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/clamp.https.any.js b/tests/wpt/tests/webnn/conformance_tests/clamp.https.any.js
index d6fa68eb19d..b3ccdcddca3 100644
--- a/tests/wpt/tests/webnn/conformance_tests/clamp.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/clamp.https.any.js
@@ -124,28 +124,6 @@ const clampTests = [
}
},
{
- 'name': 'clamp float16 1D tensor',
- 'graph': {
- 'inputs': {
- 'clampInput': {
- 'data': [NaN, -Infinity, Infinity, -64000, 64000, -2, 1, 0],
- 'descriptor': {shape: [8], dataType: 'float16'}
- }
- },
- 'operators': [{
- 'name': 'clamp',
- 'arguments': [{'input': 'clampInput'}, {'options': {'minValue': -2}}],
- 'outputs': 'clampOutput'
- }],
- 'expectedOutputs': {
- 'clampOutput': {
- 'data': [NaN, -2, Infinity, -2, 64000, -2, 1, 0],
- 'descriptor': {shape: [8], dataType: 'float16'}
- }
- }
- }
- },
- {
'name': 'clamp int8 1D tensor',
'graph': {
'inputs': {
@@ -1090,6 +1068,660 @@ const clampTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'clamp float16 0D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [-9.8203125],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [-9.8203125],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [NaN, -Infinity, Infinity, -64000, 64000, -2, 1, 0],
+ 'descriptor': {shape: [8], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'minValue': -2}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [NaN, -2, Infinity, -2, 64000, -2, 1, 0],
+ 'descriptor': {shape: [8], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 1D constant tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 1D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 2D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 3D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 2, 2, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 2, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'clamp float16 5D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [4, 1, 1, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [4, 1, 1, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 4D tensor default options.maxValue and specified negative options.minValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'minValue': -1}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -1, -1, -1, -1, -1,
+ 9.5234375, 3.728515625, 6.48046875, -1, -1,
+ 7.87890625, -1, 6.34375, 5.52734375, 0.84326171875,
+ -1, -1, 9.28125, -1, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -1
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 3D tensor default options.maxValue and specified options.minValue=0.0',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [6, 2, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'minValue': 0}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ 0, 0, 0, 0, 0,
+ 9.5234375, 3.728515625, 6.48046875, 0, 0,
+ 7.87890625, 0, 6.34375, 5.52734375, 0.84326171875,
+ 0, 0, 9.28125, 0, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, 0
+ ],
+ 'descriptor': {shape: [6, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 2D tensor default options.maxValue and specified positive options.minValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 8], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'minValue': 1}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ 1, 1, 1, 1, 1, 9.5234375, 3.728515625,
+ 6.48046875, 1, 1, 7.87890625, 1, 6.34375, 5.52734375,
+ 1, 1, 1, 9.28125, 1, 9.546875, 5.7890625,
+ 5.55078125, 7.41015625, 1
+ ],
+ 'descriptor': {shape: [3, 8], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 5D tensor default options.minValue and specified negative options.maxValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'maxValue': -2}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ -2, -2, -2, -2, -7.34375,
+ -2, -2.056640625, -2, -2, -2,
+ -8.203125, -7.78515625, -2, -2.3125, -2,
+ -2, -2, -2, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 1D tensor default options.minValue and specified options.maxValue=0.0',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'maxValue': 0}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875,
+ -6.57421875, -7.75390625, 0,
+ 0, 0, -1.537109375,
+ -7.34375, 0, -2.056640625,
+ 0, 0, 0,
+ -8.203125, -7.78515625, 0,
+ -2.3125, 0, 0,
+ 0, 0, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 3D tensor default options.minValue and specified positive options.maxValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 4, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [{'input': 'clampInput'}, {'options': {'maxValue': 3}}],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875,
+ -6.57421875, -7.75390625, 3,
+ 3, 3, -1.537109375,
+ -7.34375, 3, -2.056640625,
+ 3, 3, 0.84326171875,
+ -8.203125, -7.78515625, 3,
+ -2.3125, 3, 3,
+ 3, 3, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 4, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 5D tensor specified both negative options.minValue and options.maxValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 2, 1, 1, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [
+ {'input': 'clampInput'}, {'options': {'minValue': -8, 'maxValue': -1}}
+ ],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -8, -6.0234375, -4.07421875, -6.57421875, -7.75390625, -1, -1,
+ -1, -1.537109375, -7.34375, -1, -2.056640625, -1, -1,
+ -1, -8, -7.78515625, -1, -2.3125, -1, -1,
+ -1, -1, -2.123046875
+ ],
+ 'descriptor': {shape: [3, 2, 1, 1, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 4D tensor specified negative options.minValue and options.maxValue=0.0',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [1, 4, 3, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [
+ {'input': 'clampInput'}, {'options': {'minValue': -6, 'maxValue': 0}}
+ ],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -6, -6, -4.07421875,
+ -6, -6, 0,
+ 0, 0, -1.537109375,
+ -6, 0, -2.056640625,
+ 0, 0, 0,
+ -6, -6, 0,
+ -2.3125, 0, 0,
+ 0, 0, -2.123046875
+ ],
+ 'descriptor': {shape: [1, 4, 3, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 3D tensor specified negative options.minValue and positive options.maxValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 6, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [
+ {'input': 'clampInput'}, {'options': {'minValue': -3, 'maxValue': 4}}
+ ],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ -3, -3, -3,
+ -3, -3, 4,
+ 3.728515625, 4, -1.537109375,
+ -3, 4, -2.056640625,
+ 4, 4, 0.84326171875,
+ -3, -3, 4,
+ -2.3125, 4, 4,
+ 4, 4, -2.123046875
+ ],
+ 'descriptor': {shape: [2, 6, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 2D tensor specified options.minValue=0.0 and positive options.maxValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [6, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [
+ {'input': 'clampInput'}, {'options': {'minValue': 0, 'maxValue': 6}}
+ ],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ 0, 0, 0, 0, 0,
+ 6, 3.728515625, 6, 0, 0,
+ 6, 0, 6, 5.52734375, 0.84326171875,
+ 0, 0, 6, 0, 6,
+ 5.7890625, 5.55078125, 6, 0
+ ],
+ 'descriptor': {shape: [6, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'clamp float16 1D tensor specified both positive options.minValue and options.maxValue',
+ 'graph': {
+ 'inputs': {
+ 'clampInput': {
+ 'data': [
+ -9.8203125, -6.0234375, -4.07421875, -6.57421875, -7.75390625,
+ 9.5234375, 3.728515625, 6.48046875, -1.537109375, -7.34375,
+ 7.87890625, -2.056640625, 6.34375, 5.52734375, 0.84326171875,
+ -8.203125, -7.78515625, 9.28125, -2.3125, 9.546875,
+ 5.7890625, 5.55078125, 7.41015625, -2.123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'clamp',
+ 'arguments': [
+ {'input': 'clampInput'}, {'options': {'minValue': 2, 'maxValue': 7}}
+ ],
+ 'outputs': 'clampOutput'
+ }],
+ 'expectedOutputs': {
+ 'clampOutput': {
+ 'data': [
+ 2, 2, 2, 2, 2, 7, 3.728515625, 6.48046875,
+ 2, 2, 7, 2, 6.34375, 5.52734375, 2, 2,
+ 2, 7, 2, 7, 5.7890625, 5.55078125, 7, 2
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js
new file mode 100644
index 00000000000..eaa232b7413
--- /dev/null
+++ b/tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js
@@ -0,0 +1,96 @@
+// META: title=test constant reshape optimization
+// META: global=window
+// META: variant=?cpu
+// META: variant=?gpu
+// META: variant=?npu
+// META: script=../resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+const tests = [{
+ 'name': 'reshape + reshape + reshape + instanceNormalization float32',
+ 'graph': {
+ 'inputs': {
+ 'originalInput': {
+ 'data': [
+ -97.949951171875, 29.44037628173828, -73.92131042480469,
+ -38.11185836791992, 41.33772659301758, -59.77853012084961,
+ -74.66901397705078, -68.16508483886719, 35.82481384277344,
+ -6.948329448699951, 54.42462158203125, 47.53074645996094,
+ 66.93562316894531, 76.74034881591797, 5.6758809089660645,
+ 25.68659210205078, 37.37651062011719, 56.252689361572266,
+ -16.574905395507812, 42.949893951416016, 73.8739242553711,
+ -99.00035095214844, -33.11322784423828, -17.380685806274414
+ ],
+ 'descriptor': {shape: [3, 8], dataType: 'float32'},
+ 'constant': true
+ },
+ 'originalScale': {
+ 'data': [-94.42772674560547, 66.69620513916016, -98.56572723388672],
+ 'descriptor': {shape: [1, 3, 1, 1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'originalBias': {
+ 'data': [-33.048641204833984, 4.511423587799072, -37.93617248535156],
+ 'descriptor': {shape: [1, 3, 1, 1], dataType: 'float32'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'reshape',
+ 'arguments': [{'input': 'originalInput'}, {'newShape': [2, 3, 2, 2]}],
+ 'outputs': 'reshapedInput'
+ },
+ {
+ 'name': 'reshape',
+ 'arguments': [{'input': 'originalScale'}, {'newShape': [3]}],
+ 'outputs': 'reshapedScale'
+ },
+ {
+ 'name': 'reshape',
+ 'arguments': [{'input': 'originalBias'}, {'newShape': [3]}],
+ 'outputs': 'reshapedBias'
+ },
+ {
+ 'name': 'instanceNormalization',
+ 'arguments': [
+ {'input': 'reshapedInput'}, {
+ 'options': {
+ 'scale': 'reshapedScale',
+ 'bias': 'reshapedBias',
+ 'epsilon': 0.000001,
+ 'layout': 'nchw'
+ }
+ }
+ ],
+ 'outputs': 'instanceNormOutput'
+ }
+ ],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ 70.77738189697266, -179.65554809570312, 23.540178298950195,
+ -46.8565788269043, 119.31526184082031, -22.847837448120117,
+ -43.782920837402344, -34.6388053894043, -50.821895599365234,
+ 126.01134490966797, -127.71744537353516, -99.2166976928711,
+ -108.09159851074219, -139.83889770507812, 90.26488494873047,
+ 25.471038818359375, 22.237276077270508, 67.60342407226562,
+ -107.4271011352539, 35.6320915222168, -186.15142822265625,
+ 90.01669311523438, -15.238543510437012, -40.37141418457031
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float32'}
+ }
+ }
+ }
+}];
+
+if (navigator.ml) {
+ tests.forEach((test) => {
+ webnn_conformance_test(
+ buildAndExecuteGraph, getInstanceNormPrecisionTolerance, test);
+ });
+} else {
+ test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
+}
diff --git a/tests/wpt/tests/webnn/conformance_tests/dequantizeLinear.https.any.js b/tests/wpt/tests/webnn/conformance_tests/dequantizeLinear.https.any.js
index 8642a964752..310dd03fcb5 100644
--- a/tests/wpt/tests/webnn/conformance_tests/dequantizeLinear.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/dequantizeLinear.https.any.js
@@ -619,6 +619,43 @@ const dequantizeLinearTests = [
}
}
},
+ {
+ 'name': 'dequantizeLinear int32 1D tensor with float32 scalar scale',
+ 'graph': {
+ 'inputs': {
+ 'dequantizeLinearInput': {
+ 'data': [12345, 23946213],
+ 'descriptor': {shape: [2], dataType: 'int32'},
+ 'constant': false
+ },
+ 'dequantizeLinearScale': {
+ 'data': [1.1202747821807861, 0.2800687253475189],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ },
+ 'dequantizeLinearZeroPoint': {
+ 'data': [32345, -2445234],
+ 'descriptor': {shape: [2], dataType: 'int32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'dequantizeLinearInput'},
+ {'scale': 'dequantizeLinearScale'},
+ {'zeroPoint': 'dequantizeLinearZeroPoint'}
+ ],
+ 'outputs': 'dequantizeLinearOutput'
+ }],
+ 'expectedOutputs': {
+ 'dequantizeLinearOutput': {
+ 'data': [-22405.495643615723, 7391418.921366602],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/elu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/elu.https.any.js
index 6b789e6308c..09cb0a99115 100644
--- a/tests/wpt/tests/webnn/conformance_tests/elu.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/elu.https.any.js
@@ -386,6 +386,345 @@ const eluTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'elu float16 positive 0D scalar default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [4.72265625],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [4.72265625],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 negative 0D scalar default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [-3.8671875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [-0.97900390625],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 1D constant tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -0.97900390625,
+ 1.359375, -0.97900390625, 7.83984375, -0.99853515625,
+ 0.54541015625, 5.77734375, 7.26171875, -0.99951171875,
+ 5.6640625, -0.9990234375, -0.96435546875, -0.70166015625,
+ 7.25390625, 8.90625, -0.98193359375, 7.11328125,
+ -0.1060791015625, -0.97509765625, 6.13671875, -1
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 1D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -0.97900390625,
+ 1.359375, -0.97900390625, 7.83984375, -0.99853515625,
+ 0.54541015625, 5.77734375, 7.26171875, -0.99951171875,
+ 5.6640625, -0.9990234375, -0.96435546875, -0.70166015625,
+ 7.25390625, 8.90625, -0.98193359375, 7.11328125,
+ -0.1060791015625, -0.97509765625, 6.13671875, -1
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 2D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -0.97900390625,
+ 1.359375, -0.97900390625, 7.83984375, -0.99853515625,
+ 0.54541015625, 5.77734375, 7.26171875, -0.99951171875,
+ 5.6640625, -0.9990234375, -0.96435546875, -0.70166015625,
+ 7.25390625, 8.90625, -0.98193359375, 7.11328125,
+ -0.1060791015625, -0.97509765625, 6.13671875, -1
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 3D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -0.97900390625,
+ 1.359375, -0.97900390625, 7.83984375, -0.99853515625,
+ 0.54541015625, 5.77734375, 7.26171875, -0.99951171875,
+ 5.6640625, -0.9990234375, -0.96435546875, -0.70166015625,
+ 7.25390625, 8.90625, -0.98193359375, 7.11328125,
+ -0.1060791015625, -0.97509765625, 6.13671875, -1
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -0.97900390625,
+ 1.359375, -0.97900390625, 7.83984375, -0.99853515625,
+ 0.54541015625, 5.77734375, 7.26171875, -0.99951171875,
+ 5.6640625, -0.9990234375, -0.96435546875, -0.70166015625,
+ 7.25390625, 8.90625, -0.98193359375, 7.11328125,
+ -0.1060791015625, -0.97509765625, 6.13671875, -1
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 5D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments': [{'input': 'eluInput'}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -0.97900390625,
+ 1.359375, -0.97900390625, 7.83984375, -0.99853515625,
+ 0.54541015625, 5.77734375, 7.26171875, -0.99951171875,
+ 5.6640625, -0.9990234375, -0.96435546875, -0.70166015625,
+ 7.25390625, 8.90625, -0.98193359375, 7.11328125,
+ -0.1060791015625, -0.97509765625, 6.13671875, -1
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 4D tensor positive options.alpha',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments':
+ [{'input': 'eluInput'}, {'options': {'alpha': 0.3607245505146506}}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125,
+ -0.353271484375, 1.359375, -0.353271484375,
+ 7.83984375, -0.3603515625, 0.54541015625,
+ 5.77734375, 7.26171875, -0.360595703125,
+ 5.6640625, -0.3603515625, -0.347900390625,
+ -0.253173828125, 7.25390625, 8.90625,
+ -0.354248046875, 7.11328125, -0.03826904296875,
+ -0.351806640625, 6.13671875, -0.360595703125
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'elu float16 4D tensor negative options.alpha',
+ 'graph': {
+ 'inputs': {
+ 'eluInput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, -3.8671875,
+ 1.359375, -3.86328125, 7.83984375, -6.69140625,
+ 0.54541015625, 5.77734375, 7.26171875, -7.421875,
+ 5.6640625, -6.71484375, -3.333984375, -1.2099609375,
+ 7.25390625, 8.90625, -4.01953125, 7.11328125,
+ -0.11212158203125, -3.689453125, 6.13671875, -9.8984375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'elu',
+ 'arguments':
+ [{'input': 'eluInput'}, {'options': {'alpha': -3.468180406374035}}],
+ 'outputs': 'eluOutput'
+ }],
+ 'expectedOutputs': {
+ 'eluOutput': {
+ 'data': [
+ 4.72265625, 0.376953125, 1.4189453125, 3.396484375,
+ 1.359375, 3.39453125, 7.83984375, 3.46484375,
+ 0.54541015625, 5.77734375, 7.26171875, 3.466796875,
+ 5.6640625, 3.46484375, 3.34375, 2.43359375,
+ 7.25390625, 8.90625, 3.40625, 7.11328125,
+ 0.367919921875, 3.380859375, 6.13671875, 3.46875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/hard_sigmoid.https.any.js b/tests/wpt/tests/webnn/conformance_tests/hard_sigmoid.https.any.js
index cfa033ba4b0..b5f6fd0c97a 100644
--- a/tests/wpt/tests/webnn/conformance_tests/hard_sigmoid.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/hard_sigmoid.https.any.js
@@ -686,6 +686,660 @@ const hardSigmoidTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'hardSigmoid float16 positive 0D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [0.05908203125],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [0.51171875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSigmoid float16 positive 1D constant tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.51171875, 0.6416015625, 0.6044921875, 0.58447265625,
+ 0.6328125, 0.68994140625, 0.52197265625, 0.50244140625,
+ 0.59521484375, 0.6064453125, 0.63671875, 0.59326171875,
+ 0.56103515625, 0.66064453125, 0.5498046875, 0.6328125,
+ 0.61083984375, 0.61083984375, 0.64599609375, 0.59765625,
+ 0.6552734375, 0.6689453125, 0.61083984375, 0.6123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSigmoid float16 positive 1D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.51171875, 0.6416015625, 0.6044921875, 0.58447265625,
+ 0.6328125, 0.68994140625, 0.52197265625, 0.50244140625,
+ 0.59521484375, 0.6064453125, 0.63671875, 0.59326171875,
+ 0.56103515625, 0.66064453125, 0.5498046875, 0.6328125,
+ 0.61083984375, 0.61083984375, 0.64599609375, 0.59765625,
+ 0.6552734375, 0.6689453125, 0.61083984375, 0.6123046875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSigmoid float16 positive 2D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.51171875, 0.6416015625, 0.6044921875, 0.58447265625,
+ 0.6328125, 0.68994140625, 0.52197265625, 0.50244140625,
+ 0.59521484375, 0.6064453125, 0.63671875, 0.59326171875,
+ 0.56103515625, 0.66064453125, 0.5498046875, 0.6328125,
+ 0.61083984375, 0.61083984375, 0.64599609375, 0.59765625,
+ 0.6552734375, 0.6689453125, 0.61083984375, 0.6123046875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSigmoid float16 positive 3D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.51171875, 0.6416015625, 0.6044921875, 0.58447265625,
+ 0.6328125, 0.68994140625, 0.52197265625, 0.50244140625,
+ 0.59521484375, 0.6064453125, 0.63671875, 0.59326171875,
+ 0.56103515625, 0.66064453125, 0.5498046875, 0.6328125,
+ 0.61083984375, 0.61083984375, 0.64599609375, 0.59765625,
+ 0.6552734375, 0.6689453125, 0.61083984375, 0.6123046875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSigmoid float16 positive 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.51171875, 0.6416015625, 0.6044921875, 0.58447265625,
+ 0.6328125, 0.68994140625, 0.52197265625, 0.50244140625,
+ 0.59521484375, 0.6064453125, 0.63671875, 0.59326171875,
+ 0.56103515625, 0.66064453125, 0.5498046875, 0.6328125,
+ 0.61083984375, 0.61083984375, 0.64599609375, 0.59765625,
+ 0.6552734375, 0.6689453125, 0.61083984375, 0.6123046875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSigmoid float16 positive 5D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [{'input': 'hardSigmoidInput'}],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.51171875, 0.6416015625, 0.6044921875, 0.58447265625,
+ 0.6328125, 0.68994140625, 0.52197265625, 0.50244140625,
+ 0.59521484375, 0.6064453125, 0.63671875, 0.59326171875,
+ 0.56103515625, 0.66064453125, 0.5498046875, 0.6328125,
+ 0.61083984375, 0.61083984375, 0.64599609375, 0.59765625,
+ 0.6552734375, 0.6689453125, 0.61083984375, 0.6123046875
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 positive 4D tensor specified positive options.alpha default options.beta',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'},
+ {'options': {'alpha': 0.7854232544278235}}
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.54638671875,
+ 1,
+ 0.91064453125,
+ 0.83251953125,
+ 1,
+ 1,
+ 0.5859375,
+ 0.51025390625,
+ 0.87353515625,
+ 0.91796875,
+ 1,
+ 0.8662109375,
+ 0.7392578125,
+ 1,
+ 0.6953125,
+ 1,
+ 0.935546875,
+ 0.93505859375,
+ 1,
+ 0.88330078125,
+ 1,
+ 1,
+ 0.93603515625,
+ 0.9404296875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 negative 4D tensor specified negative options.alpha default options.beta',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ -0.05908203125, -0.70751953125, -0.52294921875,
+ -0.423095703125, -0.66455078125, -0.9501953125,
+ -0.10919189453125, -0.01297760009765625, -0.4755859375,
+ -0.5322265625, -0.68408203125, -0.46630859375,
+ -0.304931640625, -0.802734375, -0.2486572265625,
+ -0.66357421875, -0.5546875, -0.55419921875,
+ -0.73095703125, -0.488037109375, -0.77685546875,
+ -0.845703125, -0.55517578125, -0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'},
+ {'options': {'alpha': -0.7854232544278235}}
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.54638671875,
+ 1,
+ 0.91064453125,
+ 0.83251953125,
+ 1,
+ 1,
+ 0.5859375,
+ 0.51025390625,
+ 0.87353515625,
+ 0.91796875,
+ 1,
+ 0.8662109375,
+ 0.7392578125,
+ 1,
+ 0.6953125,
+ 1,
+ 0.935546875,
+ 0.93505859375,
+ 1,
+ 0.88330078125,
+ 1,
+ 1,
+ 0.93603515625,
+ 0.9404296875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 positive 4D tensor specified positive options.beta default options.alpha',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'},
+ {'options': {'beta': 0.4361860418530341}}
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.447998046875, 0.57763671875, 0.541015625, 0.52099609375,
+ 0.5693359375, 0.62646484375, 0.4580078125, 0.438720703125,
+ 0.53125, 0.54248046875, 0.5732421875, 0.529296875,
+ 0.4970703125, 0.5966796875, 0.48583984375, 0.56884765625,
+ 0.54736328125, 0.546875, 0.58251953125, 0.53369140625,
+ 0.591796875, 0.60546875, 0.54736328125, 0.54833984375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 negative 4D tensor specified negative options.beta default options.alpha',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ -0.05908203125, -0.70751953125, -0.52294921875,
+ -0.423095703125, -0.66455078125, -0.9501953125,
+ -0.10919189453125, -0.01297760009765625, -0.4755859375,
+ -0.5322265625, -0.68408203125, -0.46630859375,
+ -0.304931640625, -0.802734375, -0.2486572265625,
+ -0.66357421875, -0.5546875, -0.55419921875,
+ -0.73095703125, -0.488037109375, -0.77685546875,
+ -0.845703125, -0.55517578125, -0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'},
+ {'options': {'beta': -0.436186041853034}}
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 positive 4D tensor specified all options (positive options.alpha and positive options.beta)',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'},
+ {'options': {'alpha': 0.7854232544278235, 'beta': 0.4361860418530341}}
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.482666015625,
+ 0.99169921875,
+ 0.8466796875,
+ 0.7685546875,
+ 0.9580078125,
+ 1,
+ 0.52197265625,
+ 0.4462890625,
+ 0.8095703125,
+ 0.85400390625,
+ 0.9736328125,
+ 0.80224609375,
+ 0.67578125,
+ 1,
+ 0.63134765625,
+ 0.95751953125,
+ 0.8720703125,
+ 0.87158203125,
+ 1,
+ 0.8193359375,
+ 1,
+ 1,
+ 0.8720703125,
+ 0.87646484375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 positive 4D tensor specified all options (negative options.alpha and negative options.beta)',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ 0.05908203125, 0.70751953125, 0.52294921875,
+ 0.423095703125, 0.66455078125, 0.9501953125,
+ 0.10919189453125, 0.01297760009765625, 0.4755859375,
+ 0.5322265625, 0.68408203125, 0.46630859375,
+ 0.304931640625, 0.802734375, 0.2486572265625,
+ 0.66357421875, 0.5546875, 0.55419921875,
+ 0.73095703125, 0.488037109375, 0.77685546875,
+ 0.845703125, 0.55517578125, 0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'}, {
+ 'options':
+ {'alpha': -0.7854232544278235, 'beta': -0.4361860418530341}
+ }
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 negative 4D tensor all options (positive options.alpha and negative options.beta)',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ -0.05908203125, -0.70751953125, -0.52294921875,
+ -0.423095703125, -0.66455078125, -0.9501953125,
+ -0.10919189453125, -0.01297760009765625, -0.4755859375,
+ -0.5322265625, -0.68408203125, -0.46630859375,
+ -0.304931640625, -0.802734375, -0.2486572265625,
+ -0.66357421875, -0.5546875, -0.55419921875,
+ -0.73095703125, -0.488037109375, -0.77685546875,
+ -0.845703125, -0.55517578125, -0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'}, {
+ 'options':
+ {'alpha': 0.7854232544278235, 'beta': -0.4361860418530341}
+ }
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'hardSigmoid float16 negative 4D tensor specified all options (negative options.alpha and positive options.beta)',
+ 'graph': {
+ 'inputs': {
+ 'hardSigmoidInput': {
+ 'data': [
+ -0.05908203125, -0.70751953125, -0.52294921875,
+ -0.423095703125, -0.66455078125, -0.9501953125,
+ -0.10919189453125, -0.01297760009765625, -0.4755859375,
+ -0.5322265625, -0.68408203125, -0.46630859375,
+ -0.304931640625, -0.802734375, -0.2486572265625,
+ -0.66357421875, -0.5546875, -0.55419921875,
+ -0.73095703125, -0.488037109375, -0.77685546875,
+ -0.845703125, -0.55517578125, -0.560546875
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSigmoid',
+ 'arguments': [
+ {'input': 'hardSigmoidInput'}, {
+ 'options':
+ {'alpha': -0.7854232544278235, 'beta': 0.4361860418530341}
+ }
+ ],
+ 'outputs': 'hardSigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSigmoidOutput': {
+ 'data': [
+ 0.482666015625,
+ 0.99169921875,
+ 0.8466796875,
+ 0.7685546875,
+ 0.9580078125,
+ 1,
+ 0.52197265625,
+ 0.4462890625,
+ 0.8095703125,
+ 0.85400390625,
+ 0.9736328125,
+ 0.80224609375,
+ 0.67578125,
+ 1,
+ 0.63134765625,
+ 0.95751953125,
+ 0.8720703125,
+ 0.87158203125,
+ 1,
+ 0.8193359375,
+ 1,
+ 1,
+ 0.8720703125,
+ 0.87646484375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/hard_swish.https.any.js b/tests/wpt/tests/webnn/conformance_tests/hard_swish.https.any.js
index 6bd054b326e..e49ea6fd719 100644
--- a/tests/wpt/tests/webnn/conformance_tests/hard_swish.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/hard_swish.https.any.js
@@ -373,6 +373,275 @@ const hardSwishTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'hardSwish float16 0D tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput':
+ {'data': [0.734375], 'descriptor': {shape: [], dataType: 'float16'}}
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [0.45703125],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSwish float16 1D constant tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput': {
+ 'data': [
+ 0.734375, 9.1171875, 3.544921875, 2.62109375, -6.4453125,
+ -1.68359375, 5.5234375, -5.95703125, -9.171875, 6.421875,
+ -3.29296875, 1.041015625, -7.24609375, -0.947265625, -5.77734375,
+ 3.185546875, -7.26171875, 4.17578125, 3.779296875, -6.0703125,
+ -9.90625, -7.74609375, -8.2890625, 8.0859375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [
+ 0.45703125, 9.1171875,
+ 3.544921875, 2.455078125,
+ 0, -0.369384765625,
+ 5.5234375, 0,
+ 0, 6.421875,
+ 0, 0.701171875,
+ 0, -0.323974609375,
+ 0, 3.185546875,
+ 0, 4.17578125,
+ 3.779296875, 0,
+ 0, 0,
+ 0, 8.0859375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSwish float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput': {
+ 'data': [
+ 0.734375, 9.1171875, 3.544921875, 2.62109375, -6.4453125,
+ -1.68359375, 5.5234375, -5.95703125, -9.171875, 6.421875,
+ -3.29296875, 1.041015625, -7.24609375, -0.947265625, -5.77734375,
+ 3.185546875, -7.26171875, 4.17578125, 3.779296875, -6.0703125,
+ -9.90625, -7.74609375, -8.2890625, 8.0859375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [
+ 0.45703125, 9.1171875,
+ 3.544921875, 2.455078125,
+ 0, -0.369384765625,
+ 5.5234375, 0,
+ 0, 6.421875,
+ 0, 0.701171875,
+ 0, -0.323974609375,
+ 0, 3.185546875,
+ 0, 4.17578125,
+ 3.779296875, 0,
+ 0, 0,
+ 0, 8.0859375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSwish float16 2D tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput': {
+ 'data': [
+ 0.734375, 9.1171875, 3.544921875, 2.62109375, -6.4453125,
+ -1.68359375, 5.5234375, -5.95703125, -9.171875, 6.421875,
+ -3.29296875, 1.041015625, -7.24609375, -0.947265625, -5.77734375,
+ 3.185546875, -7.26171875, 4.17578125, 3.779296875, -6.0703125,
+ -9.90625, -7.74609375, -8.2890625, 8.0859375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [
+ 0.45703125, 9.1171875,
+ 3.544921875, 2.455078125,
+ 0, -0.369384765625,
+ 5.5234375, 0,
+ 0, 6.421875,
+ 0, 0.701171875,
+ 0, -0.323974609375,
+ 0, 3.185546875,
+ 0, 4.17578125,
+ 3.779296875, 0,
+ 0, 0,
+ 0, 8.0859375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSwish float16 3D tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput': {
+ 'data': [
+ 0.734375, 9.1171875, 3.544921875, 2.62109375, -6.4453125,
+ -1.68359375, 5.5234375, -5.95703125, -9.171875, 6.421875,
+ -3.29296875, 1.041015625, -7.24609375, -0.947265625, -5.77734375,
+ 3.185546875, -7.26171875, 4.17578125, 3.779296875, -6.0703125,
+ -9.90625, -7.74609375, -8.2890625, 8.0859375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [
+ 0.45703125, 9.1171875,
+ 3.544921875, 2.455078125,
+ 0, -0.369384765625,
+ 5.5234375, 0,
+ 0, 6.421875,
+ 0, 0.701171875,
+ 0, -0.323974609375,
+ 0, 3.185546875,
+ 0, 4.17578125,
+ 3.779296875, 0,
+ 0, 0,
+ 0, 8.0859375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSwish float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput': {
+ 'data': [
+ 0.734375, 9.1171875, 3.544921875, 2.62109375, -6.4453125,
+ -1.68359375, 5.5234375, -5.95703125, -9.171875, 6.421875,
+ -3.29296875, 1.041015625, -7.24609375, -0.947265625, -5.77734375,
+ 3.185546875, -7.26171875, 4.17578125, 3.779296875, -6.0703125,
+ -9.90625, -7.74609375, -8.2890625, 8.0859375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [
+ 0.45703125, 9.1171875,
+ 3.544921875, 2.455078125,
+ 0, -0.369384765625,
+ 5.5234375, 0,
+ 0, 6.421875,
+ 0, 0.701171875,
+ 0, -0.323974609375,
+ 0, 3.185546875,
+ 0, 4.17578125,
+ 3.779296875, 0,
+ 0, 0,
+ 0, 8.0859375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'hardSwish float16 5D tensor',
+ 'graph': {
+ 'inputs': {
+ 'hardSwishInput': {
+ 'data': [
+ 0.734375, 9.1171875, 3.544921875, 2.62109375, -6.4453125,
+ -1.68359375, 5.5234375, -5.95703125, -9.171875, 6.421875,
+ -3.29296875, 1.041015625, -7.24609375, -0.947265625, -5.77734375,
+ 3.185546875, -7.26171875, 4.17578125, 3.779296875, -6.0703125,
+ -9.90625, -7.74609375, -8.2890625, 8.0859375
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'hardSwish',
+ 'arguments': [{'input': 'hardSwishInput'}],
+ 'outputs': 'hardSwishOutput'
+ }],
+ 'expectedOutputs': {
+ 'hardSwishOutput': {
+ 'data': [
+ 0.45703125, 9.1171875,
+ 3.544921875, 2.455078125,
+ 0, -0.369384765625,
+ 5.5234375, 0,
+ 0, 6.421875,
+ 0, 0.701171875,
+ 0, -0.323974609375,
+ 0, 3.185546875,
+ 0, 4.17578125,
+ 3.779296875, 0,
+ 0, 0,
+ 0, 8.0859375
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js
index 26e0cd0aa93..2766f914b3d 100644
--- a/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js
@@ -21,16 +21,6 @@
// MLOperand instanceNormalization(
// MLOperand input, optional MLInstanceNormalizationOptions options = {});
-
-const getInstanceNormPrecisionTolerance = (graphResources) => {
- // according to
- // https://github.com/web-platform-tests/wpt/pull/43891#discussion_r1457026316
- const toleranceValueDict = {float32: 840, float16: 8400};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
-};
-
const instanceNormTests = [
{
'name': 'instanceNormalization float32 4D tensor default options',
@@ -212,7 +202,7 @@ const instanceNormTests = [
},
{
'name':
- 'instanceNormalization float32 4D tensor explict options.layout=\'nchw\'',
+ 'instanceNormalization float32 4D tensor explicit options.layout=\'nchw\'',
'graph': {
'inputs': {
'instanceNormInput': {
@@ -351,6 +341,290 @@ const instanceNormTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'instanceNormalization float16 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 29.4375, -73.9375, -38.125, 41.34375, -59.78125,
+ -74.6875, -68.1875, 35.8125, -6.94921875, 54.4375, 47.53125,
+ 66.9375, 76.75, 5.67578125, 25.6875, 37.375, 56.25,
+ -16.578125, 42.9375, 73.875, -99, -33.125, -17.375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments': [{'input': 'instanceNormInput'}],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ -1.099609375, 1.552734375, -0.599609375,
+ 0.1461181640625, 1.7216796875, -0.409912109375,
+ -0.72412109375, -0.5869140625, 0.1302490234375,
+ -1.6630859375, 0.9111328125, 0.62158203125,
+ 0.79443359375, 1.130859375, -1.3056640625,
+ -0.61962890625, 0.265869140625, 0.9462890625,
+ -1.6787109375, 0.46630859375, 1.50390625,
+ -1.2978515625, -0.23046875, 0.024810791015625
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'instanceNormalization float16 4D tensor options.scale',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 29.4375, -73.9375, -38.125, 41.34375, -59.78125,
+ -74.6875, -68.1875, 35.8125, -6.94921875, 54.4375, 47.53125,
+ 66.9375, 76.75, 5.67578125, 25.6875, 37.375, 56.25,
+ -16.578125, 42.9375, 73.875, -99, -33.125, -17.375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'instanceNormScale': {
+ 'data': [-94.4375, 66.6875, -98.5625],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments': [
+ {'input': 'instanceNormInput'},
+ {'options': {'scale': 'instanceNormScale'}}
+ ],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ 103.8125, -146.625, 56.625, -13.796875, 114.8125,
+ -27.34375, -48.28125, -39.15625, -12.8359375, 163.875,
+ -89.8125, -61.28125, -75.0625, -106.8125, 123.3125,
+ 58.53125, 17.734375, 63.09375, -111.9375, 31.09375,
+ -148.25, 127.9375, 22.71875, -2.4453125
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'instanceNormalization float16 4D tensor options.bias',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 29.4375, -73.9375, -38.125, 41.34375, -59.78125,
+ -74.6875, -68.1875, 35.8125, -6.94921875, 54.4375, 47.53125,
+ 66.9375, 76.75, 5.67578125, 25.6875, 37.375, 56.25,
+ -16.578125, 42.9375, 73.875, -99, -33.125, -17.375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ },
+ 'instanceNormBias': {
+ 'data': [-33.0625, 4.51171875, -37.9375],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments': [
+ {'input': 'instanceNormInput'},
+ {'options': {'bias': 'instanceNormBias'}}
+ ],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ -34.15625, -31.515625, -33.65625, -32.90625, 6.234375,
+ 4.1015625, 3.787109375, 3.923828125, -37.8125, -39.59375,
+ -37.03125, -37.3125, -32.28125, -31.9375, -34.375,
+ -33.6875, 4.77734375, 5.45703125, 2.833984375, 4.9765625,
+ -36.4375, -39.25, -38.15625, -37.90625
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'instanceNormalization float16 4D tensor options.epsilon',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 29.4375, -73.9375, -38.125, 41.34375, -59.78125,
+ -74.6875, -68.1875, 35.8125, -6.94921875, 54.4375, 47.53125,
+ 66.9375, 76.75, 5.67578125, 25.6875, 37.375, 56.25,
+ -16.578125, 42.9375, 73.875, -99, -33.125, -17.375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments': [
+ {'input': 'instanceNormInput'}, {'options': {'epsilon': 0.000001}}
+ ],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ -1.099609375, 1.552734375, -0.599609375,
+ 0.1461181640625, 1.7216796875, -0.409912109375,
+ -0.72412109375, -0.5869140625, 0.1302490234375,
+ -1.6630859375, 0.9111328125, 0.62158203125,
+ 0.79443359375, 1.130859375, -1.3056640625,
+ -0.61962890625, 0.265869140625, 0.9462890625,
+ -1.6787109375, 0.46630859375, 1.50390625,
+ -1.2978515625, -0.23046875, 0.024810791015625
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'instanceNormalization float16 4D tensor explicit options.layout=\'nchw\'',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 29.4375, -73.9375, -38.125, 41.34375, -59.78125,
+ -74.6875, -68.1875, 35.8125, -6.94921875, 54.4375, 47.53125,
+ 66.9375, 76.75, 5.67578125, 25.6875, 37.375, 56.25,
+ -16.578125, 42.9375, 73.875, -99, -33.125, -17.375
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments':
+ [{'input': 'instanceNormInput'}, {'options': {'layout': 'nchw'}}],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ -1.099609375, 1.552734375, -0.599609375,
+ 0.1461181640625, 1.7216796875, -0.409912109375,
+ -0.72412109375, -0.5869140625, 0.1302490234375,
+ -1.6630859375, 0.9111328125, 0.62158203125,
+ 0.79443359375, 1.130859375, -1.3056640625,
+ -0.61962890625, 0.265869140625, 0.9462890625,
+ -1.6787109375, 0.46630859375, 1.50390625,
+ -1.2978515625, -0.23046875, 0.024810791015625
+ ],
+ 'descriptor': {shape: [2, 3, 2, 2], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'instanceNormalization float16 4D tensor options.layout=\'nhwc\'',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 41.34375, 35.8125, 29.4375, -59.78125, -6.94921875,
+ -73.9375, -74.6875, 54.4375, -38.125, -68.1875, 47.53125,
+ 66.9375, 37.375, 73.875, 76.75, 56.25, -99,
+ 5.67578125, -16.578125, -33.125, 25.6875, 42.9375, -17.375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments':
+ [{'input': 'instanceNormInput'}, {'options': {'layout': 'nhwc'}}],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ -1.099609375, 1.7216796875, 0.1302490234375,
+ 1.552734375, -0.409912109375, -1.6630859375,
+ -0.599609375, -0.72412109375, 0.9111328125,
+ 0.1461181640625, -0.5869140625, 0.62158203125,
+ 0.79443359375, 0.265869140625, 1.50390625,
+ 1.130859375, 0.9462890625, -1.2978515625,
+ -1.3056640625, -1.6787109375, -0.23046875,
+ -0.61962890625, 0.46630859375, 0.024810791015625
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'instanceNormalization float16 4D tensor all options',
+ 'graph': {
+ 'inputs': {
+ 'instanceNormInput': {
+ 'data': [
+ -97.9375, 41.34375, 35.8125, 29.4375, -59.78125, -6.94921875,
+ -73.9375, -74.6875, 54.4375, -38.125, -68.1875, 47.53125,
+ 66.9375, 37.375, 73.875, 76.75, 56.25, -99,
+ 5.67578125, -16.578125, -33.125, 25.6875, 42.9375, -17.375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ },
+ 'instanceNormScale': {
+ 'data': [-94.4375, 66.6875, -98.5625],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'instanceNormBias': {
+ 'data': [-33.0625, 4.51171875, -37.9375],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'instanceNormalization',
+ 'arguments': [
+ {'input': 'instanceNormInput'}, {
+ 'options': {
+ 'scale': 'instanceNormScale',
+ 'bias': 'instanceNormBias',
+ 'epsilon': 0.000001,
+ 'layout': 'nhwc'
+ }
+ }
+ ],
+ 'outputs': 'instanceNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'instanceNormOutput': {
+ 'data': [
+ 70.75, 119.3125, -50.78125, -179.75, -22.828125, 126,
+ 23.5625, -43.78125, -127.75, -46.84375, -34.65625, -99.1875,
+ -108.125, 22.25, -186.125, -139.875, 67.625, 90,
+ 90.25, -107.4375, -15.2265625, 25.46875, 35.625, -40.375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/layer_normalization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/layer_normalization.https.any.js
index 2d5e98ea09d..f22d0444cfa 100644
--- a/tests/wpt/tests/webnn/conformance_tests/layer_normalization.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/layer_normalization.https.any.js
@@ -22,11 +22,8 @@
// MLOperand input, optional MLLayerNormalizationOptions options = {});
-const getLayerNormPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 1 / 1024, float16: 1 / 512};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ATOL', value: toleranceValueDict[expectedDataType]};
+const getLayerNormPrecisionTolerance = () => {
+ return {metricType: 'ULP', value: 14};
};
const layerNormTests = [
@@ -56,14 +53,14 @@ const layerNormTests = [
'inputs': {
'layerNormInput': {
'data': [
- -35.51446533203125, 54.735408782958984, 19.659019470214844,
- -15.882678031921387, 65.48657989501953, 25.818492889404297,
- 97.55302429199219, -8.057161331176758, 62.9412956237793,
- -48.91555404663086, 91.90644073486328, 46.67098617553711,
- -74.85331726074219, 30.126361846923828, 26.13089370727539,
- 59.30270767211914, -60.361995697021484, 18.55615234375,
- -88.03730773925781, -26.5667724609375, 70.81292724609375,
- 9.105611801147461, 56.66746139526367, 21.78444480895996
+ -5.712825298309326, 1.4681644439697266, 6.143280029296875,
+ 9.427258491516113, 2.0522539615631104, -8.829475402832031,
+ 9.143593788146973, -7.643154144287109, -2.0325264930725098,
+ 6.063992500305176, 4.094968318939209, 0.8910917043685913,
+ 8.712732315063477, -0.0006124831270426512, 5.505736827850342,
+ -9.155109405517578, -9.89109992980957, 1.0480059385299683,
+ -5.925083637237549, 7.741676330566406, 0.700584352016449,
+ -5.662013530731201, 1.3204102516174316, 2.7849292755126953
],
'descriptor': {shape: [4, 6], dataType: 'float32'}
}
@@ -76,14 +73,14 @@ const layerNormTests = [
'expectedOutputs': {
'layerNormOutput': {
'data': [
- -1.5257738828659058, 0.997844934463501, 0.017018765211105347,
- -0.9768186211585999, 1.2984753847122192, 0.18925349414348602,
- 1.0812907218933105, -0.915019690990448, 0.4270379841327667,
- -1.6873507499694824, 0.9745554327964783, 0.11948632448911667,
- -1.5086692571640015, 0.6123882532119751, 0.5316619873046875,
- 1.2018805742263794, -1.215880036354065, 0.378618448972702,
- -1.795186161994934, -0.6376377940177917, 1.1961140632629395,
- 0.034106940031051636, 0.9297415614128113, 0.2728613615036011
+ -1.0228718519210815, 0.11223962903022766, 0.8512431979179382,
+ 1.3703473806381226, 0.20456767082214355, -1.5155260562896729,
+ 1.3417094945907593, -1.705802321434021, -0.6872337460517883,
+ 0.7826303243637085, 0.42516833543777466, -0.1564721316099167,
+ 1.3518258333206177, 0.09107562154531479, 0.8877996206283569,
+ -1.2335057258605957, -1.3399975299835205, 0.2428021878004074,
+ -1.273769736289978, 1.58700692653656, 0.1131395623087883,
+ -1.2187029123306274, 0.2428838163614273, 0.5494423508644104
],
'descriptor': {shape: [4, 6], dataType: 'float32'}
}
@@ -647,6 +644,459 @@ const layerNormTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'layerNormalization float16 2D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -5.7109375, 1.4677734375,
+ 6.14453125, 9.4296875,
+ 2.052734375, -8.828125,
+ 9.140625, -7.64453125,
+ -2.033203125, 6.0625,
+ 4.09375, 0.89111328125,
+ 8.7109375, -0.0006122589111328125,
+ 5.50390625, -9.15625,
+ -9.890625, 1.0478515625,
+ -5.92578125, 7.7421875,
+ 0.70068359375, -5.66015625,
+ 1.3203125, 2.78515625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [{'input': 'layerNormInput'}],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -1.0224609375, 0.11199951171875, 0.85107421875, 1.3701171875,
+ 0.2044677734375, -1.515625, 1.341796875, -1.7060546875,
+ -0.68701171875, 0.78271484375, 0.42529296875, -0.15625,
+ 1.3515625, 0.0911865234375, 0.8876953125, -1.2333984375,
+ -1.33984375, 0.242919921875, -1.2744140625, 1.5869140625,
+ 0.11309814453125, -1.21875, 0.2427978515625, 0.54931640625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 3D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [{'input': 'layerNormInput'}],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -1.4052734375, 0.5400390625, -0.216552734375, -0.982421875,
+ 0.771484375, -0.08392333984375, 1.462890625, -0.81396484375,
+ 0.71630859375, -1.6943359375, 1.341796875, 0.365234375,
+ -1.5234375, 0.51611328125, 0.4384765625, 1.0830078125,
+ -1.2421875, 0.291748046875, -1.7802734375, -0.5849609375,
+ 1.306640625, 0.10797119140625, 1.03125, 0.354248046875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [{'input': 'layerNormInput'}],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -1.4052734375, 0.5400390625, -0.216552734375, -0.982421875,
+ 0.771484375, -0.08392333984375, 1.462890625, -0.81396484375,
+ 0.71630859375, -1.6943359375, 1.341796875, 0.365234375,
+ -1.5234375, 0.51611328125, 0.4384765625, 1.0830078125,
+ -1.2421875, 0.291748046875, -1.7802734375, -0.5849609375,
+ 1.306640625, 0.10797119140625, 1.03125, 0.354248046875
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 5D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 2, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [{'input': 'layerNormInput'}],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -1.4052734375, 0.5400390625, -0.216552734375, -0.982421875,
+ 0.771484375, -0.08392333984375, 1.462890625, -0.81396484375,
+ 0.71630859375, -1.6943359375, 1.341796875, 0.365234375,
+ -1.5234375, 0.51611328125, 0.4384765625, 1.0830078125,
+ -1.2421875, 0.291748046875, -1.7802734375, -0.5849609375,
+ 1.306640625, 0.10797119140625, 1.03125, 0.354248046875
+ ],
+ 'descriptor': {shape: [2, 1, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 4D tensor options.scale',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ },
+ 'layerNormScale': {
+ 'data': [
+ -3.822265625, -5.453125, 0.677734375, -4.02734375, -3.77734375,
+ -9.328125, 7.18359375, 1.505859375, 3.12109375, 0.521484375,
+ 2.671875, -3.572265625
+ ],
+ 'descriptor': {shape: [1, 4, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [
+ {'input': 'layerNormInput'}, {'options': {'scale': 'layerNormScale'}}
+ ],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ 5.37109375, -2.943359375, -0.1468505859375, 3.95703125,
+ -2.9140625, 0.78271484375, 10.5078125, -1.2255859375,
+ 2.236328125, -0.8837890625, 3.583984375, -1.3046875,
+ 5.82421875, -2.814453125, 0.297119140625, -4.36328125,
+ 4.69140625, -2.720703125, -12.7890625, -0.880859375,
+ 4.078125, 0.056304931640625, 2.755859375, -1.265625
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 4D tensor options.bias',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ },
+ 'layerNormBias': {
+ 'data': [
+ 7.86328125, -3.66015625, -6.95703125, -6.3984375, 3.26953125, -2.75,
+ -4.08203125, -7.13671875, 8.46875, 2.76171875, 0.8232421875,
+ -3.828125
+ ],
+ 'descriptor': {shape: [1, 4, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [
+ {'input': 'layerNormInput'}, {'options': {'bias': 'layerNormBias'}}
+ ],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ 6.45703125, -3.12109375, -7.171875, -7.3828125, 4.04296875,
+ -2.833984375, -2.619140625, -7.94921875, 9.1875, 1.0673828125,
+ 2.1640625, -3.462890625, 6.33984375, -3.14453125, -6.51953125,
+ -5.31640625, 2.02734375, -2.458984375, -5.86328125, -7.72265625,
+ 9.7734375, 2.869140625, 1.8544921875, -3.474609375
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 4D tensor options.axes=[2]',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [{'input': 'layerNormInput'}, {'options': {'axes': [2]}}],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -0.60107421875, 0.10125732421875, -1.11328125, -0.262451171875,
+ 0.394287109375, -0.75439453125, 1.6962890625, -1.6103515625,
+ 1.4072265625, -0.83251953125, 1.1142578125, 0.45947265625,
+ -0.8447265625, 0.65576171875, -0.3857421875, 1.3671875,
+ -1.3115234375, -0.74169921875, -1.0615234375, -0.57666015625,
+ 1.7177734375, 0.53955078125, 1.232421875, -0.59033203125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 4D tensor options.epsilon',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments':
+ [{'input': 'layerNormInput'}, {'options': {'epsilon': 0.0001}}],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -1.4052734375, 0.5400390625, -0.216552734375, -0.982421875,
+ 0.771484375, -0.08392333984375, 1.462890625, -0.81396484375,
+ 0.71630859375, -1.6943359375, 1.341796875, 0.365234375,
+ -1.5234375, 0.51611328125, 0.4384765625, 1.0830078125,
+ -1.2421875, 0.291748046875, -1.7802734375, -0.5849609375,
+ 1.306640625, 0.10797119140625, 1.03125, 0.354248046875
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'layerNormalization float16 4D tensor options.scale and options.axes=[0, 2]',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ },
+ 'layerNormScale': {
+ 'data': [
+ 8.7265625, -5.38671875, -6.8125, 4.70703125, -4.70703125,
+ -5.14453125, -1.111328125, 5.25
+ ],
+ 'descriptor': {shape: [2, 4], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [
+ {'input': 'layerNormInput'},
+ {'options': {'scale': 'layerNormScale', 'axes': [0, 2]}}
+ ],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -3.37109375, 5.2265625, -7.58203125, 0.332275390625,
+ -4.4140625, 2.97265625, -12.375, 4.6796875,
+ -9.25, -2.86328125, 6.40625, 2.44921875,
+ 4.88671875, -0.446044921875, 2.5234375, -6.0859375,
+ 9.046875, 4.7578125, 1.396484375, 1.1845703125,
+ -1.958984375, 1.84765625, 3.349609375, -3.986328125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name':
+ 'layerNormalization float16 4D tensor options.bias and options.axes=[3, 1, 2]',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ },
+ 'layerNormBias': {
+ 'data': [
+ -0.1396484375, -6.15625, 4.36328125, 8.859375, 9.7734375,
+ -3.462890625, 9.7421875, -0.39599609375, -8.5, 6.171875,
+ -2.892578125, 1.7216796875
+ ],
+ 'descriptor': {shape: [3, 1, 4], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [
+ {'input': 'layerNormInput'},
+ {'options': {'bias': 'layerNormBias', 'axes': [3, 1, 2]}}
+ ],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -1.544921875, 10.3125, -8.71875, -7.140625, -2.69140625,
+ 6.08984375, 5.82421875, 8.9296875, -2.17578125, 7.1640625,
+ 0.9453125, 2.087890625, -1.6630859375, 10.2890625, -8.0625,
+ -5.07421875, -4.703125, 6.46484375, 2.583984375, 9.15625,
+ -1.5859375, 8.96875, 0.6357421875, 2.076171875
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'layerNormalization float16 4D tensor all options',
+ 'graph': {
+ 'inputs': {
+ 'layerNormInput': {
+ 'data': [
+ -35.5, 54.75, 19.65625, -15.8828125, 65.5, 25.8125,
+ 97.5625, -8.0546875, 62.9375, -48.90625, 91.9375, 46.65625,
+ -74.875, 30.125, 26.125, 59.3125, -60.375, 18.5625,
+ -88.0625, -26.5625, 70.8125, 9.109375, 56.65625, 21.78125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ },
+ 'layerNormScale': {
+ 'data': [
+ 7.71484375, 1.7373046875, 9.140625, 5.7578125, -2.8203125,
+ -0.6865234375
+ ],
+ 'descriptor': {shape: [2, 3, 1], dataType: 'float16'},
+ 'constant': true
+ },
+ 'layerNormBias': {
+ 'data': [
+ -8.7109375, -7.64453125, 4.9375, -2.1875, -4.06640625, -6.8359375
+ ],
+ 'descriptor': {shape: [2, 3, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'layerNormalization',
+ 'arguments': [
+ {'input': 'layerNormInput'}, {
+ 'options': {
+ 'scale': 'layerNormScale',
+ 'bias': 'layerNormBias',
+ 'axes': [0, 3, 1],
+ 'epsilon': 0.0001
+ }
+ }
+ ],
+ 'outputs': 'layerNormOutput'
+ }],
+ 'expectedOutputs': {
+ 'layerNormOutput': {
+ 'data': [
+ -15.484375, -5.62890625, 8.296875, -14.296875, -5.640625,
+ 7.11328125, 0.775390625, -8.3515625, 11.28125, -22.5,
+ -5.17578125, 8.5, -12.359375, -5.76953125, -7.1875,
+ 3.6328125, 0.86865234375, -6.8828125, -11.6484375, -2.1171875,
+ -7.39453125, -4.8671875, -5.80859375, -6.71484375
+ ],
+ 'descriptor': {shape: [2, 1, 4, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/leaky_relu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/leaky_relu.https.any.js
index fe950c0ed4d..03c8985c6c6 100644
--- a/tests/wpt/tests/webnn/conformance_tests/leaky_relu.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/leaky_relu.https.any.js
@@ -425,6 +425,452 @@ const leakyReluTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'leakyRelu float16 1D constant tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -0.1904296875,
+ 50.78125,
+ -0.69580078125,
+ -0.8056640625,
+ -0.90380859375,
+ 76,
+ 66.3125,
+ -0.84130859375,
+ -0.171875,
+ -0.875,
+ -0.034149169921875,
+ -0.2276611328125,
+ -0.0251007080078125,
+ 18.9375,
+ 98.625,
+ 55.34375,
+ -0.331787109375,
+ -0.460205078125,
+ -0.61474609375,
+ 64.25,
+ 21.46875,
+ -0.315185546875,
+ -0.412841796875,
+ -0.65625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 0D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [-19.046875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [-0.1904296875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 1D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -0.1904296875,
+ 50.78125,
+ -0.69580078125,
+ -0.8056640625,
+ -0.90380859375,
+ 76,
+ 66.3125,
+ -0.84130859375,
+ -0.171875,
+ -0.875,
+ -0.034149169921875,
+ -0.2276611328125,
+ -0.0251007080078125,
+ 18.9375,
+ 98.625,
+ 55.34375,
+ -0.331787109375,
+ -0.460205078125,
+ -0.61474609375,
+ 64.25,
+ 21.46875,
+ -0.315185546875,
+ -0.412841796875,
+ -0.65625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 2D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -0.1904296875,
+ 50.78125,
+ -0.69580078125,
+ -0.8056640625,
+ -0.90380859375,
+ 76,
+ 66.3125,
+ -0.84130859375,
+ -0.171875,
+ -0.875,
+ -0.034149169921875,
+ -0.2276611328125,
+ -0.0251007080078125,
+ 18.9375,
+ 98.625,
+ 55.34375,
+ -0.331787109375,
+ -0.460205078125,
+ -0.61474609375,
+ 64.25,
+ 21.46875,
+ -0.315185546875,
+ -0.412841796875,
+ -0.65625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 3D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -0.1904296875,
+ 50.78125,
+ -0.69580078125,
+ -0.8056640625,
+ -0.90380859375,
+ 76,
+ 66.3125,
+ -0.84130859375,
+ -0.171875,
+ -0.875,
+ -0.034149169921875,
+ -0.2276611328125,
+ -0.0251007080078125,
+ 18.9375,
+ 98.625,
+ 55.34375,
+ -0.331787109375,
+ -0.460205078125,
+ -0.61474609375,
+ 64.25,
+ 21.46875,
+ -0.315185546875,
+ -0.412841796875,
+ -0.65625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 4D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -0.1904296875,
+ 50.78125,
+ -0.69580078125,
+ -0.8056640625,
+ -0.90380859375,
+ 76,
+ 66.3125,
+ -0.84130859375,
+ -0.171875,
+ -0.875,
+ -0.034149169921875,
+ -0.2276611328125,
+ -0.0251007080078125,
+ 18.9375,
+ 98.625,
+ 55.34375,
+ -0.331787109375,
+ -0.460205078125,
+ -0.61474609375,
+ 64.25,
+ 21.46875,
+ -0.315185546875,
+ -0.412841796875,
+ -0.65625
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 5D tensor default options',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -0.1904296875,
+ 50.78125,
+ -0.69580078125,
+ -0.8056640625,
+ -0.90380859375,
+ 76,
+ 66.3125,
+ -0.84130859375,
+ -0.171875,
+ -0.875,
+ -0.034149169921875,
+ -0.2276611328125,
+ -0.0251007080078125,
+ 18.9375,
+ 98.625,
+ 55.34375,
+ -0.331787109375,
+ -0.460205078125,
+ -0.61474609375,
+ 64.25,
+ 21.46875,
+ -0.315185546875,
+ -0.412841796875,
+ -0.65625
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 1D tensor negative options.alpha',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [
+ {'input': 'leakyReluInput'},
+ {'options': {'alpha': -97.70109193608776}}
+ ],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ 1861, 50.78125, 6796, 7872, 8832, 76, 66.3125, 8216,
+ 1679, 8552, 333.75, 2224, 245.25, 18.9375, 98.625, 55.34375,
+ 3242, 4496, 6004, 64.25, 21.46875, 3080, 4034, 6412
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 2D tensor positive options.alpha',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [
+ {'input': 'leakyReluInput'},
+ {'options': {'alpha': 35.799162942273234}}
+ ],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ -682, 50.78125, -2490, -2884, -3236, 76,
+ 66.3125, -3012, -615.5, -3132, -122.3125, -815,
+ -89.875, 18.9375, 98.625, 55.34375, -1188, -1648,
+ -2200, 64.25, 21.46875, -1128, -1478, -2350
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'leakyRelu float16 5D tensor options.alpha=0.0',
+ 'graph': {
+ 'inputs': {
+ 'leakyReluInput': {
+ 'data': [
+ -19.046875, 50.78125, -69.5625, -80.5625, -90.375,
+ 76, 66.3125, -84.125, -17.1875, -87.5,
+ -3.416015625, -22.765625, -2.509765625, 18.9375, 98.625,
+ 55.34375, -33.1875, -46.03125, -61.46875, 64.25,
+ 21.46875, -31.515625, -41.28125, -65.625
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'leakyRelu',
+ 'arguments': [{'input': 'leakyReluInput'}, {'options': {'alpha': 0}}],
+ 'outputs': 'leakyReluOutput'
+ }],
+ 'expectedOutputs': {
+ 'leakyReluOutput': {
+ 'data': [
+ 0, 50.78125, 0, 0, 0, 76, 66.3125, 0,
+ 0, 0, 0, 0, 0, 18.9375, 98.625, 55.34375,
+ 0, 0, 0, 64.25, 21.46875, 0, 0, 0
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/prelu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/prelu.https.any.js
index a3612715805..b89de832d3e 100644
--- a/tests/wpt/tests/webnn/conformance_tests/prelu.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/prelu.https.any.js
@@ -606,6 +606,531 @@ const preluTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'prelu float16 0D scalar',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [-4.79296875],
+ 'descriptor': {shape: [], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [1.1201171875],
+ 'descriptor': {shape: [], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [-5.3671875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 1D constant tensors',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [
+ 9.34375, 0.280029296875, -4.6171875, 1.1201171875,
+ -1.43359375, -3.158203125, -6.2890625, -5.01171875,
+ -6.8984375, 3.572265625, 6.86328125, -1.9619140625,
+ 4.58203125, 2.6640625, 9.1953125, -9.5546875,
+ -5.50390625, -2.392578125, 3.58203125, -2.322265625,
+ -1.9814453125, 4.15625, -1.7998046875, 9.296875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -23.8125, -1.341796875, 8.4140625, 6.109375, 12.171875,
+ 3.314453125, 1.1689453125, 0.71044921875, 46.3125, 5.7890625,
+ -25.78125, 9.609375, 7.328125, -10.5390625, 7.06640625,
+ 9.4375, 14.0859375, 20.703125, 8.4765625, 4.55078125,
+ 18.359375, -1.08984375, 1.326171875, -68.9375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 1D tensors',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [
+ 9.34375, 0.280029296875, -4.6171875, 1.1201171875,
+ -1.43359375, -3.158203125, -6.2890625, -5.01171875,
+ -6.8984375, 3.572265625, 6.86328125, -1.9619140625,
+ 4.58203125, 2.6640625, 9.1953125, -9.5546875,
+ -5.50390625, -2.392578125, 3.58203125, -2.322265625,
+ -1.9814453125, 4.15625, -1.7998046875, 9.296875
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -23.8125, -1.341796875, 8.4140625, 6.109375, 12.171875,
+ 3.314453125, 1.1689453125, 0.71044921875, 46.3125, 5.7890625,
+ -25.78125, 9.609375, 7.328125, -10.5390625, 7.06640625,
+ 9.4375, 14.0859375, 20.703125, 8.4765625, 4.55078125,
+ 18.359375, -1.08984375, 1.326171875, -68.9375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 2D tensors',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [
+ 9.34375, 0.280029296875, -4.6171875, 1.1201171875,
+ -1.43359375, -3.158203125, -6.2890625, -5.01171875,
+ -6.8984375, 3.572265625, 6.86328125, -1.9619140625,
+ 4.58203125, 2.6640625, 9.1953125, -9.5546875,
+ -5.50390625, -2.392578125, 3.58203125, -2.322265625,
+ -1.9814453125, 4.15625, -1.7998046875, 9.296875
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -23.8125, -1.341796875, 8.4140625, 6.109375, 12.171875,
+ 3.314453125, 1.1689453125, 0.71044921875, 46.3125, 5.7890625,
+ -25.78125, 9.609375, 7.328125, -10.5390625, 7.06640625,
+ 9.4375, 14.0859375, 20.703125, 8.4765625, 4.55078125,
+ 18.359375, -1.08984375, 1.326171875, -68.9375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 3D tensors',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [
+ 9.34375, 0.280029296875, -4.6171875, 1.1201171875,
+ -1.43359375, -3.158203125, -6.2890625, -5.01171875,
+ -6.8984375, 3.572265625, 6.86328125, -1.9619140625,
+ 4.58203125, 2.6640625, 9.1953125, -9.5546875,
+ -5.50390625, -2.392578125, 3.58203125, -2.322265625,
+ -1.9814453125, 4.15625, -1.7998046875, 9.296875
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -23.8125, -1.341796875, 8.4140625, 6.109375, 12.171875,
+ 3.314453125, 1.1689453125, 0.71044921875, 46.3125, 5.7890625,
+ -25.78125, 9.609375, 7.328125, -10.5390625, 7.06640625,
+ 9.4375, 14.0859375, 20.703125, 8.4765625, 4.55078125,
+ 18.359375, -1.08984375, 1.326171875, -68.9375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [
+ 9.34375, 0.280029296875, -4.6171875, 1.1201171875,
+ -1.43359375, -3.158203125, -6.2890625, -5.01171875,
+ -6.8984375, 3.572265625, 6.86328125, -1.9619140625,
+ 4.58203125, 2.6640625, 9.1953125, -9.5546875,
+ -5.50390625, -2.392578125, 3.58203125, -2.322265625,
+ -1.9814453125, 4.15625, -1.7998046875, 9.296875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -23.8125, -1.341796875, 8.4140625, 6.109375, 12.171875,
+ 3.314453125, 1.1689453125, 0.71044921875, 46.3125, 5.7890625,
+ -25.78125, 9.609375, 7.328125, -10.5390625, 7.06640625,
+ 9.4375, 14.0859375, 20.703125, 8.4765625, 4.55078125,
+ 18.359375, -1.08984375, 1.326171875, -68.9375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 5D tensors',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [
+ 9.34375, 0.280029296875, -4.6171875, 1.1201171875,
+ -1.43359375, -3.158203125, -6.2890625, -5.01171875,
+ -6.8984375, 3.572265625, 6.86328125, -1.9619140625,
+ 4.58203125, 2.6640625, 9.1953125, -9.5546875,
+ -5.50390625, -2.392578125, 3.58203125, -2.322265625,
+ -1.9814453125, 4.15625, -1.7998046875, 9.296875
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -23.8125, -1.341796875, 8.4140625, 6.109375, 12.171875,
+ 3.314453125, 1.1689453125, 0.71044921875, 46.3125, 5.7890625,
+ -25.78125, 9.609375, 7.328125, -10.5390625, 7.06640625,
+ 9.4375, 14.0859375, 20.703125, 8.4765625, 4.55078125,
+ 18.359375, -1.08984375, 1.326171875, -68.9375
+ ],
+ 'descriptor': {shape: [2, 2, 1, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 broadcast 4D x 1D slope',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [5.07421875, 0.480712890625, -7.08984375],
+ 'descriptor': {shape: [3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -12.9296875, -2.3046875, 8.4140625, 6.109375,
+ -4.08203125, 3.314453125, 1.1689453125, -0.068115234375,
+ 47.59375, 5.7890625, -1.8056640625, 34.71875,
+ 7.328125, -1.9013671875, 7.06640625, 9.4375,
+ -1.2294921875, 61.375, 8.4765625, 4.55078125,
+ 65.6875, -1.330078125, 1.326171875, 52.59375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 broadcast 4D x 1D slope of shape [1]',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [5.01171875],
+ 'descriptor': {shape: [1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -12.7734375, -24.015625, 8.4140625, 6.109375, -42.5625,
+ 3.314453125, 1.1689453125, -0.71044921875, -33.65625, 5.7890625,
+ -18.828125, -24.546875, 7.328125, -19.828125, 7.06640625,
+ 9.4375, -12.8203125, -43.375, 8.4765625, 4.55078125,
+ -46.4375, -1.314453125, 1.326171875, -37.1875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 broadcast 4D x 2D slope',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [4.875, -8.5, 1.181640625, -9.984375, -4.42578125, -6.65625],
+ 'descriptor': {shape: [2, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -12.421875, 40.75, 8.4140625, 6.109375, 37.59375,
+ 3.314453125, 1.1689453125, 1.205078125, -7.93359375, 5.7890625,
+ 16.625, 32.59375, 7.328125, 33.625, 7.06640625,
+ 9.4375, 11.3203125, 57.625, 8.4765625, 4.55078125,
+ -10.9453125, 2.6171875, 1.326171875, 49.375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 broadcast 4D x 3D slope',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [5.07421875, 0.480712890625, -7.08984375],
+ 'descriptor': {shape: [1, 1, 3], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -12.9296875, -2.3046875, 8.4140625, 6.109375,
+ -4.08203125, 3.314453125, 1.1689453125, -0.068115234375,
+ 47.59375, 5.7890625, -1.8056640625, 34.71875,
+ 7.328125, -1.9013671875, 7.06640625, 9.4375,
+ -1.2294921875, 61.375, 8.4765625, 4.55078125,
+ 65.6875, -1.330078125, 1.326171875, 52.59375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'prelu float16 broadcast 4D x 4D slope',
+ 'graph': {
+ 'inputs': {
+ 'preluInput': {
+ 'data': [
+ -2.548828125, -4.79296875, 8.4140625, 6.109375,
+ -8.4921875, 3.314453125, 1.1689453125, -0.1417236328125,
+ -6.71484375, 5.7890625, -3.755859375, -4.8984375,
+ 7.328125, -3.955078125, 7.06640625, 9.4375,
+ -2.55859375, -8.65625, 8.4765625, 4.55078125,
+ -9.265625, -0.26220703125, 1.326171875, -7.41796875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'},
+ 'constant': true
+ },
+ 'preluSlope': {
+ 'data': [5.01171875],
+ 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'prelu',
+ 'arguments': [{'input': 'preluInput'}, {'slope': 'preluSlope'}],
+ 'outputs': 'preluOutput'
+ }],
+ 'expectedOutputs': {
+ 'preluOutput': {
+ 'data': [
+ -12.7734375, -24.015625, 8.4140625, 6.109375, -42.5625,
+ 3.314453125, 1.1689453125, -0.71044921875, -33.65625, 5.7890625,
+ -18.828125, -24.546875, 7.328125, -19.828125, 7.06640625,
+ 9.4375, -12.8203125, -43.375, 8.4765625, 4.55078125,
+ -46.4375, -1.314453125, 1.326171875, -37.1875
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/quantizeLinear.https.any.js b/tests/wpt/tests/webnn/conformance_tests/quantizeLinear.https.any.js
index c25bdbaac60..5c4989fdf31 100644
--- a/tests/wpt/tests/webnn/conformance_tests/quantizeLinear.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/quantizeLinear.https.any.js
@@ -202,7 +202,7 @@ const quantizeLinearTests = [
'constant': true
},
'quantizeLinearScale': {
- 'data': [0.2800687253475189, -4.617084980010986],
+ 'data': [0.2800687253475189, 4.617084980010986],
'descriptor': {shape: [2, 1], dataType: 'float32'},
'constant': true
},
@@ -222,7 +222,7 @@ const quantizeLinearTests = [
}],
'expectedOutputs': {
'quantizeLinearOutput': {
- 'data': [119, 111, 126, 127],
+ 'data': [119, 111, 130, 129],
'descriptor': {shape: [1, 1, 2, 2], dataType: 'uint8'}
}
}
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_l1.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_l1.https.any.js
index 63a6ab727cb..1e6b163cff3 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_l1.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_l1.https.any.js
@@ -74,6 +74,29 @@ const reduceL1Tests = [
}
},
{
+ 'name': 'reduceL1 float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceL1Input': {
+ 'data': [-5.50882625579834, 5.50882625579833],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceL1',
+ 'arguments': [{'input': 'reduceL1Input'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceL1Output'
+ }],
+ 'expectedOutputs': {
+ 'reduceL1Output': {
+ 'data': [5.50882625579834, 5.50882625579833],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reduceL1 float32 1D constant tensor all positive default options',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_l2.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_l2.https.any.js
index 7358ee8a15c..0670a1d25c1 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_l2.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_l2.https.any.js
@@ -75,6 +75,29 @@ const reduceL2Tests = [
}
},
{
+ 'name': 'reduceL2 float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceL2Input': {
+ 'data': [-4.860228061676025, 4.860228061676024],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceL2',
+ 'arguments': [{'input': 'reduceL2Input'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceL2Output'
+ }],
+ 'expectedOutputs': {
+ 'reduceL2Output': {
+ 'data': [4.860228061676025, 4.860228061676024],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reduceL2 float32 1D constant tensor all positive default options',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum.https.any.js
index 31e21dbd50a..9d30accb2cb 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum.https.any.js
@@ -76,6 +76,30 @@ const reduceLogSumTests = [
}
},
{
+ 'name': 'reduceLogSum float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceLogSumInput': {
+ 'data': [64.54827117919922, 64.54827117919922],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceLogSum',
+ 'arguments':
+ [{'input': 'reduceLogSumInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceLogSumOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceLogSumOutput': {
+ 'data': [4.167413234710693, 4.167413234710693],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name':
'reduceLogSum float32 1D constant tensor all non-negative default options',
'graph': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum_exp.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum_exp.https.any.js
index e60d6cfc892..e8026435017 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum_exp.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_log_sum_exp.https.any.js
@@ -76,6 +76,30 @@ const reduceLogSumExpTests = [
}
},
{
+ 'name': 'reduceLogSumExp float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceLogSumExpInput': {
+ 'data': [0.7974132895469666, 0.7974132895469665],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceLogSumExp',
+ 'arguments':
+ [{'input': 'reduceLogSumExpInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceLogSumExpOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceLogSumExpOutput': {
+ 'data': [0.7974132895469666, 0.7974132895469665],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name':
'reduceLogSumExp float32 1D constant tensor all positive default options',
'graph': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_max.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_max.https.any.js
index 03458a30470..784db3101b6 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_max.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_max.https.any.js
@@ -74,6 +74,29 @@ const reduceMaxTests = [
}
},
{
+ 'name': 'reduceMax float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceMaxInput': {
+ 'data': [32.16658401489258, 32.16658401489257],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceMax',
+ 'arguments': [{'input': 'reduceMaxInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceMaxOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceMaxOutput': {
+ 'data': [32.16658401489258, 32.16658401489257],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reduceMax float32 1D constant tensor default options',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_mean.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_mean.https.any.js
index e9c9475088a..63566b011c0 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_mean.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_mean.https.any.js
@@ -74,6 +74,29 @@ const reduceMeanTests = [
}
},
{
+ 'name': 'reduceMean float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceMeanInput': {
+ 'data': [-95.84498596191406, 95.84498596191405],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceMean',
+ 'arguments': [{'input': 'reduceMeanInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceMeanOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceMeanOutput': {
+ 'data': [-95.84498596191406, 95.84498596191405],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name':
'reduceMean float32 1D constant tensor all positive default options',
'graph': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_min.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_min.https.any.js
index aca474d74ff..64cf8b7ee98 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_min.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_min.https.any.js
@@ -74,6 +74,29 @@ const reduceMinTests = [
}
},
{
+ 'name': 'reduceMin float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceMinInput': {
+ 'data': [-58.76195526123047, 58.76195526123047],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceMin',
+ 'arguments': [{'input': 'reduceMinInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceMinOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceMinOutput': {
+ 'data': [-58.76195526123047, 58.76195526123047],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reduceMin float32 1D constant tensor default options',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_product.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_product.https.any.js
index 9534c5b92e5..6b4c1242d7f 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_product.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_product.https.any.js
@@ -76,6 +76,30 @@ const reduceProductTests = [
}
},
{
+ 'name': 'reduceProduct float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceProductInput': {
+ 'data': [-68.75911712646484, -68.75911712646483],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceProduct',
+ 'arguments':
+ [{'input': 'reduceProductInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceProductOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceProductOutput': {
+ 'data': [-68.75911712646484, -68.75911712646483],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reduceProduct float32 1D constant tensor default options',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/reduce_sum.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reduce_sum.https.any.js
index 687f8e5e7ee..d333f9fb5ad 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reduce_sum.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reduce_sum.https.any.js
@@ -74,6 +74,29 @@ const reduceSumTests = [
}
},
{
+ 'name': 'reduceSum float32 1D constant tensor empty axes',
+ 'graph': {
+ 'inputs': {
+ 'reduceSumInput': {
+ 'data': [69.6038589477539, 69.6038589477538],
+ 'descriptor': {shape: [2], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reduceSum',
+ 'arguments': [{'input': 'reduceSumInput'}, {'options': {'axes': []}}],
+ 'outputs': 'reduceSumOutput'
+ }],
+ 'expectedOutputs': {
+ 'reduceSumOutput': {
+ 'data': [69.6038589477539, 69.6038589477538],
+ 'descriptor': {shape: [2], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reduceSum float32 1D constant tensor all positive default options',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
index 30b797637db..16cc2a3fa67 100644
--- a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
@@ -374,6 +374,213 @@ const reluTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'relu float16 1D constant tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, -71.0625,
+ -82.75, -26.8125, -99.1875, -35.71875, 18.359375, -37.375,
+ -52.84375, -10.40625, 60.59375, -13.640625, -76.5625, -8.1328125,
+ 51.5, -51.625, -64.5625, -5.09375, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, 0, 0, 0, 0,
+ 0, 18.359375, 0, 0, 0, 60.59375, 0, 0, 0,
+ 51.5, 0, 0, 0, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'relu float16 0D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput':
+ {'data': [79.0625], 'descriptor': {shape: [], dataType: 'float16'}}
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput':
+ {'data': [79.0625], 'descriptor': {shape: [], dataType: 'float16'}}
+ }
+ }
+ },
+ {
+ 'name': 'relu float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, -71.0625,
+ -82.75, -26.8125, -99.1875, -35.71875, 18.359375, -37.375,
+ -52.84375, -10.40625, 60.59375, -13.640625, -76.5625, -8.1328125,
+ 51.5, -51.625, -64.5625, -5.09375, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, 0, 0, 0, 0,
+ 0, 18.359375, 0, 0, 0, 60.59375, 0, 0, 0,
+ 51.5, 0, 0, 0, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'relu float16 2D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, -71.0625,
+ -82.75, -26.8125, -99.1875, -35.71875, 18.359375, -37.375,
+ -52.84375, -10.40625, 60.59375, -13.640625, -76.5625, -8.1328125,
+ 51.5, -51.625, -64.5625, -5.09375, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, 0, 0, 0, 0,
+ 0, 18.359375, 0, 0, 0, 60.59375, 0, 0, 0,
+ 51.5, 0, 0, 0, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'relu float16 3D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, -71.0625,
+ -82.75, -26.8125, -99.1875, -35.71875, 18.359375, -37.375,
+ -52.84375, -10.40625, 60.59375, -13.640625, -76.5625, -8.1328125,
+ 51.5, -51.625, -64.5625, -5.09375, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, 0, 0, 0, 0,
+ 0, 18.359375, 0, 0, 0, 60.59375, 0, 0, 0,
+ 51.5, 0, 0, 0, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'relu float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, -71.0625,
+ -82.75, -26.8125, -99.1875, -35.71875, 18.359375, -37.375,
+ -52.84375, -10.40625, 60.59375, -13.640625, -76.5625, -8.1328125,
+ 51.5, -51.625, -64.5625, -5.09375, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, 0, 0, 0, 0,
+ 0, 18.359375, 0, 0, 0, 60.59375, 0, 0, 0,
+ 51.5, 0, 0, 0, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'relu float16 5D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, -71.0625,
+ -82.75, -26.8125, -99.1875, -35.71875, 18.359375, -37.375,
+ -52.84375, -10.40625, 60.59375, -13.640625, -76.5625, -8.1328125,
+ 51.5, -51.625, -64.5625, -5.09375, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [
+ 79.0625, 2.25, 80.75, 63.90625, 77.6875, 0, 0, 0, 0,
+ 0, 18.359375, 0, 0, 0, 60.59375, 0, 0, 0,
+ 51.5, 0, 0, 0, 15.3515625, 90.0625
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js b/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js
index fe758193730..05b8ea21e67 100644
--- a/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js
@@ -57,6 +57,48 @@ const reshapeTests = [
}
},
{
+ 'name':
+ 'reshape float32 constant tensor to a new shape (reorder all dimensions)',
+ 'graph': {
+ 'inputs': {
+ 'reshapeInput': {
+ 'data': [
+ -30.0561466217041, 99.56941986083984, 88.04620361328125,
+ -91.87507629394531, -23.7972354888916, -91.28665161132812,
+ -63.15204620361328, 12.0669527053833, -96.1172866821289,
+ -44.77365493774414, -80.08650970458984, -64.43756866455078,
+ 27.64195442199707, -96.86306762695312, 83.6834716796875,
+ 50.599483489990234, -20.18765640258789, -1.3904608488082886,
+ -96.93603515625, 65.34143829345703, 34.835994720458984,
+ 62.01485824584961, -2.8698415756225586, 27.903749465942383
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float32'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'reshape',
+ 'arguments': [{'input': 'reshapeInput'}, {'newShape': [4, 2, 3]}],
+ 'outputs': 'reshapeOutput'
+ }],
+ 'expectedOutputs': {
+ 'reshapeOutput': {
+ 'data': [
+ -30.0561466217041, 99.56941986083984, 88.04620361328125,
+ -91.87507629394531, -23.7972354888916, -91.28665161132812,
+ -63.15204620361328, 12.0669527053833, -96.1172866821289,
+ -44.77365493774414, -80.08650970458984, -64.43756866455078,
+ 27.64195442199707, -96.86306762695312, 83.6834716796875,
+ 50.599483489990234, -20.18765640258789, -1.3904608488082886,
+ -96.93603515625, 65.34143829345703, 34.835994720458984,
+ 62.01485824584961, -2.8698415756225586, 27.903749465942383
+ ],
+ 'descriptor': {shape: [4, 2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
'name': 'reshape float32 tensor to a new shape (reduce dimensions)',
'graph': {
'inputs': {
diff --git a/tests/wpt/tests/webnn/conformance_tests/sigmoid.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sigmoid.https.any.js
index a925f0c6110..287568a390a 100644
--- a/tests/wpt/tests/webnn/conformance_tests/sigmoid.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/sigmoid.https.any.js
@@ -277,6 +277,355 @@ const sigmoidTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'sigmoid float16 1D constant tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [
+ -0.376953125, -0.68505859375, -5.98828125, 4.43359375,
+ -0.9384765625, 4.58984375, -2.505859375, 1.5673828125,
+ -2.595703125, -0.6474609375, 2.677734375, -3.10546875,
+ 2.2578125, -0.28662109375, 4.640625, 1.060546875,
+ -3.537109375, 0.441162109375, 4.79296875, 2.07421875,
+ 0.83544921875, -5.43359375, -4.18359375, -2.484375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [
+ 0.406982421875,
+ 0.335205078125,
+ 0.00250244140625,
+ 0.98828125,
+ 0.28125,
+ 0.98974609375,
+ 0.075439453125,
+ 0.82763671875,
+ 0.06939697265625,
+ 0.343505859375,
+ 0.935546875,
+ 0.042877197265625,
+ 0.9052734375,
+ 0.4287109375,
+ 0.990234375,
+ 0.74267578125,
+ 0.0282745361328125,
+ 0.6083984375,
+ 0.99169921875,
+ 0.88818359375,
+ 0.697265625,
+ 0.0043487548828125,
+ 0.0150146484375,
+ 0.07696533203125
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'sigmoid float16 0D tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [-0.376953125],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [0.406982421875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'sigmoid float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [
+ -0.376953125, -0.68505859375, -5.98828125, 4.43359375,
+ -0.9384765625, 4.58984375, -2.505859375, 1.5673828125,
+ -2.595703125, -0.6474609375, 2.677734375, -3.10546875,
+ 2.2578125, -0.28662109375, 4.640625, 1.060546875,
+ -3.537109375, 0.441162109375, 4.79296875, 2.07421875,
+ 0.83544921875, -5.43359375, -4.18359375, -2.484375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [
+ 0.406982421875,
+ 0.335205078125,
+ 0.00250244140625,
+ 0.98828125,
+ 0.28125,
+ 0.98974609375,
+ 0.075439453125,
+ 0.82763671875,
+ 0.06939697265625,
+ 0.343505859375,
+ 0.935546875,
+ 0.042877197265625,
+ 0.9052734375,
+ 0.4287109375,
+ 0.990234375,
+ 0.74267578125,
+ 0.0282745361328125,
+ 0.6083984375,
+ 0.99169921875,
+ 0.88818359375,
+ 0.697265625,
+ 0.0043487548828125,
+ 0.0150146484375,
+ 0.07696533203125
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'sigmoid float16 2D tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [
+ -0.376953125, -0.68505859375, -5.98828125, 4.43359375,
+ -0.9384765625, 4.58984375, -2.505859375, 1.5673828125,
+ -2.595703125, -0.6474609375, 2.677734375, -3.10546875,
+ 2.2578125, -0.28662109375, 4.640625, 1.060546875,
+ -3.537109375, 0.441162109375, 4.79296875, 2.07421875,
+ 0.83544921875, -5.43359375, -4.18359375, -2.484375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [
+ 0.406982421875,
+ 0.335205078125,
+ 0.00250244140625,
+ 0.98828125,
+ 0.28125,
+ 0.98974609375,
+ 0.075439453125,
+ 0.82763671875,
+ 0.06939697265625,
+ 0.343505859375,
+ 0.935546875,
+ 0.042877197265625,
+ 0.9052734375,
+ 0.4287109375,
+ 0.990234375,
+ 0.74267578125,
+ 0.0282745361328125,
+ 0.6083984375,
+ 0.99169921875,
+ 0.88818359375,
+ 0.697265625,
+ 0.0043487548828125,
+ 0.0150146484375,
+ 0.07696533203125
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'sigmoid float16 3D tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [
+ -0.376953125, -0.68505859375, -5.98828125, 4.43359375,
+ -0.9384765625, 4.58984375, -2.505859375, 1.5673828125,
+ -2.595703125, -0.6474609375, 2.677734375, -3.10546875,
+ 2.2578125, -0.28662109375, 4.640625, 1.060546875,
+ -3.537109375, 0.441162109375, 4.79296875, 2.07421875,
+ 0.83544921875, -5.43359375, -4.18359375, -2.484375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [
+ 0.406982421875,
+ 0.335205078125,
+ 0.00250244140625,
+ 0.98828125,
+ 0.28125,
+ 0.98974609375,
+ 0.075439453125,
+ 0.82763671875,
+ 0.06939697265625,
+ 0.343505859375,
+ 0.935546875,
+ 0.042877197265625,
+ 0.9052734375,
+ 0.4287109375,
+ 0.990234375,
+ 0.74267578125,
+ 0.0282745361328125,
+ 0.6083984375,
+ 0.99169921875,
+ 0.88818359375,
+ 0.697265625,
+ 0.0043487548828125,
+ 0.0150146484375,
+ 0.07696533203125
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'sigmoid float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [
+ -0.376953125, -0.68505859375, -5.98828125, 4.43359375,
+ -0.9384765625, 4.58984375, -2.505859375, 1.5673828125,
+ -2.595703125, -0.6474609375, 2.677734375, -3.10546875,
+ 2.2578125, -0.28662109375, 4.640625, 1.060546875,
+ -3.537109375, 0.441162109375, 4.79296875, 2.07421875,
+ 0.83544921875, -5.43359375, -4.18359375, -2.484375
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [
+ 0.406982421875,
+ 0.335205078125,
+ 0.00250244140625,
+ 0.98828125,
+ 0.28125,
+ 0.98974609375,
+ 0.075439453125,
+ 0.82763671875,
+ 0.06939697265625,
+ 0.343505859375,
+ 0.935546875,
+ 0.042877197265625,
+ 0.9052734375,
+ 0.4287109375,
+ 0.990234375,
+ 0.74267578125,
+ 0.0282745361328125,
+ 0.6083984375,
+ 0.99169921875,
+ 0.88818359375,
+ 0.697265625,
+ 0.0043487548828125,
+ 0.0150146484375,
+ 0.07696533203125
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'sigmoid float16 5D tensor',
+ 'graph': {
+ 'inputs': {
+ 'sigmoidInput': {
+ 'data': [
+ -0.376953125, -0.68505859375, -5.98828125, 4.43359375,
+ -0.9384765625, 4.58984375, -2.505859375, 1.5673828125,
+ -2.595703125, -0.6474609375, 2.677734375, -3.10546875,
+ 2.2578125, -0.28662109375, 4.640625, 1.060546875,
+ -3.537109375, 0.441162109375, 4.79296875, 2.07421875,
+ 0.83544921875, -5.43359375, -4.18359375, -2.484375
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'sigmoidInput'}],
+ 'outputs': 'sigmoidOutput'
+ }],
+ 'expectedOutputs': {
+ 'sigmoidOutput': {
+ 'data': [
+ 0.406982421875,
+ 0.335205078125,
+ 0.00250244140625,
+ 0.98828125,
+ 0.28125,
+ 0.98974609375,
+ 0.075439453125,
+ 0.82763671875,
+ 0.06939697265625,
+ 0.343505859375,
+ 0.935546875,
+ 0.042877197265625,
+ 0.9052734375,
+ 0.4287109375,
+ 0.990234375,
+ 0.74267578125,
+ 0.0282745361328125,
+ 0.6083984375,
+ 0.99169921875,
+ 0.88818359375,
+ 0.697265625,
+ 0.0043487548828125,
+ 0.0150146484375,
+ 0.07696533203125
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/softmax.https.any.js b/tests/wpt/tests/webnn/conformance_tests/softmax.https.any.js
index f289f081b16..33c2e1db9ef 100644
--- a/tests/wpt/tests/webnn/conformance_tests/softmax.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/softmax.https.any.js
@@ -207,6 +207,160 @@ const softmaxTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'softmax float16 2D constant tensor all positive',
+ 'graph': {
+ 'inputs': {
+ 'softmaxInput': {
+ 'data': [
+ 7.90234375, 6.359375, 4.83203125, 9.578125,
+ 0.210693359375, 4.5546875, 7.1484375, 8.328125,
+ 1.5361328125, 6.6328125, 1.4541015625, 0.21337890625,
+ 5.2578125, 8.1953125, 8.1640625, 2.875,
+ 8.953125, 6.11328125, 1.63671875, 0.2763671875,
+ 5.02734375, 3.8984375, 2.896484375, 6.890625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'softmax',
+ 'arguments': [{'input': 'softmaxInput'}],
+ 'outputs': 'softmaxOutput'
+ }],
+ 'expectedOutputs': {
+ 'softmaxOutput': {
+ 'data': [
+ 0.150634765625, 0.032196044921875,
+ 0.006988525390625, 0.8046875,
+ 0.00006878376007080078, 0.005298614501953125,
+ 0.205810546875, 0.66943359375,
+ 0.0007519721984863281, 0.1229248046875,
+ 0.0006923675537109375, 0.0002002716064453125,
+ 0.01236724853515625, 0.2333984375,
+ 0.2261962890625, 0.0011415481567382812,
+ 0.497802734375, 0.0290985107421875,
+ 0.00424957275390625, 0.0010900497436523438,
+ 0.1260986328125, 0.040771484375,
+ 0.01497650146484375, 0.81298828125
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softmax float16 2D tensor all positive',
+ 'graph': {
+ 'inputs': {
+ 'softmaxInput': {
+ 'data': [
+ 7.90234375, 6.359375, 4.83203125, 9.578125,
+ 0.210693359375, 4.5546875, 7.1484375, 8.328125,
+ 1.5361328125, 6.6328125, 1.4541015625, 0.21337890625,
+ 5.2578125, 8.1953125, 8.1640625, 2.875,
+ 8.953125, 6.11328125, 1.63671875, 0.2763671875,
+ 5.02734375, 3.8984375, 2.896484375, 6.890625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softmax',
+ 'arguments': [{'input': 'softmaxInput'}],
+ 'outputs': 'softmaxOutput'
+ }],
+ 'expectedOutputs': {
+ 'softmaxOutput': {
+ 'data': [
+ 0.150634765625, 0.032196044921875,
+ 0.006988525390625, 0.8046875,
+ 0.00006878376007080078, 0.005298614501953125,
+ 0.205810546875, 0.66943359375,
+ 0.0007519721984863281, 0.1229248046875,
+ 0.0006923675537109375, 0.0002002716064453125,
+ 0.01236724853515625, 0.2333984375,
+ 0.2261962890625, 0.0011415481567382812,
+ 0.497802734375, 0.0290985107421875,
+ 0.00424957275390625, 0.0010900497436523438,
+ 0.1260986328125, 0.040771484375,
+ 0.01497650146484375, 0.81298828125
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softmax float16 2D tensor all negative',
+ 'graph': {
+ 'inputs': {
+ 'softmaxInput': {
+ 'data': [
+ -3.3125, -3.33984375, -3.41015625, -6.6953125, -7.89453125,
+ -3.30859375, -3.23046875, -4.31640625, -9.3125, -3.923828125,
+ -3.78125, -6.03515625, -3.919921875, -2.22265625, -9.328125,
+ -1.48828125, -6.3046875, -5.53125, -1.841796875, -4.99609375,
+ -9.5234375, -4.984375, -8.421875, -6.234375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softmax',
+ 'arguments': [{'input': 'softmaxInput'}],
+ 'outputs': 'softmaxOutput'
+ }],
+ 'expectedOutputs': {
+ 'softmaxOutput': {
+ 'data': [
+ 0.254638671875, 0.2476806640625, 0.2308349609375,
+ 0.00864410400390625, 0.002605438232421875, 0.255615234375,
+ 0.40380859375, 0.1363525390625, 0.0009222030639648438,
+ 0.2017822265625, 0.2327880859375, 0.024444580078125,
+ 0.055145263671875, 0.301025390625, 0.00024700164794921875,
+ 0.62744140625, 0.0050811767578125, 0.01100921630859375,
+ 0.9091796875, 0.038787841796875, 0.00041937828063964844,
+ 0.03924560546875, 0.0012617111206054688, 0.0112457275390625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softmax float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softmaxInput': {
+ 'data': [
+ 0.43017578125, 0.54736328125, -1.1640625, 0.1839599609375,
+ 0.583984375, 0.173583984375, 0.53955078125, -0.95361328125,
+ -0.591796875, -0.1734619140625, 0.1439208984375, -0.379150390625
+ ],
+ 'descriptor': {shape: [3, 4, 1, 1], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softmax',
+ 'arguments': [{'input': 'softmaxInput'}, {'axis': 1}],
+ 'outputs': 'softmaxOutput'
+ }],
+ 'expectedOutputs': {
+ 'softmaxOutput': {
+ 'data': [
+ 0.321533203125, 0.361572265625, 0.0653076171875, 0.25146484375,
+ 0.352783203125, 0.2340087890625, 0.33740234375, 0.0758056640625,
+ 0.171142578125, 0.260009765625, 0.357177734375, 0.211669921875
+ ],
+ 'descriptor': {shape: [3, 4, 1, 1], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/softplus.https.any.js b/tests/wpt/tests/webnn/conformance_tests/softplus.https.any.js
index 52fce910dfe..36386c03378 100644
--- a/tests/wpt/tests/webnn/conformance_tests/softplus.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/softplus.https.any.js
@@ -277,6 +277,233 @@ const softplusTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'softplus float16 1D constant tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput': {
+ 'data': [
+ 5.625, 5.16796875, 4.015625, 9.4765625, 9.9921875,
+ 7.06640625, 2.1328125, 8.1875, 5.171875, 2.10546875,
+ 3.5234375, 4.13671875, 1.7421875, 5.14453125, 5.015625,
+ 0.0458984375, 2.95703125, 3.958984375, 5.51953125, 7.19140625,
+ 8.765625, 1.373046875, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [
+ 5.62890625, 5.171875, 4.03515625, 9.4765625, 9.9921875,
+ 7.06640625, 2.244140625, 8.1875, 5.17578125, 2.220703125,
+ 3.552734375, 4.15234375, 1.9033203125, 5.1484375, 5.0234375,
+ 0.71630859375, 3.0078125, 3.978515625, 5.5234375, 7.19140625,
+ 8.765625, 1.5986328125, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softplus float16 0D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput':
+ {'data': [5.625], 'descriptor': {shape: [], dataType: 'float16'}}
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [5.62890625],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softplus float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput': {
+ 'data': [
+ 5.625, 5.16796875, 4.015625, 9.4765625, 9.9921875,
+ 7.06640625, 2.1328125, 8.1875, 5.171875, 2.10546875,
+ 3.5234375, 4.13671875, 1.7421875, 5.14453125, 5.015625,
+ 0.0458984375, 2.95703125, 3.958984375, 5.51953125, 7.19140625,
+ 8.765625, 1.373046875, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [
+ 5.62890625, 5.171875, 4.03515625, 9.4765625, 9.9921875,
+ 7.06640625, 2.244140625, 8.1875, 5.17578125, 2.220703125,
+ 3.552734375, 4.15234375, 1.9033203125, 5.1484375, 5.0234375,
+ 0.71630859375, 3.0078125, 3.978515625, 5.5234375, 7.19140625,
+ 8.765625, 1.5986328125, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softplus float16 2D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput': {
+ 'data': [
+ 5.625, 5.16796875, 4.015625, 9.4765625, 9.9921875,
+ 7.06640625, 2.1328125, 8.1875, 5.171875, 2.10546875,
+ 3.5234375, 4.13671875, 1.7421875, 5.14453125, 5.015625,
+ 0.0458984375, 2.95703125, 3.958984375, 5.51953125, 7.19140625,
+ 8.765625, 1.373046875, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [
+ 5.62890625, 5.171875, 4.03515625, 9.4765625, 9.9921875,
+ 7.06640625, 2.244140625, 8.1875, 5.17578125, 2.220703125,
+ 3.552734375, 4.15234375, 1.9033203125, 5.1484375, 5.0234375,
+ 0.71630859375, 3.0078125, 3.978515625, 5.5234375, 7.19140625,
+ 8.765625, 1.5986328125, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softplus float16 3D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput': {
+ 'data': [
+ 5.625, 5.16796875, 4.015625, 9.4765625, 9.9921875,
+ 7.06640625, 2.1328125, 8.1875, 5.171875, 2.10546875,
+ 3.5234375, 4.13671875, 1.7421875, 5.14453125, 5.015625,
+ 0.0458984375, 2.95703125, 3.958984375, 5.51953125, 7.19140625,
+ 8.765625, 1.373046875, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [
+ 5.62890625, 5.171875, 4.03515625, 9.4765625, 9.9921875,
+ 7.06640625, 2.244140625, 8.1875, 5.17578125, 2.220703125,
+ 3.552734375, 4.15234375, 1.9033203125, 5.1484375, 5.0234375,
+ 0.71630859375, 3.0078125, 3.978515625, 5.5234375, 7.19140625,
+ 8.765625, 1.5986328125, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softplus float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput': {
+ 'data': [
+ 5.625, 5.16796875, 4.015625, 9.4765625, 9.9921875,
+ 7.06640625, 2.1328125, 8.1875, 5.171875, 2.10546875,
+ 3.5234375, 4.13671875, 1.7421875, 5.14453125, 5.015625,
+ 0.0458984375, 2.95703125, 3.958984375, 5.51953125, 7.19140625,
+ 8.765625, 1.373046875, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [
+ 5.62890625, 5.171875, 4.03515625, 9.4765625, 9.9921875,
+ 7.06640625, 2.244140625, 8.1875, 5.17578125, 2.220703125,
+ 3.552734375, 4.15234375, 1.9033203125, 5.1484375, 5.0234375,
+ 0.71630859375, 3.0078125, 3.978515625, 5.5234375, 7.19140625,
+ 8.765625, 1.5986328125, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softplus float16 5D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softplusInput': {
+ 'data': [
+ 5.625, 5.16796875, 4.015625, 9.4765625, 9.9921875,
+ 7.06640625, 2.1328125, 8.1875, 5.171875, 2.10546875,
+ 3.5234375, 4.13671875, 1.7421875, 5.14453125, 5.015625,
+ 0.0458984375, 2.95703125, 3.958984375, 5.51953125, 7.19140625,
+ 8.765625, 1.373046875, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softplus',
+ 'arguments': [{'input': 'softplusInput'}],
+ 'outputs': 'softplusOutput'
+ }],
+ 'expectedOutputs': {
+ 'softplusOutput': {
+ 'data': [
+ 5.62890625, 5.171875, 4.03515625, 9.4765625, 9.9921875,
+ 7.06640625, 2.244140625, 8.1875, 5.17578125, 2.220703125,
+ 3.552734375, 4.15234375, 1.9033203125, 5.1484375, 5.0234375,
+ 0.71630859375, 3.0078125, 3.978515625, 5.5234375, 7.19140625,
+ 8.765625, 1.5986328125, 8.9296875, 8.6640625
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/softsign.https.any.js b/tests/wpt/tests/webnn/conformance_tests/softsign.https.any.js
index 21eeb6c5d81..cf06bbc4fdb 100644
--- a/tests/wpt/tests/webnn/conformance_tests/softsign.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/softsign.https.any.js
@@ -339,6 +339,310 @@ const softsignTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'softsign positive float16 1D constant tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ 1.5830078125, 4.078125, 8.8828125, 8.0703125, 8.2109375,
+ 2.455078125, 0.6533203125, 7.8671875, 3.123046875, 8.015625,
+ 3.94140625, 1.8134765625, 2.390625, 1.3359375, 9.4140625,
+ 0.443359375, 5.23828125, 9.421875, 7.81640625, 5.84765625,
+ 8.78125, 5.12109375, 7.1171875, 4.59765625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ 0.61279296875, 0.80322265625, 0.89892578125, 0.8896484375,
+ 0.8916015625, 0.71044921875, 0.395263671875, 0.88720703125,
+ 0.75732421875, 0.88916015625, 0.7978515625, 0.64453125,
+ 0.705078125, 0.57177734375, 0.90380859375, 0.30712890625,
+ 0.83984375, 0.90380859375, 0.88671875, 0.85400390625,
+ 0.89794921875, 0.83642578125, 0.876953125, 0.8212890625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign positive float16 0D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [1.5830078125],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [0.61279296875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign negative float16 0D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [-2.59765625],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [-0.72216796875],
+ 'descriptor': {shape: [], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign positive float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ 1.5830078125, 4.078125, 8.8828125, 8.0703125, 8.2109375,
+ 2.455078125, 0.6533203125, 7.8671875, 3.123046875, 8.015625,
+ 3.94140625, 1.8134765625, 2.390625, 1.3359375, 9.4140625,
+ 0.443359375, 5.23828125, 9.421875, 7.81640625, 5.84765625,
+ 8.78125, 5.12109375, 7.1171875, 4.59765625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ 0.61279296875, 0.80322265625, 0.89892578125, 0.8896484375,
+ 0.8916015625, 0.71044921875, 0.395263671875, 0.88720703125,
+ 0.75732421875, 0.88916015625, 0.7978515625, 0.64453125,
+ 0.705078125, 0.57177734375, 0.90380859375, 0.30712890625,
+ 0.83984375, 0.90380859375, 0.88671875, 0.85400390625,
+ 0.89794921875, 0.83642578125, 0.876953125, 0.8212890625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign negative float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ -2.59765625, -0.445068359375, -9.09375, -3.748046875, -1.38671875,
+ -8.21875, -3.5390625, -9.3671875, -6.28515625, -5.00390625,
+ -8.2421875, -3.775390625, -4.0859375, -7.3828125, -5.8828125,
+ -8.3359375, -6.6015625, -4.4921875, -3.525390625, -4.44140625,
+ -5.234375, -1.5908203125, -9.109375, -8.5234375
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ -0.72216796875, -0.30810546875, -0.90087890625, -0.78955078125,
+ -0.5810546875, -0.8916015625, -0.77978515625, -0.9033203125,
+ -0.86279296875, -0.83349609375, -0.8916015625, -0.79052734375,
+ -0.80322265625, -0.880859375, -0.8544921875, -0.89306640625,
+ -0.86865234375, -0.81787109375, -0.77880859375, -0.81640625,
+ -0.83935546875, -0.6142578125, -0.90087890625, -0.89501953125
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign float16 2D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ -8.34375, -6.921875, 2.69921875, -8.6640625,
+ -3.19140625, 7.65625, 6.6484375, 6.05859375,
+ 0.66357421875, 5.8046875, -0.328125, 1.2705078125,
+ -9.9453125, 6.90625, -0.03106689453125, -3.96875,
+ 6.26953125, -2.638671875, 3.05078125, 7.42578125,
+ -8.453125, 7.13671875, -4.984375, -7.859375
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ -0.89306640625, -0.87353515625, 0.7294921875,
+ -0.896484375, -0.76123046875, 0.88427734375,
+ 0.869140625, 0.8583984375, 0.39892578125,
+ 0.85302734375, -0.2470703125, 0.5595703125,
+ -0.90869140625, 0.87353515625, -0.0301361083984375,
+ -0.798828125, 0.8623046875, -0.72509765625,
+ 0.7529296875, 0.88134765625, -0.89404296875,
+ 0.876953125, -0.8330078125, -0.88720703125
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign float16 3D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ -8.34375, -6.921875, 2.69921875, -8.6640625,
+ -3.19140625, 7.65625, 6.6484375, 6.05859375,
+ 0.66357421875, 5.8046875, -0.328125, 1.2705078125,
+ -9.9453125, 6.90625, -0.03106689453125, -3.96875,
+ 6.26953125, -2.638671875, 3.05078125, 7.42578125,
+ -8.453125, 7.13671875, -4.984375, -7.859375
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ -0.89306640625, -0.87353515625, 0.7294921875,
+ -0.896484375, -0.76123046875, 0.88427734375,
+ 0.869140625, 0.8583984375, 0.39892578125,
+ 0.85302734375, -0.2470703125, 0.5595703125,
+ -0.90869140625, 0.87353515625, -0.0301361083984375,
+ -0.798828125, 0.8623046875, -0.72509765625,
+ 0.7529296875, 0.88134765625, -0.89404296875,
+ 0.876953125, -0.8330078125, -0.88720703125
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ -8.34375, -6.921875, 2.69921875, -8.6640625,
+ -3.19140625, 7.65625, 6.6484375, 6.05859375,
+ 0.66357421875, 5.8046875, -0.328125, 1.2705078125,
+ -9.9453125, 6.90625, -0.03106689453125, -3.96875,
+ 6.26953125, -2.638671875, 3.05078125, 7.42578125,
+ -8.453125, 7.13671875, -4.984375, -7.859375
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ -0.89306640625, -0.87353515625, 0.7294921875,
+ -0.896484375, -0.76123046875, 0.88427734375,
+ 0.869140625, 0.8583984375, 0.39892578125,
+ 0.85302734375, -0.2470703125, 0.5595703125,
+ -0.90869140625, 0.87353515625, -0.0301361083984375,
+ -0.798828125, 0.8623046875, -0.72509765625,
+ 0.7529296875, 0.88134765625, -0.89404296875,
+ 0.876953125, -0.8330078125, -0.88720703125
+ ],
+ 'descriptor': {shape: [1, 2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'softsign float16 5D tensor',
+ 'graph': {
+ 'inputs': {
+ 'softsignInput': {
+ 'data': [
+ -8.34375, -6.921875, 2.69921875, -8.6640625,
+ -3.19140625, 7.65625, 6.6484375, 6.05859375,
+ 0.66357421875, 5.8046875, -0.328125, 1.2705078125,
+ -9.9453125, 6.90625, -0.03106689453125, -3.96875,
+ 6.26953125, -2.638671875, 3.05078125, 7.42578125,
+ -8.453125, 7.13671875, -4.984375, -7.859375
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'softsign',
+ 'arguments': [{'input': 'softsignInput'}],
+ 'outputs': 'softsignOutput'
+ }],
+ 'expectedOutputs': {
+ 'softsignOutput': {
+ 'data': [
+ -0.89306640625, -0.87353515625, 0.7294921875,
+ -0.896484375, -0.76123046875, 0.88427734375,
+ 0.869140625, 0.8583984375, 0.39892578125,
+ 0.85302734375, -0.2470703125, 0.5595703125,
+ -0.90869140625, 0.87353515625, -0.0301361083984375,
+ -0.798828125, 0.8623046875, -0.72509765625,
+ 0.7529296875, 0.88134765625, -0.89404296875,
+ 0.876953125, -0.8330078125, -0.88720703125
+ ],
+ 'descriptor': {shape: [1, 2, 1, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js
index 9b21d6e4f94..a494a8b7a95 100644
--- a/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js
@@ -2523,6 +2523,137 @@ const subgraphTests = [
}
}
},
+ {
+ 'name': 'quantized conv2d',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [0.05605664849281311, 0.7114229798316956, 0.6529743671417236],
+ 'descriptor': {shape: [1, 1, 1, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'filter': {
+ 'data': [2, 3, 4],
+ 'descriptor': {shape: [1, 1, 1, 3], dataType: 'int8'},
+ 'constant': true
+ },
+ 'filterScale': {
+ 'data': [0.023458752938762234],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'filterZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'bias': {
+ 'data': [1],
+ 'descriptor': {shape: [1], dataType: 'int32'},
+ 'constant': true
+ },
+ 'biasScale': {
+ 'data': [0.000091995115004270],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'biasZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int32'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'filter'},
+ {'scale': 'filterScale', 'zeroPoint': 'filterZeroPoint'}
+ ],
+ 'outputs': 'dequantizedFilter'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'bias'},
+ {'scale': 'biasScale', 'zeroPoint': 'biasZeroPoint'}
+ ],
+ 'outputs': 'dequantizedBias'
+ },
+ {
+ 'name': 'conv2d',
+ 'arguments': [
+ {'input': 'dequantizedInput'}, {'filter': 'dequantizedFilter'}, {
+ 'options': {
+ 'inputLayout': 'nhwc',
+ 'bias': 'dequantizedBias',
+ 'filterLayout': 'ohwi'
+ }
+ }
+ ],
+ 'outputs': 'conv2dOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'conv2dOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedConv2dOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedConv2dOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0.11372549831867218],
+ 'descriptor': {shape: [1, 1, 1, 1], dataType: 'float32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/tanh.https.any.js b/tests/wpt/tests/webnn/conformance_tests/tanh.https.any.js
index 1b38d7707e8..63b8668644a 100644
--- a/tests/wpt/tests/webnn/conformance_tests/tanh.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/tanh.https.any.js
@@ -262,6 +262,333 @@ const tanhTests = [
}
}
}
+ },
+
+ // float16 tests
+ {
+ 'name': 'tanh float16 1D constant tensor',
+ 'graph': {
+ 'inputs': {
+ 'tanhInput': {
+ 'data': [
+ 5.47265625, -1.1533203125, 0.407470703125, 1.830078125,
+ 2.869140625, -4.5703125, 4.1484375, -4.06640625,
+ -3.712890625, 0.90771484375, -0.11083984375, 5.95703125,
+ 1.783203125, 4.0234375, 5.5859375, -5.28125,
+ 1.4150390625, -5.70703125, -1.4443359375, -1.9130859375,
+ 2.75, -0.7421875, 4.85546875, -0.75634765625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'},
+ 'constant': true
+ }
+ },
+ 'operators': [{
+ 'name': 'tanh',
+ 'arguments': [{'input': 'tanhInput'}],
+ 'outputs': 'tanhOutput'
+ }],
+ 'expectedOutputs': {
+ 'tanhOutput': {
+ 'data': [
+ 1,
+ -0.81884765625,
+ 0.38623046875,
+ 0.94970703125,
+ 0.99365234375,
+ -1,
+ 0.99951171875,
+ -0.99951171875,
+ -0.9990234375,
+ 0.72021484375,
+ -0.11041259765625,
+ 1,
+ 0.94482421875,
+ 0.99951171875,
+ 1,
+ -1,
+ 0.888671875,
+ -1,
+ -0.89453125,
+ -0.95751953125,
+ 0.99169921875,
+ -0.63037109375,
+ 1,
+ -0.63916015625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'tanh float16 1D tensor',
+ 'graph': {
+ 'inputs': {
+ 'tanhInput': {
+ 'data': [
+ 5.47265625, -1.1533203125, 0.407470703125, 1.830078125,
+ 2.869140625, -4.5703125, 4.1484375, -4.06640625,
+ -3.712890625, 0.90771484375, -0.11083984375, 5.95703125,
+ 1.783203125, 4.0234375, 5.5859375, -5.28125,
+ 1.4150390625, -5.70703125, -1.4443359375, -1.9130859375,
+ 2.75, -0.7421875, 4.85546875, -0.75634765625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'tanh',
+ 'arguments': [{'input': 'tanhInput'}],
+ 'outputs': 'tanhOutput'
+ }],
+ 'expectedOutputs': {
+ 'tanhOutput': {
+ 'data': [
+ 1,
+ -0.81884765625,
+ 0.38623046875,
+ 0.94970703125,
+ 0.99365234375,
+ -1,
+ 0.99951171875,
+ -0.99951171875,
+ -0.9990234375,
+ 0.72021484375,
+ -0.11041259765625,
+ 1,
+ 0.94482421875,
+ 0.99951171875,
+ 1,
+ -1,
+ 0.888671875,
+ -1,
+ -0.89453125,
+ -0.95751953125,
+ 0.99169921875,
+ -0.63037109375,
+ 1,
+ -0.63916015625
+ ],
+ 'descriptor': {shape: [24], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'tanh float16 2D tensor',
+ 'graph': {
+ 'inputs': {
+ 'tanhInput': {
+ 'data': [
+ 5.47265625, -1.1533203125, 0.407470703125, 1.830078125,
+ 2.869140625, -4.5703125, 4.1484375, -4.06640625,
+ -3.712890625, 0.90771484375, -0.11083984375, 5.95703125,
+ 1.783203125, 4.0234375, 5.5859375, -5.28125,
+ 1.4150390625, -5.70703125, -1.4443359375, -1.9130859375,
+ 2.75, -0.7421875, 4.85546875, -0.75634765625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'tanh',
+ 'arguments': [{'input': 'tanhInput'}],
+ 'outputs': 'tanhOutput'
+ }],
+ 'expectedOutputs': {
+ 'tanhOutput': {
+ 'data': [
+ 1,
+ -0.81884765625,
+ 0.38623046875,
+ 0.94970703125,
+ 0.99365234375,
+ -1,
+ 0.99951171875,
+ -0.99951171875,
+ -0.9990234375,
+ 0.72021484375,
+ -0.11041259765625,
+ 1,
+ 0.94482421875,
+ 0.99951171875,
+ 1,
+ -1,
+ 0.888671875,
+ -1,
+ -0.89453125,
+ -0.95751953125,
+ 0.99169921875,
+ -0.63037109375,
+ 1,
+ -0.63916015625
+ ],
+ 'descriptor': {shape: [4, 6], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'tanh float16 3D tensor',
+ 'graph': {
+ 'inputs': {
+ 'tanhInput': {
+ 'data': [
+ 5.47265625, -1.1533203125, 0.407470703125, 1.830078125,
+ 2.869140625, -4.5703125, 4.1484375, -4.06640625,
+ -3.712890625, 0.90771484375, -0.11083984375, 5.95703125,
+ 1.783203125, 4.0234375, 5.5859375, -5.28125,
+ 1.4150390625, -5.70703125, -1.4443359375, -1.9130859375,
+ 2.75, -0.7421875, 4.85546875, -0.75634765625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'tanh',
+ 'arguments': [{'input': 'tanhInput'}],
+ 'outputs': 'tanhOutput'
+ }],
+ 'expectedOutputs': {
+ 'tanhOutput': {
+ 'data': [
+ 1,
+ -0.81884765625,
+ 0.38623046875,
+ 0.94970703125,
+ 0.99365234375,
+ -1,
+ 0.99951171875,
+ -0.99951171875,
+ -0.9990234375,
+ 0.72021484375,
+ -0.11041259765625,
+ 1,
+ 0.94482421875,
+ 0.99951171875,
+ 1,
+ -1,
+ 0.888671875,
+ -1,
+ -0.89453125,
+ -0.95751953125,
+ 0.99169921875,
+ -0.63037109375,
+ 1,
+ -0.63916015625
+ ],
+ 'descriptor': {shape: [2, 3, 4], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'tanh float16 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'tanhInput': {
+ 'data': [
+ 5.47265625, -1.1533203125, 0.407470703125, 1.830078125,
+ 2.869140625, -4.5703125, 4.1484375, -4.06640625,
+ -3.712890625, 0.90771484375, -0.11083984375, 5.95703125,
+ 1.783203125, 4.0234375, 5.5859375, -5.28125,
+ 1.4150390625, -5.70703125, -1.4443359375, -1.9130859375,
+ 2.75, -0.7421875, 4.85546875, -0.75634765625
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'tanh',
+ 'arguments': [{'input': 'tanhInput'}],
+ 'outputs': 'tanhOutput'
+ }],
+ 'expectedOutputs': {
+ 'tanhOutput': {
+ 'data': [
+ 1,
+ -0.81884765625,
+ 0.38623046875,
+ 0.94970703125,
+ 0.99365234375,
+ -1,
+ 0.99951171875,
+ -0.99951171875,
+ -0.9990234375,
+ 0.72021484375,
+ -0.11041259765625,
+ 1,
+ 0.94482421875,
+ 0.99951171875,
+ 1,
+ -1,
+ 0.888671875,
+ -1,
+ -0.89453125,
+ -0.95751953125,
+ 0.99169921875,
+ -0.63037109375,
+ 1,
+ -0.63916015625
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'float16'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'tanh float16 5D tensor',
+ 'graph': {
+ 'inputs': {
+ 'tanhInput': {
+ 'data': [
+ 5.47265625, -1.1533203125, 0.407470703125, 1.830078125,
+ 2.869140625, -4.5703125, 4.1484375, -4.06640625,
+ -3.712890625, 0.90771484375, -0.11083984375, 5.95703125,
+ 1.783203125, 4.0234375, 5.5859375, -5.28125,
+ 1.4150390625, -5.70703125, -1.4443359375, -1.9130859375,
+ 2.75, -0.7421875, 4.85546875, -0.75634765625
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ },
+ 'operators': [{
+ 'name': 'tanh',
+ 'arguments': [{'input': 'tanhInput'}],
+ 'outputs': 'tanhOutput'
+ }],
+ 'expectedOutputs': {
+ 'tanhOutput': {
+ 'data': [
+ 1,
+ -0.81884765625,
+ 0.38623046875,
+ 0.94970703125,
+ 0.99365234375,
+ -1,
+ 0.99951171875,
+ -0.99951171875,
+ -0.9990234375,
+ 0.72021484375,
+ -0.11041259765625,
+ 1,
+ 0.94482421875,
+ 0.99951171875,
+ 1,
+ -1,
+ 0.888671875,
+ -1,
+ -0.89453125,
+ -0.95751953125,
+ 0.99169921875,
+ -0.63037109375,
+ 1,
+ -0.63916015625
+ ],
+ 'descriptor': {shape: [2, 1, 4, 1, 3], dataType: 'float16'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js
index 7cecf29061f..f5802aa1137 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -7,12 +7,12 @@ const operatorToleranceDict = {
gelu: {float32: 18, float16: 18},
hardSigmoid: {float32: 2, float16: 2},
hardSwish: {float32: 4, float16: 4},
- leakyRelu: {float32: 1, float16: 1},
+ leakyRelu: {float32: 1, float16: 2},
linear: {float32: 2, float16: 2},
prelu: {float32: 1, float16: 1},
relu: {float32: 0, float16: 0},
reshape: {float32: 0, float16: 0},
- sigmoid: {float32: 34, float16: 3},
+ sigmoid: {float32: 34, float16: 10},
softplus: {float32: 18, float16: 18},
softsign: {float32: 3, float16: 3},
};
@@ -289,7 +289,7 @@ const assert_array_approx_equals_ulp = (actual, expected, nulp, dataType, descri
actual.length === expected.length,
`assert_array_approx_equals_ulp: ${description} lengths differ, ` +
`expected ${expected.length} but got ${actual.length}`);
- let actualBitwise, expectedBitwise, distance;
+ let distance;
for (let i = 0; i < actual.length; i++) {
if (actual[i] === expected[i]) {
continue;
@@ -303,7 +303,10 @@ const assert_array_approx_equals_ulp = (actual, expected, nulp, dataType, descri
assert_true(
false,
`assert_array_approx_equals_ulp: ${description} actual ` +
- `${actual[i]} should be close enough to expected ` +
+ `${
+ dataType === 'float16' ?
+ float16AsUint16ToNumber(actual[i]) :
+ actual[i]} should be close enough to expected ` +
`${expected[i]} by the acceptable ${nulp} ULP distance, ` +
`but they have ${distance} ULP distance`);
}
@@ -330,6 +333,14 @@ const ulpDistance = (a, b, dataType) => {
aBitwise = a;
// convert b data of Float16 to Uint16
bBitwise = toHalf(b);
+
+ // Workaround to use mask to check returned special float16 value -0.0 which
+ // is 32768 (1000 0000 0000 0000) of uint16
+ const signExclusionMask = 0x00007FFF;
+ if ((aBitwise & signExclusionMask) === 0 &&
+ (bBitwise & signExclusionMask) === 0) {
+ return 0;
+ }
} else if (dataType === 'int64' || dataType === 'uint64') {
aBitwise = BigInt(a);
bBitwise = BigInt(b);
@@ -975,6 +986,15 @@ const getConv2dPrecisionTolerance =
return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
};
+const getInstanceNormPrecisionTolerance = (graphResources) => {
+ // according to
+ // https://github.com/web-platform-tests/wpt/pull/43891#discussion_r1457026316
+ const toleranceValueDict = {float32: 840, float16: 8400};
+ const expectedDataType =
+ getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
+ return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
+};
+
const getExpectedDataTypeOfSingleOutput = (expectedOutput) => {
const expectedDescriptor =
expectedOutput[Object.keys(expectedOutput)[0]].descriptor;
diff --git a/tests/wpt/tests/webrtc-encoded-transform/WEB_FEATURES.yml b/tests/wpt/tests/webrtc-encoded-transform/WEB_FEATURES.yml
new file mode 100644
index 00000000000..0df5a2c40ef
--- /dev/null
+++ b/tests/wpt/tests/webrtc-encoded-transform/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: webrtc-encoded-transform
+ files: "**"
diff --git a/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html b/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html
index b760c7b05a5..05c0849f7a0 100644
--- a/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html
+++ b/tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html
@@ -151,12 +151,15 @@
assert_equals(candidate.usernameFragment, null, 'usernameFragment');
}, 'new RTCIceCandidate({ ... }) with invalid candidate string and sdpMid');
+["most", "all"].forEach(howMany => {
test(t => {
const candidate = new RTCIceCandidate({
candidate: candidateString,
sdpMid: 'video',
sdpMLineIndex: 1,
- usernameFragment: 'test'
+ usernameFragment: 'test',
+ relayProtocol: 'udp',
+ url: 'stun:stun.example.org'
});
assert_equals(candidate.candidate, candidateString, 'candidate');
@@ -175,14 +178,21 @@
assert_equals(candidate.tcpType, null, 'tcpType');
assert_equals(candidate.relatedAddress, null, 'relatedAddress');
assert_equals(candidate.relatedPort, null, 'relatedPort');
- }, 'new RTCIceCandidate({ ... }) with nondefault values for all fields');
+ // The remaining fields are newer, so test them seperately
+ if (howMany != "most") {
+ assert_equals(candidate.relayProtocol, 'udp', 'relayProtocol');
+ assert_equals(candidate.url, 'stun:stun.example.org', 'url');
+ }
+ }, `new RTCIceCandidate({ ... }) with nondefault values for ${howMany} fields`);
test(t => {
const candidate = new RTCIceCandidate({
candidate: candidateString2,
sdpMid: 'video',
sdpMLineIndex: 1,
- usernameFragment: 'user1'
+ usernameFragment: 'user1',
+ relayProtocol: 'tcp',
+ url: 'turn:turn.example.net'
});
assert_equals(candidate.candidate, candidateString2, 'candidate');
@@ -201,7 +211,28 @@
assert_equals(candidate.tcpType, 'active', 'tcpType');
assert_equals(candidate.relatedAddress, 'www.example.com', 'relatedAddress');
assert_equals(candidate.relatedPort, 22222, 'relatedPort');
- }, 'new RTCIceCandidate({ ... }) with nondefault values for all fields, tcp candidate');
+ // The remaining fields are newer, so test them seperately
+ if (howMany != "most") {
+ assert_equals(candidate.url, 'turn:turn.example.net', 'url');
+ assert_equals(candidate.relayProtocol, 'tcp', 'relayProtocol');
+ }
+ }, `new RTCIceCandidate({ ... }) with nondefault values for ${howMany} fields, tcp candidate`);
+});
+
+ test(t => {
+ let candidate = new RTCIceCandidate(new RTCIceCandidate({
+ sdpMid: 'video',
+ relayProtocol: 'tls',
+ url: 'turn:turn.example.net'
+ }));
+
+ assert_equals(candidate.relayProtocol, 'tls', 'relayProtocol cloned');
+ assert_equals(candidate.url, 'turn:turn.example.net', 'url cloned');
+
+ candidate = new RTCIceCandidate(JSON.parse(JSON.stringify(candidate)));
+ assert_equals(candidate.relayProtocol, null, 'relayProtocol not signaled');
+ assert_equals(candidate.url, null, 'url not signaled');
+ }, `new RTCIceCandidate({ relayProtocol, url }) cloned vs signaled`);
test(t => {
// sdpMid is not validated in RTCIceCandidate
diff --git a/tests/wpt/tests/webrtc/RTCIceTransport.html b/tests/wpt/tests/webrtc/RTCIceTransport.html
index 31504481f4b..f00af08e97c 100644
--- a/tests/wpt/tests/webrtc/RTCIceTransport.html
+++ b/tests/wpt/tests/webrtc/RTCIceTransport.html
@@ -125,6 +125,11 @@
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
+ const pc1Candidates = new Set();
+ const pc2Candidates = new Set();
+ pc1.addEventListener('icecandidate', e => { if (e.candidate) pc1Candidates.add(e.candidate.candidate); });
+ pc2.addEventListener('icecandidate', e => { if (e.candidate) pc2Candidates.add(e.candidate.candidate); });
+
return createDataChannelPair(t, {}, pc1, pc2)
.then(([channel1, channel2]) => {
// Send a ping message and wait for it just to make sure
@@ -136,6 +141,22 @@
const iceTransport1 = getIceTransportFromSctp(pc1);
const iceTransport2 = getIceTransportFromSctp(pc2);
+ test(() => {
+ const candidatePair1 = iceTransport1.getSelectedCandidatePair();
+ const candidatePair2 = iceTransport2.getSelectedCandidatePair();
+
+ assert_equals(candidatePair1.local.candidate, candidatePair2.remote.candidate,
+ 'Expect selected local candidate of one pc is the selected remote candidate or another');
+
+ assert_equals(candidatePair1.remote.candidate, candidatePair2.local.candidate,
+ 'Expect selected local candidate of one pc is the selected remote candidate or another');
+
+ assert_true(pc1Candidates.has(candidatePair1.local.candidate), "pc1 selected local candidate in pc1 candidates");
+ assert_true(pc1Candidates.has(candidatePair2.remote.candidate), "pc2 selected remote candidate in pc1 candidates");
+ assert_true(pc2Candidates.has(candidatePair2.local.candidate), "pc2 selected local candidate in pc2 candidates");
+ assert_true(pc2Candidates.has(candidatePair1.remote.candidate), "pc1 selected remote candidate in pc2 candidates");
+ }, "Validate selected candidate pair");
+
validateConnectedIceTransport(iceTransport1);
validateConnectedIceTransport(iceTransport2);
@@ -149,15 +170,6 @@
iceTransport2.getLocalCandidates().length,
`Expect iceTransport1 to have same number of remote candidate as iceTransport2's local candidates`);
- const candidatePair1 = iceTransport1.getSelectedCandidatePair();
- const candidatePair2 = iceTransport2.getSelectedCandidatePair();
-
- assert_equals(candidatePair1.local.candidate, candidatePair2.remote.candidate,
- 'Expect selected local candidate of one pc is the selected remote candidate or another');
-
- assert_equals(candidatePair1.remote.candidate, candidatePair2.local.candidate,
- 'Expect selected local candidate of one pc is the selected remote candidate or another');
-
assert_equals(iceTransport1.role, 'controlling',
`Expect offerer's iceTransport to take the controlling role`);
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html b/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html
index 618ef7e33c6..4517554bc0b 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-addIceCandidate.html
@@ -641,4 +641,28 @@ a=rtcp-rsize
usernameFragment: usernameFragment1
})));
}, 'Add candidate with sdpMid belonging to different usernameFragment should reject with OperationError');
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ await pc.setRemoteDescription(sessionDesc);
+ const recognized = [];
+ await pc.addIceCandidate({
+ candidate: candidateStr1,
+ sdpMid: sdpMid1,
+ get relayProtocol() {
+ recognized.push("relayProtocol");
+ return null;
+ },
+ get url() {
+ recognized.push("url");
+ return null;
+ },
+ get usernameFragment() {
+ recognized.push("usernameFragment");
+ return null;
+ },
+ });
+ assert_array_equals(recognized, ['usernameFragment']);
+ }, 'addIceCandidate should not recognize relayProtocol or url');
</script>
diff --git a/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html b/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html
index cb5336f3f35..de9ad184af0 100644
--- a/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html
+++ b/tests/wpt/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html
@@ -100,14 +100,4 @@ promise_test(async t => {
assert_less_than_equal(ssrc.audioLevel, 1);
}, '[audio-only] RTCRtpSynchronizationSource.audioLevel is a number [0, 1]');
-// This test only passes if the implementation is sending the RFC 6464 extension
-// header and the "vad" extension attribute is not "off", otherwise
-// voiceActivityFlag is absent. TODO: Consider moving this test to an
-// optional-to-implement subfolder?
-promise_test(async t => {
- const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
- const [ssrc] = await listenForSSRCs(t, receiver);
- assert_equals(typeof ssrc.voiceActivityFlag, 'boolean');
-}, '[audio-only] RTCRtpSynchronizationSource.voiceActivityFlag is a boolean');
-
</script>
diff --git a/tests/wpt/tests/webrtc/protocol/av1-profile-asymmetry.https.html b/tests/wpt/tests/webrtc/protocol/av1-profile-asymmetry.https.html
new file mode 100644
index 00000000000..f7d14ad6d86
--- /dev/null
+++ b/tests/wpt/tests/webrtc/protocol/av1-profile-asymmetry.https.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../third_party/sdp/sdp.js"></script>
+<script>
+'use strict';
+
+promise_test(async t => {
+ const av1SendCodec = RTCRtpSender.getCapabilities('video').codecs.find(
+ codec => codec.mimeType == 'video/AV1');
+ assert_not_equals(av1SendCodec, undefined);
+
+ const pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc2.close());
+
+ const transceiver = pc1.addTransceiver('video');
+ transceiver.setCodecPreferences([av1SendCodec]);
+
+ await pc1.setLocalDescription();
+ await pc2.setRemoteDescription(pc1.localDescription);
+ await pc2.setLocalDescription();
+ await pc1.setRemoteDescription(pc2.localDescription);
+
+ // Modify the profile ID of `av1SendCodec` to ensure a strict codec comparison
+ // matcher would no longer consider them the same.
+ const sdpFmtpMap = SDPUtils.parseFmtp(av1SendCodec.sdpFmtpLine);
+ const profileId = Number(sdpFmtpMap['profile']);
+ av1SendCodec.sdpFmtpLine =
+ av1SendCodec.sdpFmtpLine.replace(`profile=${profileId}`,
+ `profile=${profileId + 1}`);
+
+ const sender = transceiver.sender;
+ let params = sender.getParameters();
+ params.encodings[0].codec = av1SendCodec;
+ // Set parameters should not reject because the codec dictionary match
+ // algorithm[1] is able to ignore asymmetrical parameters such as AV1's
+ // `profile` parameter, see [2].
+ //
+ // [1] https://w3c.github.io/webrtc-pc/#dfn-codec-dictionary-match
+ // [2] https://aomediacodec.github.io/av1-rtp-spec/#723-usage-with-the-sdp-offeranswer-model
+ await sender.setParameters(params);
+ // getParameters() returns `av1SendCodec` now.
+ params = sender.getParameters();
+ assert_equals(params.encodings[0].codec.mimeType, 'video/AV1');
+ assert_equals(params.encodings[0].codec.sdpFmtpLine,
+ av1SendCodec.sdpFmtpLine);
+}, `setParameters() ignores the asymmetrical AV1 parameter 'profile'`);
+</script>
diff --git a/tests/wpt/tests/webrtc/protocol/h265-loopback.https.html b/tests/wpt/tests/webrtc/protocol/h265-loopback.https.html
new file mode 100644
index 00000000000..c3a394ef8f4
--- /dev/null
+++ b/tests/wpt/tests/webrtc/protocol/h265-loopback.https.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../RTCPeerConnection-helper.js"></script>
+<script>
+'use strict';
+
+async function pollGetStatsUntil(t, pc, condition, pollingMs = 100) {
+ while (true) {
+ const report = await pc.getStats();
+ for (const stats of report.values()) {
+ if (condition(report, stats) == true) {
+ // Condition satisfied, stop polling.
+ return;
+ }
+ }
+ await new Promise(r => t.step_timeout(r, pollingMs));
+ }
+}
+
+function isRtpWithCodec(report, stats, mimeType) {
+ if (stats.type != 'outbound-rtp' && stats.type != 'inbound-rtp') {
+ return false; // Not an RTP stats object.
+ }
+ const codec = report.get(stats.codecId);
+ return codec && codec.mimeType == mimeType;
+}
+
+promise_test(async t => {
+ const sendCodec = RTCRtpSender.getCapabilities('video').codecs.find(
+ codec => codec.mimeType == 'video/H265');
+ const recvCodec = RTCRtpReceiver.getCapabilities('video').codecs.find(
+ codec => codec.mimeType == 'video/H265');
+ assert_implements_optional(
+ sendCodec != undefined && recvCodec != undefined,
+ 'H265 not available for sending or receiving. Loopback requires both.');
+
+ const pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc2.close());
+ pc1.onicecandidate = (e) => pc2.addIceCandidate(e.candidate);
+ pc2.onicecandidate = (e) => pc1.addIceCandidate(e.candidate);
+
+ const stream = await getNoiseStream({video:{width:640, height:360}});
+ const [track] = stream.getVideoTracks();
+ t.add_cleanup(() => track.stop());
+
+ // Negotiate H265.
+ const transceiver = pc1.addTransceiver(track);
+ transceiver.setCodecPreferences([sendCodec]);
+ await pc1.setLocalDescription();
+ await pc2.setRemoteDescription(pc1.localDescription);
+ await pc2.setLocalDescription();
+ await pc1.setRemoteDescription(pc2.localDescription);
+
+ // Wait for H265 frames to be encoded and sent.
+ await pollGetStatsUntil(t, pc1, (report, stats) => {
+ if (!isRtpWithCodec(report, stats, 'video/H265')) {
+ return false;
+ }
+ assert_equals(stats.type, 'outbound-rtp');
+ return stats.framesEncoded > 0 && stats.framesSent > 0;
+ });
+ // Wait for H265 frames to be received and decoded.
+ await pollGetStatsUntil(t, pc2, (report, stats) => {
+ if (!isRtpWithCodec(report, stats, 'video/H265')) {
+ return false;
+ }
+ assert_equals(stats.type, 'inbound-rtp');
+ return stats.framesReceived > 0 && stats.framesDecoded > 0;
+ });
+}, `Negotiate H265 loopback and verify frames are flowing`);
+</script>
diff --git a/tests/wpt/tests/xhr/resources/redirect.py b/tests/wpt/tests/xhr/resources/redirect.py
index 3839b635e02..e2786b45031 100644
--- a/tests/wpt/tests/xhr/resources/redirect.py
+++ b/tests/wpt/tests/xhr/resources/redirect.py
@@ -1,10 +1,15 @@
import time
+from urllib.parse import parse_qs
from wptserve.utils import isomorphic_encode
def main(request, response):
code = int(request.GET.first(b"code", 302))
location = request.GET.first(b"location", isomorphic_encode(request.url_parts.path + u"?followed"))
+ if location:
+ location = parse_qs(u"location=" + location.decode(u"UTF-8"))[u"location"][0]
+ if location.startswith(u"redirect.py"):
+ location += u"&code=" + str(code)
if b"delay" in request.GET:
delay = float(request.GET.first(b"delay"))
diff --git a/tests/wpt/tests/xhr/send-redirect.htm b/tests/wpt/tests/xhr/send-redirect.htm
index 7d73f0f64cc..de3899f5e5d 100644
--- a/tests/wpt/tests/xhr/send-redirect.htm
+++ b/tests/wpt/tests/xhr/send-redirect.htm
@@ -10,36 +10,73 @@
<div id="log"></div>
<script>
// https://fetch.spec.whatwg.org/#statuses
- var redirect_codes = new Set([301, 302, 303, 307, 308]);
- function redirect(code) {
- var test = async_test(`${document.title} (${code} does ${redirect_codes.has(code)? "redirect": "not redirect"})`);
- test.step(function() {
- var client = new XMLHttpRequest();
- client.onreadystatechange = function() {
- test.step(function() {
- if(client.readyState == 4) {
- if (redirect_codes.has(code)) {
- assert_equals(client.getResponseHeader("x-request-method"), "GET");
- assert_equals(client.getResponseHeader("x-request-content-type"), "application/x-pony");
- assert_equals(client.status, 200);
- } else {
- assert_equals(client.getResponseHeader("x-request-method"), null);
- assert_equals(client.getResponseHeader("x-request-content-type"), null);
- assert_equals(client.status, code);
+ const redirect_codes = new Set([301, 302, 303, 307, 308]);
+ function maybeRedirect(code, method="GET", redirectLocation="content.py") {
+ async_test(t => {
+ const client = new XMLHttpRequest();
+ client.onreadystatechange = t.step_func(() => {
+ if(client.readyState == 4) {
+ if (redirect_codes.has(code)) {
+ let expected_method = method;
+ let expected_content_type = "application/x-pony";
+ if ((method == "POST" && (code == "301" || code == "302")) ||
+ (code == "303" && method != "GET" && method != "HEAD")) {
+ expected_method = "GET";
+ expected_content_type = "NO";
}
- test.done();
+ assert_equals(client.getResponseHeader("x-request-method"), expected_method);
+ assert_equals(client.getResponseHeader("x-request-content-type"), expected_content_type);
+ assert_equals(client.status, 200);
+ } else {
+ assert_equals(client.getResponseHeader("x-request-method"), null);
+ assert_equals(client.getResponseHeader("x-request-content-type"), null);
+ assert_equals(client.status, code);
}
- })
- }
- client.open("GET", "resources/redirect.py?location=content.py&code=" + code);
+ t.done();
+ }
+ });
+ client.open(method, `resources/redirect.py?location=${redirectLocation}&code=${code}`);
client.setRequestHeader("Content-Type", "application/x-pony");
client.send(null);
- })
+ }, `${document.title} (${code}, ${method}, ${redirectLocation})`);
}
- for (var number of [300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 350, 399]) {
- redirect(number);
- }
+ maybeRedirect(300);
+ maybeRedirect(301);
+ maybeRedirect(302);
+ maybeRedirect(303);
+ maybeRedirect(304);
+ maybeRedirect(305);
+ maybeRedirect(306);
+ maybeRedirect(307);
+ maybeRedirect(308);
+ maybeRedirect(309);
+ maybeRedirect(310);
+ maybeRedirect(350);
+ maybeRedirect(399);
+ maybeRedirect(301, "POST");
+ maybeRedirect(302, "POST");
+ maybeRedirect(303, "POST");
+ maybeRedirect(307, "POST");
+ maybeRedirect(301, "HEAD");
+ maybeRedirect(302, "HEAD");
+ maybeRedirect(303, "HEAD");
+ maybeRedirect(307, "HEAD");
+
+ const redirectedLocation = encodeURIComponent("redirect.py?location=content.py");
+ maybeRedirect(301, "GET", redirectedLocation);
+ maybeRedirect(302, "GET", redirectedLocation);
+ maybeRedirect(303, "GET", redirectedLocation);
+ maybeRedirect(307, "GET", redirectedLocation);
+ maybeRedirect(301, "POST", redirectedLocation);
+ maybeRedirect(302, "POST", redirectedLocation);
+ maybeRedirect(303, "POST", redirectedLocation);
+ maybeRedirect(307, "POST", redirectedLocation);
+ maybeRedirect(303, "CHICKEN", redirectedLocation);
+ maybeRedirect(301, "HEAD", redirectedLocation);
+ maybeRedirect(302, "HEAD", redirectedLocation);
+ maybeRedirect(303, "HEAD", redirectedLocation);
+ maybeRedirect(307, "HEAD", redirectedLocation);
</script>
</body>
</html>
diff --git a/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm b/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm
index 1aed30d1c2a..ce10482cad8 100644
--- a/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm
+++ b/tests/wpt/tests/xhr/setrequestheader-case-insensitive.htm
@@ -9,26 +9,28 @@
<body>
<div id="log"></div>
<script>
- test(function() {
- var client = new XMLHttpRequest()
- client.open("POST", "resources/inspect-headers.py?filter_value=t1, t2, t3", false)
- client.setRequestHeader("x-test", "t1")
- client.setRequestHeader("X-TEST", "t2")
- client.setRequestHeader("X-teST", "t3")
- client.send(null)
- assert_equals(client.responseText, "x-test,")
- })
+ test(() => {
+ const client = new XMLHttpRequest();
+ client.open("POST", "resources/inspect-headers.py?filter_value=t1, t2, t3", false);
+ client.setRequestHeader("x-test", "t1");
+ client.setRequestHeader("X-TEST", "t2");
+ client.setRequestHeader("X-teST", "t3");
+ client.send(null);
+ assert_equals(client.responseText, "x-test,");
+ });
test(() => {
- const client = new XMLHttpRequest
- client.open("GET", "resources/echo-headers.py", false)
- client.setRequestHeader("THIS-IS-A-TEST", "1")
- client.setRequestHeader("THIS-is-A-test", "2")
- client.setRequestHeader("content-TYPE", "x/x")
- client.send()
- assert_regexp_match(client.responseText, /content-TYPE/)
- assert_regexp_match(client.responseText, /THIS-IS-A-TEST: 1, 2/)
- })
+ const client = new XMLHttpRequest();
+ client.open("GET", "resources/echo-headers.py", false);
+ client.setRequestHeader("THIS-IS-A-TEST", "1");
+ client.setRequestHeader("THIS-is-A-test", "2");
+ client.setRequestHeader("content-TYPE", "x/x");
+ client.send();
+ const contentTypeHeader = client.responseText.match(/content-TYPE/gi);
+ const thisIsATestHeader = client.responseText.match(/THIS-IS-A-TEST: 1, 2/gi);
+ assert_array_equals(contentTypeHeader, ["content-TYPE"]);
+ assert_array_equals(thisIsATestHeader, ["THIS-IS-A-TEST: 1, 2"]);
+ });
</script>
</body>
</html>
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..68603ee5931 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
@@ -1,16 +1,4 @@
[texture-upload-size.html]
- [WebGL test #100]
- expected: FAIL
-
- [WebGL test #116]
- expected: FAIL
-
- [WebGL test #124]
- expected: FAIL
-
- [WebGL test #132]
- expected: FAIL
-
[WebGL test #156]
expected: FAIL
@@ -23,17 +11,8 @@
[WebGL test #236]
expected: FAIL
- [WebGL test #52]
- expected: FAIL
-
[WebGL test #588]
expected: FAIL
- [WebGL test #78]
- expected: FAIL
-
- [WebGL test #82]
- expected: FAIL
-
- [WebGL test #84]
+ [WebGL test #60]
expected: FAIL