aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/meta/FileAPI/url/url-with-fetch.any.js.ini3
-rw-r--r--tests/wpt/meta/MANIFEST.json2322
-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.ini45
-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/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/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-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-tables/table-cell-overflow-auto-scrolled.html.ini2
-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/filter-effects/feComposite-intersection-feTile-input.html.ini2
-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/empty-iframe-load-event.html.ini6
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini2
-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/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/media-elements/offsets-into-the-media-resource/currentTime.html.ini4
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini1
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.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/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini9
-rw-r--r--tests/wpt/meta/subresource-integrity/signatures/tentative/accept-signature.window.js.ini9
-rw-r--r--tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini2
-rw-r--r--tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini2
-rw-r--r--tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini2
-rw-r--r--tests/wpt/tests/.github/workflows/docker.yml2
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js6
-rw-r--r--tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js46
-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/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/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-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.html21
-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.js4
-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.js4
-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-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/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/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-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/line-clamp/line-clamp-auto-002-crash.html27
-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-overscroll-behavior/overscroll-behavior-root.html3
-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/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/snap-after-relayout/resnap-on-oveflow-hidden-container.html63
-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/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/hypot-pow-sqrt-invalid.html3
-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/navigate-after-hide.html3
-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-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/zoom-revert-layer-crash.html4
-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/filter-effects/feComposite-intersection-feTile-input-ref.html5
-rw-r--r--tests/wpt/tests/css/filter-effects/feComposite-intersection-feTile-input.html36
-rw-r--r--tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html213
-rw-r--r--tests/wpt/tests/ecmascript/locale-compat.html7
-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/event-timing/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/fetch/private-network-access/README.md3
-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/html/browsers/the-window-object/open-close/open_initial_size.html28
-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/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/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/widgets/field-sizing-textarea-relayout.html2
-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/interactive-elements/the-dialog-element/focus-after-close.html7
-rw-r--r--tests/wpt/tests/largest-contentful-paint/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/lint.ignore2
-rw-r--r--tests/wpt/tests/media-capabilities/decodingInfo.any.js91
-rw-r--r--tests/wpt/tests/media-capabilities/encodingInfo.any.js91
-rw-r--r--tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html97
-rw-r--r--tests/wpt/tests/mediacapture-record/legacy/MediaRecorder-canvas-media-source-legacy.https.html165
-rw-r--r--tests/wpt/tests/resources/testdriver.js38
-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-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/shadow-dom/focus/text-selection-with-delegatesFocus-text-control.html63
-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/subresource-integrity/signatures/tentative/accept-signature.window.js14
-rw-r--r--tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js2
-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.py3
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/actions.py17
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py15
-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/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.html10
-rw-r--r--tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html11
-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.js35
-rw-r--r--tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers7
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js28
-rw-r--r--tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers9
-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-no-unsafe-eval.html.headers3
-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-eval-reporting.html.headers4
-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.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.json21
-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-utils.js12
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/constant-reshape-optimization.https.any.js96
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js10
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/reshape.https.any.js42
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/subgraph.https.any.js131
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js9
-rw-r--r--tests/wpt/tests/webrtc/RTCIceCandidate-constructor.html39
-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/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/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini6
404 files changed, 10968 insertions, 2222 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..b275cb58343 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]
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 117f1af832b..a9e0663a711 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -762,6 +762,13 @@
{}
]
],
+ "chrome-bug-404743651.html": [
+ "238862374028415bb2ddb91de5f9a16132ec654d",
+ [
+ null,
+ {}
+ ]
+ ],
"pseudo-element-animation-with-marker.html": [
"ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5",
[
@@ -2496,6 +2503,15 @@
]
]
},
+ "css-easing": {
+ "linear-timing-functions-chrome-405004975-crash.html": [
+ "510b51716cec67fcdad51d44e2124c5986efa3f3",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"css-flexbox": {
"animation": {
"flex-basis-content-crash.html": [
@@ -4162,6 +4178,13 @@
{}
]
],
+ "line-clamp-auto-002-crash.html": [
+ "be5693c70456bd664dd219d6985067400a26084e",
+ [
+ null,
+ {}
+ ]
+ ],
"webkit-line-clamp-041-crash.html": [
"3f4bf3c8ef578fa22469e81e504879aa5d713bf8",
[
@@ -5735,6 +5758,13 @@
null,
{}
]
+ ],
+ "zoom-revert-layer-crash.html": [
+ "c75b792e6de78a27a4c5961a0efcbf7593f02eb7",
+ [
+ null,
+ {}
+ ]
]
}
},
@@ -123902,6 +123932,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",
[
@@ -125550,6 +125609,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",
[
@@ -135995,7 +136067,7 @@
},
"corner-shape": {
"corner-shape-any.html": [
- "9c256eb89778f8060906b7d943d08a01a3cfe300",
+ "5b197317eb182639168b21a8ad522c081aba6f26",
[
"css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30px",
[
@@ -136023,6 +136095,84 @@
}
],
[
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 180
+ ],
+ [
+ 0,
+ 520
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 180
+ ],
+ [
+ 0,
+ 520
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 180
+ ],
+ [
+ 0,
+ 520
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
"css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-bottom-right-shape=superellipse(1.9)&border-bottom-right-radius=50%",
[
[
@@ -136049,6 +136199,32 @@
}
],
[
+ "css/css-borders/tentative/corner-shape/corner-shape-any.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,
+ 180
+ ],
+ [
+ 0,
+ 520
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
"css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-radius=50%",
[
[
@@ -136075,6 +136251,32 @@
}
],
[
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px",
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 180
+ ],
+ [
+ 0,
+ 520
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
"css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-shape=squircle&border-top-left-radius=30%",
[
[
@@ -136205,10 +136407,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-any.html?corner-top-left-shape=bevel&border-radius=40px",
[
[
- "/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-top-left-shape=bevel&border-radius=40px",
"=="
]
],
@@ -136231,10 +136433,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-any.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-right-shape=superellipse(0.1)&border-top-right-radius=50px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px",
"=="
]
],
@@ -136255,15 +136457,12 @@
]
]
}
- ]
- ],
- "corner-shape-bevel-overflow-composite.html": [
- "985b5efdc9b9c868465d658e5486cd1e7eae5fd5",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=bevel&border-width=10px&border-color=black",
[
[
- "/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-top-left-shape=bevel&border-width=10px&border-color=black",
"=="
]
],
@@ -136274,25 +136473,22 @@
[
[
0,
- 100
+ 180
],
[
0,
- 255
+ 520
]
]
]
]
}
- ]
- ],
- "corner-shape-bevel-overflow.html": [
- "df604db8d13888a2c59488e374ee27ebe6878001",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=scoop&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&border-radius=40px",
"=="
]
],
@@ -136303,25 +136499,22 @@
[
[
0,
- 32
+ 180
],
[
0,
- 32
+ 520
]
]
]
]
}
- ]
- ],
- "corner-shape-fill.html": [
- "6e5df8364c5fa57398644a72d40ca0e3dc8b2b65",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-fill-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%",
"=="
]
],
@@ -136332,25 +136525,22 @@
[
[
0,
- 32
+ 180
],
[
0,
- 32
+ 520
]
]
]
]
}
- ]
- ],
- "corner-shape-notch.html": [
- "79f64070bd8389e5cdcf01566bb0da117d1f313a",
+ ],
[
- null,
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px",
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-notch-ref.html",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px",
"=="
]
],
@@ -136361,25 +136551,22 @@
[
[
0,
- 64
+ 180
],
[
0,
- 64
+ 520
]
]
]
]
}
- ]
- ],
- "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-any.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%",
[
[
- "/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-top-left-shape=superellipse(0.3)&border-radius=40%",
"=="
]
],
@@ -136390,11 +136577,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 520
]
]
]
@@ -136402,10 +136589,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-bottom-right-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(0.8)&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=superellipse(0.8)&border-radius=40px",
"=="
]
],
@@ -136416,11 +136603,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 520
]
]
]
@@ -136428,10 +136615,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-any.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px",
[
[
- "/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=superellipse(1.2)&border-radius=40px",
"=="
]
],
@@ -136442,11 +136629,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 520
]
]
]
@@ -136454,10 +136641,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px",
[
[
- "/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=superellipse(6)&border-radius=20%&border-width=10px",
"=="
]
],
@@ -136468,11 +136655,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 520
]
]
]
@@ -136480,10 +136667,10 @@
}
],
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-left-shape=bevel",
+ "css/css-borders/tentative/corner-shape/corner-shape-any.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-left-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=bevel&border-width=10px&border-color=black",
"=="
]
],
@@ -136494,11 +136681,11 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 520
]
]
]
@@ -136506,10 +136693,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-any.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-left-shape=bevel&border-radius=40px",
+ "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-right-shape=superellipse(0.1)&border-top-right-radius=50px",
"=="
]
],
@@ -136520,22 +136707,25 @@
[
[
0,
- 82
+ 180
],
[
0,
- 800
+ 520
]
]
]
]
}
- ],
+ ]
+ ],
+ "corner-shape-bevel-overflow-composite.html": [
+ "985b5efdc9b9c868465d658e5486cd1e7eae5fd5",
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel",
+ null,
[
[
- "/css/css-borders/tentative/corner-shape/corner-shape-render-ref.html?corner-top-right-shape=bevel",
+ "/css/css-borders/tentative/corner-shape/corner-shape-bevel-overflow-composite-ref.html",
"=="
]
],
@@ -136546,22 +136736,25 @@
[
[
0,
- 82
+ 100
],
[
0,
- 800
+ 255
]
]
]
]
}
- ],
+ ]
+ ],
+ "corner-shape-bevel-overflow.html": [
+ "df604db8d13888a2c59488e374ee27ebe6878001",
[
- "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",
+ null,
[
[
- "/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-bevel-overflow-ref.html",
"=="
]
],
@@ -136572,22 +136765,25 @@
[
[
0,
- 82
+ 32
],
[
0,
- 800
+ 32
]
]
]
]
}
- ],
+ ]
+ ],
+ "corner-shape-fill.html": [
+ "6e5df8364c5fa57398644a72d40ca0e3dc8b2b65",
[
- "css/css-borders/tentative/corner-shape/corner-shape-render.html?corner-top-right-shape=bevel&corner-bottom-right-shape=bevel&border-radius=80px",
+ null,
[
[
- "/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-fill-ref.html",
"=="
]
],
@@ -136598,11 +136794,40 @@
[
[
0,
- 82
+ 32
],
[
0,
- 800
+ 32
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "corner-shape-notch.html": [
+ "79f64070bd8389e5cdcf01566bb0da117d1f313a",
+ [
+ null,
+ [
+ [
+ "/css/css-borders/tentative/corner-shape/corner-shape-notch-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 64
]
]
]
@@ -154382,6 +154607,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",
[
@@ -184968,6 +185219,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",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
}
}
@@ -192325,7 +192706,7 @@
]
],
"masonry-grid-item-self-baseline-002a.html": [
- "6708e58332808b1bba0f20db46cfa062270956b8",
+ "4ece8d754d3d686e4691f5140af9b7f14503e036",
[
null,
[
@@ -192338,7 +192719,7 @@
]
],
"masonry-grid-item-self-baseline-002b.html": [
- "34911b7c9fa632da919b769e015148e2b8c4c488",
+ "cc0eaaa9cc27dc3e54f660314d63f155a838212e",
[
null,
[
@@ -192998,7 +193379,7 @@
]
],
"masonry-item-placement-004.html": [
- "52867cd4a213530e8cb9640b20371a7f35bbaac8",
+ "92741f4b1153ff7487a84e4f053c1288bcd2fa0f",
[
null,
[
@@ -193011,7 +193392,7 @@
]
],
"masonry-item-placement-005.html": [
- "7d4993fb3a61a015af6098e1f79d7e5f94d1b17e",
+ "f879ddce562b40133ac6e5522b86c4bd177c85ef",
[
null,
[
@@ -193024,7 +193405,7 @@
]
],
"masonry-item-placement-006.html": [
- "467e313d339776a90d994459991724b75210e1b9",
+ "0f963762af5a71a73ddbbaa1a6f01ab0396d875a",
[
null,
[
@@ -193037,7 +193418,7 @@
]
],
"masonry-item-placement-007.html": [
- "4c8053ba666b5c6ddc3b61f74a2233151414e4ff",
+ "ebbed114a1171a3218be7e1378c199cb82c0fe97",
[
null,
[
@@ -193062,19 +193443,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",
[
@@ -193128,19 +193496,6 @@
],
{}
]
- ],
- "masonry-order-002.html": [
- "5ebdec27193a454e98fb54ea48508c2b26b3cfa8",
- [
- null,
- [
- [
- "/css/css-grid/masonry/tentative/order/masonry-order-002-ref.html",
- "=="
- ]
- ],
- {}
- ]
]
},
"subgrid": {
@@ -196656,6 +197011,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",
[
@@ -196724,6 +197092,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",
[
@@ -196870,7 +197251,7 @@
]
],
"gradient-eval-004.html": [
- "ada406fd2a0ec8bea1af74daeafc95563174ac1f",
+ "1a9c43610f41cb8cab10543ffcc3fd7ee378dd07",
[
null,
[
@@ -196890,7 +197271,7 @@
],
[
0,
- 10000
+ 2000
]
]
]
@@ -200413,7 +200794,7 @@
]
],
"object-fit-containcontainintrinsicsize-png-001c.tentative.html": [
- "b17f59f887f216f11a386077c41156388624ee27",
+ "dd1bf249a5555aaeec924de5d944442b55452e2f",
[
null,
[
@@ -200465,7 +200846,7 @@
]
],
"object-fit-containsize-png-001c.tentative.html": [
- "43a50adcedcf2bcdf81d86f717ec52e6a96e0f1a",
+ "733b7592f3ba8f748300c7ee681b765ba66cb559",
[
null,
[
@@ -216381,6 +216762,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",
[
@@ -225434,6 +225932,58 @@
{}
]
],
+ "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-counters.html": [
"25e4fdfd24f849128c711cdc5a8610abba5e1d8f",
[
@@ -230468,6 +231018,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",
[
@@ -236544,6 +237107,19 @@
{}
]
],
+ "host-has-internal-004.html": [
+ "fe51186f59f88bdfcf5ed8641938b7491024bfda",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"host-is-001.html": [
"16d0dd76691362ee963e386a2fd238783c096243",
[
@@ -244508,7 +245084,7 @@
]
],
"replaced-element-013.html": [
- "bcbf653d68af4c1f908a59ca6e66e5752a09c833",
+ "564858e360eee6aaa676224fe342409d06486f1b",
[
null,
[
@@ -244521,7 +245097,7 @@
]
],
"replaced-element-014.html": [
- "4c1ad16ce8624295251b73d1a14f53b9c9905610",
+ "8b7bdafc10770d3f3371c5ec7a699f4189c982cb",
[
null,
[
@@ -244845,6 +245421,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",
[
@@ -265245,7 +265847,7 @@
]
],
"text-wrap-balance-before-after-001.html": [
- "9f5741e23492875670f1406e934a1306bdd51973",
+ "7176768b8df4fe19d63188097cd8be96c43ae1cb",
[
null,
[
@@ -265258,7 +265860,7 @@
]
],
"text-wrap-balance-before-after-002.html": [
- "e9d08953fac0963ba2a9639ac9aabb6f3f59764b",
+ "60e3a777df33b008284669c35c64742ea19d6ba0",
[
null,
[
@@ -304533,6 +305135,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",
[
@@ -307183,6 +307814,19 @@
{}
]
],
+ "font-size-keyword-specified.html": [
+ "fc724307f46bc5c77f8599f07e4cca1411d6d0e3",
+ [
+ null,
+ [
+ [
+ "/css/css-viewport/zoom/font-size-keyword-specified-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"font-size.html": [
"e572806be41f21297b6b864f9b74378de35a28c6",
[
@@ -325286,6 +325930,19 @@
{}
]
],
+ "feComposite-intersection-feTile-input.html": [
+ "1bf1f4b8fba8ca37705e276d8c72888f01db4954",
+ [
+ null,
+ [
+ [
+ "/css/filter-effects/feComposite-intersection-feTile-input-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"fecolormatrix-negative.html": [
"eddec862154fc9929a9f7ad8f9cbb0a7d182ef18",
[
@@ -346604,6 +347261,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",
[
@@ -347338,7 +348008,7 @@
]
],
"field-sizing-textarea-relayout.html": [
- "1e18bd2070377923ec1e29d012ddcf94ad7aa6a2",
+ "579462ca2f579b7360790c3ad3a63d0de45e4c41",
[
null,
[
@@ -347353,11 +348023,11 @@
null,
[
[
- 153,
+ 0,
153
],
[
- 2,
+ 0,
2
]
]
@@ -366932,7 +367602,7 @@
[]
],
"docker.yml": [
- "6d5c7c79a05faeaeb5e18040ceedaf99240020c4",
+ "9119c018c2f88232b4aea1bd22e8d69bc9aa3af0",
[]
],
"documentation.yml": [
@@ -370269,6 +370939,10 @@
[]
],
"support": {
+ "clear-cache-helper.sub.js": [
+ "2b2d35abfc571969f414d6f8f7d61f9ac189f284",
+ []
+ ],
"clear-site-data-cache.py": [
"38f131bdd52b51250204cca79972d93a62ace715",
[]
@@ -409787,6 +410461,10 @@
"b07685d951735d521418a98e2b7bf283a068019b",
[]
],
+ "root-element-background-margin-opacity-ref.html": [
+ "afe543029d800f5b3c53c1c2179e981693c033ba",
+ []
+ ],
"root-element-background-transparency-ref.html": [
"4671d44c1c3f3e2ff16149cbaabebb0433aef3e5",
[]
@@ -410225,6 +410903,10 @@
"398217c4587e0c5f5364b00b8b39b49885c7f27b",
[]
],
+ "animate-with-background-color-oklch-001-ref.html": [
+ "92b91077f3fe1cc66cca5b5202cd5d9a2d5f6b50",
+ []
+ ],
"animation-common-ref.html": [
"ddc7da67ddf5fed83e653d1130a65f5c1e3a6dec",
[]
@@ -412436,7 +413118,7 @@
"tentative": {
"corner-shape": {
"corner-shape-any-ref.html": [
- "688f01c8668554efce1ccde22ebf2b12a2ff61c8",
+ "36fc7a88825fea38ad5cfcdf544946e3644cc00b",
[]
],
"corner-shape-bevel-overflow-composite-ref.html": [
@@ -412455,25 +413137,21 @@
"8963c0ca2939c4036d9505461c9772b803b586f2",
[]
],
- "corner-shape-render-ref.html": [
- "1a9043cbc827f4ef4b1ba753e1fae278647de5f2",
- []
- ],
"corner-shape-straight-ref.html": [
"4576240ef3288a954c9a627cbafd640eacd95444",
[]
],
"resources": {
"corner-shape.js": [
- "2aaaf5ed28987608fba8f4f8b756cd3062e82498",
+ "6de6c9a5d7ef206f8f6bebae651a0e93b55cec77",
[]
],
"corner-utils.js": [
- "39203aefc67d57e9e0128112e60ac5b01e147d95",
+ "bacaaa8a6e4ae7f68bab460e8e98b292d103bb69",
[]
],
"resolve-corner-style.js": [
- "ea065f577e09c30b56cf1171685375b7aefeebc7",
+ "b584994b4ea52295381f4c79b34fa63a78afec7a",
[]
]
}
@@ -420341,14 +421019,6 @@
"ea32e1787e58047763ca26ca575e5ff67325d110",
[]
],
- "Lato-Medium-Liga.ttf": [
- "3a0beaea38b8bc0cbf6fa656bf23e28cfdf18c6f",
- []
- ],
- "Lato-Medium.ttf": [
- "2c612da2ae589dc264deb683f90baf75c8e18e03",
- []
- ],
"LigatureSymbolsWithSpaces.woff": [
"1f0e7ca0076ae09f3fdea656052a1a08ab2b1111",
[]
@@ -426636,6 +427306,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",
+ []
]
}
}
@@ -427093,7 +427803,7 @@
[]
],
"grid-item-aspect-ratio-stretch-4-ref.html": [
- "8d7fc870fae1ad7f969b7a9de4035da783c1dae4",
+ "8c251a9d9f002041354bb252baf12e694b6a2207",
[]
],
"grid-item-content-baseline-001-ref.html": [
@@ -427795,7 +428505,7 @@
[]
],
"masonry-intrinsic-sizing-rows-003-fr-ref.html": [
- "ca2aaef482dc6207913d66db1d38fba4e21f43b0",
+ "41a032712a21a28b2710630425391f7f63d15402",
[]
],
"masonry-intrinsic-sizing-rows-003-mix1-ref.html": [
@@ -427819,7 +428529,7 @@
[]
],
"masonry-intrinsic-sizing-rows-004-mix2-ref.html": [
- "97e6b3ea2922b8810d5bc940caad3eb48b3ac371",
+ "4d1470896c8e828f3aa52d6e6dc701f76fbd31a0",
[]
],
"masonry-intrinsic-sizing-rows-005-ref.html": [
@@ -427851,29 +428561,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",
[]
@@ -427887,10 +428593,6 @@
"masonry-order-001-ref.html": [
"6f20bd05838efed10a0915b30941ff7bcbb73b6a",
[]
- ],
- "masonry-order-002-ref.html": [
- "15be3fde83710c6a7876a5befa8d91dc9f26f8e7",
- []
]
},
"subgrid": {
@@ -428658,6 +429360,10 @@
"28d57bc19c779250d792eafc2d5e4461baece0d5",
[]
],
+ "conic-gradient-001-ref.html": [
+ "2f12c01bb5fe1aee2f1eedd2461133ed257f3bf9",
+ []
+ ],
"gradient-analogous-missing-components-001-ref.html": [
"5e89048bf00d924bc63fce23301c59c0a4a3c417",
[]
@@ -428670,6 +429376,10 @@
"134388315a03691bdd20e77cf7d54ba959e9b7fb",
[]
],
+ "gradient-analogous-missing-components-004-ref.html": [
+ "09f168115bee8485e27da66a686d888cfcc3259b",
+ []
+ ],
"gradient-decreasing-hue-hsl-ref.html": [
"df6dc90ac033e4d00fca3e8f5f6e7ad998aa4c6c",
[]
@@ -428691,7 +429401,7 @@
[]
],
"gradient-eval-004-ref.html": [
- "f197386bcfb4af5bc084fd262cc29a73f2329ffe",
+ "f28b30137cdc176fa6c9134ffecbb981e87da557",
[]
],
"gradient-eval-005-ref.html": [
@@ -432013,6 +432723,10 @@
"f0ee4df8c9de3a77fb39b40942dbf0743312494f",
[]
],
+ "column-height-009-ref.html": [
+ "034440ebd5c81be43f0d871d3adb276b2a735768",
+ []
+ ],
"column-pseudo-background-color-ref.html": [
"8a6d741542939fda5e165f56129a44fdd2e950a9",
[]
@@ -433865,6 +434579,18 @@
"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-counters-ref.html": [
"7113a5c5d23a97cf83f173a72ef96b57ecf09263",
[]
@@ -435552,6 +436278,10 @@
"9ba42e18b2bc6d37ac1d98af14d30f9894d4e2bc",
[]
],
+ "position-sticky-table-pixel-rounding-ref.html": [
+ "83313e0ad109ffee6bc313d9814aa26866e839f7",
+ []
+ ],
"position-sticky-table-td-bottom-ref.html": [
"e851315641e0212bcbc2453b56e831422b6d6c32",
[]
@@ -445741,7 +446471,7 @@
[]
],
"properties.js": [
- "81cf9d46d5ff575e16b955ec2d64f579699fd441",
+ "e450208389086aa559b576eeea723800c3acf933",
[]
],
"ruler-h-50%.png": [
@@ -448306,7 +449036,7 @@
[]
],
"navigate-after-hide.html": [
- "0b6a3d669e89e07b6b6476dcdaafef3157fdaa77",
+ "9bed19eda2a0187a18583f05a151ca0ebb1247a2",
[]
],
"opt-in-style.css": [
@@ -448392,6 +449122,10 @@
"d189a460c7cb5147b04367d4e56aac0ae751c6d5",
[]
],
+ "nested-root-capture-with-clip-ref.html": [
+ "0e2c7d025431898870762711a18e38150448985a",
+ []
+ ],
"resources": {
"compute-common.css": [
"20337ccce5f3387e7e70e6fb219544369b74aa06",
@@ -448808,6 +449542,10 @@
"d1b9a0d68dd5cf15d035896a6e4deac59b950310",
[]
],
+ "font-size-keyword-specified-ref.html": [
+ "3395465c5d59422520d62002618e406e97e63423",
+ []
+ ],
"font-size-ref.html": [
"30eaa4aeb9fcae4e42ca2061358bd976e9144eee",
[]
@@ -451448,7 +452186,7 @@
[]
],
"wm-propagation-body-044-ref.html": [
- "9cf46c0b214652ca0bd7f28fe88c7943f6ccef8c",
+ "f61f97c9a1de34e246f1edb056cab56cc6db62b7",
[]
],
"wm-propagation-body-047-ref.html": [
@@ -451826,6 +452564,10 @@
"b0dbb071d5b05d1c574cd5c9a660f1e3d62c573b",
[]
],
+ "action-utils.js": [
+ "c3ab5272da666146564deae7fc6ab9ffbec3a9e4",
+ []
+ ],
"b-green.css": [
"a0473f5ca26652c1229290bbf1f81eabc1e37280",
[]
@@ -452227,6 +452969,10 @@
"21c33ea1cd44fa23f6f92c3881e6ef22d33587d2",
[]
],
+ "feComposite-intersection-feTile-input-ref.html": [
+ "4345e3d8ac143dfffef9638d75481bfe40630163",
+ []
+ ],
"fecolormatrix-negative-ref.html": [
"95a0051c18a1219012e48ad91e58ecc213ba24b6",
[]
@@ -457272,6 +458018,10 @@
"e38d492da0a2c22c30bdc799b6b06c224bfec136",
[]
],
+ "WEB_FEATURES.yml": [
+ "b20102ff2a34622e493481126f59717660d9d2fd",
+ []
+ ],
"resources": {
"crossiframe-childframe.html": [
"6a8bc6b64240636dbc576aaa15b9c86b799dae8e",
@@ -460240,7 +460990,7 @@
[]
],
"README.md": [
- "a69aab487239021088f944b0a8cee2dad4b3d111",
+ "cbb5b85b74d1347b93c7f0e480cf978262da6b03",
[]
],
"resources": {
@@ -460507,7 +461257,7 @@
[]
],
"ba-fledge-util.sub.js": [
- "3371813feee6e11dedd71126ca1b354e64021d73",
+ "8fa4eb1e3514274e9ca179253fdae56150ccf07b",
[]
],
"ba-public-keys": [
@@ -460535,7 +461285,7 @@
[]
],
"fledge-util.sub.js": [
- "ebd2b44b9928a9c72e93112f226e51cfa54d4094",
+ "e0d5d99bb6553e441de6e4a8213cf114002666f0",
[]
],
"fledge_http_server_util.py": [
@@ -460567,7 +461317,7 @@
[]
],
"service-worker-helper.js": [
- "cc00181359740b51f83c3289cfc215252123b67e",
+ "2b94dc60e0175996ac27dfcc8df93ef573978a56",
[]
],
"service-worker-helper.js.headers": [
@@ -461226,6 +461976,14 @@
"2d3bf3ed873e8b1d361afbd8aacaee3f3d0b6251",
[]
],
+ "Lato-Medium-Liga.ttf": [
+ "3a0beaea38b8bc0cbf6fa656bf23e28cfdf18c6f",
+ []
+ ],
+ "Lato-Medium.ttf": [
+ "2c612da2ae589dc264deb683f90baf75c8e18e03",
+ []
+ ],
"META.yml": [
"5b04a86e6ef33a371a3e4199fff4cd8d2fc6e25b",
[]
@@ -467051,11 +467809,11 @@
[]
],
"canvas-promise-test-worker.js": [
- "f5410efca5b92d3b1272f94a9049027972698996",
+ "2cb50c322f7978c12bbc10faed1d8302ad58d79a",
[]
],
"canvas-promise-test.js": [
- "1b2e2b3a584a1740c01e6911f6e5c72b0a5aafda",
+ "09e01633ace2fc9157ae8b98f47fed3edc7a90d9",
[]
],
"canvas-spec.css": [
@@ -467220,7 +467978,7 @@
[]
],
"text.yaml": [
- "48a0429f267d281927fad8d59dd6a791e6f029ac",
+ "900431860e27fa1c41276cc43bc961ea3da45270",
[]
],
"the-canvas-state.yaml": [
@@ -473239,6 +473997,10 @@
]
},
"the-option-element": {
+ "option-label-whitespace-2-ref.html": [
+ "b0567c2b4e33f48efe31b62620f243b0089f0589",
+ []
+ ],
"option-label-whitespace-ref.html": [
"acb4f9ee2478898eb648c00ea6b9f6ed0e71c7a7",
[]
@@ -482232,6 +482994,10 @@
"e11810cc10fa16774924fe8a8080ab5aae161ac7",
[]
],
+ "WEB_FEATURES.yml": [
+ "fbd4cc58df949323199f8832a72592f6e00d8b5f",
+ []
+ ],
"resources": {
"iframe-stores-entry.html": [
"cd600254805570deab8447ea843657d7f268b7c5",
@@ -482324,7 +483090,7 @@
]
},
"lint.ignore": [
- "65e22dccbc1d9cce01a6c570fe739e68d112df3e",
+ "8df85b016fe85482344b9d5cbe76f1e15a8d8827",
[]
],
"loading": {
@@ -490113,7 +490879,7 @@
[]
],
"testdriver.js": [
- "05301bf55895eef71dc7e949871388f8f9cd7a49",
+ "b63d5b176636bfc2477cae4a9858872530211394",
[]
],
"testdriver.js.headers": [
@@ -490272,7 +491038,7 @@
[]
],
"sandboxed-iframe-locking.html": [
- "436c67f5b53b1f88ef1537072be3b0011724d7b3",
+ "f4773535dbc3d21319f8dd7a398ff7731d19a240",
[]
]
}
@@ -490314,6 +491080,14 @@
"adf4bf2ac173e8bff0978fa19b24e535f4229c2e",
[]
],
+ "animation-trigger": {
+ "support": {
+ "support.js": [
+ "f5aa18e82f19f7fa56b2853e2c46b21342b7d970",
+ []
+ ]
+ }
+ },
"css": {
"animation-fill-outside-range-ref.html": [
"998576b3a4f2257006232506ee32306bc716895c",
@@ -494732,6 +495506,14 @@
"8cfe09a41fe2ac32e734073329681bb74962eb03",
[]
],
+ "protocol-handler-service-worker.js": [
+ "cb6142db0e3c4b00fecfde154b77f06a3517ef9d",
+ []
+ ],
+ "protocol-handler.html": [
+ "210b23aae21a5ab25d48262b9f0bd31f489a7de8",
+ []
+ ],
"push.https.html": [
"30eb563ab75532d47dfc5706b81686059d19a8a0",
[]
@@ -494808,8 +495590,12 @@
"06688e3bd4cf6e8d251ef694ffba40b8dab95248",
[]
],
+ "shared-storage-worklet.js": [
+ "92a1a7325bb7ac7c169cc1745241d08e5717d5f4",
+ []
+ ],
"shared-storage.https.html": [
- "53edf109698d013e21c001525e00a74e9a3a5350",
+ "408168e4c4c7599eaa81654289b234e16b9de8a5",
[]
],
"shared-worker.py": [
@@ -495259,7 +496045,7 @@
],
"tentative": {
"helper.js": [
- "e5e00ec7b5318d5bbe5c8542458e61b4105c5c93",
+ "458da38213a83f48faa772f22dbe655f75684c23",
[]
]
}
@@ -496786,7 +497572,7 @@
[]
],
"requirements_build.txt": [
- "e74e4e5302de95611631ab3193f8ae38f643f7dc",
+ "60c09170a98e2d16fd3e499962f59b0df8089fd3",
[]
],
"requirements_macos_color_profile.txt": [
@@ -508068,7 +508854,7 @@
[]
],
"chrome.py": [
- "76bc652075eef3e4738ec4b276e1b19bcd55579e",
+ "e3ef73de6a04a354ba3d72db85dc0d149c21050a",
[]
],
"chrome_android.py": [
@@ -508168,7 +508954,7 @@
[]
],
"actions.py": [
- "859ce8f4fa604481a029b0af624d4cddaeafd429",
+ "06d58e7e87b6dc9bad8c8eddadcdb2597779b24e",
[]
],
"asyncactions.py": [
@@ -508188,7 +508974,7 @@
[]
],
"executormarionette.py": [
- "ebc4a4a565667d66af7da73332802da72fadf580",
+ "b4b5b2a3ea664d7652e3735e360f2b01b04c74ed",
[]
],
"executorselenium.py": [
@@ -508204,7 +508990,7 @@
[]
],
"executorwebdriver.py": [
- "95667480afe7bd67a54f235428f12a45879bac5a",
+ "bea6ab57ba8ac93f5812569d489336d36ba1ac87",
[]
],
"executorwktr.py": [
@@ -508220,7 +509006,7 @@
[]
],
"protocol.py": [
- "0940e87cdbdea9b78397a067240553f3034eb0f6",
+ "53a7b4378483e183d10532c50d26be1586a95dbe",
[]
],
"pytestrunner": {
@@ -508335,7 +509121,7 @@
[]
],
"testdriver-extra.js": [
- "9ddbe2e8df53886c5c3c89e5f21b62c5da760a2d",
+ "71c1be2732f3e62f156c2d1017eee8e8111ac254",
[]
],
"testdriver-vendor.js": [
@@ -509148,7 +509934,7 @@
[]
],
"csp-violations.js": [
- "49649f45cd6e263bff984f0afcb5ecafbbb8a0a5",
+ "46c2ca1b30f33bec538b2245ed8e9a8c1a1b7c6d",
[]
],
"event-handler-attributes.mjs": [
@@ -509195,10 +509981,110 @@
"45053d43e362e223e0ce5e6dffb4da09c0ce3f34",
[]
],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js": [
+ "dc3eb004c384b578f1217575626ba5725018f15e",
+ []
+ ],
+ "should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers": [
+ "c17d57d19ae4ef9d3e584d10fc39065823cb2f73",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js": [
+ "c5c512d98a2748bfbe12880b7003a6845806c6a2",
+ []
+ ],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers": [
+ "c27bd116d8d25f28a411097e6d53b1dc30f3bdc5",
+ []
+ ],
+ "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": [
+ "c8de9f8d5fdab4d4d2d82ec37eedd7785c1ceee1",
+ []
+ ],
+ "trusted-types-reporting-for-importScripts.js.headers": [
+ "54d8b1d4c1285d05cbabf7b35b0facea96284bad",
+ []
+ ],
"trusted-types-reporting-for-setTimeout-setInterval-worker.js": [
"7c65802c9ef09696f0f74fa386629948847c1783",
[]
@@ -509207,6 +510093,14 @@
"54d8b1d4c1285d05cbabf7b35b0facea96284bad",
[]
],
+ "trusted-types-sandbox-no-allow-scripts.html": [
+ "11967a4d97f80d0ce5344cb2dc309070c2ab57da",
+ []
+ ],
+ "trusted-types-sandbox-no-allow-scripts.html.headers": [
+ "da0823c6bc5d9682dd643ee9d6a64b4f3be47bae",
+ []
+ ],
"worker.https.js": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
@@ -509220,28 +510114,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",
[]
]
},
@@ -509938,7 +510832,7 @@
[]
],
"urlpatterntestdata.json": [
- "f92ab76b71df5ab42b729ebe366e381bd9e939af",
+ "75f1cf8694523b63cee9c94dd90eebeb13434ba5",
[]
],
"urlpatterntests.js": [
@@ -511121,7 +512015,7 @@
"animation-model": {
"animation-types": {
"property-list.js": [
- "f31ee8e4ccf05471e94417971da6ca31b288719e",
+ "9cfd90d17f2e95986cd3db5999447faef9a64df6",
[]
],
"property-types.js": [
@@ -512505,7 +513399,7 @@
[]
],
"video-encoder-utils.js": [
- "916f995156e51d7fed083d9ab175cc44d974dc6b",
+ "5c8d17e5bfe65ff382cc8ae617350873f7cabd4d",
[]
],
"videoDecoder-codec-specific-setup.js": [
@@ -514078,7 +514972,7 @@
},
"resources": {
"utils.js": [
- "7cecf29061fe35408b0875ba3cf2638ea5eb0605",
+ "70c97a8454cdd95ad9af78702cafb0dcc7515986",
[]
],
"utils_validation.js": [
@@ -518778,7 +519672,7 @@
[]
],
"redirect.py": [
- "3839b635e022a347a7877e9022d9820d55831588",
+ "e2786b45031b3d6493eeff9bbe8d7eaf7a46c566",
[]
],
"requri.py": [
@@ -545042,7 +545936,7 @@
"ai": {
"language_detection": {
"detector.https.tentative.any.js": [
- "337f11d338d495a46a6926308970768f99ac2526",
+ "98968415ddd2af1530a95986dc7cdb727ad61551",
[
"ai/language_detection/detector.https.tentative.any.html",
{
@@ -545206,7 +546100,7 @@
]
],
"ai_translator_translate.tentative.https.any.js": [
- "729cb04fb76e94d9bf8eb40e463b840931b0e3a7",
+ "992215d921025079dfee122672fcde827c249e6a",
[
"ai/translator/ai_translator_translate.tentative.https.any.html",
{
@@ -553102,8 +553996,8 @@
]
},
"clear-site-data": {
- "clear-cache-partitioning.sub.https.html": [
- "b3841450b5a3fcfbe79857cebd7da8855754597a",
+ "clear-cache-partitioning.https.html": [
+ "2deadeef2d0853d08a559a9af8050646fb8e3163",
[
null,
{
@@ -553112,7 +554006,7 @@
]
],
"clear-cache.https.html": [
- "e356001d0c89e39273e3070dec43e3a66cd44171",
+ "c75c2e16becf994dccfc7d05aa6147ba1022d72b",
[
null,
{
@@ -570778,14 +571672,14 @@
]
],
"anchor-center-htb-htb.html": [
- "50fc09061073a7bcd16d9669b3fd6ad85234e783",
+ "88e01619cafad8a51e5dcea6bbb565e8cdae14e2",
[
null,
{}
]
],
"anchor-center-htb-vrl.html": [
- "eba72d649133da882a9fa095f0433f426b54bf8e",
+ "f777a2caf8803f77283d9fe667ca29c7ecdf4fa0",
[
null,
{}
@@ -570799,14 +571693,14 @@
]
],
"anchor-center-vrl-htb.html": [
- "8f7af0414edd4eb606e7be3437f81468696522b9",
+ "595f7ea1ecdc6fb52e86624fa6dccc7861563aa7",
[
null,
{}
]
],
"anchor-center-vrl-vrl.html": [
- "d8e90057dc3372c5ccca659132e708c678678a56",
+ "e22391a8192e1c0909a7983b08c450f9bff219e3",
[
null,
{}
@@ -571692,21 +572586,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,
{}
@@ -572220,6 +573114,13 @@
{}
]
],
+ "animate-with-background-color-oklch-002.html": [
+ "ee6847c11bf1257c59bdcf5b53a61245403d7cfa",
+ [
+ null,
+ {}
+ ]
+ ],
"animate-with-color-mix.html": [
"0b6d9bb4ab3ae911e7291e1da5e2259c0afbd0fc",
[
@@ -575826,7 +576727,7 @@
]
],
"color-computed-relative-color.html": [
- "23ee07d177ac525c2ce2b4e60cd1861a33cc23c5",
+ "9bb87459623ac3c50b2154432269adef114fe811",
[
null,
{}
@@ -577415,6 +578316,13 @@
{}
]
],
+ "CSS-supports-details-content-pseudo-parsing.html": [
+ "67a46fe82a2ffaa4d5a9bd0729831c6e4415ab54",
+ [
+ null,
+ {}
+ ]
+ ],
"CSS-supports-selector-detecting-invalid-in-logical-combinations.html": [
"3adcd7ae2e62bd76130b3ecf2b903e1401b23c77",
[
@@ -579660,6 +580568,13 @@
{}
]
],
+ "flex-shorthand-calc.html": [
+ "6498988dd53b3e6f7e48f643094551121fdc28f4",
+ [
+ null,
+ {}
+ ]
+ ],
"flex-shorthand-flex-basis-middle.html": [
"284aac275b87b59a2703e3aaaf78e2369d77a95a",
[
@@ -580667,7 +581582,7 @@
]
],
"flex-computed.html": [
- "ea1f4f6fa4568e8a3b4913aea52d89d5ec1e1870",
+ "074d0f7395c1ce53fb37e2875d389ddf8c352c7e",
[
null,
{}
@@ -580744,7 +581659,7 @@
]
],
"flex-invalid.html": [
- "ae010d7b4b4540f6591c1ad42f1c89753a71afc6",
+ "d47f8b6793074c5aa27881eaf58809e69a76812d",
[
null,
{}
@@ -580779,7 +581694,7 @@
]
],
"flex-valid.html": [
- "f3eaf118da61d2eb9cd6f30e7f703a0de8053305",
+ "4c57fe4e25361f9223fade0794bb3a1869c89caa",
[
null,
{}
@@ -580835,6 +581750,13 @@
]
]
},
+ "percent-height-flex-items-cross-sizes-with-mutations.html": [
+ "87f20000f1f2e1718e31dddb9c92d0edf10b6cb3",
+ [
+ null,
+ {}
+ ]
+ ],
"percentage-heights-000.html": [
"cf501031448c8d3d020061d29a2c7e6991deea92",
[
@@ -581393,6 +582315,13 @@
{}
]
],
+ "font-variation-settings-calc.html": [
+ "e3f5178952e0df7aa8f6f185edc6148144975a9d",
+ [
+ null,
+ {}
+ ]
+ ],
"font-variation-settings-serialization-001.html": [
"88764fd652f453f2def184a26f922783aa6d0121",
[
@@ -585619,7 +586548,7 @@
],
"parsing": {
"masonry-parsing.html": [
- "2204c06f72b8bd15c9662def13c3d89fb64048b4",
+ "64af83b316c912fcc4eeac9a13f52ed089d0f358",
[
null,
{}
@@ -585630,7 +586559,7 @@
},
"parsing": {
"grid-area-computed.html": [
- "d1ae78c7023c9cbd9ea4040e63692c24b1323a74",
+ "9b31e2b23c6fbe99bc712a116a57e0384a5396e0",
[
null,
{}
@@ -589252,6 +590181,15 @@
}
]
],
+ "column-scroll-marker-focus-002.html": [
+ "cd26b8aca85fe6d4e9ac643f4675d8ca1a3b83bd",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"column-updates-computed-style.html": [
"d741b8cf915a189e13a7f7c2738bb2880aa4e852",
[
@@ -589668,6 +590606,13 @@
}
]
],
+ "scroll-marker-15.html": [
+ "764e56b55436ad461df39ec44e25d660c1d99bc6",
+ [
+ null,
+ {}
+ ]
+ ],
"scroll-marker-activation-retains-focus.html": [
"cf38ed354c73d3c5840258f87912a76c50ccebed",
[
@@ -590115,7 +591060,7 @@
]
],
"overscroll-behavior-root.html": [
- "18c172b40a13b5bac3bcfeb08f23d59fd94ee17e",
+ "a116ead01b71db7b72bfd483b10b35b2e83ea1b8",
[
null,
{
@@ -591785,6 +592730,15 @@
{}
]
],
+ "focus-visible-originating-element.html": [
+ "05fc82324917c49ce3fab8e667dd3a9df51825d8",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"highlight-cascade": {
"highlight-cascade-007.html": [
"df79d8dff51ae23a75a7a4ef593f673ea596f36d",
@@ -593966,6 +594920,13 @@
{}
]
],
+ "resnap-on-oveflow-hidden-container.html": [
+ "41e454b2789cb90f1c72edf9f3dab8b3960b400d",
+ [
+ null,
+ {}
+ ]
+ ],
"resnap-on-reconstructing-frame.html": [
"d046608815aff119e443a17594a4947bea2ce587",
[
@@ -596134,7 +597095,7 @@
]
],
"contain-intrinsic-size-028.html": [
- "15e8e0e89108b112bc113d6090946307379f53e7",
+ "da31a1efeadea5bf6f32b6aee6ec9e452a30917c",
[
null,
{}
@@ -596176,7 +597137,7 @@
]
],
"contain-intrinsic-size-logical-003.html": [
- "48fedb11483342fd6f6fd580bab4f16b0b0fa334",
+ "9ee60268d60482ddbfe4c7263d2ce7b85e3c3c55",
[
null,
{}
@@ -602925,7 +603886,7 @@
},
"inline": {
"append.tentative.html": [
- "f80875622366939f48a7471513fb6319f75be718",
+ "fa23071c4f22468fd46015b9767c91d6ef81e232",
[
null,
{}
@@ -603381,6 +604342,13 @@
{}
]
],
+ "column-height.html": [
+ "f9986221f4886a756584258e8e3d4ad01c39c81c",
+ [
+ null,
+ {}
+ ]
+ ],
"column-rule-color.html": [
"3d35b856d71f2de9c87e83aa1ace57b3b4d8cf5d",
[
@@ -604882,6 +605850,13 @@
{}
]
],
+ "cursor-calc-hotspot.html": [
+ "84f9ca35b79878972d61e132857640a9f5e86fa7",
+ [
+ null,
+ {}
+ ]
+ ],
"historical": {
"moz-user-modify-01.html": [
"595df9440e523fc371cf55975e4042d569163136",
@@ -605569,6 +606544,13 @@
{}
]
],
+ "calc-complex-unresolved-serialize.html": [
+ "64bccd216abe357a3594d27f1b016d473c44f7a0",
+ [
+ null,
+ {}
+ ]
+ ],
"calc-in-color-001.html": [
"7db087def7552af2662524e26813aa51daae0cb1",
[
@@ -606082,7 +607064,7 @@
]
],
"hypot-pow-sqrt-invalid.html": [
- "edecfceb13afe79ad0b13b6b5d29a9924f5fad9b",
+ "3e29889588399a53ddb7b1dbce84a9f2c0c36f7c",
[
null,
{}
@@ -607274,7 +608256,7 @@
]
],
"pageswap-in-hidden-doc-should-skip-transition.html": [
- "aceced0dded84f88782356a99d96fec5febd40c3",
+ "2fddb7e17a4c7bdd006a255cb8e7d713c2c29660",
[
null,
{
@@ -610816,8 +611798,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,
{
@@ -617213,9 +618213,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"
@@ -620999,7 +622027,7 @@
},
"ecmascript": {
"locale-compat.html": [
- "74806987879e74befd087489285b6610d8107089",
+ "1f863b21ecb3b74287f9f5464303dec45c116c16",
[
null,
{}
@@ -625738,6 +626766,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",
[
@@ -625748,6 +626803,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",
[
@@ -659026,7 +660108,7 @@
"fledge": {
"tentative": {
"abort.https.window.js": [
- "db6aae4604575fd0f096efeec45c86fe94e11e3d",
+ "e4a3189a30c823b9c7135c1733b0021ea8728684",
[
"fledge/tentative/abort.https.window.html",
{
@@ -659057,7 +660139,7 @@
]
],
"additional-bids.https.window.js": [
- "edacb05512e968fb98668a4b40ec92c68c9a1410",
+ "384a9e620307bd05ba4594bb4494fd3382126333",
[
"fledge/tentative/additional-bids.https.window.html?1-last",
{
@@ -659096,7 +660178,7 @@
]
],
"auction-config-passed-to-worklets.https.window.js": [
- "dec49b80a96967e86d318f9e31995c1786e95654",
+ "1fb59972b58768227e3e1e2e272ee3e8969d86dd",
[
"fledge/tentative/auction-config-passed-to-worklets.https.window.html?1-5",
{
@@ -659519,7 +660601,7 @@
]
],
"auction-config.https.window.js": [
- "50b9cb9e9e6b071604522268fc1113a7f1a8a662",
+ "e32d8b31773295aa498db9109f20128109def8da",
[
"fledge/tentative/auction-config.https.window.html?1-5",
{
@@ -660754,7 +661836,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",
{
@@ -661339,7 +662421,7 @@
]
],
"cross-origin.https.window.js": [
- "9669f2790bcfa492a5419c9f7f16d39b12da0f2c",
+ "6c95f74c1f597332e2b74d9c5dd18f7808d34124",
[
"fledge/tentative/cross-origin.https.window.html?1-4",
{
@@ -661534,7 +662616,7 @@
]
],
"currency.https.window.js": [
- "f1b2bba87340340fdf04b5d4c065fe06707f53a1",
+ "b65dea5820ab69aad19839281dcda54ea7d0b1d1",
[
"fledge/tentative/currency.https.window.html?1-4",
{
@@ -662149,7 +663231,7 @@
]
],
"deprecated-render-url-replacements.https.window.js": [
- "75377ca7aa348486fad8ed589e7d947f2dcb3b64",
+ "51daaf277975043f065c39fc2dfc043c5301af8d",
[
"fledge/tentative/deprecated-render-url-replacements.https.window.html?1-5",
{
@@ -662344,7 +663426,7 @@
]
],
"direct-from-seller-signals.https.window.js": [
- "3f58b2c8ad541da98b1345bc7db3994d8ed5340e",
+ "a4e6911491d2c7b1f5df6f190139d0d7a15752e8",
[
"fledge/tentative/direct-from-seller-signals.https.window.html?1-4",
{
@@ -662973,7 +664055,7 @@
]
],
"generate-bid-browser-signals.https.window.js": [
- "00c4bfdcc315c02211792888b0e377302df2e36d",
+ "e472fccdc4da37c1a2cebb80921809cab5788b54",
[
"fledge/tentative/generate-bid-browser-signals.https.window.html?1-4",
{
@@ -663488,7 +664570,7 @@
]
],
"get-interest-group-auction-data.https.window.js": [
- "855e6b5a075cfbbba74772dc222e8a487fb3a118",
+ "de749e1e60a2d5f010c07dd98829ede5c7da21ea",
[
"fledge/tentative/get-interest-group-auction-data.https.window.html?1-4",
{
@@ -663798,7 +664880,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",
{
@@ -665501,7 +666583,7 @@
]
],
"interest-group-update.https.window.js": [
- "ceac2c79a6e93635f5f4ebb9e7e26256cb695a7b",
+ "041100547446369dd7566d2ab010319edc434135",
[
"fledge/tentative/interest-group-update.https.window.html?1-4",
{
@@ -665764,7 +666846,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",
{
@@ -665899,7 +666981,7 @@
]
],
"join-leave-ad-interest-group.https.window.js": [
- "68a4e9d09c941493b8dd8c85c5a535a5d962d761",
+ "5e004ed1dc5dbb71216eb0f2f5e44cea41e722b5",
[
"fledge/tentative/join-leave-ad-interest-group.https.window.html?1-10",
{
@@ -666514,7 +667596,7 @@
]
],
"kanon-status-below-threshold.https.window.js": [
- "6f3c2f572a198469607a27b51328c9ff8364d7a0",
+ "419b94bd7814756059a2029562510915a1c648ef",
[
"fledge/tentative/kanon-status-below-threshold.https.window.html",
{
@@ -666544,7 +667626,7 @@
]
],
"kanon-status-not-calculated.https.window.js": [
- "87a66c106fbff5388e05905539840556ceb41e35",
+ "965082d8ffd0a2f4cbdedea298f19abddab1afa9",
[
"fledge/tentative/kanon-status-not-calculated.https.window.html",
{
@@ -666769,7 +667851,7 @@
]
],
"no-winner.https.window.js": [
- "2632a95deeeb85eb9bc7be26194260af218c59ad",
+ "cfa0704dbc400248d48ed8bbfa771af86fc73dc6",
[
"fledge/tentative/no-winner.https.window.html?1-5",
{
@@ -667492,7 +668574,7 @@
]
],
"private-aggregation.https.window.js": [
- "a1c261b6291495ffb778753f1444dac5f414b910",
+ "474bf4ced76c2214d9abc82e0e5b69fe7b787b82",
[
"fledge/tentative/private-aggregation.https.window.html?1-5",
{
@@ -667703,7 +668785,7 @@
]
],
"real-time-reporting.https.window.js": [
- "5ebd20d19aec35f8c5fa14c314621f8724493126",
+ "84dce53844f44c9dc468ad63f168588bd973841d",
[
"fledge/tentative/real-time-reporting.https.window.html?1-5",
{
@@ -667794,7 +668876,7 @@
]
],
"register-ad-beacon.https.window.js": [
- "d74f0dab5e56601c808d7cd28dc6dea78aa5b628",
+ "98b6a75c42f33bf5d8a900d817c5a20e718718da",
[
"fledge/tentative/register-ad-beacon.https.window.html?1-5",
{
@@ -667929,7 +669011,7 @@
]
],
"reporting-arguments.https.window.js": [
- "a3b546f596476d95d36e6d0a6c7dd858c2a62e27",
+ "04af8ebc64354d6fe987c310352f08eb2d8a289f",
[
"fledge/tentative/reporting-arguments.https.window.html?1-5",
{
@@ -668124,7 +669206,7 @@
]
],
"reporting-ids.https.window.js": [
- "43c78987f1e8610c5aff66f72ec37d2e58330dca",
+ "0019393008bc565c10aa8af9cd7ab28f82d102d1",
[
"fledge/tentative/reporting-ids.https.window.html?1-5",
{
@@ -668207,7 +669289,7 @@
]
],
"round-a-value.https.window.js": [
- "2195b45ea5f81893699a6732f102d492f3d12bec",
+ "21bbf29572659789651de645f38a89d759f62dc0",
[
"fledge/tentative/round-a-value.https.window.html",
{
@@ -668238,7 +669320,7 @@
]
],
"score-ad-browser-signals.https.window.js": [
- "23fee313af53b5431928f6d4c5cd406c3ccb915c",
+ "9acf994cf9fd9b0355561af7ca3b97ea5eb5ddc1",
[
"fledge/tentative/score-ad-browser-signals.https.window.html?1-last",
{
@@ -668277,7 +669359,7 @@
]
],
"send-report-to.https.window.js": [
- "163443cb76d450e5a559fefcbd48ac26266e33dc",
+ "fa0f01ccfe8b403fcd6ceded435688481b37f467",
[
"fledge/tentative/send-report-to.https.window.html?1-5",
{
@@ -668360,7 +669442,7 @@
]
],
"server-response-for-debugging-only.https.window.js": [
- "1b4edc66a89ce0577f14ef76b79d655492629a19",
+ "e6787e8a2d9bda86c78b289e26ac1361f1652c35",
[
"fledge/tentative/server-response-for-debugging-only.https.window.html?1-last",
{
@@ -668411,7 +669493,7 @@
]
],
"server-response-private-aggregation.https.window.js": [
- "d7f21e16cf08506ec277985dec74ae81e350a2e6",
+ "6d9a8a887706eeb75506a95884271a754e4ee05e",
[
"fledge/tentative/server-response-private-aggregation.https.window.html?1-6",
{
@@ -668518,7 +669600,7 @@
]
],
"server-response.https.window.js": [
- "d4eaf0d25123298a696f0116cb54c6fe144038d4",
+ "4241cc8e1c9025bfae29d72a1567fcf63be3242e",
[
"fledge/tentative/server-response.https.window.html?1-6",
{
@@ -670357,7 +671439,7 @@
]
],
"service-worker-request-visibility.https.window.js": [
- "8b8618420e56e30d2a9e4428f24f22cc7d9053b9",
+ "41ebf839600bb2cd52bbb9f01b7a8118dc1eee13",
[
"fledge/tentative/service-worker-request-visibility.https.window.html?1-last",
{
@@ -670396,7 +671478,7 @@
]
],
"tie.https.window.js": [
- "f528df8fb020382907a63d372452010217bf2b55",
+ "21be690c92ef4386d7100d1e600a1c3524f48809",
[
"fledge/tentative/tie.https.window.html",
{
@@ -672929,7 +674011,7 @@
]
],
"utf8-helpers.https.window.js": [
- "4a712bf6269ea1fc2b9e7eb832a2b3cdcf2a9e07",
+ "9d8d0836419fd7f7223707be99d700b28ee39aca",
[
"fledge/tentative/utf8-helpers.https.window.html?1-5",
{
@@ -684883,6 +685965,13 @@
"timeout": "long"
}
]
+ ],
+ "open_initial_size.html": [
+ "a3a82d7646891edc92008073c1bb66fab7d36fa6",
+ [
+ null,
+ {}
+ ]
]
},
"proxy-getOwnPropertyDescriptor.html": [
@@ -692947,6 +694036,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",
[
@@ -706844,6 +707947,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",
[
@@ -712776,14 +713900,14 @@
]
],
"nameditem-01.html": [
- "2b428aa65bd7d6cda28fee7e83ef2528a1b751f5",
+ "2caeed7dd000a7ca7951980ac59c724f251ee0f4",
[
null,
{}
]
],
"nameditem-02.html": [
- "8c3155e7e4cabc69a58315d620ace5b20fa91b4c",
+ "84cf64c1ffc685164bda1f3e5493c2fe9db0bda8",
[
null,
{}
@@ -712797,28 +713921,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,
{}
@@ -713844,6 +714968,20 @@
{}
]
],
+ "element-render-blocking-040.html": [
+ "3ef1fefc4f85bc6accb6b5d81c2f58bef821578e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "element-render-blocking-041.html": [
+ "c6d87710f7e56fd3e80b60f21c79ac4a28431330",
+ [
+ null,
+ {}
+ ]
+ ],
"non-render-blocking-scripts.optional.html": [
"a4c32ea037b7b47490c54ddd7616b88bfebcdc76",
[
@@ -717311,6 +718449,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",
[
@@ -725900,6 +727059,13 @@
}
]
],
+ "option-color-inheritance.html": [
+ "d96124d008c50be1f62a7b2f4c3ddf153c62bdd6",
+ [
+ null,
+ {}
+ ]
+ ],
"option-computed-style.tentative.html": [
"ba2861a5c6181b72c3b8abc3e077a9f414f2cd99",
[
@@ -727109,7 +728275,7 @@
]
],
"focus-after-close.html": [
- "93baf65cf60c17d9292525e110faff15bcbd52b9",
+ "7137edcd1a18080c96d627e5f40da13b1d36437f",
[
null,
{
@@ -746918,7 +748084,7 @@
]
],
"decodingInfo.any.js": [
- "2fd3743b442cf8f3143ee2d4c3ccb02571036b15",
+ "e7a0e6ae430deb71e0f426f63bcac60e60d0448a",
[
"media-capabilities/decodingInfo.any.html",
{
@@ -746988,7 +748154,7 @@
]
],
"encodingInfo.any.js": [
- "14612238e60cdb45cf716a6bd0d7037e1e2506a6",
+ "97b6c196f09d3c4fc3d46f92a916e4020c39d646",
[
"media-capabilities/encodingInfo.any.html",
{}
@@ -748226,7 +749392,7 @@
]
],
"MediaRecorder-canvas-media-source.https.html": [
- "0c5f47f0ef83efe6d8e36d76a1ff88534b51c6ab",
+ "847e6618b3b66a5297f617959c37d70f1bf7d342",
[
"mediacapture-record/MediaRecorder-canvas-media-source.https.html?mimeType=''",
{
@@ -748868,6 +750034,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",
@@ -777536,7 +778819,7 @@
]
],
"sanitizer-config.tentative.html": [
- "438e1db7eadc0a5f6404c4f7f2ce39d7f37c3eac",
+ "4a7b7ecc517fb2ecfc0bc1f800d1e650dbde86b6",
[
null,
{}
@@ -779496,7 +780779,7 @@
]
],
"lock-sandboxed-iframe.html": [
- "ab954f04b4c5d9043d893e36892c4061ed446661",
+ "f78d7d72d538fd9384e9b5f7193d318a0ae69589",
[
null,
{
@@ -779772,6 +781055,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",
@@ -786192,6 +787519,15 @@
}
]
],
+ "text-selection-with-delegatesFocus-text-control.html": [
+ "6474729b8b4a8c496b33e40d5b056a12b7232418",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"text-selection-with-delegatesFocus.html": [
"7c92d35394f126d878780a1c04f2bdb49550ba86",
[
@@ -790780,6 +792116,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",
[
@@ -791540,6 +792905,15 @@
}
]
],
+ "restrictions_shared_storage_worklet.https.html": [
+ "72a46c3137ff9595147901a5d48297613d1033dd",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"sandbox-iframe.html": [
"469b8aadc31137d412faad400523af61922c6c0b",
[
@@ -805020,7 +806394,7 @@
]
],
"accept-signature.window.js": [
- "efcbf0cdad6cb2816b47e989701835a30b777639",
+ "97e817e328c279149ac9668ed5014a30f811006d",
[
"subresource-integrity/signatures/tentative/accept-signature.window.html",
{
@@ -808967,6 +810341,13 @@
{}
]
],
+ "SVGGraphicsElement-padding.svg": [
+ "7bf47767a525a4950cf4be9f7da970ec9c8fdbe0",
+ [
+ null,
+ {}
+ ]
+ ],
"SVGGraphicsElement.getBBox-01.html": [
"773b06e5043d8d942b793a03d967a8acc925d5b1",
[
@@ -810265,7 +811646,16 @@
]
],
"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": [
+ "9a7b237f11a5c436141f8f658b1d21b816ceadff",
[
null,
{
@@ -810300,6 +811690,15 @@
}
]
],
+ "should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html": [
+ "7e928d2d7192e694d632ce5907c430a673653bf8",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"trusted-types-createHTMLDocument.html": [
"38223dac7016eb766d4c3369a4d1c912290bd14b",
[
@@ -810336,21 +811735,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,
{}
@@ -810378,14 +811770,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.html": [
- "ae5ac25052d34be4d64bada3fb23283c783978ee",
+ "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-Window-sink-mismatch.html": [
+ "ad855dfb2f15a85548c423fe587592925e9a962d",
[
null,
{}
@@ -810398,6 +811811,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",
[
@@ -810496,6 +811944,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.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",
[
@@ -810510,6 +811993,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",
[
@@ -810517,6 +812035,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",
[
@@ -810525,7 +812078,7 @@
]
],
"trusted-types-reporting.html": [
- "5e7930382ad16c3def4ae4055148595cf64a2325",
+ "7432d3bded8c45b64e12eca00cc6c477349d4869",
[
null,
{
@@ -810533,6 +812086,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",
[
@@ -825956,7 +827523,7 @@
]
],
"style-change-events.html": [
- "d1c1c96f7b03e8f8cd6596f1ae24772d292e77b4",
+ "c64400e869df5e844e276facb7d975827027f68a",
[
null,
{}
@@ -835465,7 +837032,7 @@
]
],
"video-decoder-no-size-in-configure.https.any.js": [
- "3481b465f9eb431ce3dc799f4f1e625fbe3d7c0c",
+ "2ad7040e08b72617ac77b19fb47efc967c95bea8",
[
"webcodecs/video-decoder-no-size-in-configure.https.any.html?av1",
{
@@ -836727,6 +838294,55 @@
}
]
],
+ "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",
[
@@ -842858,6 +844474,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",
[
@@ -846282,7 +848009,7 @@
]
],
"instance_normalization.https.any.js": [
- "26e0cd0aa935d473a7bdb84da59e46f534544066",
+ "08d7d6ca337e4b426825bdd1808026dd2a28ef11",
[
"webnn/conformance_tests/instance_normalization.https.any.html?cpu",
{
@@ -850824,7 +852551,7 @@
]
],
"reshape.https.any.js": [
- "fe758193730c0c8a43ba226bd3c50cccb3224b70",
+ "05b8ea21e674796818f4c6143044a1beaaa3fb59",
[
"webnn/conformance_tests/reshape.https.any.html?cpu",
{
@@ -853176,7 +854903,7 @@
]
],
"subgraph.https.any.js": [
- "9b21d6e4f9453fb72c3f7a6850c5690cc9ed87cf",
+ "a494a8b7a95d7ff9b4a4be717d7f876a1b061b26",
[
"webnn/conformance_tests/subgraph.https.any.html?cpu",
{
@@ -870167,7 +871894,7 @@
]
],
"RTCIceCandidate-constructor.html": [
- "b760c7b05a565c97c9c75287d11ca8cc83258d1f",
+ "05c0849f7a040b08dabd6201e08825328bdc7a8b",
[
null,
{}
@@ -870233,7 +871960,7 @@
]
],
"RTCPeerConnection-addIceCandidate.html": [
- "618ef7e33c69735338ec4e05f2e15cd40d34c063",
+ "4517554bc0bcd5fe0275a358b4c51e5dca7dfaa5",
[
null,
{}
@@ -870796,7 +872523,7 @@
]
],
"RTCRtpReceiver-getSynchronizationSources.https.html": [
- "cb5336f3f3523d0684e48de42f2666a6e6a3aa50",
+ "de9ad184af0d7619a725bb302b0814bf57b70c62",
[
null,
{
@@ -871345,6 +873072,15 @@
{}
]
],
+ "h265-loopback.https.html": [
+ "c3a394ef8f4ce5fa03ff8b272eacbd1b61e6ff07",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"handover-datachannel.html": [
"8f224f822a76bb48924bc13e59d53f8a24d99f64",
[
@@ -895704,7 +897440,7 @@
]
],
"send-redirect.htm": [
- "7d73f0f64cc4d7506e607f75d3bba37b9d3d74a9",
+ "de3899f5e5d3ccef28ac54dfa05a7dbf8af98bd9",
[
null,
{}
@@ -895852,7 +897588,7 @@
]
],
"setrequestheader-case-insensitive.htm": [
- "1aed30d1c2a13fcb35e90a31e599a6cc963c6491",
+ "ce10482cad8d47f8f3933a55f321b44f88f663aa",
[
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
index f1903acb386..c528fee0d39 100644
--- 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
@@ -27,3 +27,48 @@
[corner-shape-any.html?corner-shape=squircle&border-top-right-radius=30px]
expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=superellipse(0.2)&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-shape=squircle&border-radius=25%&border-width=20px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-right-shape=bevel&border-width=10px&border-color=black]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=bevel&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-bottom-right-shape=bevel&border-width=10px&border-radius=20px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=scoop&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-bottom-left-shape=bevel&border-width=10px&border-radius=20px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=bevel&border-radius=40px&border-width=10px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=superellipse(0.3)&border-radius=40%]
+ expected: FAIL
+
+[corner-shape-any.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=superellipse(0.8)&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=superellipse(1.2)&border-radius=40px]
+ expected: FAIL
+
+[corner-shape-any.html?corner-bottom-right-shape=bevel&corner-bottom-left-shape=bevel]
+ expected: FAIL
+
+[corner-shape-any.html?corner-top-left-shape=bevel&border-width=10px&border-color=black]
+ 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/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/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-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-tables/table-cell-overflow-auto-scrolled.html.ini b/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini
new file mode 100644
index 00000000000..55805c45ee2
--- /dev/null
+++ b/tests/wpt/meta/css/css-tables/table-cell-overflow-auto-scrolled.html.ini
@@ -0,0 +1,2 @@
+[table-cell-overflow-auto-scrolled.html]
+ 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/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/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..fb584b75a0b 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
@@ -47,9 +47,6 @@
[sec-fetch-user]
expected: FAIL
- [sec-fetch-dest]
- expected: FAIL
-
[sec-fetch-storage-access - Same site]
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
new file mode 100644
index 00000000000..3e07e6b7d1f
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
@@ -0,0 +1,6 @@
+[empty-iframe-load-event.html]
+ [Check execution order from nested timeout]
+ expected: FAIL
+
+ [Check execution order on load handler]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
index 5d2657041d1..7e036a1c4e4 100644
--- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
@@ -1,5 +1,5 @@
[createImageBitmap-transfer.html]
- expected: ERROR
+ expected: TIMEOUT
[Transfer ImageBitmap created from a vector HTMLImageElement]
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..5544627aa21
--- /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: FAIL
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..46ed1107ac1
--- /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: FAIL
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/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/media-elements/offsets-into-the-media-resource/currentTime.html.ini b/tests/wpt/meta/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime.html.ini
new file mode 100644
index 00000000000..f374bb50e79
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime.html.ini
@@ -0,0 +1,4 @@
+[currentTime.html]
+ expected: TIMEOUT
+ [setting currentTime when readyState is greater than HAVE_NOTHING]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index b83d68ddd33..68203d2a082 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_escaping-2.html]
+ expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 7da2bc5ac80..ef88bb2e2fd 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index c6f1e5d7d84..90c8bd71ded 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
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/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini b/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini
index f137b6ba51c..3af98fe9c4e 100644
--- a/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini
+++ b/tests/wpt/meta/mixed-content/gen/top.http-rp/opt-in/audio-tag.https.html.ini
@@ -1,4 +1,5 @@
[audio-tag.https.html]
+ expected: TIMEOUT
[Mixed-Content: Expects blocked for audio-tag to cross-http origin and keep-scheme redirection from https context.]
expected: FAIL
@@ -12,13 +13,13 @@
expected: FAIL
[Mixed-Content: Expects blocked for audio-tag to same-http origin and keep-scheme redirection from https context.]
- expected: FAIL
+ expected: NOTRUN
[Mixed-Content: Expects blocked for audio-tag to same-http origin and no-redirect redirection from https context.]
- expected: FAIL
+ expected: NOTRUN
[Mixed-Content: Expects blocked for audio-tag to same-http origin and swap-scheme redirection from https context.]
- expected: FAIL
+ expected: NOTRUN
[Mixed-Content: Expects blocked for audio-tag to same-https origin and swap-scheme redirection from https context.]
- expected: FAIL
+ expected: NOTRUN
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/wasm/jsapi/global/type.tentative.any.js.ini b/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini
index 6bc8c09ae52..89330feabf4 100644
--- a/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini
+++ b/tests/wpt/meta/wasm/jsapi/global/type.tentative.any.js.ini
@@ -123,4 +123,4 @@
expected: ERROR
[type.tentative.https.any.shadowrealm-in-audioworklet.html]
- expected: ERROR
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini b/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini
index 9198393a92f..766d339198a 100644
--- a/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini
+++ b/tests/wpt/meta/wasm/jsapi/global/valueOf.any.js.ini
@@ -18,7 +18,7 @@
expected: ERROR
[valueOf.https.any.shadowrealm-in-audioworklet.html]
- expected: ERROR
+ expected: TIMEOUT
[valueOf.any.shadowrealm-in-shadowrealm.html]
expected: ERROR
diff --git a/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini b/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini
index bcc1dbe1112..f91dc75092c 100644
--- a/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini
+++ b/tests/wpt/meta/wasm/jsapi/memory/type.tentative.any.js.ini
@@ -54,7 +54,7 @@
expected: ERROR
[type.tentative.https.any.shadowrealm-in-audioworklet.html]
- expected: ERROR
+ expected: TIMEOUT
[type.tentative.any.shadowrealm-in-dedicatedworker.html]
expected: ERROR
diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml
index 6d5c7c79a05..9119c018c2f 100644
--- a/tests/wpt/tests/.github/workflows/docker.yml
+++ b/tests/wpt/tests/.github/workflows/docker.yml
@@ -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/ai/language_detection/detector.https.tentative.any.js b/tests/wpt/tests/ai/language_detection/detector.https.tentative.any.js
index 337f11d338d..98968415ddd 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
@@ -32,6 +32,12 @@ promise_test(async t => {
}, 'AILanguageDetectorFactory.create() call with an aborted signal.');
promise_test(async t => {
+ await testAbortPromise(t, signal => {
+ return ai.languageDetector.create({signal});
+ });
+}, 'Aborting AILanguageDetectorFactory.create().');
+
+promise_test(async t => {
const controller = new AbortController();
controller.abort();
diff --git a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js b/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
index 729cb04fb76..992215d9210 100644
--- a/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
+++ b/tests/wpt/tests/ai/translator/ai_translator_translate.tentative.https.any.js
@@ -60,7 +60,7 @@ promise_test(async t => {
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.')
+}, 'AITranslator: sourceLanguage and targetLanguage are equal to their respective option passed in to AITranslatorFactory.create.');
promise_test(async (t) => {
const translator =
@@ -109,16 +109,22 @@ promise_test(async t => {
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);
@@ -166,3 +172,41 @@ promise_test(async t => {
assert_not_equals(translatedTranslatableString[i], translatableStrings[i]);
}
}, 'AITranslator.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));
+ }
+}, 'AITranslator.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);
+}, 'AITranslator.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 AITranslator.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/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/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-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
index 9c256eb8977..5b197317eb1 100644
--- 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
@@ -4,6 +4,9 @@
<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=25%&border-width=10px">
+<meta name="variant" content="?corner-shape=squircle&border-radius=25%&border-width=20px">
+<meta name="variant" content="?corner-top-left-shape=superellipse(6)&border-radius=20%&border-width=10px">
<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">
@@ -13,13 +16,31 @@
<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="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">
+<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(0.3)&border-radius=40%">
+<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-top-left-shape=bevel&border-radius=40px&border-width=10px">
<meta name="fuzzy" content="maxDifference=0-180;totalPixels=0-520">
<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>
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..6de6c9a5d7e 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
@@ -109,7 +109,7 @@ function render_rect_with_corner_shapes(style, ctx, width, height) {
}
function draw_inner_corner_from_params(params, phase = "both", direction) {
- add_corner(ctx, ...params.inner_rect, params.shape, phase, direction);
+ add_corner(ctx, ...params.inner_rect, params.inner_shape, phase, direction);
}
function draw_inner_corner(corner, phase = "both", direction) {
@@ -123,7 +123,7 @@ function render_rect_with_corner_shapes(style, ctx, width, height) {
draw_outer_corner("bottom-left");
draw_outer_corner("top-left");
ctx.closePath();
- ctx.clip("nonzero");
+ ctx.fill("nonzero");
const inner_rect = [
style["border-left-width"],
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..b584994b4ea 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))
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-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/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/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-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/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/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-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-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/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/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-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/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/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-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/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/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-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/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/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/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.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/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/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/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/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/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/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/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/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/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/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/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-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/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/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..8df85b016fe 100644
--- a/tests/wpt/tests/lint.ignore
+++ b/tests/wpt/tests/lint.ignore
@@ -287,6 +287,8 @@ 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.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.any.js b/tests/wpt/tests/media-capabilities/decodingInfo.any.js
index 2fd3743b442..e7a0e6ae430 100644
--- a/tests/wpt/tests/media-capabilities/decodingInfo.any.js
+++ b/tests/wpt/tests/media-capabilities/decodingInfo.any.js
@@ -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/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/MediaRecorder-canvas-media-source.https.html b/tests/wpt/tests/mediacapture-record/MediaRecorder-canvas-media-source.https.html
index 0c5f47f0ef8..847e6618b3b 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,14 @@
</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);
+}
async_test(test => {
const CANVAS_WIDTH = 256;
@@ -100,49 +106,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 +171,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/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js
index 05301bf5589..b63d5b17663 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,9 @@
* @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 +1450,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 +1475,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 +1749,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-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/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/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/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/helper.js b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
index e5e00ec7b53..458da38213a 100644
--- a/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
+++ b/tests/wpt/tests/subresource-integrity/signatures/tentative/helper.js
@@ -112,7 +112,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/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..e3ef73de6a0 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -158,6 +158,9 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite
chrome_options["args"].append(
"--ip-address-space-overrides=" + address_space_overrides_arg)
+ # Disable overlay scrollbar animations to prevent flaky wpt screenshots based on timing.
+ chrome_options["args"].append("--disable-features=ScrollbarAnimations")
+
# Always disable antialiasing on the Ahem font.
blink_features = ['DisableAhemAntialias']
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..b4b5b2a3ea6 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):
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 95667480afe..bea6ab57ba8 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)
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/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..9a7b237f11a
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ fetch_tests_from_worker(new Worker(
+ "support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js"
+ ));
+</script>
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..7e928d2d719
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.html
@@ -0,0 +1,11 @@
+<!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>
+ fetch_tests_from_worker(new Worker(
+ "support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js"
+ ));
+</script>
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.js b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js
new file mode 100644
index 00000000000..dc3eb004c38
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.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.js.headers
+
+promise_test(async () => {
+ let {violations, exception} = await trusted_type_violations_and_exception_for(_ => setTimeout("unsafe"));
+
+ // 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('unsafe') from DedicatedWorker");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.js.headers b/tests/wpt/tests/trusted-types/support/should-sink-type-mismatch-violation-be-blocked-by-csp-002-worker.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.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-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js
new file mode 100644
index 00000000000..c5c512d98a2
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.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.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");
+}, "Checking reported violations for createPolicy('tt-policy-name') from DedicatedWorker");
+
+done();
diff --git a/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.js.headers
new file mode 100644
index 00000000000..c27bd116d8d
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/support/should-trusted-type-policy-creation-be-blocked-by-csp-004-worker.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/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..c8de9f8d5fd
--- /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 = `data:text/javascript,${`;`.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-no-unsafe-eval.html.headers b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers
deleted file mode 100644
index 72cebc03552..00000000000
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting-no-unsafe-eval.html.headers
+++ /dev/null
@@ -1,3 +0,0 @@
-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/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-eval-reporting.html.headers b/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers
deleted file mode 100644
index 1e57f8bf585..00000000000
--- a/tests/wpt/tests/trusted-types/trusted-types-eval-reporting.html.headers
+++ /dev/null
@@ -1,4 +0,0 @@
-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/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.html b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.html
new file mode 100644
index 00000000000..791663dfc79
--- /dev/null
+++ b/tests/wpt/tests/trusted-types/trusted-types-reporting-for-ServiceWorker-function-constructor.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..75f1cf86945 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" }],
@@ -1874,7 +1875,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-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/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/instance_normalization.https.any.js b/tests/wpt/tests/webnn/conformance_tests/instance_normalization.https.any.js
index 26e0cd0aa93..08d7d6ca337 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',
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/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/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js
index 7cecf29061f..70c97a8454c 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -975,6 +975,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/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/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/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/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini b/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini
index dc7b31a735f..3f8b4a2e97d 100644
--- a/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini
+++ b/tests/wpt/webgl/meta/conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html.ini
@@ -2,3 +2,9 @@
expected: TIMEOUT
[Overall test]
expected: NOTRUN
+
+ [WebGL test #1]
+ expected: FAIL
+
+ [WebGL test #3]
+ expected: FAIL