aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock50
-rw-r--r--components/script/canvas_context.rs182
-rw-r--r--components/script/canvas_state.rs13
-rw-r--r--components/script/dom/htmlcanvaselement.rs99
-rw-r--r--components/script/dom/nodelist.rs1
-rw-r--r--components/script/dom/offscreencanvas.rs58
-rw-r--r--components/script/dom/offscreencanvasrenderingcontext2d.rs29
-rw-r--r--components/script/script_module.rs5
-rw-r--r--ports/servoshell/Cargo.toml2
-rw-r--r--python/servo/testing_commands.py6
-rw-r--r--tests/wpt/meta/MANIFEST.json1622
-rw-r--r--tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini8
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini2
-rw-r--r--tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini18
-rw-r--r--tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini18
-rw-r--r--tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini3
-rw-r--r--tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini3
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini3
-rw-r--r--tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini2
-rw-r--r--tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini3
-rw-r--r--tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini6
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini3
-rw-r--r--tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini3
-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.ini2
-rw-r--r--tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini9
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini15
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini17
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini30
-rw-r--r--tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini3
-rw-r--r--tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini12
-rw-r--r--tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini19
-rw-r--r--tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini19
-rw-r--r--tests/wpt/tests/.github/workflows/docker.yml2
-rw-r--r--tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html13
-rw-r--r--tests/wpt/tests/ai/language_detection/detector-iframe.https.html3
-rw-r--r--tests/wpt/tests/ai/language_detection/detector-locale.https.window.js15
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.https.window.js49
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.optional.https.window.js7
-rw-r--r--tests/wpt/tests/ai/language_detection/resources/util.js4
-rw-r--r--tests/wpt/tests/audio-output/setSinkId.https.html6
-rw-r--r--tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py18
-rw-r--r--tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py18
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js19
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js15
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js16
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js43
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html30
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html39
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html32
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html41
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html59
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html110
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html67
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html118
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html21
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html29
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html48
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html64
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html48
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html71
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html103
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html110
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html30
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html29
-rw-r--r--tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html30
-rw-r--r--tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html29
-rw-r--r--tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html17
-rw-r--r--tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html9
-rw-r--r--tests/wpt/tests/css/css-box/parsing/margin-trim.html14
-rw-r--r--tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html1
-rw-r--r--tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html1
-rw-r--r--tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html14
-rw-r--r--tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html1
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html45
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html96
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html59
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html59
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html35
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html78
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html46
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html64
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html64
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html52
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html39
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html133
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html44
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html115
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html116
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html135
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html115
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html104
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html60
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html41
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html28
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html62
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html47
-rw-r--r--tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html13
-rw-r--r--tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html13
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-button-display-none.html54
-rw-r--r--tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html4
-rw-r--r--tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html31
-rw-r--r--tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html128
-rw-r--r--tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html106
-rw-r--r--tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html187
-rw-r--r--tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html14
-rw-r--r--tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html19
-rw-r--r--tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html36
-rw-r--r--tests/wpt/tests/editing/include/editor-test-utils.js3
-rw-r--r--tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html13
-rw-r--r--tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js281
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js10
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/record-click.py21
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/record-view.py19
-rw-r--r--tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml5
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md9
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html19
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html62
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html71
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html19
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html65
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js144
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html94
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html91
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html90
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html91
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html57
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html44
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html44
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html44
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html62
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html55
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html55
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html43
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html43
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers2
-rw-r--r--tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html4
-rw-r--r--tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html10
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html49
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html55
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html192
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html129
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css14
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js13
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html16
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html39
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html10
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html57
-rw-r--r--tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html12
-rw-r--r--tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini3
-rw-r--r--tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html71
-rw-r--r--tests/wpt/tests/interfaces/fedcm.idl6
-rw-r--r--tests/wpt/tests/interfaces/image-capture.idl2
-rw-r--r--tests/wpt/tests/interfaces/mediastream-recording.idl2
-rw-r--r--tests/wpt/tests/interfaces/turtledove.idl7
-rw-r--r--tests/wpt/tests/interfaces/webcodecs.idl2
-rw-r--r--tests/wpt/tests/interfaces/webcrypto.idl (renamed from tests/wpt/tests/interfaces/WebCryptoAPI.idl)0
-rw-r--r--tests/wpt/tests/interfaces/webgpu.idl1
-rw-r--r--tests/wpt/tests/interfaces/webnn.idl6
-rw-r--r--tests/wpt/tests/interfaces/webxr-depth-sensing.idl7
-rw-r--r--tests/wpt/tests/interfaces/webxr.idl9
-rw-r--r--tests/wpt/tests/interfaces/writing-assistance-apis.idl193
-rw-r--r--tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html4
-rw-r--r--tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html105
-rw-r--r--tests/wpt/tests/resources/chromium/webxr-test.js56
-rw-r--r--tests/wpt/tests/resources/testdriver.js55
-rw-r--r--tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html2
-rw-r--r--tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html2
-rw-r--r--tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html2
-rw-r--r--tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html8
-rw-r--r--tests/wpt/tests/shadow-dom/reference-target/tentative/form.html112
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html35
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html66
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html (renamed from tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html)8
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html (renamed from tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html)44
-rw-r--r--tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js68
-rw-r--r--tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html27
-rw-r--r--tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html33
-rw-r--r--tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html39
-rw-r--r--tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html33
-rw-r--r--tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html27
-rw-r--r--tests/wpt/tests/svg/styling/cx-sibling-index-crash.html5
-rw-r--r--tests/wpt/tests/tools/ci/requirements_tc.txt2
-rw-r--r--tests/wpt/tests/tools/requirements_tests.txt2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py29
-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.js11
-rw-r--r--tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html16
-rw-r--r--tests/wpt/tests/viewport/viewport-segments.html5
-rw-r--r--tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html8
-rw-r--r--tests/wpt/tests/web-animations/resources/keyframe-tests.js5
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py74
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py2
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/abs.https.any.js63
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/concat.https.any.js46
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/neg.https.any.js63
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js366
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/relu.https.any.js56
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/sub.https.any.js213
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js22
-rw-r--r--tests/wpt/tests/webrtc-stats/supported-stats.https.html1
-rw-r--r--tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html24
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html37
-rw-r--r--tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html61
-rw-r--r--tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html61
-rw-r--r--tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js31
-rw-r--r--tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini3
272 files changed, 8397 insertions, 2512 deletions
diff --git a/Cargo.lock b/Cargo.lock
index d2bdb6fdf48..f4a32a14a0f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1065,7 +1065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [
"lazy_static",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2022,7 +2022,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
dependencies = [
"libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -2548,7 +2548,7 @@ dependencies = [
"gobject-sys",
"libc",
"system-deps",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -3421,7 +3421,7 @@ dependencies = [
"js-sys",
"log",
"wasm-bindgen",
- "windows-core 0.57.0",
+ "windows-core 0.58.0",
]
[[package]]
@@ -3990,7 +3990,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
"hermit-abi 0.5.0",
"libc",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -4243,7 +4243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
- "windows-targets 0.52.6",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -6129,7 +6129,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -6926,9 +6926,9 @@ dependencies = [
[[package]]
name = "sha2"
-version = "0.10.8"
+version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -7412,9 +7412,9 @@ dependencies = [
[[package]]
name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
@@ -7492,7 +7492,7 @@ dependencies = [
"getrandom",
"once_cell",
"rustix",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -8279,9 +8279,9 @@ checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49"
[[package]]
name = "wayland-backend"
-version = "0.3.9"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2bea670be0e24795f39416e5461ccef0185b47df2749ed2b226b8a7557ac871"
+checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121"
dependencies = [
"cc",
"downcast-rs",
@@ -8293,9 +8293,9 @@ dependencies = [
[[package]]
name = "wayland-client"
-version = "0.31.8"
+version = "0.31.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f"
+checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61"
dependencies = [
"bitflags 2.9.0",
"rustix",
@@ -8327,9 +8327,9 @@ dependencies = [
[[package]]
name = "wayland-protocols"
-version = "0.32.6"
+version = "0.32.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc"
+checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@@ -8339,9 +8339,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-plasma"
-version = "0.3.6"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3"
+checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@@ -8543,9 +8543,9 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "0.26.9"
+version = "0.26.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b"
+checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93"
dependencies = [
"rustls-pki-types",
]
@@ -8801,7 +8801,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -9149,9 +9149,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winit"
-version = "0.30.9"
+version = "0.30.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0"
+checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e"
dependencies = [
"ahash",
"android-activity",
diff --git a/components/script/canvas_context.rs b/components/script/canvas_context.rs
index d49d31997e1..d85877c0f41 100644
--- a/components/script/canvas_context.rs
+++ b/components/script/canvas_context.rs
@@ -5,6 +5,7 @@
//! Common interfaces for Canvas Contexts
use euclid::default::Size2D;
+use script_bindings::root::Dom;
use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource};
use snapshot::Snapshot;
@@ -12,6 +13,10 @@ use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanva
use crate::dom::bindings::inheritance::Castable;
use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::node::{Node, NodeDamage};
+use crate::dom::types::{
+ CanvasRenderingContext2D, GPUCanvasContext, OffscreenCanvas, OffscreenCanvasRenderingContext2D,
+ WebGL2RenderingContext, WebGLRenderingContext,
+};
pub(crate) trait LayoutCanvasRenderingContextHelpers {
fn canvas_data_source(self) -> HTMLCanvasDataSource;
@@ -85,3 +90,180 @@ impl CanvasHelpers for HTMLCanvasElementOrOffscreenCanvas {
}
}
}
+
+/// Non rooted variant of [`crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::RenderingContext`]
+#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
+#[derive(Clone, JSTraceable, MallocSizeOf)]
+pub(crate) enum RenderingContext {
+ Placeholder(Dom<OffscreenCanvas>),
+ Context2d(Dom<CanvasRenderingContext2D>),
+ WebGL(Dom<WebGLRenderingContext>),
+ WebGL2(Dom<WebGL2RenderingContext>),
+ #[cfg(feature = "webgpu")]
+ WebGPU(Dom<GPUCanvasContext>),
+}
+
+impl CanvasContext for RenderingContext {
+ type ID = ();
+
+ fn context_id(&self) -> Self::ID {}
+
+ fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).canvas(),
+ RenderingContext::Context2d(context) => context.canvas(),
+ RenderingContext::WebGL(context) => context.canvas(),
+ RenderingContext::WebGL2(context) => context.canvas(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.canvas(),
+ }
+ }
+
+ fn resize(&self) {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).resize(),
+ RenderingContext::Context2d(context) => context.resize(),
+ RenderingContext::WebGL(context) => context.resize(),
+ RenderingContext::WebGL2(context) => context.resize(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.resize(),
+ }
+ }
+
+ fn get_image_data(&self) -> Option<Snapshot> {
+ match self {
+ RenderingContext::Placeholder(context) => {
+ (*context.context().unwrap()).get_image_data()
+ },
+ RenderingContext::Context2d(context) => context.get_image_data(),
+ RenderingContext::WebGL(context) => context.get_image_data(),
+ RenderingContext::WebGL2(context) => context.get_image_data(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.get_image_data(),
+ }
+ }
+
+ fn origin_is_clean(&self) -> bool {
+ match self {
+ RenderingContext::Placeholder(context) => {
+ (*context.context().unwrap()).origin_is_clean()
+ },
+ RenderingContext::Context2d(context) => context.origin_is_clean(),
+ RenderingContext::WebGL(context) => context.origin_is_clean(),
+ RenderingContext::WebGL2(context) => context.origin_is_clean(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.origin_is_clean(),
+ }
+ }
+
+ fn size(&self) -> Size2D<u64> {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).size(),
+ RenderingContext::Context2d(context) => context.size(),
+ RenderingContext::WebGL(context) => context.size(),
+ RenderingContext::WebGL2(context) => context.size(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.size(),
+ }
+ }
+
+ fn mark_as_dirty(&self) {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).mark_as_dirty(),
+ RenderingContext::Context2d(context) => context.mark_as_dirty(),
+ RenderingContext::WebGL(context) => context.mark_as_dirty(),
+ RenderingContext::WebGL2(context) => context.mark_as_dirty(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.mark_as_dirty(),
+ }
+ }
+
+ fn update_rendering(&self) {
+ match self {
+ RenderingContext::Placeholder(context) => {
+ (*context.context().unwrap()).update_rendering()
+ },
+ RenderingContext::Context2d(context) => context.update_rendering(),
+ RenderingContext::WebGL(context) => context.update_rendering(),
+ RenderingContext::WebGL2(context) => context.update_rendering(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.update_rendering(),
+ }
+ }
+
+ fn onscreen(&self) -> bool {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).onscreen(),
+ RenderingContext::Context2d(context) => context.onscreen(),
+ RenderingContext::WebGL(context) => context.onscreen(),
+ RenderingContext::WebGL2(context) => context.onscreen(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.onscreen(),
+ }
+ }
+}
+
+/// Non rooted variant of [`crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::OffscreenRenderingContext`]
+#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
+#[derive(Clone, JSTraceable, MallocSizeOf)]
+pub(crate) enum OffscreenRenderingContext {
+ Context2d(Dom<OffscreenCanvasRenderingContext2D>),
+ //WebGL(Dom<WebGLRenderingContext>),
+ //WebGL2(Dom<WebGL2RenderingContext>),
+ //#[cfg(feature = "webgpu")]
+ //WebGPU(Dom<GPUCanvasContext>),
+}
+
+impl CanvasContext for OffscreenRenderingContext {
+ type ID = ();
+
+ fn context_id(&self) -> Self::ID {}
+
+ fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.canvas(),
+ }
+ }
+
+ fn resize(&self) {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.resize(),
+ }
+ }
+
+ fn get_image_data(&self) -> Option<Snapshot> {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.get_image_data(),
+ }
+ }
+
+ fn origin_is_clean(&self) -> bool {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.origin_is_clean(),
+ }
+ }
+
+ fn size(&self) -> Size2D<u64> {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.size(),
+ }
+ }
+
+ fn mark_as_dirty(&self) {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.mark_as_dirty(),
+ }
+ }
+
+ fn update_rendering(&self) {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.update_rendering(),
+ }
+ }
+
+ fn onscreen(&self) -> bool {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.onscreen(),
+ }
+ }
+}
diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs
index e9892818e92..dabe6a5728b 100644
--- a/components/script/canvas_state.rs
+++ b/components/script/canvas_state.rs
@@ -36,6 +36,7 @@ use style_traits::{CssWriter, ParsingMode};
use url::Url;
use webrender_api::ImageKey;
+use crate::canvas_context::{OffscreenRenderingContext, RenderingContext};
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::{
CanvasDirection, CanvasFillRule, CanvasImageSource, CanvasLineCap, CanvasLineJoin,
@@ -52,10 +53,10 @@ use crate::dom::canvaspattern::CanvasPattern;
use crate::dom::dommatrix::DOMMatrix;
use crate::dom::element::{Element, cors_setting_for_element};
use crate::dom::globalscope::GlobalScope;
-use crate::dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement};
+use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::imagedata::ImageData;
use crate::dom::node::{Node, NodeTraits};
-use crate::dom::offscreencanvas::{OffscreenCanvas, OffscreenCanvasContext};
+use crate::dom::offscreencanvas::OffscreenCanvas;
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
use crate::dom::textmetrics::TextMetrics;
use crate::script_runtime::CanGc;
@@ -522,7 +523,7 @@ impl CanvasState {
if let Some(context) = canvas.context() {
match *context {
- OffscreenCanvasContext::OffscreenContext2d(ref context) => {
+ OffscreenRenderingContext::Context2d(ref context) => {
context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
@@ -577,7 +578,7 @@ impl CanvasState {
if let Some(context) = canvas.context() {
match *context {
- CanvasContext::Context2d(ref context) => {
+ RenderingContext::Context2d(ref context) => {
context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
@@ -586,12 +587,12 @@ impl CanvasState {
smoothing_enabled,
));
},
- CanvasContext::Placeholder(ref context) => {
+ RenderingContext::Placeholder(ref context) => {
let Some(context) = context.context() else {
return Err(Error::InvalidState);
};
match *context {
- OffscreenCanvasContext::OffscreenContext2d(ref context) => context
+ OffscreenRenderingContext::Context2d(ref context) => context
.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index bb27d28cea8..cc6df183f42 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -27,14 +27,13 @@ use servo_media::streams::registry::MediaStreamId;
use snapshot::Snapshot;
use style::attr::AttrValue;
-use crate::canvas_context::CanvasContext as _;
pub(crate) use crate::canvas_context::*;
use crate::conversions::Convert;
use crate::dom::attr::Attr;
use crate::dom::bindings::callback::ExceptionHandling;
use crate::dom::bindings::cell::{DomRefCell, Ref, ref_filter_map};
use crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::{
- BlobCallback, HTMLCanvasElementMethods, RenderingContext,
+ BlobCallback, HTMLCanvasElementMethods, RenderingContext as RootedRenderingContext,
};
use crate::dom::bindings::codegen::Bindings::MediaStreamBinding::MediaStreamMethods;
use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes;
@@ -104,21 +103,10 @@ impl EncodedImageType {
}
}
-#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
-#[derive(Clone, JSTraceable, MallocSizeOf)]
-pub(crate) enum CanvasContext {
- Placeholder(Dom<OffscreenCanvas>),
- Context2d(Dom<CanvasRenderingContext2D>),
- WebGL(Dom<WebGLRenderingContext>),
- WebGL2(Dom<WebGL2RenderingContext>),
- #[cfg(feature = "webgpu")]
- WebGPU(Dom<GPUCanvasContext>),
-}
-
#[dom_struct]
pub(crate) struct HTMLCanvasElement {
htmlelement: HTMLElement,
- context: DomRefCell<Option<CanvasContext>>,
+ context: DomRefCell<Option<RenderingContext>>,
// This id and hashmap are used to keep track of ongoing toBlob() calls.
callback_id: Cell<u32>,
#[ignore_malloc_size_of = "not implemented for webidl callbacks"]
@@ -159,14 +147,7 @@ impl HTMLCanvasElement {
fn recreate_contexts_after_resize(&self) {
if let Some(ref context) = *self.context.borrow() {
- match *context {
- CanvasContext::Context2d(ref context) => context.resize(),
- CanvasContext::WebGL(ref context) => context.resize(),
- CanvasContext::WebGL2(ref context) => context.resize(),
- #[cfg(feature = "webgpu")]
- CanvasContext::WebGPU(ref context) => context.resize(),
- CanvasContext::Placeholder(ref context) => context.resize(self.get_size().cast()),
- }
+ context.resize()
}
}
@@ -176,23 +157,14 @@ impl HTMLCanvasElement {
pub(crate) fn origin_is_clean(&self) -> bool {
match *self.context.borrow() {
- Some(CanvasContext::Context2d(ref context)) => context.origin_is_clean(),
+ Some(ref context) => context.origin_is_clean(),
_ => true,
}
}
pub(crate) fn mark_as_dirty(&self) {
if let Some(ref context) = *self.context.borrow() {
- match *context {
- CanvasContext::Context2d(ref context) => context.mark_as_dirty(),
- CanvasContext::WebGL(ref context) => context.mark_as_dirty(),
- CanvasContext::WebGL2(ref context) => context.mark_as_dirty(),
- #[cfg(feature = "webgpu")]
- CanvasContext::WebGPU(ref context) => context.mark_as_dirty(),
- CanvasContext::Placeholder(ref _context) => {
- // TODO: Should this be marked as dirty?
- },
- }
+ context.mark_as_dirty()
}
}
@@ -222,12 +194,14 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> {
fn data(self) -> HTMLCanvasData {
let source = unsafe {
match self.unsafe_get().context.borrow_for_layout().as_ref() {
- Some(CanvasContext::Context2d(context)) => context.to_layout().canvas_data_source(),
- Some(CanvasContext::WebGL(context)) => context.to_layout().canvas_data_source(),
- Some(CanvasContext::WebGL2(context)) => context.to_layout().canvas_data_source(),
+ Some(RenderingContext::Context2d(context)) => {
+ context.to_layout().canvas_data_source()
+ },
+ Some(RenderingContext::WebGL(context)) => context.to_layout().canvas_data_source(),
+ Some(RenderingContext::WebGL2(context)) => context.to_layout().canvas_data_source(),
#[cfg(feature = "webgpu")]
- Some(CanvasContext::WebGPU(context)) => context.to_layout().canvas_data_source(),
- Some(CanvasContext::Placeholder(_)) | None => HTMLCanvasDataSource::Empty,
+ Some(RenderingContext::WebGPU(context)) => context.to_layout().canvas_data_source(),
+ Some(RenderingContext::Placeholder(_)) | None => HTMLCanvasDataSource::Empty,
}
};
@@ -246,14 +220,14 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> {
}
impl HTMLCanvasElement {
- pub(crate) fn context(&self) -> Option<Ref<CanvasContext>> {
+ pub(crate) fn context(&self) -> Option<Ref<RenderingContext>> {
ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref())
}
fn get_or_init_2d_context(&self, can_gc: CanGc) -> Option<DomRoot<CanvasRenderingContext2D>> {
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -261,7 +235,7 @@ impl HTMLCanvasElement {
let window = self.owner_window();
let size = self.get_size();
let context = CanvasRenderingContext2D::new(window.as_global_scope(), self, size, can_gc);
- *self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() = Some(RenderingContext::Context2d(Dom::from_ref(&*context)));
Some(context)
}
@@ -273,7 +247,7 @@ impl HTMLCanvasElement {
) -> Option<DomRoot<WebGLRenderingContext>> {
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::WebGL(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::WebGL(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -289,7 +263,7 @@ impl HTMLCanvasElement {
attrs,
can_gc,
)?;
- *self.context.borrow_mut() = Some(CanvasContext::WebGL(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() = Some(RenderingContext::WebGL(Dom::from_ref(&*context)));
Some(context)
}
@@ -305,7 +279,7 @@ impl HTMLCanvasElement {
}
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::WebGL2(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::WebGL2(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -314,7 +288,7 @@ impl HTMLCanvasElement {
let attrs = Self::get_gl_attributes(cx, options)?;
let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self));
let context = WebGL2RenderingContext::new(&window, &canvas, size, attrs, can_gc)?;
- *self.context.borrow_mut() = Some(CanvasContext::WebGL2(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() = Some(RenderingContext::WebGL2(Dom::from_ref(&*context)));
Some(context)
}
@@ -327,7 +301,7 @@ impl HTMLCanvasElement {
fn get_or_init_webgpu_context(&self, can_gc: CanGc) -> Option<DomRoot<GPUCanvasContext>> {
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::WebGPU(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::WebGPU(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -341,7 +315,8 @@ impl HTMLCanvasElement {
.expect("Failed to get WebGPU channel")
.map(|channel| {
let context = GPUCanvasContext::new(&global_scope, self, channel, can_gc);
- *self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() =
+ Some(RenderingContext::WebGPU(Dom::from_ref(&*context)));
context
})
}
@@ -349,8 +324,8 @@ impl HTMLCanvasElement {
/// Gets the base WebGLRenderingContext for WebGL or WebGL 2, if exists.
pub(crate) fn get_base_webgl_context(&self) -> Option<DomRoot<WebGLRenderingContext>> {
match *self.context.borrow() {
- Some(CanvasContext::WebGL(ref context)) => Some(DomRoot::from_ref(context)),
- Some(CanvasContext::WebGL2(ref context)) => Some(context.base_context()),
+ Some(RenderingContext::WebGL(ref context)) => Some(DomRoot::from_ref(context)),
+ Some(RenderingContext::WebGL2(ref context)) => Some(context.base_context()),
_ => None,
}
}
@@ -378,12 +353,7 @@ impl HTMLCanvasElement {
pub(crate) fn get_image_data(&self) -> Option<Snapshot> {
match self.context.borrow().as_ref() {
- Some(CanvasContext::Context2d(context)) => context.get_image_data(),
- Some(CanvasContext::WebGL(context)) => context.get_image_data(),
- Some(CanvasContext::WebGL2(context)) => context.get_image_data(),
- #[cfg(feature = "webgpu")]
- Some(CanvasContext::WebGPU(context)) => context.get_image_data(),
- Some(CanvasContext::Placeholder(context)) => context.get_image_data(),
+ Some(context) => context.get_image_data(),
None => {
let size = self.get_size();
if size.width == 0 || size.height == 0 {
@@ -466,7 +436,7 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
// is set to placeholder, the user agent must throw an "InvalidStateError" DOMException and leave the
// attribute's value unchanged.
fn SetWidth(&self, value: u32, can_gc: CanGc) -> Fallible<()> {
- if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() {
+ if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() {
return Err(Error::InvalidState);
}
@@ -485,7 +455,7 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
// https://html.spec.whatwg.org/multipage/#dom-canvas-height
fn SetHeight(&self, value: u32, can_gc: CanGc) -> Fallible<()> {
- if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() {
+ if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() {
return Err(Error::InvalidState);
}
@@ -506,26 +476,26 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
id: DOMString,
options: HandleValue,
can_gc: CanGc,
- ) -> Fallible<Option<RenderingContext>> {
+ ) -> Fallible<Option<RootedRenderingContext>> {
// Always throw an InvalidState exception when the canvas is in Placeholder mode (See table in the spec).
- if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() {
+ if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() {
return Err(Error::InvalidState);
}
Ok(match &*id {
"2d" => self
.get_or_init_2d_context(can_gc)
- .map(RenderingContext::CanvasRenderingContext2D),
+ .map(RootedRenderingContext::CanvasRenderingContext2D),
"webgl" | "experimental-webgl" => self
.get_or_init_webgl_context(cx, options, can_gc)
- .map(RenderingContext::WebGLRenderingContext),
+ .map(RootedRenderingContext::WebGLRenderingContext),
"webgl2" | "experimental-webgl2" => self
.get_or_init_webgl2_context(cx, options, can_gc)
- .map(RenderingContext::WebGL2RenderingContext),
+ .map(RootedRenderingContext::WebGL2RenderingContext),
#[cfg(feature = "webgpu")]
"webgpu" => self
.get_or_init_webgpu_context(can_gc)
- .map(RenderingContext::GPUCanvasContext),
+ .map(RootedRenderingContext::GPUCanvasContext),
_ => None,
})
}
@@ -672,7 +642,8 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
can_gc,
);
// Step 4. Set this canvas element's context mode to placeholder.
- *self.context.borrow_mut() = Some(CanvasContext::Placeholder(offscreen_canvas.as_traced()));
+ *self.context.borrow_mut() =
+ Some(RenderingContext::Placeholder(offscreen_canvas.as_traced()));
// Step 5. Return offscreenCanvas.
Ok(offscreen_canvas)
diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs
index b349f16a986..1ec2dc3f78b 100644
--- a/components/script/dom/nodelist.rs
+++ b/components/script/dom/nodelist.rs
@@ -175,7 +175,6 @@ impl NodeList {
#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
pub(crate) struct ChildrenList {
node: Dom<Node>,
- #[ignore_malloc_size_of = "Defined in rust-mozjs"]
last_visited: MutNullableDom<Node>,
last_index: Cell<u32>,
}
diff --git a/components/script/dom/offscreencanvas.rs b/components/script/dom/offscreencanvas.rs
index aabe5955e12..9947d35f4e0 100644
--- a/components/script/dom/offscreencanvas.rs
+++ b/components/script/dom/offscreencanvas.rs
@@ -9,9 +9,10 @@ use euclid::default::Size2D;
use js::rust::{HandleObject, HandleValue};
use snapshot::Snapshot;
+use crate::canvas_context::{CanvasContext, OffscreenRenderingContext};
use crate::dom::bindings::cell::{DomRefCell, Ref, ref_filter_map};
use crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{
- OffscreenCanvasMethods, OffscreenRenderingContext,
+ OffscreenCanvasMethods, OffscreenRenderingContext as RootedOffscreenRenderingContext,
};
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object_with_proto};
@@ -23,20 +24,12 @@ use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::offscreencanvasrenderingcontext2d::OffscreenCanvasRenderingContext2D;
use crate::script_runtime::{CanGc, JSContext};
-#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
-#[derive(Clone, JSTraceable, MallocSizeOf)]
-pub(crate) enum OffscreenCanvasContext {
- OffscreenContext2d(Dom<OffscreenCanvasRenderingContext2D>),
- //WebGL(Dom<WebGLRenderingContext>),
- //WebGL2(Dom<WebGL2RenderingContext>),
-}
-
#[dom_struct]
pub(crate) struct OffscreenCanvas {
eventtarget: EventTarget,
width: Cell<u64>,
height: Cell<u64>,
- context: DomRefCell<Option<OffscreenCanvasContext>>,
+ context: DomRefCell<Option<OffscreenRenderingContext>>,
placeholder: Option<Dom<HTMLCanvasElement>>,
}
@@ -77,20 +70,18 @@ impl OffscreenCanvas {
pub(crate) fn origin_is_clean(&self) -> bool {
match *self.context.borrow() {
- Some(OffscreenCanvasContext::OffscreenContext2d(ref context)) => {
- context.origin_is_clean()
- },
+ Some(ref context) => context.origin_is_clean(),
_ => true,
}
}
- pub(crate) fn context(&self) -> Option<Ref<OffscreenCanvasContext>> {
+ pub(crate) fn context(&self) -> Option<Ref<OffscreenRenderingContext>> {
ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref())
}
pub(crate) fn get_image_data(&self) -> Option<Snapshot> {
match self.context.borrow().as_ref() {
- Some(OffscreenCanvasContext::OffscreenContext2d(context)) => context.get_image_data(),
+ Some(context) => context.get_image_data(),
None => {
let size = self.get_size();
if size.width == 0 || size.height == 0 {
@@ -108,13 +99,13 @@ impl OffscreenCanvas {
) -> Option<DomRoot<OffscreenCanvasRenderingContext2D>> {
if let Some(ctx) = self.context() {
return match *ctx {
- OffscreenCanvasContext::OffscreenContext2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ OffscreenRenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
};
}
let context = OffscreenCanvasRenderingContext2D::new(&self.global(), self, can_gc);
- *self.context.borrow_mut() = Some(OffscreenCanvasContext::OffscreenContext2d(
- Dom::from_ref(&*context),
- ));
+ *self.context.borrow_mut() = Some(OffscreenRenderingContext::Context2d(Dom::from_ref(
+ &*context,
+ )));
Some(context)
}
@@ -125,19 +116,6 @@ impl OffscreenCanvas {
pub(crate) fn placeholder(&self) -> Option<&HTMLCanvasElement> {
self.placeholder.as_deref()
}
-
- pub(crate) fn resize(&self, size: Size2D<u64>) {
- self.width.set(size.width);
- self.height.set(size.height);
-
- if let Some(canvas_context) = self.context() {
- match &*canvas_context {
- OffscreenCanvasContext::OffscreenContext2d(rendering_context) => {
- rendering_context.set_canvas_bitmap_dimensions(self.get_size());
- },
- }
- }
- }
}
impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
@@ -160,11 +138,11 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
id: DOMString,
_options: HandleValue,
can_gc: CanGc,
- ) -> Fallible<Option<OffscreenRenderingContext>> {
+ ) -> Fallible<Option<RootedOffscreenRenderingContext>> {
match &*id {
"2d" => Ok(self
.get_or_init_2d_context(can_gc)
- .map(OffscreenRenderingContext::OffscreenCanvasRenderingContext2D)),
+ .map(RootedOffscreenRenderingContext::OffscreenCanvasRenderingContext2D)),
/*"webgl" | "experimental-webgl" => self
.get_or_init_webgl_context(cx, options)
.map(OffscreenRenderingContext::WebGLRenderingContext),
@@ -187,11 +165,7 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
self.width.set(value);
if let Some(canvas_context) = self.context() {
- match &*canvas_context {
- OffscreenCanvasContext::OffscreenContext2d(rendering_context) => {
- rendering_context.set_canvas_bitmap_dimensions(self.get_size());
- },
- }
+ canvas_context.resize();
}
if let Some(canvas) = &self.placeholder {
@@ -209,11 +183,7 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
self.height.set(value);
if let Some(canvas_context) = self.context() {
- match &*canvas_context {
- OffscreenCanvasContext::OffscreenContext2d(rendering_context) => {
- rendering_context.set_canvas_bitmap_dimensions(self.get_size());
- },
- }
+ canvas_context.resize();
}
if let Some(canvas) = &self.placeholder {
diff --git a/components/script/dom/offscreencanvasrenderingcontext2d.rs b/components/script/dom/offscreencanvasrenderingcontext2d.rs
index b2d0f3201ca..d7ca0e9dc4d 100644
--- a/components/script/dom/offscreencanvasrenderingcontext2d.rs
+++ b/components/script/dom/offscreencanvasrenderingcontext2d.rs
@@ -3,11 +3,10 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::bindings::codegen::GenericBindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2D_Binding::CanvasRenderingContext2DMethods;
-use crate::canvas_context::CanvasContext as _;
+use crate::canvas_context::CanvasContext;
use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas;
use canvas_traits::canvas::Canvas2dMsg;
use dom_struct::dom_struct;
-use euclid::default::Size2D;
use snapshot::Snapshot;
use crate::dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::{
@@ -64,21 +63,33 @@ impl OffscreenCanvasRenderingContext2D {
reflect_dom_object(boxed, global, can_gc)
}
- pub(crate) fn set_canvas_bitmap_dimensions(&self, size: Size2D<u64>) {
- self.context.set_canvas_bitmap_dimensions(size.cast());
- }
-
pub(crate) fn send_canvas_2d_msg(&self, msg: Canvas2dMsg) {
self.context.send_canvas_2d_msg(msg)
}
+}
- pub(crate) fn origin_is_clean(&self) -> bool {
- self.context.origin_is_clean()
+impl CanvasContext for OffscreenCanvasRenderingContext2D {
+ type ID = <CanvasRenderingContext2D as CanvasContext>::ID;
+
+ fn context_id(&self) -> Self::ID {
+ self.context.context_id()
+ }
+
+ fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas {
+ self.context.canvas()
+ }
+
+ fn resize(&self) {
+ self.context.resize()
}
- pub(crate) fn get_image_data(&self) -> Option<Snapshot> {
+ fn get_image_data(&self) -> Option<Snapshot> {
self.context.get_image_data()
}
+
+ fn origin_is_clean(&self) -> bool {
+ self.context.origin_is_clean()
+ }
}
impl OffscreenCanvasRenderingContext2DMethods<crate::DomTypeHolder>
diff --git a/components/script/script_module.rs b/components/script/script_module.rs
index c7697adeea6..0aa35a2eda8 100644
--- a/components/script/script_module.rs
+++ b/components/script/script_module.rs
@@ -1369,7 +1369,7 @@ pub(crate) unsafe extern "C" fn host_import_module_dynamically(
true
}
-#[derive(Clone, JSTraceable, MallocSizeOf)]
+#[derive(Clone, Debug, JSTraceable, MallocSizeOf)]
/// <https://html.spec.whatwg.org/multipage/#script-fetch-options>
pub(crate) struct ScriptFetchOptions {
#[no_trace]
@@ -1763,7 +1763,8 @@ fn fetch_single_module_script(
.mode(mode)
.insecure_requests_policy(global.insecure_requests_policy())
.has_trustworthy_ancestor_origin(global.has_trustworthy_ancestor_origin())
- .policy_container(global.policy_container().to_owned());
+ .policy_container(global.policy_container().to_owned())
+ .cryptographic_nonce_metadata(options.cryptographic_nonce.clone());
let context = Arc::new(Mutex::new(ModuleContext {
owner,
diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml
index c77ea06fa15..e000900e4ea 100644
--- a/ports/servoshell/Cargo.toml
+++ b/ports/servoshell/Cargo.toml
@@ -121,7 +121,7 @@ serde_json = { workspace = true }
servo_allocator = { path = "../../components/allocator" }
shellwords = "1.0.0"
surfman = { workspace = true, features = ["sm-raw-window-handle-06", "sm-x11"] }
-winit = "0.30.9"
+winit = "0.30.10"
[target.'cfg(any(all(target_os = "linux", not(target_env = "ohos")), target_os = "macos"))'.dependencies]
sig = "1.0"
diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py
index 845b09b622a..860217d062a 100644
--- a/python/servo/testing_commands.py
+++ b/python/servo/testing_commands.py
@@ -432,9 +432,9 @@ class MachCommands(CommandBase):
return [py, avd, apk]
@Command('test-jquery', description='Run the jQuery test suite', category='testing')
- @CommandBase.common_command_arguments(build_configuration=False, build_type=True)
- def test_jquery(self, build_type: BuildType):
- return self.jquery_test_runner("test", build_type)
+ @CommandBase.common_command_arguments(binary_selection=True)
+ def test_jquery(self, servo_binary: str):
+ return self.jquery_test_runner("test", servo_binary)
@Command('test-dromaeo', description='Run the Dromaeo test suite', category='testing')
@CommandArgument('tests', default=["recommended"], nargs="...", help="Specific tests to run")
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 72c930afccf..b5e319c83c3 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -411,10 +411,12 @@
"ai": {
"language_detection": {
"availability-detached-crash.https.html": [
- "5f76d59eb3540048bc0586f2a1ac5b3b313a147e",
+ "ee5e27e35b60e89f17f8008d809f4d6040e4eb5b",
[
null,
- {}
+ {
+ "testdriver": true
+ }
]
]
}
@@ -790,6 +792,13 @@
{}
]
],
+ "chrome-bug-405795970.html": [
+ "5b45527fd9ccb2038fdd3f459bcf10a9514f199c",
+ [
+ null,
+ {}
+ ]
+ ],
"pseudo-element-animation-with-marker.html": [
"ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5",
[
@@ -9893,6 +9902,13 @@
]
},
"styling": {
+ "cx-sibling-index-crash.html": [
+ "9fe97b12d774a547a2cb3bf65f9a9ad8f1af8a58",
+ [
+ null,
+ {}
+ ]
+ ],
"font-size-number-calc-crash.svg": [
"6b56d9df2b426e2376f87668a98f5e21ee56e37b",
[
@@ -10055,6 +10071,13 @@
null,
{}
]
+ ],
+ "sibling-index-offset-crash.html": [
+ "812a7952738231f4c1bc2bf22c0d87f9a39c86cd",
+ [
+ null,
+ {}
+ ]
]
},
"interfaces": {
@@ -124262,6 +124285,32 @@
},
"css-align": {
"abspos": {
+ "align-items-static-position-001.tentative.html": [
+ "06c11e6cdb61a519fdbc77d377fb0ace0e92f6b1",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-items-static-position-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-items-static-position-002.tentative.html": [
+ "f90004b5672a1fef9f42cf32ae13b06fc085e0ec",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-items-static-position-002-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"align-items-static-position.html": [
"0b653ca5d6c2bbaf29b3834aec7d806169c8de55",
[
@@ -124301,6 +124350,110 @@
{}
]
],
+ "align-self-static-position-003.html": [
+ "39f871f4c2b837dc67b30d615e9c8ad0e4392d24",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-004.html": [
+ "afba7215b116506138434da5fa3c13ec832fb393",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-005.html": [
+ "e148f0ebda37797d5573f4c3a2d4b7c52e5a2f2e",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-006.html": [
+ "253b2a52f618a82fcf13b82bd61075bc2dcee8be",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-007.html": [
+ "ebe872aaab909e29abf3eed33840a577a616b34b",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-008.html": [
+ "187974884b4aded9a031c0c2fdc9d2caafd9ef5b",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-stretch-auto-margins-aspect-ratio.html": [
+ "4eaa9d2f3a6dbab63d3d931d4c58a427bc11976f",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-stretch-auto-margins.html": [
+ "9d1b6454c848c02b7fef360fb447d4d6b46ee8c0",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"align-self-stretch-auto-size.tentative.html": [
"74091feacfe63813aa4a6bbc3ef1b4d3e4e8a59c",
[
@@ -124326,6 +124479,32 @@
],
{}
]
+ ],
+ "justify-self-stretch-auto-margins-aspect-ratio.html": [
+ "c50b32f089b1b0043ac5d9dbd0f79906d82827f3",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "justify-self-stretch-auto-margins.html": [
+ "7d7b4bfc8570d3dde59fc903de7cb173b0b5baf8",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"baseline-of-scrollable-1a.html": [
@@ -186631,6 +186810,192 @@
{}
]
]
+ },
+ "tentative": {
+ "multicol": {
+ "multicol-gap-decorations-001.html": [
+ "c3752156c7d54f6620ade9715b4562582c6135f6",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-002.html": [
+ "0b632fa94ace20a253f5f56079d29adbb7997135",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-003.html": [
+ "2f2473fd04686283e120abd29b5f273da40c3ef3",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-004.html": [
+ "0dcbeef4df82f4d9dc6e2ed2215ee2fa39773052",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-005.html": [
+ "daa65e904e71ee62c83ba2a16933d13311328539",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-006.html": [
+ "64b3b007ab5f6282c95bb79a39a3bcf89d10de88",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-007.html": [
+ "1f23ed7f7ca34602f4310627edb5ae96885028b8",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-008.html": [
+ "ed299b5d9f68e8560d99cdd58fcc9b3830929117",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-009.html": [
+ "b00c6a70f8abf9894e548d9e40882e396ed5b1f0",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-010.html": [
+ "61bb4a9b93314bb7d96a90b98f67b175a4cf86c6",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-011.html": [
+ "cf588ded41ea3e811c241984ec8909e5fbcf14be",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-012.html": [
+ "078b810cf8e608b16dd2a898136f4ce757325ed9",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-013.html": [
+ "d4170084f066688fd136b2abeb40da03b1243816",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-014.html": [
+ "1dcd393d99aa19021684e42e9f835e17281fc6a4",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ }
}
},
"css-grid": {
@@ -192732,6 +193097,32 @@
{}
]
],
+ "replaced-element-016.tentative.html": [
+ "2d5b401b8d20ac682675b3eeb23f264239b83d49",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "replaced-element-017.tentative.html": [
+ "575fa8c78179d3741948e0d987fc446534bb6a86",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table-with-infinite-max-intrinsic-width.html": [
"877e982cd4c5987f131587da33a23f3b7a49d538",
[
@@ -249641,6 +250032,32 @@
{}
]
],
+ "intrinsic-percent-replaced-029.tentative.html": [
+ "feff03bbe2e1a1e18a22429a58a9d20cc0f9987b",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "intrinsic-percent-replaced-030.tentative.html": [
+ "5a6b103c22e20d23aa842e72ac6ffe6c9948156f",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"intrinsic-percent-replaced-dynamic-001.html": [
"1128ffa1759f26011c0639d8b5f498322c6396ac",
[
@@ -324194,6 +324611,19 @@
{}
]
],
+ "table-cell-align-006.html": [
+ "a8d33f281fda76603ea312601933fdf170ddf64b",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/table-cell-align-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table-cell-valign-001.html": [
"f3026810dd58cd04f87df5f3ae2ad474d5c289db",
[
@@ -347931,7 +348361,7 @@
]
],
"marquee-with-trusted-types.html": [
- "57f4985032165e989ba261c32c11c9acf0491908",
+ "f16c58bb85d71b011e4ee524dfb63184a5fca81a",
[
null,
[
@@ -353323,19 +353753,6 @@
}
]
],
- "select-multiple-base-appearance.html": [
- "48673b446bc8e6e6cce72e6c4d29671bed313779",
- [
- null,
- [
- [
- "/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"select-only-button-opt-in.tentative.html": [
"b010d15e8adab1ebfe448842e195e29b24d332fb",
[
@@ -353568,6 +353985,21 @@
]
]
},
+ "customizable-select-in-page": {
+ "customizable-select-in-page-appearance.tentative.html": [
+ "b3bf75eb0ff25df6d4737326940a498a11d264d2",
+ [
+ null,
+ [
+ [
+ "/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"reset-algorithm-rendering.html": [
"67da173ff2eb0d90c063294db486eaa34ea8878a",
[
@@ -361587,7 +362019,7 @@
]
],
"animation-with-transform.html": [
- "f741cc634d732624186d8d0a034822bef831c872",
+ "323d984c98938fbb5bd224560d7adf0711149430",
[
null,
[
@@ -361652,7 +362084,7 @@
]
],
"two-animations-attach-to-same-scroll-timeline-cancel-one.html": [
- "ed8e8337a65af3033e3df4e158333d225d88a56d",
+ "28973d2d1858421ff53bae1d667c160152d6ecda",
[
null,
[
@@ -361665,7 +362097,7 @@
]
],
"two-animations-attach-to-same-scroll-timeline.html": [
- "de50599fbafb634e44ccd9546e18bea8ba7f7f7e",
+ "45ba3f99ccdbf9ef64f915c1c124d7f946a1f74f",
[
null,
[
@@ -370762,7 +371194,7 @@
[]
],
"docker.yml": [
- "66794b69aba0f2ee5984c269434cdab2ee9a6cfc",
+ "5de0cc4bcb1faf6c919d41998bd9ec035e8594cf",
[]
],
"documentation.yml": [
@@ -371505,6 +371937,10 @@
"iframe-helper.html": [
"fe07de3f8abac59ddbd6ccfd706a5e69c5b8b4c4",
[]
+ ],
+ "util.js": [
+ "7cb3e7c2e13cb0415be019580ccfcc339cd7bd8f",
+ []
]
}
},
@@ -374135,6 +374571,14 @@
"eb50cb54ef867844ea741fe1fdb01df970e4deea",
[]
],
+ "clear-site-data-prefetchCache.py": [
+ "3a332dd58b2012154b6a193410be34dc3f92a172",
+ []
+ ],
+ "clear-site-data-prerenderCache.py": [
+ "bf845cfb699c311c145357ad12a5b4b056d2c986",
+ []
+ ],
"controlled-endpoint.py": [
"bb4f464088e46438f993d66ae0da134bb4410c7b",
[]
@@ -413754,6 +414198,14 @@
[]
],
"abspos": {
+ "align-items-static-position-001-ref.tentative.html": [
+ "22c1fd03e38792a3d697659c1e087178c453f1ed",
+ []
+ ],
+ "align-items-static-position-002-ref.tentative.html": [
+ "6f53b04178707a83eb2822e5807cf42d3c547ca6",
+ []
+ ],
"align-items-static-position-ref.html": [
"fd7093f98748709d0f6d03c9dc9993a7a1447446",
[]
@@ -413766,6 +414218,30 @@
"d8bef63aa292aecd1ce6628e27abbc2c196f8a29",
[]
],
+ "align-self-static-position-003-ref.html": [
+ "132bbb7360fb5a40130e0a7af9ffb3a9d2baf753",
+ []
+ ],
+ "align-self-static-position-004-ref.html": [
+ "68130ee1d7e723a6b5c4c8a7e3b78d7bdb2f35da",
+ []
+ ],
+ "align-self-static-position-005-ref.html": [
+ "947bd2704481f757f3d1f4bf51105483978cc7ff",
+ []
+ ],
+ "align-self-static-position-006-ref.html": [
+ "5bbafc6484585ad25223cf1b5825214e90705836",
+ []
+ ],
+ "align-self-static-position-007-ref.html": [
+ "bc9b5f4f6502f647e97332401308a87a64c339f0",
+ []
+ ],
+ "align-self-static-position-008-ref.html": [
+ "79cf612b8f846920af1d2d7b188376693c789b3f",
+ []
+ ],
"align-self-with-flex-grid-parent-ref.html": [
"c87289d450e9ec95677c17a6d72d3e34dec4d05d",
[]
@@ -430722,6 +431198,66 @@
"7e0d9cbcd6ff64b17bc8fe57616a37ba29a9fd8e",
[]
]
+ },
+ "tentative": {
+ "multicol": {
+ "multicol-gap-decorations-001-ref.html": [
+ "834c96ccd397fbc41abcfb80dbd298094cb929b1",
+ []
+ ],
+ "multicol-gap-decorations-002-ref.html": [
+ "d132f0ca6770be13d87ee66fb033f2f498d0e37b",
+ []
+ ],
+ "multicol-gap-decorations-003-ref.html": [
+ "cd26da243891f05c83c5d1eea17c747dcf390f05",
+ []
+ ],
+ "multicol-gap-decorations-004-ref.html": [
+ "002b1f2b594cf791b6d66613f48128e915517e01",
+ []
+ ],
+ "multicol-gap-decorations-005-ref.html": [
+ "6543021c97934a217568e567ac005166f7a9c0a0",
+ []
+ ],
+ "multicol-gap-decorations-006-ref.html": [
+ "4cb56d207fef4f801ec2063828103712267c030e",
+ []
+ ],
+ "multicol-gap-decorations-007-ref.html": [
+ "09973ddc690a899be9fb321e603b7831bfeb22a7",
+ []
+ ],
+ "multicol-gap-decorations-008-ref.html": [
+ "d49c2f50f1909d5b04be07798e62448d9b82ab72",
+ []
+ ],
+ "multicol-gap-decorations-009-ref.html": [
+ "124bf7eaeb1779d067d84f1c30560f45763add7c",
+ []
+ ],
+ "multicol-gap-decorations-010-ref.html": [
+ "9582ab4103d197d25823ed75dc8cafa83e0b1a7c",
+ []
+ ],
+ "multicol-gap-decorations-011-ref.html": [
+ "3387918d399cdbd3b39364ebe954a2a204a5145c",
+ []
+ ],
+ "multicol-gap-decorations-012-ref.html": [
+ "9fb5e85e920812d259e057c7538d35db56659b05",
+ []
+ ],
+ "multicol-gap-decorations-013-ref.html": [
+ "8e426d8ed32b25248e602e063e69678ca94b5e09",
+ []
+ ],
+ "multicol-gap-decorations-014-ref.html": [
+ "9d9674bd476896f0f1b03ec6835b069c97d9c8e5",
+ []
+ ]
+ }
}
},
"css-gcpm": {
@@ -454356,6 +454892,10 @@
"c5cd6fe28a97343b94989193c4583ddd2393538a",
[]
],
+ "table-cell-align-006-ref.html": [
+ "c5b52346fc0ad931aedb40339150146e067bc268",
+ []
+ ],
"table-cell-valign-001-ref.html": [
"03cb9ec9e4c6b1d7b6e0973b57f3c93ce293b1e4",
[]
@@ -460256,7 +460796,7 @@
},
"include": {
"editor-test-utils.js": [
- "9c5600af77bf22c936cbe383a9667790d2cd8c10",
+ "f0c4f58399263a453b11a37e54d7152d935adec5",
[]
],
"implementation.js": [
@@ -464917,7 +465457,7 @@
[]
],
"fledge-util.sub.js": [
- "0a18ea40d3d25e22acef6a7c32f0e644989294cf",
+ "49ebfd1c596c102970f0062592284b14da3841f9",
[]
],
"fledge_http_server_util.py": [
@@ -464936,6 +465476,14 @@
"54873674eb58783731237dde5ef299ce15947638",
[]
],
+ "record-click.py": [
+ "b4e76873d9b12227e350e2d4d01321cab05a44ce",
+ []
+ ],
+ "record-view.py": [
+ "d423b2d9c72930a1302738418eef197f28dfb661",
+ []
+ ],
"redirect-to-trusted-signals.py": [
"7da27cd6872f9119c8647be939aecc4452526e50",
[]
@@ -469620,6 +470168,10 @@
"2d.gradient.object.current.png": [
"d638d033868afd3aab0a7b26d5b2a0a2b95da010",
[]
+ ],
+ "WEB_FEATURES.yml": [
+ "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c",
+ []
]
},
"filters": {
@@ -470040,6 +470592,10 @@
]
},
"fill-and-stroke-styles": {
+ "WEB_FEATURES.yml": [
+ "5d9106c1cd63b77005e44a30177d9e623f4e98df",
+ []
+ ],
"conic-gradient-expected.html": [
"f347abc9d3939fb52c4fe08d949f8d96c4de3386",
[]
@@ -470950,6 +471506,10 @@
"2d.gradient.hueInterpolationMethod-expected.html": [
"13ae67ad970eb6bc6a94d837d3f2c01c2ad9c3ba",
[]
+ ],
+ "WEB_FEATURES.yml": [
+ "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c",
+ []
]
},
"filters": {
@@ -472316,82 +472876,6 @@
"244167937219cfd784f13d8ed37eedead64665e9",
[]
]
- },
- "tentative": {
- "restrict-properties": {
- "README.md": [
- "b3c24c3f82d2dbf07eefa9fa2e88fcf3817473d2",
- []
- ],
- "coop-rp-in-navigation-chain.https.html.headers": [
- "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c",
- []
- ],
- "iframe-popup-about-blank.https.window.js.headers": [
- "19d0dbe4e18df8ba52c2a564853f5614a0469b95",
- []
- ],
- "iframe-popup-to-so.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "iframe-popup-to-soap.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "iframe-popup-to-un.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "iframe-popup.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "popup-so.https.html.headers": [
- "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
- []
- ],
- "popup-soap.https.html.headers": [
- "d83ed86fb9b5d159b9f380424887402edc96cb75",
- []
- ],
- "popup-un.https.html.headers": [
- "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c",
- []
- ],
- "popup-with-cross-origin.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "popup-with-same-origin.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "popup-with-same-site.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "reporting-bcg-reuse.https.html.sub.headers": [
- "33abadd83dd9187bfa5ecf811f9fef7058412780",
- []
- ],
- "reporting-from-rp-ro.https.html.sub.headers": [
- "07ecad96f2493c7ddc70cc5f37d242c07f0cabb1",
- []
- ],
- "reporting-from-rp.https.html.sub.headers": [
- "a61e2919c8acb6be886ef16e764f1ba5dcabe9bc",
- []
- ],
- "reporting-to-rp-ro.https.html.headers": [
- "16903320bb50789e0a64f9620540f1cc8c0902fd",
- []
- ],
- "reporting-to-rp.https.html.headers": [
- "16903320bb50789e0a64f9620540f1cc8c0902fd",
- []
- ]
- }
}
},
"document-isolation-policy": {
@@ -476387,6 +476871,12 @@
[]
]
}
+ },
+ "writing-suggestions": {
+ "WEB_FEATURES.yml": [
+ "4700eca4a12b8b607c16d85ff987a8ef42ac81a3",
+ []
+ ]
}
},
"the-hidden-attribute": {
@@ -476998,7 +477488,7 @@
[]
],
"marquee-with-trusted-types-ref.html": [
- "b177f47b757cc278abe79f5b59d9063f6911dbd3",
+ "5042557212e58741859ad6750543540cff563493",
[]
]
}
@@ -479774,10 +480264,6 @@
"b351c80c273940c8422db8f66da959fb36e962cb",
[]
],
- "select-multiple-base-appearance-ref.html": [
- "45a74da7559c72ee5840c00842aef4fc23915e0e",
- []
- ],
"select-only-picker-opt-in-ref.html": [
"67a0abe43f2d1aad0b1d82da8b8cdfc77a25b549",
[]
@@ -479815,6 +480301,22 @@
[]
]
},
+ "customizable-select-in-page": {
+ "customizable-select-in-page-appearance-ref.html": [
+ "57ea51e367cfad284ed80e71870698dfed0b26e4",
+ []
+ ],
+ "resources": {
+ "customizable-select-in-page.css": [
+ "deb080b4756cf51d2ece9d2b132e9fff6ccd6f7c",
+ []
+ ],
+ "customizable-select-in-page.js": [
+ "1323094332135c46297a1df5c9fed1922efe8f4a",
+ []
+ ]
+ }
+ },
"reset-algorithm-rendering-ref.html": [
"acf192d1d55b7da110d04651093e3ebe0cd48214",
[]
@@ -483763,6 +484265,10 @@
},
"system-state-and-capabilities": {
"the-navigator-object": {
+ "WEB_FEATURES.yml": [
+ "a1af3e21a48f5941a078209963d1ae7bc379dd59",
+ []
+ ],
"resources": {
"handler-sw.js": [
"5fd915d17f98d8fa9c3c81451f46d71bc6cd024e",
@@ -484806,6 +485312,12 @@
[]
]
},
+ "emulation": {
+ "set_geolocation_override.https.html.ini": [
+ "7de34991442711cd389fe324dabd6005605268af",
+ []
+ ]
+ },
"permissions": {
"set_permission.https.html.ini": [
"2101196fa2fe436c3f94c5f84451f1746501c84d",
@@ -485268,10 +485780,6 @@
"035e1d233d6f5646768b78e878c9db43b84a0068",
[]
],
- "WebCryptoAPI.idl": [
- "ff7a89cd0d51be01760b9bfdb709393f4db5fd31",
- []
- ],
"accelerometer.idl": [
"a082224dc88e10e043d86d09cbf981616f6bb9a7",
[]
@@ -485597,7 +486105,7 @@
[]
],
"fedcm.idl": [
- "215f375432e930afb63c26fb9bdc42365ca8c61d",
+ "5ce2d260f114ddcc25210905ee010a9b96b47410",
[]
],
"fenced-frame.idl": [
@@ -485689,7 +486197,7 @@
[]
],
"image-capture.idl": [
- "21e03d4db8248d469671d8286be877e3ad7dc7b5",
+ "26cc7fab5cdf1f3209057cf159171961b779dcd5",
[]
],
"image-resource.idl": [
@@ -485829,7 +486337,7 @@
[]
],
"mediastream-recording.idl": [
- "496bfcf2e27da7a7da6c653b8e7f27b702f7386f",
+ "68c891cdc918e7468de8add96acce35d6d63102f",
[]
],
"model-element.idl": [
@@ -486121,7 +486629,7 @@
[]
],
"turtledove.idl": [
- "b9f50d47885cf9186c9a2dd3c2d08e1dc4054431",
+ "7f11cdc37908f411280ea6f79eeb759c85acbe62",
[]
],
"ua-client-hints.idl": [
@@ -486245,13 +486753,17 @@
[]
],
"webcodecs.idl": [
- "274ef96578a3d16b9fcda6e817c25e12373ec824",
+ "3d4db1ed49d316c31005a5be857ad7d48eca378d",
[]
],
"webcrypto-secure-curves.idl": [
"01bb290b747827bb4e45ea6d0c8f6146e59b01ee",
[]
],
+ "webcrypto.idl": [
+ "ff7a89cd0d51be01760b9bfdb709393f4db5fd31",
+ []
+ ],
"webdriver.idl": [
"194e2d806adb2131f7cdc56a70a46d7784cb7d75",
[]
@@ -486265,7 +486777,7 @@
[]
],
"webgpu.idl": [
- "de1f7c1e52bc401fed112469595f281736213027",
+ "4fec46a2557033a941b5da7a7481aa8125696ed2",
[]
],
"webhid.idl": [
@@ -486281,7 +486793,7 @@
[]
],
"webnn.idl": [
- "57f2a4a9890147e24f10e91537a626732db1f617",
+ "37fcc32501efbeb38c9686a8fc96e1ce062eb30a",
[]
],
"webrtc-encoded-transform.idl": [
@@ -486337,7 +486849,7 @@
[]
],
"webxr-depth-sensing.idl": [
- "9befd640646a132bff680de5f5b0d2edbe199e91",
+ "7ddbec7cc975dfd1c5be6f05f1a854fffe653e79",
[]
],
"webxr-dom-overlays.idl": [
@@ -486365,7 +486877,7 @@
[]
],
"webxr.idl": [
- "1098000d6c2edae1a36f8e6a035f0c53432207c8",
+ "874994086a250df0f3c0a0eed03375d9429aeaa9",
[]
],
"webxrlayers.idl": [
@@ -486380,6 +486892,10 @@
"527c41deb6cda2de79780899d15bc43f02b281db",
[]
],
+ "writing-assistance-apis.idl": [
+ "916daee754e3ef992ad8fa282882c88dd9aa0734",
+ []
+ ],
"xhr.idl": [
"6ff75fd27741369f9671509998a21aeb9de3761a",
[]
@@ -494086,7 +494602,7 @@
[]
],
"webxr-test.js": [
- "0885b559e6335d7bcd8a539b7d7e03f5843c74a5",
+ "ce2503b1bbcfbd5c4318c08b49020e9453c4b3a6",
[]
],
"webxr-test.js.headers": [
@@ -494575,7 +495091,7 @@
[]
],
"testdriver.js": [
- "f127e2b2c8d9091a767b1ead849af1d18167070f",
+ "6e8410b7ea46064438c8d276274b6fbb689f81d2",
[]
],
"testdriver.js.headers": [
@@ -501392,7 +501908,7 @@
[]
],
"requirements_tc.txt": [
- "cb4ba1947784f9b9ba39b3e43237640c7d1e802d",
+ "ada75c2f761904412048f3525f3010b658d174f9",
[]
],
"run_tc.py": [
@@ -502011,7 +502527,7 @@
[]
],
"requirements_tests.txt": [
- "833fdb3b8761b3d790fcd9bf70ba536bd8dd3251",
+ "ca00b8f1f9835eea866a0462962b705a63366de6",
[]
],
"runner": {
@@ -512782,7 +513298,7 @@
[]
],
"asyncactions.py": [
- "71187ee76d7a1aff4803903a8506cb4dac4a8a04",
+ "9925a4b511def24fda82522acb5c5f0f9f3e80a1",
[]
],
"base.py": [
@@ -512814,7 +513330,7 @@
[]
],
"executorwebdriver.py": [
- "123c89c98b21e9ec2616c6bfad3d91c5069ee89c",
+ "87403c2944d57e31c2612871262af9b77ce73235",
[]
],
"executorwktr.py": [
@@ -512830,7 +513346,7 @@
[]
],
"protocol.py": [
- "7630fe1f3580f6cbb3554e89e05ab34c2fa3ee8e",
+ "833dff45636c7e22697e47cfe692ebecfcf2d76f",
[]
],
"pytestrunner": {
@@ -512945,7 +513461,7 @@
[]
],
"testdriver-extra.js": [
- "d83ba4192eb52487bf9265a5c2eea22f21e49c64",
+ "ab8b04ba3cdfc3d7c351ce99c6289de6e99b8f3e",
[]
],
"testdriver-vendor.js": [
@@ -515988,7 +516504,7 @@
[]
],
"keyframe-tests.js": [
- "2bcce1ecf47f180d7f91a8160ad548e2ad06f5b9",
+ "34a84f45b20dea524016a6f479e9e0d0f5b7b2e7",
[]
],
"keyframe-utils.js": [
@@ -518920,7 +519436,7 @@
},
"resources": {
"utils.js": [
- "d19cb7cf760f63d60b26f008af7329fad0a568a1",
+ "50d7911a9181a5139d9e16f7c866112dc54d6d01",
[]
],
"utils_validation.js": [
@@ -521793,6 +522309,10 @@
"0cc425955374e214cd5dd9bdb75a654c7c69faa9",
[]
],
+ "matchDepthViewValues.js": [
+ "597f9734d3fe66c2600c291a643a6d70ec908a25",
+ []
+ ],
"pauseResumeTests.js": [
"e7513ef61c13b856ea9e49ff93ad9088e57163b3",
[]
@@ -550205,14 +550725,14 @@
"ai": {
"language_detection": {
"detector-iframe.https.html": [
- "3e90d36b5aa63a556b82337cdf7a26410b80ac36",
+ "ddcf82bec684024f855217c649bb2da6cbd1f577",
[
null,
{}
]
],
"detector-locale.https.window.js": [
- "a1c67db912961d8850bb4a430f92f7be4b450c87",
+ "80cbfa485e3944ba13de2aec3ba317e2cc84026f",
[
"ai/language_detection/detector-locale.https.window.html",
{
@@ -550226,6 +550746,18 @@
"window"
],
[
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "resources/util.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
"script",
"../resources/util.js"
],
@@ -550233,12 +550765,13 @@
"script",
"../resources/locale-util.js"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
"detector.https.window.js": [
- "e85ea6d249b17d3ed1505f206f5ac6659b6dfd94",
+ "b0255bc552b0d2f7c71f8567bab9e0102702cd4c",
[
"ai/language_detection/detector.https.window.html",
{
@@ -550252,6 +550785,18 @@
"window"
],
[
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "resources/util.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
"script",
"../resources/util.js"
],
@@ -550259,12 +550804,13 @@
"script",
"../resources/locale-util.js"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
"detector.optional.https.window.js": [
- "7ffa1362dd5f97b68e7c678463dd5afa186d10dc",
+ "1dd248a9ecab667355702d00e865341122a2ebe2",
[
"ai/language_detection/detector.optional.https.window.html",
{
@@ -550278,10 +550824,23 @@
"window"
],
[
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "resources/util.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
"script",
"../resources/util.js"
]
- ]
+ ],
+ "timeout": "long"
}
]
]
@@ -551304,7 +551863,7 @@
]
],
"setSinkId.https.html": [
- "be65f0ac81bc41a89e5085a43124f7ee991fea7b",
+ "662596910ee9adf94f83d536fe9c67a49db67f4b",
[
null,
{
@@ -571991,7 +572550,7 @@
},
"cookie-store": {
"change_eventhandler_for_already_expired.https.window.js": [
- "89d84b13d1b53ec4d424b363ace9b26ed9685685",
+ "f3bbe0ea560974e9486941384e75a58d2d6a4637",
[
"cookie-store/change_eventhandler_for_already_expired.https.window.html",
{
@@ -572009,7 +572568,7 @@
]
],
"change_eventhandler_for_document_cookie.https.window.js": [
- "82b0f2baa2bb72f51d944e2138ad56f7a170ba7a",
+ "1937ebdae35942840dc3b641b5907f334048f3fb",
[
"cookie-store/change_eventhandler_for_document_cookie.https.window.html",
{
@@ -572027,7 +572586,7 @@
]
],
"change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js": [
- "8f5ef1cabbe7a742115ba81328e40ee789496edd",
+ "8517995acfe746bbff09243597d6d319e3af1bc2",
[
"cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.html",
{
@@ -572044,6 +572603,24 @@
}
]
],
+ "change_eventhandler_for_no_change.https.window.js": [
+ "5f9c2927433fc408c70c005789dc0bcc34d46caa",
+ [
+ "cookie-store/change_eventhandler_for_no_change.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Cookie Store API: Test that setting a duplicate cookie does not fire a second event."
+ ],
+ [
+ "script",
+ "resources/cookie-test-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
"change_eventhandler_for_no_name_and_no_value.https.window.js": [
"4498caf59689cc3da875d1c56937f6d2a235cb5d",
[
@@ -580275,14 +580852,14 @@
]
],
"margin-trim-computed.html": [
- "ad2d17f2ef01d2f870a4f07cd3eccb226e4de0f2",
+ "c38adea9a68e1eeee53e8a42ba9d745546624f88",
[
null,
{}
]
],
"margin-trim.html": [
- "0d92f80b9b96ee409b141487f26cb664ce67f8df",
+ "e8679f9cbf3fb606c542ae8ccc653e0b90b96bbc",
[
null,
{}
@@ -584169,7 +584746,7 @@
]
],
"linear-timing-functions-syntax.html": [
- "0c949e9ea7dc50c86cd6877da1a10f7b2ba01625",
+ "408264b58dfe41dd7744d20419bae3a5fc7fd3eb",
[
null,
{}
@@ -584183,7 +584760,7 @@
]
],
"step-timing-functions-syntax.html": [
- "4e8b21e4413f8000ae584396355ed7df1c44a447",
+ "e8465ff7a3304184046f7eb81f93d51a61c19dad",
[
null,
{}
@@ -587335,7 +587912,7 @@
]
],
"font-palette-values-invalid.html": [
- "a3a0a88ba68c8fcc1f8b00054d7b12bc08d4b7af",
+ "32c9c4c5efeec345c24261b7bb0aa237f11d25e0",
[
null,
{}
@@ -587756,7 +588333,7 @@
]
],
"test_font_feature_values_parsing.html": [
- "7a5844d56008eae798652b59a335d08d24b34032",
+ "08c20142449646123ebdecde6f023511b45feed4",
[
null,
{}
@@ -595361,6 +595938,15 @@
}
]
],
+ "scroll-button-display-none.html": [
+ "8b3068be6dad6d1ccbe1134b9833ecc1c8b0f594",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"scroll-button-hover-remove.html": [
"af000012b4ec605fb0e30a34e50bc02119a9b925",
[
@@ -595959,7 +596545,7 @@
]
],
"overscroll-behavior-root.html": [
- "a116ead01b71db7b72bfd483b10b35b2e83ea1b8",
+ "71c5f6573d6f31f1ef872c09302063919597d8da",
[
null,
{
@@ -600437,6 +601023,13 @@
{}
]
],
+ "host-part-nesting.html": [
+ "c0dc8e20eee9ab3fda124ef99cb7623146b8a321",
+ [
+ null,
+ {}
+ ]
+ ],
"host-stylesheet.html": [
"2e65c4b1b57bd9959c68e85e11b442c67f2c5a42",
[
@@ -613595,6 +614188,13 @@
{}
]
],
+ "run_in_parallel.html": [
+ "1afdae2be9d8092953746d360d2a77ea1a538ba1",
+ [
+ null,
+ {}
+ ]
+ ],
"start-view-transition.html": [
"a1bc95891956e6678c8ee2ecd51be7d6e94b70ca",
[
@@ -622664,6 +623264,13 @@
]
],
"non-cancelable-when-passive": {
+ "generic-events-stay-cancelable.html": [
+ "961794728d3799a2096bad18dd60e79f619533a4",
+ [
+ null,
+ {}
+ ]
+ ],
"non-passive-mousewheel-event-listener-on-body.html": [
"5574fe0acbcccb64ff05213fa518c49d4149e7e4",
[
@@ -626771,7 +627378,7 @@
]
],
"XMLSerializer-serializeToString.html": [
- "c3b704bf18825c27e74c5db8177fa178925c9b26",
+ "6c294e464a5dc787abd4d10281ab2fe0555a0a3c",
[
null,
{}
@@ -626875,6 +627482,13 @@
{}
]
],
+ "xml-parse-serialize-roundtrip.html": [
+ "5195b9f04b5dd9f47937a5d11d2e82f09fdb9204",
+ [
+ null,
+ {}
+ ]
+ ],
"xml-serialization.xhtml": [
"852bbcc9fd1b1c91fd544dfc2fc462efc1195a4a",
[
@@ -630433,7 +631047,7 @@
]
],
"selection-change-not-fired-if-selection-set-to-root.html": [
- "39e8b46e69b2c469b4b5d4ed40314bd67a2b3524",
+ "cac621ad3cdd3b1b8c9fcbbdf09cac739f9756ff",
[
null,
{
@@ -669027,7 +669641,7 @@
]
],
"generate-bid-browser-signals.https.window.js": [
- "e472fccdc4da37c1a2cebb80921809cab5788b54",
+ "ee0cdd84efa4a3307bb674015c3eb5a8211fe962",
[
"fledge/tentative/generate-bid-browser-signals.https.window.html?1-4",
{
@@ -669086,7 +669700,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669150,7 +669772,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669214,7 +669844,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669278,7 +669916,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669342,14 +669988,94 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?29-32",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
}
],
[
- "fledge/tentative/generate-bid-browser-signals.https.window.html?29-last",
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?33-36",
{
"script_metadata": [
[
@@ -669406,7 +670132,87 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?37-last",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669470,7 +670276,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669534,7 +670348,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -717289,342 +718111,6 @@
}
]
]
- },
- "restrict-properties": {
- "access-reporting-closed.https.html": [
- "1c315b35d7fa81188aabf59c1c3196a5d5d2a2ea",
- [
- null,
- {}
- ]
- ],
- "access-reporting-openee-rp-ro.https.html": [
- "7a96f4f5762721378036b47d248c3ae1ef21dd2f",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "access-reporting-opener-rp-ro.https.html": [
- "9e1e85b16a5876c3e78656b8300c2fcc9e3e3ab1",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "access-reporting-post-message.https.html": [
- "5bc718e2a89a28a6867e83c0d85bc0cedefe39f6",
- [
- null,
- {}
- ]
- ],
- "coop-rp-in-navigation-chain.https.html": [
- "e5c877517488f755e08f69233439a817dd444164",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup-about-blank.https.window.js": [
- "1247400a4e37d2f6bd52b2731c2a3eb7f84a7185",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.html",
- {
- "script_metadata": [
- [
- "script",
- "/common/get-host-info.sub.js"
- ],
- [
- "script",
- "/common/utils.js"
- ],
- [
- "script",
- "/common/dispatcher/dispatcher.js"
- ]
- ]
- }
- ]
- ],
- "iframe-popup-to-so.https.html": [
- "8cf2679e190129e91de8e2af4ceef5b064fedba4",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?1-1",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?2-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?3-3",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?4-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?5-5",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?6-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?7-7",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?8-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup-to-soap.https.html": [
- "f3af3ca7db1bad6506fef6b519c8f244d2080d0e",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?1-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?3-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?5-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?7-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup-to-un.https.html": [
- "560dfd90511dca11a8b5f4fb30d88beb093c538a",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?1-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?3-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?5-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?7-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup.https.html": [
- "17840724d9e342aa52cdcc474356b25d554dfd63",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?1-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?3-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?5-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?7-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "named_targeting.https.html": [
- "10929847ee64d1f47e78b1c34af55c963871c055",
- [
- null,
- {}
- ]
- ],
- "popup-so.https.html": [
- "e5313a6e222d5b7671747516b8d056fda7e9db8b",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-soap.https.html": [
- "595a10a84bbc9c23ba609411e84f5e0bf107e6ac",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-u.https.html": [
- "595a10a84bbc9c23ba609411e84f5e0bf107e6ac",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-un.https.html": [
- "595a10a84bbc9c23ba609411e84f5e0bf107e6ac",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-with-cross-origin.https.html": [
- "a84d52584e9b4fbd6a9a35e5472c5a990fdf2351",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-with-same-origin.https.html": [
- "c0020fa23a478fd75aa27b69edb95c84f3e3789a",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-with-same-site.https.html": [
- "7d115ac7e639a53c76f6bc1b7b7c9210d8d6bf89",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-bcg-reuse.https.html": [
- "9bc171a269c5284de80cad871baafd58fb297da0",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-from-rp-ro.https.html": [
- "b89030f218ffeb79da7269f70a3432f79700e95a",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-from-rp.https.html": [
- "6b31f7e0098da78db34e91ba179ac1ef86e3035d",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-to-rp-ro.https.html": [
- "c47e59cd8f1aeac7ee6b1dbe2177595730148a38",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-to-rp.https.html": [
- "ff60e8c5afda67ff3ca1573dab5405769b2b2cc3",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ]
}
}
},
@@ -732964,6 +733450,26 @@
]
]
},
+ "customizable-select-in-page": {
+ "customizable-select-in-page-keyboard-behavior.tentative.html": [
+ "24e6e39ea48236fc7b72604860913247b5f5f05c",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "customizable-select-in-page-mouse-behavior.tentative.html": [
+ "d5b93693cf7d65b1202f459223a8cf6b8cff581a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
"inserted-or-removed.html": [
"0db2bf0e77a4a8a76ebcef1b0879cac9bb8c3fea",
[
@@ -733685,7 +734191,7 @@
]
],
"dialog-focusability.html": [
- "1e000866099c7044ce07fc812229293f645c2f27",
+ "5afb407640b7d2ee1487454464df9adb41419a8a",
[
null,
{
@@ -733795,7 +734301,7 @@
]
],
"dialog-requestclose.html": [
- "9a9c87167d5eaf93bd31c1f979450415dd9fba0d",
+ "6555f1b43bd399cc4e885f80a3a9cbee1dd752dc",
[
null,
{
@@ -741574,6 +742080,13 @@
{}
]
],
+ "serializing-cdata-in-html-document.html": [
+ "b2366285a41d946324981e771bfbfe2b157606f5",
+ [
+ null,
+ {}
+ ]
+ ],
"serializing-lt-gt.tentative.html": [
"6c74b443a838267be7f0d2ad8a8a80964c57209f",
[
@@ -747382,6 +747895,20 @@
]
]
},
+ "emulation": {
+ "set_geolocation_override.https.html": [
+ "5cbcf546423c772a98fd3725531754c366ab7b91",
+ [
+ null,
+ {
+ "testdriver": true,
+ "testdriver_features": [
+ "bidi"
+ ]
+ }
+ ]
+ ]
+ },
"permissions": {
"set_permission.https.html": [
"5b05e2374e2b4b451a0f98eabd36a6e72a03f933",
@@ -756027,7 +756554,7 @@
]
],
"MediaDevices-enumerateDevices-per-origin-ids.sub.https.html": [
- "714355f5c1c0b2fe37cff162c7be6240540cc0e2",
+ "467cf5d50c71c28675e87445ec311df53815a100",
[
null,
{
@@ -768929,7 +769456,7 @@
]
],
"pointerevent_pointerout_no_pointer_movement.html": [
- "856f2ce37cec59f70dc1a9ad4d3fe0436da3e4cd",
+ "1af166593266f671b1b4705e1911e46eb4c4b990",
[
null,
{
@@ -787717,7 +788244,7 @@
]
],
"fieldset-source.html": [
- "d75f30e664e325f4e43277b4036da0cbb157a990",
+ "cdd2e0be40c87d0cb932a341c9f2f9bf842f96b8",
[
null,
{}
@@ -793943,7 +794470,7 @@
]
],
"form.html": [
- "a4a5f37283848efcdb99b50b3aebb23df3235fe5",
+ "5ab144b05ed130409a09c116fcceecfc57cfaab5",
[
null,
{
@@ -796397,8 +796924,8 @@
{}
]
],
- "clear-prefetch-cache-after-clear-site-data-cache.https.html": [
- "c5796e48b768868f084ae5ad97a63fca5abf6992",
+ "clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html": [
+ "48f6264e852b0e32e6be06367e16b27f7cc6d14b",
[
null,
{}
@@ -797364,8 +797891,8 @@
}
]
],
- "cancel-prerendering-after-clear-site-data-cache-different-origins.https.html": [
- "34b77f8bc47346ecaac9e6f42856d2c5dcd66daf",
+ "cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html": [
+ "db52e758750f2757f722c025e3accf6fce13a9cc",
[
null,
{
@@ -797373,8 +797900,8 @@
}
]
],
- "cancel-prerendering-after-clear-site-data-cache-same-origin.https.html": [
- "cb253d45eaa8f70da33b3bfb13f222280058e9b7",
+ "cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html": [
+ "23d862c5130139bc5e20242e73cb8d2e4a93e332",
[
null,
{
@@ -806073,7 +806600,7 @@
],
"crashtests": {
"garbage-collection.any.js": [
- "b2ba5cd4c27e9120a9e69c358e6ff5be31b107fd",
+ "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335",
[
"streams/readable-streams/crashtests/garbage-collection.any.html",
{
@@ -814625,6 +815152,13 @@
]
},
"embedded": {
+ "attr-image-fetchpriority.html": [
+ "b083538a8b8ba723347860dda97afecadd1283ee",
+ [
+ null,
+ {}
+ ]
+ ],
"image-crossorigin.sub.html": [
"531512ec168003a55bd687b1b8db010e161f1b0e",
[
@@ -814928,6 +815462,33 @@
]
],
"interact": {
+ "focus-inside-hidden-svg-containers-01.html": [
+ "25765c5b93e66b597c3e66a3083e40e298491cb2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "focus-inside-hidden-svg-containers-02.html": [
+ "fd9fd34275d0784d82ec0ef847b295c3ad93bcca",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "focus-inside-hidden-svg-containers-03.html": [
+ "097cff57b5ac8296f2e528f96e5333a7370e9722",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"inheritance.svg": [
"e67f19ed43529af5e34683b6853ae870435be014",
[
@@ -815805,6 +816366,13 @@
]
},
"scripted": {
+ "attr-script-fetchpriority.html": [
+ "2f73e1e59a8a450d0a1ad74e45cbb6d25c70bf4a",
+ [
+ null,
+ {}
+ ]
+ ],
"script-invalid-script-type.html": [
"9602dd525bd4d2b77b8d4ffadebef9e568a98c77",
[
@@ -822779,7 +823347,7 @@
},
"viewport": {
"viewport-segments.html": [
- "64f0eb9caefb0b862faabcfe0ab23df52c00735d",
+ "cd24f2bd230b6ce60da9fd230554856ae43d6b64",
[
null,
{}
@@ -822806,7 +823374,7 @@
]
],
"viewport-segments-segments-property.https.html": [
- "852e49fa7fecea5badf92dfafb6befa49800dd39",
+ "e6c9d8b4e169ad061ae7aef5ca270894dbb1db2c",
[
null,
{
@@ -849414,7 +849982,7 @@
"webnn": {
"conformance_tests": {
"abs.https.any.js": [
- "fcf144200f665b7f9370c2c3f0867f6cfc80a059",
+ "de6a5761df443ab6977ee3a61afc764eedd31c2c",
[
"webnn/conformance_tests/abs.https.any.html?cpu",
{
@@ -850674,7 +851242,7 @@
]
],
"concat.https.any.js": [
- "0208e2ec605387a8d4dac040b64a1465b61d6848",
+ "d41921720463d388eeb0e152b30e04d8246b40b0",
[
"webnn/conformance_tests/concat.https.any.html?cpu",
{
@@ -856317,7 +856885,7 @@
]
],
"neg.https.any.js": [
- "c03afc52516e3e59bd84c500afbbefe6ef7ce7cf",
+ "8bc10475453e24ce6e7d4049d5470b21d8e7b147",
[
"webnn/conformance_tests/neg.https.any.html?cpu",
{
@@ -857418,7 +857986,7 @@
]
],
"qdq_subgraph.https.any.js": [
- "8f6f2246b04f8a6fc9570eced30b31b841da5a06",
+ "3b59c3bb49d6441a77e83309f48a97dd982aea74",
[
"webnn/conformance_tests/qdq_subgraph.https.any.html?cpu",
{
@@ -859185,7 +859753,7 @@
]
],
"relu.https.any.js": [
- "16cc2a3fa67b4ffa77f2555b94e91d8d398e87ff",
+ "63ef9fa9ff09d41d60a228b79b20fd29ff911a21",
[
"webnn/conformance_tests/relu.https.any.html?cpu",
{
@@ -861648,7 +862216,7 @@
]
],
"sub.https.any.js": [
- "2f2fadf7282185eb92cbd7961ab3f1e9d35fd5a3",
+ "85b15f5a00051c0ece94f6202150c0b93b23260f",
[
"webnn/conformance_tests/sub.https.any.html?cpu",
{
@@ -878590,7 +879158,7 @@
]
],
"RTCConfiguration-iceServers.html": [
- "aa66bfbb2bfff0febc9404e4b73e0637a3226a70",
+ "bc7831361ab5f417b46a507b0e5977bef9bedd49",
[
null,
{}
@@ -878841,7 +879409,7 @@
]
],
"RTCPeerConnection-addTransceiver.https.html": [
- "3fd83a76fe2f687114de006bc877bc915a1809be",
+ "62df4293067e554dee9328f3f4f03556dedcdb10",
[
null,
{}
@@ -880814,7 +881382,7 @@
]
],
"supported-stats.https.html": [
- "677736f3cd8f33963c53d4fa9bee0c52f4826a5f",
+ "81aef5f94b90da1ee83de617ecabf0d3e11ad21d",
[
null,
{
@@ -897009,6 +897577,13 @@
{}
]
],
+ "depth_sensing_cpu_matchDepthViewIdentity.https.html": [
+ "f3256106e904b2b66291834197a80a4537c3c682",
+ [
+ null,
+ {}
+ ]
+ ],
"depth_sensing_cpu_pauseResume.https.html": [
"47469f4a0ea186e981843db8c00a1d72bc938907",
[
@@ -897074,6 +897649,13 @@
{}
]
],
+ "depth_sensing_gpu_matchDepthViewIdentity.https.html": [
+ "1813ddd449ec40a9722d38795b23c3397e02dc16",
+ [
+ null,
+ {}
+ ]
+ ],
"depth_sensing_gpu_pauseResume.https.html": [
"d51edb8cd3b85192fc5904df9f488e7c32356080",
[
@@ -926325,7 +926907,7 @@
]
],
"user_prompt_closed.py": [
- "fdb9e8b3ca7d5cc642ec69517f065887b16cdc24",
+ "8322829ebaf078152fd1874773ce0d110a0aac8e",
[
null,
{}
@@ -926348,7 +926930,7 @@
]
],
"user_prompt_opened.py": [
- "c24128004f73a8b09a61991837b1dad103f91789",
+ "a9051f662c8124b6ee4a8c1fc657a5a1aaf2a2b9",
[
null,
{}
@@ -926373,7 +926955,7 @@
]
],
"invalid.py": [
- "79241287fbc2b9a0dbd3c48e455d938e6bce7ad0",
+ "e804848e0be6c483340dcd8b3b4def10dddedce9",
[
null,
{}
@@ -926825,7 +927407,7 @@
]
],
"before_request_sent_cached.py": [
- "9483a707eab1d4caa561a193d641611cf92ffa2e",
+ "e8119d29d9e259208a11bed7c330a9ecbca49886",
[
null,
{}
diff --git a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini
new file mode 100644
index 00000000000..88bb87548ec
--- /dev/null
+++ b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini
@@ -0,0 +1,8 @@
+[idlharness.https.any.html]
+ [idl_test setup]
+ expected: FAIL
+
+
+[idlharness.https.any.worker.html]
+ [idl_test setup]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini
new file mode 100644
index 00000000000..2f9fddf138a
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini
new file mode 100644
index 00000000000..f268ef7e7a6
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-004.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini
new file mode 100644
index 00000000000..07f1806f326
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-006.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini
new file mode 100644
index 00000000000..d5abf6545c2
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-007.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini
new file mode 100644
index 00000000000..bfeba12b70e
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-008.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini
new file mode 100644
index 00000000000..6094b40bf56
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini
@@ -0,0 +1,2 @@
+[align-self-stretch-auto-margins-aspect-ratio.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini
new file mode 100644
index 00000000000..cfef366e7b3
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini
@@ -0,0 +1,2 @@
+[align-self-stretch-auto-margins.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini
new file mode 100644
index 00000000000..bfba165e645
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini
@@ -0,0 +1,2 @@
+[justify-self-stretch-auto-margins-aspect-ratio.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini
new file mode 100644
index 00000000000..75934b08795
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini
@@ -0,0 +1,2 @@
+[justify-self-stretch-auto-margins.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini
index 790872b29d0..ee2b86f6368 100644
--- a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini
+++ b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini
@@ -46,3 +46,21 @@
[Property margin-trim value 'inline-start inline-end block-start']
expected: FAIL
+
+ [Property margin-trim value 'block-start inline-start block-end inline-end']
+ expected: FAIL
+
+ [Property margin-trim value 'block-start block-end inline-end inline-start']
+ expected: FAIL
+
+ [Property margin-trim value 'block-start block-end inline-start inline-end']
+ expected: FAIL
+
+ [Property margin-trim value 'inline-start block-end block-start inline-end']
+ expected: FAIL
+
+ [Property margin-trim value 'inline-start inline-end block-start block-end']
+ expected: FAIL
+
+ [Property margin-trim value 'inline-end block-end inline-start block-start']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini
index cd977b53207..b75bfe7845a 100644
--- a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini
+++ b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini
@@ -43,3 +43,21 @@
[e.style['margin-trim'\] = "inline-end block-end inline-start block-start" should set the property value]
expected: FAIL
+
+ [e.style['margin-trim'\] = "block inline" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "inline block" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "block-start block-end inline-end inline-start" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "block-start block-end inline-start inline-end" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "inline-start block-end block-start inline-end" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "inline-start inline-end block-start block-end" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini
index 86c285fb78a..0d491bce6a4 100644
--- a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini
+++ b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini
@@ -73,3 +73,6 @@
[CSS Fonts Module Level 4: parsing @font-palette-values 25]
expected: FAIL
+
+ [sibling-index() is invalid in base-palette descriptor]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini
index 6b1969e3049..b0922321d1f 100644
--- a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini
+++ b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini
@@ -316,3 +316,6 @@
[basic parse tests - @font-feature-values bongo { @styleset { complex\\ blah: 1; } }]
expected: FAIL
+
+ [basic parse tests - @font-feature-values bongo { @stylistic { blah: sibling-index(); } }]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini
new file mode 100644
index 00000000000..09b5c2407df
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini
new file mode 100644
index 00000000000..d3d6008a74d
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini
new file mode 100644
index 00000000000..be28f9f62c3
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini
new file mode 100644
index 00000000000..f2c19d9824a
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-004.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini
new file mode 100644
index 00000000000..e63a9af4a63
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-005.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini
new file mode 100644
index 00000000000..e9fd7c8f430
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-006.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini
new file mode 100644
index 00000000000..f0da110b11d
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-007.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini
new file mode 100644
index 00000000000..fecb739fed1
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-008.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini
new file mode 100644
index 00000000000..15809ab6be8
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-009.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini
new file mode 100644
index 00000000000..087a090d25e
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-010.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini
new file mode 100644
index 00000000000..39cd43f8d3f
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-011.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini
new file mode 100644
index 00000000000..c60637403c8
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-012.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini
new file mode 100644
index 00000000000..319ec1ea8c7
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-013.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini
new file mode 100644
index 00000000000..7baae0182e4
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-014.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
new file mode 100644
index 00000000000..efff2a2620a
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
@@ -0,0 +1,3 @@
+[grid-content-alignment-with-abspos-001.html]
+ [.grid 1]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini
new file mode 100644
index 00000000000..39f8cc21286
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-016.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini
new file mode 100644
index 00000000000..77a110a0e75
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-017.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini
new file mode 100644
index 00000000000..1a4d7b6af62
--- /dev/null
+++ b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini
@@ -0,0 +1,2 @@
+[intrinsic-percent-replaced-030.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini
index dda18d32621..ad2c6663e6c 100644
--- a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini
+++ b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini
@@ -67,3 +67,6 @@
[Check if a prefix bound to an empty namespace URI ("no namespace") serialize]
expected: FAIL
+
+ [Drop inconsistent xmlns="..." by matching on local name]
+ expected: FAIL
diff --git a/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini
new file mode 100644
index 00000000000..5424089439f
--- /dev/null
+++ b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini
@@ -0,0 +1,6 @@
+[xml-parse-serialize-roundtrip.html]
+ [DOMParser and XMLSerializer should round trip with CDATA sections: large CDATA]
+ expected: FAIL
+
+ [DOMParser and XMLSerializer should round trip with CDATA sections: multiple CDATAs]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini
new file mode 100644
index 00000000000..407f9d191c7
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini
@@ -0,0 +1,3 @@
+[cross-document-nav-cross-document-nav.html]
+ [cross-document navigation then cross-document navigation]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini
new file mode 100644
index 00000000000..ad3b45255f4
--- /dev/null
+++ b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini
@@ -0,0 +1,2 @@
+[marquee-with-trusted-types.html]
+ expected: FAIL
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 841bafc6eca..26704422bbe 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: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index c6f1e5d7d84..a6591b318dc 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
[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-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 d89a1691435..d5fd800f09d 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,4 @@
[iframe_sandbox_popups_nonescaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini
new file mode 100644
index 00000000000..8458e10e93e
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini
@@ -0,0 +1,2 @@
+[customizable-select-in-page-appearance.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
index 8dba4e9c469..bdba8dadafa 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
@@ -15,3 +15,6 @@
[blob-url.any.html]
[Different blob URLs pointing to the same blob resolve to different modules]
expected: FAIL
+
+ [Revoking a blob URL immediately after calling import will not fail]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini
deleted file mode 100644
index ccad3276c85..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[code-cache-nonce.html]
- [First dynamic import should use nonce=abc]
- expected: FAIL
-
- [Second dynamic import should use nonce=def]
- expected: FAIL
-
- [Third dynamic import should use nonce=ghi]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini
deleted file mode 100644
index 0080e7908e9..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[propagate-nonce-external-classic.html]
- [Dynamically imported module should eval when imported from script w/ a valid nonce.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini
deleted file mode 100644
index 849c9b3e60d..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[propagate-nonce-external-module.html]
- expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini
deleted file mode 100644
index 74b32cc06dd..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[propagate-nonce-inline-classic.html]
- [Dynamically imported module should eval when imported from script w/ a valid nonce.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini
deleted file mode 100644
index eb08f590857..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[propagate-nonce-inline-module.html]
- [Dynamically imported module should eval when imported from script w/ a valid nonce.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini
index 9b3e3358ad3..8a3281def9e 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini
@@ -1,18 +1,3 @@
[string-compilation-nonce-classic.html]
- [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
- [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
[setTimeout must inherit the nonce from the triggering script, thus execute]
expected: FAIL
-
- [direct eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [indirect eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [the Function constructor must inherit the nonce from the triggering script, thus execute]
- expected: FAIL \ No newline at end of file
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini
index 1d3b047b68b..98d0b640164 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini
@@ -1,18 +1,3 @@
[string-compilation-nonce-module.html]
- [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
- [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
- [direct eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [indirect eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [the Function constructor must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
[setTimeout must inherit the nonce from the triggering script, thus execute]
- expected: FAIL \ No newline at end of file
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini
deleted file mode 100644
index 64413107401..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini
+++ /dev/null
@@ -1,30 +0,0 @@
-[v8-code-cache.html]
- [text/javascript: Run #1]
- expected: FAIL
-
- [text/javascript: Run #2]
- expected: FAIL
-
- [text/javascript: Run #3]
- expected: FAIL
-
- [text/javascript: Run #4]
- expected: FAIL
-
- [text/javascript: Run #5]
- expected: FAIL
-
- [module: Run #1]
- expected: FAIL
-
- [module: Run #2]
- expected: FAIL
-
- [module: Run #3]
- expected: FAIL
-
- [module: Run #4]
- expected: FAIL
-
- [module: Run #5]
- expected: FAIL
diff --git a/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini
new file mode 100644
index 00000000000..d8b897fb81f
--- /dev/null
+++ b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini
@@ -0,0 +1,3 @@
+[serializing-cdata-in-html-document.html]
+ [Serializing CDATA in an HTML document]
+ expected: FAIL
diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
index a8e069b27e7..3bfb92e671a 100644
--- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
+++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
@@ -760,3 +760,15 @@
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t1.7249685451109781e-36\t2.0512369275093079e-1\t2.0512369275093079e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.0512369275093079e-1 at index of 14680.\n\tMax RelError of 1.0000000000000000e+0 at index of 14680.\n]
expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-2.7021871583080320e+24\t2.0512369275093079e-1\t2.7021871583080320e+24\t1.3173452184234677e+25\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.7021871583080320e+24 at index of 14680.\n\tMax RelError of 1.3173452184234677e+25 at index of 14680.\n]
+ expected: FAIL
+
+ [X SNR (-445.2002225707384 dB) is not greater than or equal to 65.737. Got -445.2002225707384.]
+ expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-4.2315589002308092e+19\t2.0512369275093079e-1\t4.2315589002308092e+19\t2.0629303438725304e+20\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 4.2315589002308092e+19 at index of 14680.\n\tMax RelError of 2.0629303438725304e+20 at index of 14680.\n]
+ expected: FAIL
+
+ [X SNR (-349.0959218623025 dB) is not greater than or equal to 65.737. Got -349.0959218623025.]
+ expected: FAIL
diff --git a/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini
new file mode 100644
index 00000000000..ce3fb065178
--- /dev/null
+++ b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini
@@ -0,0 +1,19 @@
+[depth_sensing_cpu_matchDepthViewIdentity.https.html]
+ expected: ERROR
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl]
+ expected: TIMEOUT
+
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl2]
+ expected: NOTRUN
diff --git a/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini
new file mode 100644
index 00000000000..54901a8468a
--- /dev/null
+++ b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini
@@ -0,0 +1,19 @@
+[depth_sensing_gpu_matchDepthViewIdentity.https.html]
+ expected: ERROR
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl]
+ expected: TIMEOUT
+
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl2]
+ expected: NOTRUN
diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml
index 66794b69aba..5de0cc4bcb1 100644
--- a/tests/wpt/tests/.github/workflows/docker.yml
+++ b/tests/wpt/tests/.github/workflows/docker.yml
@@ -40,7 +40,7 @@ jobs:
latest
type=raw,value=${{ inputs.tag }}
- name: Build and push the Docker image
- uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
+ uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
with:
context: ./tools/docker
push: true
diff --git a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html
index 5f76d59eb35..ee5e27e35b6 100644
--- a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html
+++ b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html
@@ -2,12 +2,19 @@
<title>Assures no crash upon call of LanguageDetector.availability() on a detached document</title>
<link rel="author" href="mailto:christinesm@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/384233287">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
<body>
<iframe src="about:blank"></iframe>
<script>
-const factory = frames[0].LanguageDetector;
-const detector = factory.create();
+const iframe = frames[0];
+await test_driver.bless('Create LanguageDetector', null, iframe);
+
+const factory = iframe.LanguageDetector;
+const detectorPromise = await factory.create();
document.getElementsByTagName("iframe")[0].remove();
-detector.availability();
+
+factory.availability();
+detectorPromise.then(detector => detector.detect());
</script>
</body>
diff --git a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html
index 3e90d36b5aa..ddcf82bec68 100644
--- a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html
+++ b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html
@@ -37,6 +37,9 @@ function load_iframe(src, permission_policy) {
});
}
+// TODO(crbug.com/414428433): Tests in this file intermittently crash.
+// Re-enable once potential causes in Permissions Policy implementation
+// and test setup are addressed.
promise_test(async t => {
const src = HTTPS_NOTSAMESITE_ORIGIN + IFRAME_PATH;
const iframe = await load_iframe(src, /*permission_policy=*/"");
diff --git a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js
index a1c67db9129..80cbfa485e3 100644
--- a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js
+++ b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js
@@ -1,5 +1,8 @@
// META: title=Detect english
// META: global=window
+// META: timeout=long
+// META: script=resources/util.js
+// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: script=../resources/locale-util.js
@@ -45,7 +48,7 @@ promise_test(async t => {
async function getExpectedInputLanguages(expectedInputLanguages) {
- return (await LanguageDetector.create({expectedInputLanguages}))
+ return (await createLanguageDetector({expectedInputLanguages}))
.expectedInputLanguages;
}
@@ -63,14 +66,14 @@ function uniqueCount(array) {
promise_test(async t => {
for (const [languageSubtag, variations] of Object.entries(
valid_language_tags)) {
- if (await getAvailability(languageSubtag) === 'unavailable') {
+ if (await getAvailability([languageSubtag]) === 'unavailable') {
continue;
}
- await assert_valid_expected_input_languages(languageSubtag)
+ await assert_valid_expected_input_languages(languageSubtag);
for (const variation of variations) {
- await assert_valid_expected_input_languages(variation)
+ await assert_valid_expected_input_languages(variation);
}
const expectedInputLanguages = await getExpectedInputLanguages(variations);
@@ -94,10 +97,10 @@ function assert_rejects_invalid_expected_input_languages(
promise_test(async t => {
for (const languageTag of invalid_language_tags) {
assert_rejects_invalid_expected_input_languages(
- t, LanguageDetector.create, [languageTag]);
+ t, createLanguageDetector, [languageTag]);
}
assert_rejects_invalid_expected_input_languages(
- t, LanguageDetector.create, invalid_language_tags);
+ t, createLanguageDetector, invalid_language_tags);
}, 'LanguageDetector.create() throws RangeError for invalid language tags');
promise_test(async t => {
diff --git a/tests/wpt/tests/ai/language_detection/detector.https.window.js b/tests/wpt/tests/ai/language_detection/detector.https.window.js
index e85ea6d249b..b0255bc552b 100644
--- a/tests/wpt/tests/ai/language_detection/detector.https.window.js
+++ b/tests/wpt/tests/ai/language_detection/detector.https.window.js
@@ -1,19 +1,32 @@
// META: title=Detect english
// META: global=window
+// META: timeout=long
+// META: script=resources/util.js
+// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: script=../resources/locale-util.js
'use strict';
promise_test(async t => {
- // Language detection is available after call to `create()`.
- await LanguageDetector.create();
+ // Creating the language detector without user activation rejects with
+ // NotAllowedError.
+ const createPromise = LanguageDetector.create();
+ await promise_rejects_dom(t, 'NotAllowedError', createPromise);
+
+ // Creating the translator with user activation succeeds.
+ await createLanguageDetector();
+
+ // Creating it should have switched it to available.
const availability = await LanguageDetector.availability();
assert_equals(availability, 'available');
-}, 'Simple LanguageDetector.availability() call');
+
+ // Now that it is available, we should no longer need user activation.
+ await LanguageDetector.create();
+}, 'LanguageDetector.create() requires user activation when availability is "downloadable.');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const results = await detector.detect('Hello world!');
// must at least have the 'und' result.
@@ -62,30 +75,30 @@ promise_test(async t => {
throw error;
}
- await promise_rejects_exactly(t, error, LanguageDetector.create({monitor}));
+ await promise_rejects_exactly(t, error, createLanguageDetector({monitor}));
}, 'If monitor throws an error, LanguageDetector.create() rejects with that error');
promise_test(async t => {
- testMonitor(LanguageDetector.create);
+ testMonitor(createLanguageDetector);
}, 'LanguageDetector.create() notifies its monitor on downloadprogress');
promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const createPromise = LanguageDetector.create({signal: controller.signal});
+ const createPromise = createLanguageDetector({signal: controller.signal});
await promise_rejects_dom(t, 'AbortError', createPromise);
}, 'LanguageDetector.create() call with an aborted signal.');
promise_test(async t => {
await testAbortPromise(t, signal => {
- return LanguageDetector.create({signal});
+ return createLanguageDetector({signal});
});
-}, 'Aborting LanguageDetector.create().');
+}, 'Aborting createLanguageDetector().');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const text = 'Hello world!';
const promises = [detector.detect(text), detector.measureInputUsage(text)];
@@ -101,7 +114,7 @@ promise_test(async t => {
promise_test(async t => {
const controller = new AbortController();
- const detector = await LanguageDetector.create({signal: controller.signal});
+ const detector = await createLanguageDetector({signal: controller.signal});
const text = 'Hello world!';
const promises = [detector.detect(text), detector.measureInputUsage(text)];
@@ -120,7 +133,7 @@ promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const detectPromise =
detector.detect('Hello world!', {signal: controller.signal});
@@ -128,14 +141,14 @@ promise_test(async t => {
}, 'LanguageDetector.detect() call with an aborted signal.');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
await testAbortPromise(t, signal => {
return detector.detect('Hello world!', {signal});
});
}, 'Aborting LanguageDetector.detect().');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const text = 'Hello world!';
const largeText = text.repeat(10000);
@@ -157,7 +170,7 @@ promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const measureInputUsagePromise =
detector.measureInputUsage('hello', {signal: controller.signal});
@@ -165,17 +178,17 @@ promise_test(async t => {
}, 'LanguageDetector.measureInputUsage() call with an aborted signal.');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
await testAbortPromise(t, signal => {
return detector.measureInputUsage('hello', {signal});
});
}, 'Aborting LanguageDetector.measureInputUsage().');
promise_test(async () => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
assert_equals(detector.expectedInputLanguages, null);
}, 'Creating LanguageDetector without expectedInputLanguages');
promise_test(async t => {
- await testCreateMonitorWithAbort(t, LanguageDetector.create);
+ await testCreateMonitorWithAbort(t, createLanguageDetector);
}, 'Progress events are not emitted after aborted.');
diff --git a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js
index 7ffa1362dd5..1dd248a9eca 100644
--- a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js
+++ b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js
@@ -1,5 +1,8 @@
// META: title=Detect english
// META: global=window
+// META: timeout=long
+// META: script=resources/util.js
+// META: script=/resources/testdriver.js
// META: script=../resources/util.js
'use strict';
@@ -36,7 +39,7 @@ promise_test(async t => {
const expectedInputLanguages = Object.keys(testInput);
- const detector = await LanguageDetector.create({expectedInputLanguages});
+ const detector = await createLanguageDetector({expectedInputLanguages});
for (const [language, input] of Object.entries(testInput)) {
await assert_detects_correct_language(detector, input, language);
@@ -45,7 +48,7 @@ promise_test(async t => {
promise_test(async () => {
const expectedInputLanguages = ['en', 'es'];
- const detector = await LanguageDetector.create({expectedInputLanguages});
+ const detector = await createLanguageDetector({expectedInputLanguages});
assert_array_equals(detector.expectedInputLanguages, expectedInputLanguages);
assert_true(Object.isFrozen(detector.expectedInputLanguages));
}, 'Creating LanguageDetector with expectedInputLanguages');
diff --git a/tests/wpt/tests/ai/language_detection/resources/util.js b/tests/wpt/tests/ai/language_detection/resources/util.js
new file mode 100644
index 00000000000..7cb3e7c2e13
--- /dev/null
+++ b/tests/wpt/tests/ai/language_detection/resources/util.js
@@ -0,0 +1,4 @@
+async function createLanguageDetector(options = {}) {
+ await test_driver.bless();
+ return await LanguageDetector.create(options);
+}
diff --git a/tests/wpt/tests/audio-output/setSinkId.https.html b/tests/wpt/tests/audio-output/setSinkId.https.html
index be65f0ac81b..662596910ee 100644
--- a/tests/wpt/tests/audio-output/setSinkId.https.html
+++ b/tests/wpt/tests/audio-output/setSinkId.https.html
@@ -26,14 +26,8 @@ promise_test(async t => {
const list = await navigator.mediaDevices.enumerateDevices();
assert_greater_than(list.length, 0,
"media device list includes at least one device");
- const audioInputList = list.filter(({kind}) => kind == "audioinput");
const outputDevicesList = list.filter(({kind}) => kind == "audiooutput");
- // List of exposed microphone groupIds
- const exposedGroupIds = new Set(audioInputList.map(device => device.groupId));
-
for (const { deviceId, groupId } of outputDevicesList) {
- assert_true(exposedGroupIds.has(groupId),
- "audiooutput device groupId must match an exposed microphone");
assert_greater_than(deviceId.length, 0, "deviceId.length");
const p1 = audio.setSinkId(deviceId);
diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py
new file mode 100644
index 00000000000..3a332dd58b2
--- /dev/null
+++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py
@@ -0,0 +1,18 @@
+def main(request, response):
+ headers = [(b"Content-Type", b"text/html")]
+ headers += [(b"Clear-Site-Data", b'"prefetchCache"')]
+ content = f'''
+ <script>
+ setTimeout(() => {{
+ if(window.opener) {{
+ window.opener.postMessage("message", "*");
+ }} else {{
+ window.parent.postMessage("message", "*");
+ }}
+ window.close();
+ }}, 1000);
+ </script>
+ <body>
+ {request.url}
+ </body>'''
+ return 200, headers, content
diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py
new file mode 100644
index 00000000000..bf845cfb699
--- /dev/null
+++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py
@@ -0,0 +1,18 @@
+def main(request, response):
+ headers = [(b"Content-Type", b"text/html")]
+ headers += [(b"Clear-Site-Data", b'"prerenderCache"')]
+ content = f'''
+ <script>
+ setTimeout(() => {{
+ if(window.opener) {{
+ window.opener.postMessage("message", "*");
+ }} else {{
+ window.parent.postMessage("message", "*");
+ }}
+ window.close();
+ }}, 1000);
+ </script>
+ <body>
+ {request.url}
+ </body>'''
+ return 200, headers, content
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
index 89d84b13d1b..f3bbe0ea560 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
@@ -20,3 +20,22 @@ cookie_test(async t => {
{deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
'Deletion not observed after document.cookie sets already-expired cookie');
}, 'CookieStore setting already-expired cookie should not be observed');
+
+cookie_test(async t => {
+ const eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'ALREADY-EXPIRED',
+ expires: new Date(new Date() - 10_000),
+ partitioned: true,
+ });
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ assert_equals(
+ await getCookieString(),
+ 'alt-cookie=IGNORE',
+ 'Already-expired cookie not included in CookieStore');
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Deletion not observed after document.cookie sets already-expired cookie');
+}, 'CookieStore setting already-expired partitioned cookie should not be observed');
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
index 82b0f2baa2b..1937ebdae35 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
@@ -78,6 +78,21 @@ cookie_test(async t => {
'Deletion not observed after document.cookie sets already-expired cookie');
}, 'document.cookie set already-expired cookie should not be observed by CookieStore');
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'DOCUMENT-cookie', value: 'VALUE'}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ // Overwrite the original cookie with a duplicate, this should not dispatch an event.
+ await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/');
+ await setCookieStringDocument('DOCUMENT-alt-cookie=IGNORE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'DOCUMENT-alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'document.cookie duplicate cookie should not be observed by CookieStore');
cookie_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
index 8f5ef1cabbe..8517995acfe 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
@@ -62,6 +62,22 @@ cookie_test(async t => {
'Deletion not observed after HTTP sets already-expired cookie');
}, 'HTTP set already-expired cookie should not be observed by CookieStore');
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await setCookieStringHttp('HTTP-cookie=VALUE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'HTTP-cookie', value: 'VALUE'}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ // Overwrite the original cookie with a duplicate, this should not dispatch an event.
+ await setCookieStringHttp('HTTP-cookie=VALUE; path=/');
+ await setCookieStringHttp('HTTP-alt-cookie=IGNORE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'HTTP-alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'HTTP duplicate cookie should not be observed by CookieStore');
+
cookie_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js
new file mode 100644
index 00000000000..5f9c2927433
--- /dev/null
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js
@@ -0,0 +1,43 @@
+// META: title=Cookie Store API: Test that setting a duplicate cookie does not fire a second event.
+// META: script=resources/cookie-test-helpers.js
+
+'use strict';
+
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set('cookie', 'VALUE');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'cookie', value: 'VALUE'}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set('cookie', 'VALUE');
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'CookieStore duplicate cookie should not be observed');
+
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'VALUE',
+ partitioned: true,
+ });
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {changed: [{name: 'cookie', value: 'VALUE', partitioned: true}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'VALUE',
+ partitioned: true,
+ });
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'CookieStore duplicate partitioned cookie should not be observed');
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html
new file mode 100644
index 00000000000..22c1fd03e38
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+ justify-self: center;
+}
+</style>
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html
new file mode 100644
index 00000000000..06c11e6cdb6
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>Align-items only applies to OOF elements of block elements when statically positioned if it would apply if not OOF.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121">
+<link rel="match" href="align-items-static-position-001-ref.tentative.html">
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+ align-items: center;
+ justify-items: center;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html
new file mode 100644
index 00000000000..6f53b041787
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<div class="container"><div class="inline">text
+ <div class="abs"></div>
+ <br>text
+</div></div>
+
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html
new file mode 100644
index 00000000000..f90004b5672
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>Align-items doesn't apply to OOF elements of inline elements when statically positioned because they would apply if not OOF.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121">
+<link rel="match" href="align-items-static-position-002-ref.tentative.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+ align-items: center;
+ justify-items: center;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<div class="container"><div class="inline">text
+ <div class="abs"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html
new file mode 100644
index 00000000000..132bbb7360f
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 0px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 50px; left: -50px"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 0px; left: -50px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 50px; left: 50px;"></div>
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 12.5px; left: -25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px; left: -25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 12.5px; left: 25px;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html
new file mode 100644
index 00000000000..39f871f4c2b
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of inline elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-003-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.static-positioned-inline {
+ left: auto;
+ right: auto;
+}
+
+.static-positioned-block {
+ top: auto;
+ bottom: auto;
+}
+
+.positioned-inline {
+ left: 0;
+ right: 0;
+}
+
+.positioned-block {
+ top: 0;
+ bottom: 0;
+}
+
+.center {
+ justify-self: center;
+ align-self: center;
+}
+
+.end {
+ justify-self: end;
+ align-self: end;
+}
+
+.start {
+ justify-self: start;
+ align-self: start;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html
new file mode 100644
index 00000000000..68130ee1d7e
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.vertRL {
+ writing-mode: vertical-rl;
+}
+
+.vertLR {
+ writing-mode: vertical-lr;
+}
+</style>
+<!-- start aligned -->
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="top: 0px; right: 25px;"></div>
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: 0px; left: 25px;"></div>
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="top: 0px; right: 0px;"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: -50px; right: 50px"></div>
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="bottom: 0px; left: 50px;"></div>
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: -50px; right: 0px;"></div>
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="right: 12.5px; top: -25px;"></div>
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="top: 25px; left: 12.5px;"></div>
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: -25px; left: 25px;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html
new file mode 100644
index 00000000000..afba7215b11
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of inline elements when statically positioned with different writing modes.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-004-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.static-positioned-inline {
+ left: auto;
+ right: auto;
+}
+
+.static-positioned-block {
+ top: auto;
+ bottom: auto;
+}
+
+.positioned-inline {
+ left: 0;
+ right: 0;
+}
+
+.positioned-block {
+ top: 0;
+ bottom: 0;
+}
+
+.center {
+ justify-self: center;
+ align-self: center;
+}
+
+.end {
+ justify-self: end;
+ align-self: end;
+}
+
+.start {
+ justify-self: start;
+ align-self: start;
+}
+
+.vertRL {
+ writing-mode: vertical-rl;
+}
+
+.vertLR {
+ writing-mode: vertical-lr;
+}
+</style>
+<!-- start aligned -->
+<div class="container vertRL"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container vertLR"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container vertRL"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html
new file mode 100644
index 00000000000..947bd270448
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.container {
+ position: relative;
+ border: 1px solid;
+}
+
+.abs {
+ position: absolute;
+ background: purple;
+ opacity: 0.5;
+ bottom: 0px;
+}
+</style>
+<div class="container">
+ <span style="font: 20px Ahem;">hello
+ <span class="abs">hello</span>
+ <span style="vertical-align: top; font-size: 50px;">world</span>
+ </span>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html
new file mode 100644
index 00000000000..e148f0ebda3
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of inline elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-005-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.container {
+ position: relative;
+ border: 1px solid;
+}
+
+.abs {
+ position: absolute;
+ background: purple;
+ align-self: end;
+ opacity: 0.5;
+}
+</style>
+<div class="container">
+ <span style="font: 20px Ahem;">hello
+ <span class="abs">hello</span>
+ <span style="vertical-align: top; font-size: 50px;">world</span>
+ </span>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html
new file mode 100644
index 00000000000..5bbafc64845
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<style>
+.block {
+ width: 75px;
+ height: 75px;
+ z-index: -1;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="left: 30px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="block">
+ <div class="abs" style="top: -45px; left: 30px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="top: -45px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="top: -45px; left: 30px;"></div>
+</div></div>
+<br>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html
new file mode 100644
index 00000000000..253b2a52f61
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<title>Align-self:self-start/end applies to OOF elements of block elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-006-ref.html">
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.end {
+ justify-self: self-end;
+ align-self: self-end;
+}
+
+.start {
+ justify-self: self-start;
+ align-self: self-start;
+}
+</style>
+<!-- self-start aligned -->
+<div class="container"><div class="block">
+ <div class="abs start"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs start" style="direction: rtl;"></div>
+</div></div>
+<div class="container"><div class="block" style="direction: rtl;">
+ <div class="abs start" style="direction: ltr;"></div>
+</div></div>
+<br>
+<!-- self-end aligned -->
+<div class="container"><div class="block">
+ <div class="abs end"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs end" style="direction: rtl;"></div>
+</div></div>
+<div class="container"><div class="block" style="direction: rtl;">
+ <div class="abs end" style="direction: ltr;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html
new file mode 100644
index 00000000000..bc9b5f4f650
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="left: -50px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 0px;"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 50px; left: -50px"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 0px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: -25px; left: -50px;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html
new file mode 100644
index 00000000000..ebe872aaab9
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<title>Align-self:self-start/end applies to OOF elements of inline elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-007-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.end {
+ justify-self: self-end;
+ align-self: self-end;
+}
+
+.start {
+ justify-self: self-start;
+ align-self: self-start;
+}
+</style>
+<!-- self-start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs start"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs start" style="direction: rtl;"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline" style="direction: rtl;">text
+ <div class="abs start" style="direction: ltr;"></div>
+ <br>text
+</div></div>
+<br>
+<!-- self-end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs end"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs end" style="direction: rtl;"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline" style="direction: rtl;">text
+ <div class="abs end" style="direction: ltr;"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html
new file mode 100644
index 00000000000..79cf612b8f8
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- justify-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: end;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="left: 25px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: end;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<br>
+<!-- align-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: end;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html
new file mode 100644
index 00000000000..187974884b4
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of block elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-008-ref.html">
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- justify-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: auto;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: normal;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: right;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: left;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: flex-start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: flex-end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: anchor-center;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: first baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: last baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: legacy;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: stretch;"></div>
+</div></div>
+<br>
+<!-- align-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: auto;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: normal;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: right;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: left;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: flex-start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: flex-end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: anchor-center;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: first baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: last baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: legacy;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: stretch;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html
new file mode 100644
index 00000000000..4eaa9d2f3a6
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 10px auto 10px 50px;
+ margin: auto 0 auto 0;
+ align-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ min-width: 100px;
+ height: 100%;
+ aspect-ratio: 1;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html
new file mode 100644
index 00000000000..9d1b6454c84
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 10px 50px 10px 50px;
+ margin: auto 0 auto 0;
+ align-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ width: 100px;
+ height: 100px;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html
new file mode 100644
index 00000000000..c50b32f089b
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 50px 10px auto 10px;
+ margin: 0 auto 0 auto;
+ justify-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ width: 100%;
+ min-height: 100px;
+ aspect-ratio: 1;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html
new file mode 100644
index 00000000000..7d7b4bfc857
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 50px 10px 50px 10px;
+ margin: 0 auto 0 auto;
+ justify-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ width: 100px;
+ height: 100px;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html
new file mode 100644
index 00000000000..5b45527fd9c
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/405795970">
+<style>
+ @keyframes --anim {
+ from {
+ width: calc(10px * sibling-index());
+ }
+ to {
+ width: calc(50px);
+ }
+ }
+ #target {
+ animation: --anim 2s;
+ }
+</style>
+<p>Pass if no crash</p>
+<div id="target"></div>
diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html
index ad2d17f2ef0..c38adea9a68 100644
--- a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html
+++ b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html
@@ -27,8 +27,13 @@ test_computed_value("margin-trim", "inline-start block-start", "block-start inli
test_computed_value("margin-trim", "inline-end block-start", "block-start inline-end");
test_computed_value("margin-trim", "inline-end block-end", "block-end inline-end");
test_computed_value("margin-trim", "block-start block-end inline-start", "block-start inline-start block-end");
-test_computed_value("margin-trim", "inline-start block-start inline-end block-end", "block-start inline-start block-end inline-end");
-test_computed_value("margin-trim", "inline-start inline-end block-start", "block-start inline-start inline-end");
+
+test_computed_value("margin-trim", "block-start inline-start block-end inline-end", "block inline");
+test_computed_value("margin-trim", "block-start block-end inline-end inline-start", "block inline");
+test_computed_value("margin-trim", "block-start block-end inline-start inline-end", "block inline");
+test_computed_value("margin-trim", "inline-start block-end block-start inline-end", "block inline");
+test_computed_value("margin-trim", "inline-start inline-end block-start block-end", "block inline");
+test_computed_value("margin-trim", "inline-end block-end inline-start block-start", "block inline");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim.html b/tests/wpt/tests/css/css-box/parsing/margin-trim.html
index 0d92f80b9b9..e8679f9cbf3 100644
--- a/tests/wpt/tests/css/css-box/parsing/margin-trim.html
+++ b/tests/wpt/tests/css/css-box/parsing/margin-trim.html
@@ -21,6 +21,9 @@ test_valid_value("margin-trim", "block-end");
test_valid_value("margin-trim", "inline-start");
test_valid_value("margin-trim", "inline-end");
+test_valid_value("margin-trim", "block inline");
+test_valid_value("margin-trim", "inline block");
+
// Serialize values into either block or inline
test_valid_value("margin-trim", "block-start block-end", "block");
test_valid_value("margin-trim", "inline-start inline-end", "inline");
@@ -29,10 +32,15 @@ test_valid_value("margin-trim", "inline-end inline-start", "inline");
test_valid_value("margin-trim", "inline-start block-start");
test_valid_value("margin-trim", "inline-end block-start block-end");
-test_valid_value("margin-trim", "block-start inline-start block-end inline-end");
-test_valid_value("margin-trim", "inline-end block-end inline-start block-start");
-test_invalid_value("margin-trim", "block inline");
+// Serialize 4 values into "block inline"
+test_valid_value("margin-trim", "block-start inline-start block-end inline-end", "block inline");
+test_valid_value("margin-trim", "block-start block-end inline-end inline-start", "block inline");
+test_valid_value("margin-trim", "block-start block-end inline-start inline-end", "block inline");
+test_valid_value("margin-trim", "inline-start block-end block-start inline-end", "block inline");
+test_valid_value("margin-trim", "inline-start inline-end block-start block-end", "block inline");
+test_valid_value("margin-trim", "inline-end block-end inline-start block-start", "block inline");
+
test_invalid_value("margin-trim", "block block");
test_invalid_value("margin-trim", "inline inline");
test_invalid_value("margin-trim", "block inline-start inline-end");
diff --git a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html
index 0c949e9ea7d..408264b58df 100644
--- a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html
+++ b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html
@@ -26,6 +26,7 @@ test_valid_value("animation-timing-function", "linear(0, 0.5 25% 75%, 1 100% 100
test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 0.998, 1 100% 100%)");
test_valid_value("animation-timing-function", "linear(0, 0 40%, 1, 0.5, 1)");
test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 1.004, 0.998, 1 100% 100%)");
+test_valid_value("animation-timing-function", "linear(calc(0/0), 1)", "linear(0 0%, 1 100%)");
test_invalid_value("animation-timing-function", "linear()");
test_invalid_value("animation-timing-function", "linear(0)");
diff --git a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html
index 4e8b21e4413..e8465ff7a33 100644
--- a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html
+++ b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html
@@ -29,6 +29,7 @@ test_invalid_value("animation-timing-function", "steps(0, jump-start)");
test_invalid_value("animation-timing-function", "steps(0, jump-end)");
test_invalid_value("animation-timing-function", "steps(0, jump-both)");
test_invalid_value("animation-timing-function", "steps(1, jump-none)");
+test_invalid_value("animation-timing-function", "steps(calc(0/0), jump-none)");
</script>
</body>
diff --git a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html
index a3a0a88ba68..32c9c4c5efe 100644
--- a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html
+++ b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html
@@ -140,13 +140,18 @@
@font-palette-values --A {
override-colors: 0 color-mix(in lch, red, color-mix(in lch, currentcolor, black));
}
+
+/* 24 */
+@font-palette-values --A {
+ base-palette: sibling-index();
+}
</style>
</head>
<body>
<script>
let rules = document.getElementById("style").sheet.cssRules;
test(function() {
- assert_equals(rules.length, 24);
+ assert_equals(rules.length, 25);
});
test(function() {
@@ -343,6 +348,13 @@ test(function() {
assert_equals(text.indexOf("override-colors"), -1);
assert_equals(rule.overrideColors, "");
});
+
+test(function() {
+ let text = rules[24].cssText;
+ let rule = rules[24];
+ assert_equals(text.indexOf("base-palette"), -1);
+ assert_equals(rule.basePalette, "");
+}, "sibling-index() is invalid in base-palette descriptor");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html
index 7a5844d5600..08c20142449 100644
--- a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html
+++ b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html
@@ -81,6 +81,7 @@ var testrules = [
{ rule: _("@styleset { ok-1: 1; }"), serializationSame: true },
{ rule: _("@annotation { ok-1: 3; }"), serializationSame: true },
{ rule: _("@stylistic { blah: 3; }"), serializationSame: true },
+ { rule: _("@stylistic { blah: sibling-index(); }"), serializationNoValueDefn: true },
{ rule: makeRule("bongo", "\n@styleset\n { blah: 3; super-blah: 4 5;\n more-blah: 5 6 7;\n }"), serializationSame: true },
{ rule: makeRule("bongo", "\n@styleset\n {\n blah:\n 3\n;\n super-blah:\n 4\n 5\n;\n more-blah:\n 5 6\n 7;\n }"), serializationSame: true },
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html
new file mode 100644
index 00000000000..834c96ccd39
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 62px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 130px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="container">
+ <div class="items"></div>
+ <div class="items"></div>
+ <div class="items"></div>
+</div>
+<div class="column-gap" style="left:62px;"></div>
+<div class="column-gap" style="left:132px;"></div>
+<div class="row-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html
new file mode 100644
index 00000000000..c3752156c7d
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-001-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-count: 3;
+ column-width: 60px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html
new file mode 100644
index 00000000000..d132f0ca677
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 120px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 40px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 142px;
+ width: 10px;
+ background: blue;
+ top: 60px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="row-gap"></div>
+ <div class="spanner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html
new file mode 100644
index 00000000000..0b632fa94ac
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and a spanner.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-002-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html
new file mode 100644
index 00000000000..cd26da24389
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ height: 200px;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ height: 200px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 200px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html
new file mode 100644
index 00000000000..2f2473fd046
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted basic case.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-003-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ column-count: 3;
+ column-width: 60px;
+ column-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 200px;
+ margin: 0px;
+ }
+</style>
+
+<div id="container">
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html
new file mode 100644
index 00000000000..002b1f2b594
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ }
+
+ .container1 {
+ width: 200px;
+ height: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 72px;
+ left: 2px;
+ width: 200px;
+ height: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 4px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 65px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 130px;
+ width: 4px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="column-gap" style="left:65px;"></div>
+ <div class="column-gap" style="left:135px;"></div>
+ <div class="row-gap"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html
new file mode 100644
index 00000000000..0dcbeef4df8
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with smaller width than gap and column-wrap.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-004-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-count: 3;
+ column-width: 60px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 4px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 4px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html
new file mode 100644
index 00000000000..6543021c979
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ display: flex;
+ border: 1px solid #ccc;
+ height: 50px;
+ width: 210px;
+ column-gap: 10px;
+ }
+
+ .outer-items {
+ background: rgb(96 139 168 / 0.2);
+ height 50px;
+ width: 100px;
+ }
+
+ .inner {
+ display: flex;
+ height: 50px;
+ column-gap: 10px;
+ width: 100px;
+ }
+
+ .inner-items {
+ height: 50px;
+ width: 45px;
+ background: black;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 50px;
+ top: 1px;
+ left: 101px;
+ width: 10px;
+ }
+
+ .row-gap {
+ position: absolute;
+ background: purple;
+ height: 10px;
+ top: 21px;
+ left: 111px;
+ width: 100px;
+ }
+</style>
+<div class="outer">
+ <div class="outer-items"></div>
+ <div class="outer-items" id="nested">
+ <div class="inner">
+ <div class="inner-items"></div>
+ <div class="inner-items"></div>
+ </div>
+ </div>
+</div>
+<div class="column-gap" style="background: blue;"></div>
+<div class="column-gap" style="background: gold; left: 156px"></div>
+<div class="row-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html
new file mode 100644
index 00000000000..daa65e904e7
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with nested multicol with column wrap.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-005-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer-container {
+ column-count: 2;
+ column-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ border: 1px solid #ccc;
+ width: 210px;
+ height: 50px;
+ }
+
+ .nested-container {
+ column-count: 2;
+ column-gap: 10px;
+ width: 100px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: gold;
+ row-gap: 10px;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: purple;
+ column-wrap: wrap;
+ column-fill: auto;
+ column-height: 20px;
+ }
+
+ .column1 {
+ background: rgb(96 139 168 / 0.2);
+ width: 100px;
+ height: 50px
+ }
+
+ .nested-column {
+ background: black;
+ width: 45px;
+ height: 20px;
+ }
+</style>
+
+<div class="outer-container">
+ <div class="column1">
+ </div>
+ <div class="column2">
+ <div class="nested-container">
+ <div class="nested-column"></div>
+ <div class="nested-column"></div>
+ <div class="nested-column"></div>
+ <div class="nested-column"></div>
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html
new file mode 100644
index 00000000000..4cb56d207fe
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ .outer-container {
+ columns: 3;
+ column-fill: auto;
+ height: 100px;
+ width: 600px;
+ gap: 10px;
+ background: yellow;
+ }
+
+ .nested-container {
+ columns: 2;
+ box-decoration-break: clone;
+ padding: 10px;
+ gap: 10px;
+ background: cyan;
+ }
+
+ .inner-column {
+ height: 250px;
+ background: hotpink;
+ width: 80px;
+ }
+
+ #col-gap1 {
+ position: absolute;
+ height: 80px;
+ width: 1px;
+ background: green;
+ top: 18px;
+ left: 104px;
+ }
+
+ #col-gap2 {
+ position: absolute;
+ width: 1px;
+ background: green;
+ top: 18px;
+ left: 307px;
+ height: 45px;
+ }
+</style>
+<div class="outer-container">
+ <div class="nested-container">
+ <div class="inner-column"></div>
+ </div>
+</div>
+<div id="col-gap1"></div>
+<div id="col-gap2"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html
new file mode 100644
index 00000000000..64b3b007ab5
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-006-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ .outer-container {
+ columns: 3;
+ column-fill: auto;
+ height: 100px;
+ width: 600px;
+ gap: 10px;
+ background: yellow;
+ }
+
+ .nested-container {
+ columns: 2;
+ box-decoration-break: clone;
+ padding: 10px;
+ column-rule: solid;
+ column-rule-color: green;
+ column-rule-width: 1px;
+ background: cyan;
+ gap: 10px;
+ }
+
+ .inner-column {
+ height: 250px;
+ background: hotpink;
+ width: 80px;
+ }
+</style>
+<div class="outer-container">
+ <div class="nested-container">
+ <div class="inner-column"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html
new file mode 100644
index 00000000000..09973ddc690
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #outer {
+ width: 620px;
+ height: 200px;
+ background: yellow;
+ }
+
+ .inner1 {
+ border-top: 2px solid;
+ border-left: 2px solid;
+ border-right: 2px solid;
+ background: cyan;
+ height: 198px;
+ width: 296px;
+ }
+
+ .inner2 {
+ border-bottom: 2px solid;
+ border-left: 2px solid;
+ border-right: 2px solid;
+ position: absolute;
+ left: 320px;
+ top: 0px;
+ height: 130px;
+ width: 296px;
+ background: cyan
+ }
+
+ .inner-flex {
+ display: flex;
+ column-gap: 20px;
+ }
+
+ .inner-items {
+ background: hotpink;
+ width: 85.333px;
+ }
+
+ .column-gap1 {
+ width: 10px;
+ background: blue;
+ position: absolute;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ width: 10px;
+ background: blue;
+ position: absolute;
+ top: 40px;
+ }
+
+ .spanner {
+ background: grey;
+ opacity: 0.5;
+ height: 18px;
+ width: 296px;
+ }
+
+ .row-gap1 {
+ height: 10px;
+ background: green;
+ position: relative;
+ width: 296px;
+ top: 105px;
+ }
+
+ .row-gap2 {
+ height: 10px;
+ background: green;
+ position: absolute;
+ width: 296px;
+ top: 105px;
+ }
+
+ .column-gap3 {
+ background: blue;
+ height: 130px;
+ position: absolute;
+ width: 10px;
+ top: 0px;
+ }
+</style>
+
+<div id="outer">
+ <div class="inner1">
+ <div class="inner-flex">
+ <div class="inner-items" style="height:20px;"></div>
+ <div class="inner-items" style="height:20px" ;></div>
+ <div class="inner-items" style="height:20px;"></div>
+ </div>
+ <div class="inner-flex" style="position: absolute; left:2px; top:40px">
+ <div class="inner-items" style="height:100px;"></div>
+ <div class="inner-items" style="height:100px" ;></div>
+ <div class="inner-items" style="height:100px;"></div>
+ </div>
+ <div class="inner-flex" style="position: absolute; left:2px; top:160px">
+ <div class="inner-items" style="height:40px;"></div>
+ <div class="inner-items" style="height:40px" ;></div>
+ <div class="inner-items" style="height:40px;"></div>
+ </div>
+ <div class="spanner"></div>
+ <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px)"></div>
+ <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)">
+ </div>
+ <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px)"></div>
+ <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)">
+ </div>
+ <div class="row-gap1"></div>
+ </div>
+ <div class="inner2">
+ <div class="inner-flex">
+ <div class="inner-items" style="height:100px"></div>
+ <div class="inner-items" style="height:100px"></div>
+ <div class="inner-items" style="height:100px"></div>
+ </div>
+ <div class="inner-flex" style="position: absolute; top:120px;">
+ <div class="inner-items" style="height:10px"></div>
+ <div class="inner-items" style="height:10px"></div>
+ <div class="inner-items" style="height:10px"></div>
+ </div>
+ <div class="column-gap3" style="left:calc(85.333px + 5px);"></div>
+ <div class="column-gap3" style="left:calc(85.333px + 5px + 10px + 5px + 85.333px + 5px);"></div>
+ <div class="row-gap2"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html
new file mode 100644
index 00000000000..1f23ed7f7ca
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-007-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #outer {
+ width: 620px;
+ columns: 2;
+ column-fill: auto;
+ gap: 20px;
+ height: 200px;
+ background: yellow;
+ }
+
+ #inner {
+ columns: 3;
+ border: 2px solid;
+ gap: 20px;
+ column-height: 100px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ column-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: green;
+ row-rule-width: 10px;
+ column-wrap: wrap;
+ background: cyan;
+ }
+</style>
+
+<div id="outer">
+ <div id="inner">
+ <div style="height:60px; background:hotpink;"></div>
+ <div style="column-span:all; background: grey; opacity: 0.5; height:18px"></div>
+ <div style="height:750px; background:hotpink;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html
new file mode 100644
index 00000000000..d49c2f50f19
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 200px;
+ left: 2px;
+ top: 120px;
+ display: flex;
+ column-gap: 10px;
+ }
+
+ .row-gap-items {
+ width: 60px;
+ background: gold;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 40px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 60px;
+ width: 10px;
+ background: blue;
+ top: 60px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+
+ .column-gap3 {
+ position: absolute;
+ height: 72px;
+ width: 10px;
+ background: blue;
+ top: 130px;
+ }
+</style>
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="row-gap">
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ </div>
+ <div class="spanner"></div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="column-gap3" style="left:62px;"></div>
+ <div class="column-gap3" style="left:132px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html
new file mode 100644
index 00000000000..ed299b5d9f6
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 0px outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-008-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: 0px;
+ row-rule-outset: 0px;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html
new file mode 100644
index 00000000000..124bf7eaeb1
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 204px;
+ left: 0px;
+ top: 120px;
+ display: flex;
+ column-gap: 6px;
+ }
+
+ .row-gap-items {
+ width: 64px;
+ background: gold;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 44px;
+ width: 10px;
+ background: blue;
+ top: 0px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 64px;
+ width: 10px;
+ background: blue;
+ top: 58px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+
+ .column-gap3 {
+ position: absolute;
+ height: 76px;
+ width: 10px;
+ background: blue;
+ top: 128px;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="spanner"></div>
+ <div class="column-gap3" style="left:62px;"></div>
+ <div class="column-gap3" style="left:132px;"></div>
+ <div class="row-gap">
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html
new file mode 100644
index 00000000000..b00c6a70f8a
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 2px outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-009-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: 2px;
+ row-rule-outset: 2px;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html
new file mode 100644
index 00000000000..9582ab4103d
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container3 {
+ position: absolute;
+ top: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items3 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 204px;
+ left: 4px;
+ top: 120px;
+ display: flex;
+ column-gap: 14px;
+ }
+
+ .row-gap-items {
+ width: 56px;
+ background: gold;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 36px;
+ width: 10px;
+ background: blue;
+ top: 4px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 56px;
+ width: 10px;
+ background: blue;
+ top: 62px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+
+ .column-gap3 {
+ position: absolute;
+ height: 68px;
+ width: 10px;
+ background: blue;
+ top: 132px;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="container3">
+ <div class="items3"></div>
+ <div class="items3"></div>
+ <div class="items3"></div>
+ </div>
+ <div class="row-gap">
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="spanner"></div>
+ <div class="column-gap3" style="left:62px;"></div>
+ <div class="column-gap3" style="left:132px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html
new file mode 100644
index 00000000000..61bb4a9b933
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with -2px outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-010-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: -2px;
+ row-rule-outset: -2px;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html
new file mode 100644
index 00000000000..3387918d399
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container3 {
+ position: absolute;
+ top: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items3 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 2px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 124px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 40px;
+ width: 2px;
+ background: blue;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 142px;
+ width: 2px;
+ background: blue;
+ top: 60px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="container3">
+ <div class="items3"></div>
+ <div class="items3"></div>
+ <div class="items3"></div>
+ </div>
+ <div class="column-gap1" style="left:66px;"></div>
+ <div class="column-gap1" style="left:136px;"></div>
+ <div class="column-gap2" style="left:66px;"></div>
+ <div class="column-gap2" style="left:136px;"></div>
+ <div class="row-gap"></div>
+ <div class="spanner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html
new file mode 100644
index 00000000000..cf588ded41e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 100% outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-011-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 2px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: 100%;
+ row-rule-outset: 100%;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html
new file mode 100644
index 00000000000..9fb5e85e920
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container3 {
+ position: absolute;
+ top: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items3 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 2px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 124px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 200px;
+ width: 2px;
+ background: blue;
+ top: 2px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="container3">
+ <div class="items3"></div>
+ <div class="items3"></div>
+ <div class="items3"></div>
+ </div>
+ <div class="column-gap1" style="left:66px;"></div>
+ <div class="column-gap1" style="left:136px;"></div>
+ <div class="row-gap"></div>
+ <div class="spanner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html
new file mode 100644
index 00000000000..078b810cf8e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 2px width and rule-break none.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-012-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 2px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: none;
+ column-rule-break: none;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html
new file mode 100644
index 00000000000..8e426d8ed32
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .mc {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100px;
+ height: 100px;
+ columns: 2;
+ column-fill: auto;
+ column-gap: 10px;
+ }
+
+ .fake-column-gaps {
+ position: absolute;
+ top: 4px;
+ left: 45px;
+ display: flex;
+ height: 92px;
+ column-gap: 45px;
+ }
+
+ .column-gap {
+ width: 10px;
+ background: gold;
+ }
+</style>
+
+<div class="fake-column-gaps">
+ <div class="column-gap"></div>
+ <div class="column-gap"></div>
+ <div class="column-gap"></div>
+</div>
+<div class="mc">
+ <div style="height: 400px; background: cyan;">
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html
new file mode 100644
index 00000000000..d4170084f06
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-013-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .mc {
+ position: absolute;
+ top: 0px;
+ width: 100px;
+ height: 100px;
+ columns: 2;
+ column-fill: auto;
+ column-gap: 10px;
+ column-rule-color: gold;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-outset: -4px;
+ }
+</style>
+
+<div class="mc">
+ <div style="height: 400px; background: cyan;">
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html
new file mode 100644
index 00000000000..9d9674bd476
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .last-item {
+ position: absolute;
+ left: 2px;
+ top: 72px;
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 2px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 66px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 60px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="container">
+ <div class="items"></div>
+ <div class="items"></div>
+ <div class="items"></div>
+</div>
+<div class="last-item"></div>
+<div class="column-gap" style="left:62px;"></div>
+<div class="column-gap" style="left:132px;"></div>
+<div class="column-gap" style="left:62px; top: 72px;"></div>
+<div class="column-gap" style="left:132px; top: 72px;"></div>
+<div class="row-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html
new file mode 100644
index 00000000000..1dcd393d99a
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap, rule-break-intersection, and fewer
+ columns in last row.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-014-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-count: 3;
+ column-width: 60px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 2px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ column-fill: auto;
+ column-rule-break: intersection;
+ column-rule-outset: 0;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html
new file mode 100644
index 00000000000..2d5b401b8d2
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero.">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="display: grid; grid-template-rows: min-content;">
+ <canvas width="100" height="100" style="background: green; block-size: 100%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html
new file mode 100644
index 00000000000..575fa8c7817
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero.">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="display: grid; grid-template-rows: min-content;">
+ <canvas width="200" height="200" style="background: green; max-block-size: 50%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html
new file mode 100644
index 00000000000..8b3068be6da
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: focused ::scroll-button() does not crash after becoming display none</title>
+<link rel="help" href="http://crbug.com/402673873">
+<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>
+ #scroller::scroll-button(left) {
+ content: "";
+ background-color: red;
+ height: 100px;
+ width: 100px;
+ top: 0;
+ left: 0;
+ position: absolute;
+ }
+
+ #scroller.hide::scroll-button(left) {
+ display: none;
+ }
+
+ #scroller {
+ width: 300px;
+ height: 300px;
+ overflow: auto;
+ }
+
+ #filler {
+ height: 20000x;
+ }
+</style>
+<div id="scroller">
+ <div id="filler"></div>
+</div>
+<script>
+ promise_test(async t => {
+ await new test_driver.Actions()
+ .pointerMove(15, 15)
+ .pointerDown()
+ .pointerUp()
+ .send();
+ scroller.className = "hide";
+ document.documentElement.offsetTop;
+ await new test_driver.Actions()
+ .pointerMove(15, 15)
+ .pointerDown()
+ .pointerUp()
+ .send();
+ assert_true(true);
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
index a116ead01b7..71c5f6573d6 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
@@ -33,6 +33,10 @@ promise_test(async function() {
Math.round(bounds.top + bounds.height / 2), 0, -100)
.send();
+ // Await two animation frames to give a chance to scroll.
+ await new Promise(resolve => requestAnimationFrame(resolve));
+ await new Promise(resolve => requestAnimationFrame(resolve));
+
assert_equals(window.scrollY, originalScrollPos, "overscroll-behavior should work on the root");
});
</script>
diff --git a/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html
new file mode 100644
index 00000000000..c0dc8e20eee
--- /dev/null
+++ b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<title>CSS Shadow Parts - :host::part() in nesting</title>
+<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/#part">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector">
+<link rel="help" href="https://crbug.com/326526716">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="host"></div>
+<script>
+test(function() {
+ let host = document.getElementById("host");
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ :host {
+ &::part(mypart) {
+ color: lime;
+ }
+ }
+ </style>
+ <div part="mypart">This text should be green.</div>
+ `;
+
+ let part = host.shadowRoot.querySelector("[part]");
+
+ assert_equals(
+ window.getComputedStyle(part).color,
+ "rgb(0, 255, 0)",
+ ":host::part() works in nesting",
+ );
+}, ":host::part works in nesting");
+</script>
diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html
new file mode 100644
index 00000000000..feff03bbe2e
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero.">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="inline-size: min-content">
+ <canvas width="100" height="100"
+ style="writing-mode:vertical-rl; background: green; block-size: 100%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html
new file mode 100644
index 00000000000..5a6b103c22e
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero.">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="inline-size: min-content">
+ <canvas width="200" height="200"
+ style="writing-mode:vertical-rl; background: green; max-block-size: 50%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html
new file mode 100644
index 00000000000..1afdae2be9d
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- TODO update link -->
+ <link rel="help" href="https://www.w3.org/TR/css-view-transitions-2/">
+ <title>Scope view transitions run in parallel</title>
+</head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style type="text/css">
+ .block {
+ background-color: blue;
+ position: relative;
+ height: 100px;
+ width: 100px;
+ margin: 50px;
+ }
+
+ #target1 {
+ view-transition-name: a;
+ }
+
+ #target2 {
+ view-transition-name: b;
+ }
+
+ ::view-transition-group(*),
+ ::view-transition-image-pair(*),
+ ::view-transition-old(*) {
+ animation: unset;
+ }
+
+ ::view-transition-old(*) {
+ opacity: 0;
+ }
+
+ @keyframes stylize {
+ from {
+ opacity: 0.5;
+ }
+ to {
+ opacity: 1.0;
+ }
+ }
+ ::view-transition-new(*) {
+ animation: stylize 1s paused;
+ }
+
+</style>
+<body>
+ <div id="target1" class="block"></div>
+ <div id="target2" class="block"></div>
+</body>
+<script type="text/javascript">
+
+ async function run_parallel_scoped_view_transition_test(
+ transition_update_callback,
+ message) {
+ promise_test(async t => {
+ const vt1 = target1.startViewTransition(() => {});
+ const vt2 = target2.startViewTransition(() => {});
+ await Promise.all([vt1.ready, vt2.ready]);
+
+ let list = document.getAnimations().map(a => {
+ return `${a.effect.pseudoElement}:${a.animationName}`;
+ });
+ let expected = [
+ '::view-transition-new(a):stylize',
+ '::view-transition-new(b):stylize'
+ ];
+ assert_array_equals(list, expected, 'Before callback');
+ assert_equals(
+ getComputedStyle(target1, "::view-transition-new(a)")
+ .getPropertyValue("opacity"),
+ "0.5");
+ assert_equals(
+ getComputedStyle(target2, "::view-transition-new(b)")
+ .getPropertyValue("opacity"),
+ "0.5");
+
+ transition_update_callback(vt1);
+ await vt1.finished.then(
+ () => {},
+ () => {
+ // The only case where the finished promise should not be resolved is
+ // when the DOM update callback returns a rejected promise.
+ assert_unreached('Finished promise should have been resolved');
+ });
+
+ list = document.getAnimations().map(a => {
+ return `${a.effect.pseudoElement}:${a.animationName}`;
+ });
+ assert_array_equals(list, [`::view-transition-new(b):stylize`],
+ 'After callback');
+ assert_equals(
+ getComputedStyle(target2, "::view-transition-new(b)")
+ .getPropertyValue("opacity"),
+ "0.5");
+ }, message);
+ }
+
+ run_parallel_scoped_view_transition_test(
+ (vt) => {
+ vt.skipTransition();
+ },
+ 'Concurrent transition keeps running after transition skipped');
+
+ run_parallel_scoped_view_transition_test(
+ () => {
+ document.getAnimations().filter(a => {
+ return a.effect.target.id == 'target1';
+ }).forEach(a => {
+ a.finish();
+ });
+ }, 'Concurrent transition keeps running after transition finished');
+
+ run_parallel_scoped_view_transition_test(
+ () => {
+ document.getAnimations().filter(a => {
+ return a.effect.target.id == 'target1';
+ }).forEach(a => {
+ a.cancel();
+ });
+ }, 'Concurrent transition keeps running after transition canceled');
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html
new file mode 100644
index 00000000000..c5b52346fc0
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes reference: text-align in orthogonal table cell</title>
+
+<meta name="flags" content="ahem" />
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+
+<style>
+table {
+ font: 20px/1 Ahem;
+ border: 1px solid gray;
+ display: inline-table;
+ margin: 1em;
+}
+
+td {
+ padding: 0;
+ color: green;
+ vertical-align: top;
+}
+
+td div {
+ position: relative;
+}
+
+.t {
+ top: 0;
+}
+.m {
+ top: 2em;
+}
+.b {
+ top: 4em;
+}
+</style>
+
+<div>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=t>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=b>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=t>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=t>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=b>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=t>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=b>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=b>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table>
+ <tr><td>XXXXX</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;X&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;X</td></tr>
+</table>
+<table>
+ <tr><td>XXXXX</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;X&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;X</td></tr>
+</table>
+</div>
diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html
new file mode 100644
index 00000000000..a8d33f281fd
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes test: text-align in orthogonal table cell</title>
+
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#line-mappings">
+<meta assert="text-align values respect line-relative mappings of the table cell">
+<link rel="match" href="reference/table-cell-align-006-ref.html">
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+
+<meta name="flags" content="ahem" />
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+
+<style>
+table {
+ font: 20px/1 Ahem;
+ border: 1px solid gray;
+ display: inline-table;
+ margin: 1em;
+}
+
+td {
+ padding: 0;
+ color: green;
+}
+
+table.vrl td {
+ writing-mode: vertical-rl;
+}
+
+table.slr td {
+ writing-mode: sideways-lr;
+}
+
+table.h {
+ writing-mode: vertical-lr;
+}
+
+table.h td {
+ writing-mode: initial;
+}
+
+/* If text-align works correctly on the cells, their green Ahem glyphs
+ should cover the red part of each background. */
+.left {
+ text-align: left;
+ background: linear-gradient(to bottom, red 20%, transparent 20%);
+}
+.slr .left {
+ background: linear-gradient(to top, red 20%, transparent 20%);
+}
+.center {
+ text-align: center;
+ background: linear-gradient(to bottom, transparent 40%, red 40%, red 60%, transparent 60%);
+}
+.right {
+ text-align: right;
+ background: linear-gradient(to bottom, transparent 80%, red 80%);
+}
+.slr .right {
+ background: linear-gradient(to top, transparent 80%, red 80%);
+}
+.start,
+.slr .start:dir(rtl)
+ {
+ text-align: start;
+ background: linear-gradient(to bottom, red 20%, transparent 20%);
+}
+.start:dir(rtl),
+.slr .start {
+ background: linear-gradient(to top, red 20%, transparent 20%);
+}
+.end,
+.slr .end:dir(rtl)
+ {
+ text-align: end;
+ background: linear-gradient(to bottom, transparent 80%, red 80%);
+}
+.end:dir(rtl),
+.slr .end
+ {
+ background: linear-gradient(to top, transparent 80%, red 80%);
+}
+.justify {
+ text-align-last: justify;
+ background: linear-gradient(to bottom, red 20%, transparent 20% 80%, red 80% );
+}
+
+.h .left {
+ background: linear-gradient(to right, red 20%, transparent 20%);
+}
+.h .center {
+ background: linear-gradient(to right, transparent 40%, red 40%, red 60%, transparent 60%);
+}
+.h .right {
+ background: linear-gradient(to right, transparent 80%, red 80%);
+}
+.h .start {
+ background: linear-gradient(to right, red 20%, transparent 20%);
+}
+.h .start:dir(rtl) {
+ background: linear-gradient(to left, red 20%, transparent 20%);
+}
+.h .end {
+ background: linear-gradient(to right, transparent 80%, red 80%);
+}
+.h .end:dir(rtl) {
+ background: linear-gradient(to left, transparent 80%, red 80%);
+}
+.h .justify {
+ background: linear-gradient(to right, red 20%, transparent 20% 80%, red 80% );
+}
+</style>
+
+</div>
+<table class=vrl>
+ <tr>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+<table class=vrl>
+ <tr dir=rtl>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table class=slr>
+ <tr>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+<table class=slr>
+ <tr dir=rtl>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table class=h>
+ <tr>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+<table class=h>
+ <tr dir=rtl>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+</div>
diff --git a/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html
new file mode 100644
index 00000000000..961794728d3
--- /dev/null
+++ b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+async_test((t) => {
+ const et = new EventTarget();
+ et.addEventListener('test', t.step_func_done((e) => {
+ assert_true(e.cancelable);
+ }), {passive: true});
+ et.dispatchEvent(new Event('test', {cancelable: true}));
+}, "A generic event with only passive listeners remains cancelable");
+</script>
diff --git a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html
index c3b704bf188..6c294e464a5 100644
--- a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html
+++ b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html
@@ -81,6 +81,25 @@ test(function() {
}, 'Check if inconsistent xmlns="..." is dropped.');
test(function() {
+ const root1 = parse('<package></package>');
+ root1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
+ const manifest1 = root1.appendChild(root1.ownerDocument.createElement('manifest'));
+ manifest1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
+ assert_equals(serialize(root1), '<package><manifest/></package>');
+
+ const root2 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>');
+ const manifest2 = root2.appendChild(root2.ownerDocument.createElement('manifest'));
+ manifest2.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
+ assert_equals(serialize(root2),
+ '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>');
+
+ const root3 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>');
+ const manifest3 = root3.appendChild(root3.ownerDocument.createElement('manifest'));
+ assert_equals(serialize(root3),
+ '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>');
+}, 'Drop inconsistent xmlns="..." by matching on local name');
+
+test(function() {
let root = parse('<r xmlns:xx="uri"></r>');
root.setAttributeNS('uri', 'name', 'v');
assert_equals(serialize(root), '<r xmlns:xx="uri" xx:name="v"/>');
diff --git a/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html
new file mode 100644
index 00000000000..5195b9f04b5
--- /dev/null
+++ b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/327273585">
+<link rel=help href="https://issues.chromium.org/issues/41101979">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+function runTest(xmlString, testName) {
+ test(() => {
+ const xmlDoc = (new DOMParser()).parseFromString(xmlString, 'text/xml');
+ const result = (new XMLSerializer()).serializeToString(xmlDoc);
+ assert_equals(result, xmlString);
+ }, `DOMParser and XMLSerializer should round trip with CDATA sections: ${testName}`);
+}
+
+runTest(
+ `<root><![CDATA[
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+]]></root>`,
+ 'large CDATA');
+
+runTest(
+ '<root><htmlDefn><![CDATA[<div><![CDATA[ Just Rubbish Data $#$^#^$ ]]]]><![CDATA[></div><div></div>]]></htmlDefn></root>',
+ 'multiple CDATAs');
+</script>
diff --git a/tests/wpt/tests/editing/include/editor-test-utils.js b/tests/wpt/tests/editing/include/editor-test-utils.js
index 9c5600af77b..f0c4f583992 100644
--- a/tests/wpt/tests/editing/include/editor-test-utils.js
+++ b/tests/wpt/tests/editing/include/editor-test-utils.js
@@ -568,5 +568,8 @@ class EditorTestUtils {
}) - (${EditorTestUtils.getNodeDescription(range.endContainer)}, ${range.endOffset})`;
}
+ static waitForRender() {
+ return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
+ }
}
diff --git a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html
index 39e8b46e69b..cac621ad3cd 100644
--- a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html
+++ b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html
@@ -3,6 +3,7 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="../include/editor-test-utils.js"></script>
<body>
<div contenteditable="true" id="target">
@@ -11,13 +12,13 @@
// Selectionchange event should not get fired if the selection is already set to the beginning of the root
promise_test(async () => {
let selectionChangeCount = 0;
- document.getElementById("target").focus();
- await new Promise(resolve => step_timeout(resolve, 50));
+ const target = document.getElementById("target");
+ await new test_driver.click(target);
+ await EditorTestUtils.waitForRender();
document.addEventListener("selectionchange", () => ++selectionChangeCount);
- test_driver.send_keys(target, "\uE003");
- // Waits a short time to allow any events to be processed.
- await new Promise(resolve => step_timeout(resolve, 50));
+ await new test_driver.send_keys(target, "\uE003");
+ await EditorTestUtils.waitForRender();
assert_equals(selectionChangeCount, 0, "Selectionchange event should not get fired");
- }, "Selectionchange event not get fired when the selection is already set to the beginning of the root ");
+ }, "Selectionchange event should not get fired when the selection is already set to the beginning of the root ");
</script>
</body> \ No newline at end of file
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 e472fccdc4d..ee0cdd84efa 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
@@ -11,7 +11,9 @@
// META: variant=?17-20
// META: variant=?21-24
// META: variant=?25-28
-// META: variant=?29-last
+// META: variant=?29-32
+// META: variant=?33-36
+// META: variant=?37-last
"use strict";
@@ -35,7 +37,21 @@ subsetTest(promise_test, async test => {
'bidCount': 0,
'multiBidLimit': 1,
'prevWinsMs': [],
- 'forDebuggingOnlySampling': false
+ 'forDebuggingOnlySampling': false,
+ 'viewCounts': {
+ 'pastHour': 0,
+ 'pastDay': 0,
+ 'pastWeek': 0,
+ 'past30Days': 0,
+ 'past90Days': 0
+ },
+ 'clickCounts': {
+ 'pastHour': 0,
+ 'pastDay': 0,
+ 'pastWeek': 0,
+ 'past30Days': 0,
+ 'past90Days': 0
+ }
};
let biddingLogicURL = createBiddingScriptURL({
generateBid:
@@ -48,6 +64,17 @@ subsetTest(promise_test, async test => {
expectedBrowserSignals.forDebuggingOnlyInCooldownOrLockout =
browserSignals.forDebuggingOnlyInCooldownOrLockout;
+ // Don't check exact values of view/click reports.
+ function zeroCounts(object) {
+ object.pastHour = 0;
+ object.pastDay = 0;
+ object.pastWeek = 0;
+ object.past30Days = 0;
+ object.past90Days = 0;
+ }
+ zeroCounts(browserSignals.viewCounts);
+ zeroCounts(browserSignals.clickCounts);
+
// Remove deprecated field, if present.
delete browserSignals.prevWins;
@@ -947,3 +974,253 @@ subsetTest(promise_test, async test => {
}
});
}, 'browserSignals.wasmHelper.');
+
+
+// Generates 0 or 1 clicks, dependent on `produceAttributionSrc` &
+// `produceUserAction`, and `numViews` views for `igOwner`, provided by
+// `viewClickProvider`.
+async function generateViewsAndClicks(
+ test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc,
+ produceUserAction) {
+ let iframe = await createIframe(test, viewClickProvider);
+ let script = `
+ // We use a wrapper iframe here so the original remains in communication.
+ let frame = document.createElement('iframe');
+ document.body.appendChild(frame);
+ let frameDocument = frame.contentDocument;
+ let a = frameDocument.createElement('a');
+ a.href = '${RESOURCE_PATH}/record-click.py?' +
+ 'eligible_origin=${igOwner}&num_views=${numViews}';
+ if (${produceAttributionSrc}) {
+ a.attributionSrc = '';
+ }
+ a.target = '_self';
+ a.appendChild(frameDocument.createTextNode('Click me'));
+ frameDocument.body.appendChild(a);
+
+ if (${produceUserAction}) {
+ // Note: test_driver.click() seems to not work well with Chrome's
+ // content_shell; while .bless() does... unreliably.
+ // headless_shell/chrome path seems to work reliably. User activation
+ // is used sparingly to work around content_shell flakiness.
+ await test_driver.bless('User-initiated click', () => { a.click() });
+ } else {
+ a.click();
+ }
+ `;
+
+ await runInFrame(test, iframe, script);
+}
+
+// Keep running a basic auction with an interest group in
+// `interestGroupOverrides` until it succeeds; joining and leaving the
+// IG every time to bypass caching which is permitted to provide stale
+// view/click counts.
+async function keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides) {
+ while (true) {
+ await joinInterestGroup(test, uuid, interestGroupOverrides);
+ let result = await runBasicFledgeAuction(test, uuid);
+ if (result !== null) { // Got a winner.
+ break;
+ }
+ await leaveInterestGroup(interestGroupOverrides);
+ }
+}
+
+// Like keepTryingAuctionUntilWinBypassCaching but for auctions with
+// cross-origin interest group, owned by `igOwner`.
+async function crossOriginKeepTryingAuctionUntilWinBypassCaching(
+ test, uuid, igOwner, interestGroupOverrides) {
+ while (true) {
+ await joinCrossOriginInterestGroup(
+ test, uuid, igOwner, interestGroupOverrides);
+ const auctionConfigOverrides = {interestGroupBuyers: [igOwner]};
+ let result =
+ await runBasicFledgeAuction(test, uuid, auctionConfigOverrides);
+ if (result !== null) { // Got a winner.
+ break;
+ }
+ await leaveCrossOriginInterestGroup(
+ test, uuid, igOwner, interestGroupOverrides);
+ }
+}
+
+// Generates `numViews` views and 0 or 1 clicks based on `produceAttributionSrc`
+// and `produceUserAction`, by `viewClickProvider` available to `igOwner`, then
+// creates an interest group for `igOwner` with given
+// `viewAndClickCountsProviders`, and runs an auction
+// to make sure the events are eventually available.
+async function testClickiness(
+ test, igOwner, viewClickProvider, numViews, produceAttributionSrc,
+ produceUserAction, viewAndClickCountsProviders = undefined) {
+ const uuid = generateUuid(test);
+
+ await generateViewsAndClicks(
+ test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc,
+ produceUserAction);
+
+ // For clicks to be recorded, both attributionsrc attribution must exist
+ // and a user action must be used. If we don't expect clicks, we can expect
+ // that the number is exactly 0 since re-running the test won't break that.
+ //
+ // This is relying on all tests using Ad-Auction-Record-Event using distinct
+ // `viewClickProvider`s.
+ let clicksBadTest =
+ produceAttributionSrc && produceUserAction ? '< 1' : ' !== 0';
+
+ let viewsBadTest = (numViews > 0) ? `< ${numViews}` : ' !== 0';
+
+ // Join an IG to read view/click info back. We use a UUID for a name to make
+ // sure nothing old is cached, since view/clicks are permitted to be a bit
+ // stale.
+ let interestGroupOverrides = {
+ owner: igOwner,
+ name: uuid,
+ biddingLogicURL: createBiddingScriptURL({
+ origin: igOwner,
+ generateBid: `
+ // We should see at least one click and numViews views the test injects.
+ if (browserSignals.clickCounts.pastHour ${clicksBadTest} ||
+ browserSignals.clickCounts.pastDay ${clicksBadTest} ||
+ browserSignals.clickCounts.pastWeek ${clicksBadTest} ||
+ browserSignals.clickCounts.past30Days ${clicksBadTest} ||
+ browserSignals.clickCounts.past90Days ${clicksBadTest} ||
+ browserSignals.viewCounts.pastHour ${viewsBadTest} ||
+ browserSignals.viewCounts.pastDay ${viewsBadTest} ||
+ browserSignals.viewCounts.pastWeek ${viewsBadTest} ||
+ browserSignals.viewCounts.past30Days ${viewsBadTest} ||
+ browserSignals.viewCounts.past90Days ${viewsBadTest}) {
+ return -1;
+ }
+ `
+ })
+ };
+
+ if (viewAndClickCountsProviders) {
+ interestGroupOverrides.viewAndClickCountsProviders =
+ viewAndClickCountsProviders;
+ }
+
+ await crossOriginKeepTryingAuctionUntilWinBypassCaching(
+ test, uuid, igOwner, interestGroupOverrides);
+}
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN5;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN6;
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 2,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true, [VIEW_CLICK_PROVIDER]);
+}, 'browserSignals for clickiness.');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN5;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN5;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 4,
+ /*produceAttributionSrc=*/ false,
+ /*produceUserAction=*/ false);
+}, 'IG owner is default clickiness provider if nothing is specified');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN4;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN4;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 6,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true, []);
+}, 'IG owner is default clickiness provider if empty list provided');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN3;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN3;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 0,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true, []);
+}, 'browserSignals for clickiness --- just a click');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN2;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN2;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 1,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ false, [VIEW_CLICK_PROVIDER]);
+}, 'browserSignals for clickiness --- no click report w/o user action');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ const IG_OWNER = window.location.origin;
+ const VIEW_CLICK_PROVIDER1 = OTHER_ORIGIN1;
+ const VIEW_CLICK_PROVIDER2 = window.location.origin;
+
+ // From provider 1 have click, no views.
+ // From provider 2 have views, no clicks;
+ await generateViewsAndClicks(
+ test, uuid, VIEW_CLICK_PROVIDER1, IG_OWNER,
+ /*numViews=*/ 0, /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true);
+ await generateViewsAndClicks(
+ test, uuid, VIEW_CLICK_PROVIDER2, IG_OWNER,
+ /*numViews=*/ 2, /*produceAttributionSrc=*/ false,
+ /*produceUserAction=*/ false);
+
+ // Create an IG that subscribes only to provider 2 --- it should only see
+ // the views.
+ let interestGroupOverrides = {
+ name: uuid,
+ viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER2],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid: `
+ if (browserSignals.clickCounts.pastHour !== 0 ||
+ browserSignals.viewCounts.pastHour < 2) {
+ throw JSON.stringify(browserSignals);
+ }
+ `
+ })
+ };
+
+ await keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides);
+
+ // Now see that subscribing only to 1 provides only the click.
+ interestGroupOverrides = {
+ name: uuid,
+ viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid: `
+ if (browserSignals.clickCounts.pastHour < 1 ||
+ browserSignals.viewCounts.pastHour !== 0) {
+ throw JSON.stringify(browserSignals);
+ }
+ `
+ })
+ };
+
+ await keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides);
+
+ // Now subscribe to both.
+ interestGroupOverrides = {
+ name: uuid,
+ viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1, VIEW_CLICK_PROVIDER2],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid: `
+ if (browserSignals.clickCounts.pastHour < 1 ||
+ browserSignals.viewCounts.pastHour < 2) {
+ throw JSON.stringify(browserSignals);
+ }
+ `
+ })
+ };
+
+ await keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides);
+}, 'browserSignals for clickiness --- viewAndClickCountsProviders works.');
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 0a18ea40d3d..49ebfd1c596 100644
--- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
+++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
@@ -695,6 +695,16 @@ async function joinCrossOriginInterestGroup(test, uuid, origin, interestGroupOve
`await joinInterestGroup(test_instance, "${uuid}", ${interestGroup})`);
}
+// Leaves a cross-origin interest group, by running a leave in an iframe.
+async function leaveCrossOriginInterestGroup(test, uuid, origin, interestGroupOverrides = {}) {
+ let interestGroup = JSON.stringify(
+ createInterestGroupForOrigin(uuid, origin, interestGroupOverrides));
+
+ let iframe = await createIframe(test, origin, 'join-ad-interest-group');
+ await runInFrame(test, iframe,
+ `await leaveInterestGroup(${interestGroup})`);
+}
+
// Joins an interest group in a top-level window, which has the same origin
// as the joined interest group.
async function joinInterestGroupInTopLevelWindow(
diff --git a/tests/wpt/tests/fledge/tentative/resources/record-click.py b/tests/wpt/tests/fledge/tentative/resources/record-click.py
new file mode 100644
index 00000000000..b4e76873d9b
--- /dev/null
+++ b/tests/wpt/tests/fledge/tentative/resources/record-click.py
@@ -0,0 +1,21 @@
+# This responds with a page reporting a click event to the origin provided in
+# the `eligible_origin` query param. The pages loads `num_views` copies of
+# record-view.py as images in a clickiness-eligible way; with them reporting
+# view events.
+def main(request, response):
+ eligible_origin = request.GET.get(b"eligible_origin")
+ num_views = int(request.GET.get(b"num_views"))
+ response.status = (200, b"OK")
+ response.headers.set(b"Content-Type", b"text/html")
+ response.headers.set(
+ b"Ad-Auction-Record-Event",
+ b"type=\"click\", eligible-origins=(\"%s\")" % eligible_origin)
+
+ result = b"<!DOCTYPE html>"
+ img_template = b"<img src=\"record-view.py?i=%d&eligible_origin=%s\"" + \
+ b" attributionsrc>"
+ for i in range(0, num_views):
+ view = img_template % (i, eligible_origin)
+ result = result + view
+ return result.decode("utf-8")
+
diff --git a/tests/wpt/tests/fledge/tentative/resources/record-view.py b/tests/wpt/tests/fledge/tentative/resources/record-view.py
new file mode 100644
index 00000000000..d423b2d9c72
--- /dev/null
+++ b/tests/wpt/tests/fledge/tentative/resources/record-view.py
@@ -0,0 +1,19 @@
+# This responds with an image reporting a view event to the origin provided in
+# the `eligible_origin` query param.
+def main(request, response):
+ eligible_origin = request.GET.get(b"eligible_origin")
+ response.status = (200, b"OK")
+ response.headers.set(b"Content-Type", b"image/png")
+ response.headers.set(
+ b"Ad-Auction-Record-Event",
+ b"type=\"view\", eligible-origins=(\"%s\")" % eligible_origin)
+ png = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" + \
+ b"\x49\x48\x44\x52\x00\x00\x00\x05\x00\x00\x00\x05" + \
+ b"\x08\x06\x00\x00\x00\x8d\x6f\x26\xe5\x00\x00\x00" + \
+ b"\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e" + \
+ b"\xc4\x01\x95\x2b\x0e\x1b\x00\x00\x00\x15\x49\x44" + \
+ b"\x41\x54\x08\x99\x63\x64\xf8\xcf\xf0\x9f\x01\x0d" + \
+ b"\x30\xa1\x0b\x50\x41\x10\x00\xcd\xaa\x02\x08\x0f" + \
+ b"\x23\x6b\x59\x00\x00\x00\x00\x49\x45\x4e\x44\xae" + \
+ b"\x42\x60\x82"
+ return png
diff --git a/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml
new file mode 100644
index 00000000000..319b5b8e04c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: canvas-createconicgradient
+ files:
+ - 2d.gradient.conic.*
diff --git a/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml
new file mode 100644
index 00000000000..5d9106c1cd6
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml
@@ -0,0 +1,5 @@
+features:
+- name: canvas-createconicgradient
+ files:
+ - conic-gradient.html
+ - conic-gradient-rotation.html
diff --git a/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml
new file mode 100644
index 00000000000..319b5b8e04c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: canvas-createconicgradient
+ files:
+ - 2d.gradient.conic.*
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md
deleted file mode 100644
index b3c24c3f82d..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Because this test suite is run as a virtual suite and it's quite deep in the
-folders, we have to use abbreviations for the test names to not run over 200
-characters, which is problematic on Windows.
-
-* unspecified -> "u"
-* unsafe-none -> "un"
-* same-origin -> "so"
-* same-origin-allow-popups -> "soap"
-* restrict-properties -> omitted
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html
deleted file mode 100644
index 1c315b35d7f..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title> Check openee.closed access is allowed for COOP: restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script>
-<script>
-
-testAccessProperty(
- "closed",
- w => w.closed,
- expectReport = false,
- use_restrict_properties = true
-);
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html
deleted file mode 100644
index 7a96f4f5762..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!doctype html>
-<title>
- COOP reports are sent to the openee when the openee used COOP-RO:
- restrict-properties and its same-origin opener tries to access it.
-</title>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
-<script>
-
-const directory = "/html/cross-origin-opener-policy";
-const same_origin = get_host_info().HTTPS_ORIGIN;
-
-promise_test(async t => {
- const report_token = token();
- const openee_token = token();
- const opener_token = token(); // The current test window.
-
- const opener_url = location.href;
-
- const reportTo = reportToHeaders(report_token);
- const openee_url = same_origin + executor_path + reportTo.header +
- reportTo.coopReportOnlyRestrictPropertiesHeader +
- `&uuid=${openee_token}`;
-
- const openee = window.open(openee_url);
- t.add_cleanup(() => send(openee_token, "window.close()"))
-
- // 1. Make sure the new document to be loaded.
- send(openee_token, `
- send("${opener_token}", "Ready");
- `);
- let reply = await receive(opener_token);
- assert_equals(reply, "Ready");
-
- // 2. Try to access the openee. A report is sent, because of COOP-RO:
- // restrict-properties.
- tryAccess(openee);
-
- // 3. Check a report is sent to the openee.
- let report =
- await receiveReport(report_token, "access-to-coop-page-from-opener");
- assert_equals(report.type, "coop");
- assert_equals(report.url, openee_url.replace(/"/g, '%22'));
- assert_equals(report.body.disposition, "reporting");
- assert_equals(report.body.effectivePolicy, "restrict-properties");
- assert_equals(report.body.property, "blur");
- assert_source_location_missing(report);
- assert_equals(report.body.openerURL, opener_url);
- assert_equals(report.body.openeeURL, undefined);
- assert_equals(report.body.otherDocumentURL, undefined);
- assert_equals(report.body.referrer, opener_url);
- assert_equals(report.body.initialPopupURL, undefined);
-}, "access-reporting-openee-rp-ro");
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html
deleted file mode 100644
index 9e1e85b16a5..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!doctype html>
-<title>
- COOP reports are sent to the opener when the opener used COOP-RO:
- restrict-properties and its same-origin openee tries to access it.
-</title>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
-<script>
-
-const directory = "/html/cross-origin-opener-policy";
-const same_origin = get_host_info().HTTPS_ORIGIN;
-
-promise_test(async t => {
- // The test window.
- const this_window_token = token();
-
- // The "opener" window. This has COOP and a reporter.
- const opener_report_token= token();
- const opener_token = token();
- const opener_reportTo = reportToHeaders(opener_report_token);
- const opener_url = same_origin + executor_path + opener_reportTo.header +
- opener_reportTo.coopReportOnlyRestrictPropertiesHeader +
- `&uuid=${opener_token}`;
-
- // The "openee" window. This is same origin with the "opener".
- const openee_report_token= token();
- const openee_token = token();
- const openee_url = same_origin + executor_path + `&uuid=${openee_token}`;
-
- // 1. Create the opener window.
- let opener_window_proxy = window.open(opener_url);
- t.add_cleanup(() => send(opener_token, "window.close()"));
-
- // 2. The opener opens its openee.
- send(opener_token, `
- openee = window.open("${openee_url}");
- send("${this_window_token}", "ACK 1");
- `);
- assert_equals("ACK 1", await receive(this_window_token));
- t.add_cleanup(() => send(openee_token, "window.close()"));
-
- // 3. The openee tries to access its opener.
- send(openee_token, addScriptAndTriggerOnload(
- directory + "/reporting/resources/try-access.js",
- "tryAccess(opener);")
- );
-
- // 4. Check a report sent to the opener.
- let report =
- await receiveReport(opener_report_token, "access-to-coop-page-from-openee");
- assert_equals(report.type, "coop");
- assert_equals(report.url, opener_url.replace(/"/g, '%22'));
- assert_equals(report.body.disposition, "reporting");
- assert_equals(report.body.effectivePolicy, "restrict-properties");
- assert_equals(report.body.property, "blur");
- assert_source_location_missing(report);
- assert_equals(report.body.openerURL, undefined);
- assert_equals(report.body.openeeURL, openee_url);
- assert_equals(report.body.otherDocumentURL, undefined);
- assert_equals(report.body.referrer, undefined);
- assert_equals(report.body.initialPopupURL, openee_url);
-}, "access-reporting-opener-rp-ro");
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
deleted file mode 100644
index 5bc718e2a89..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title> Check openee.postMessage() access is allowed for COOP: restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script>
-<script>
-
-testAccessProperty(
- "postMessage",
- w => w.postMessage("message", "*"),
- expectReport = false,
- use_restrict_properties = true
-);
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html
deleted file mode 100644
index e5c87751748..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-promise_test(async t => {
- const popup_token = token();
- const second_popup_token = token();
- const reply_token = token();
-
- const unsafe_none_url = getExecutorPath(
- popup_token,
- SAME_ORIGIN.origin,
- { coop: "unsafe-none"});
-
- const restrict_properties_url = getExecutorPath(
- second_popup_token,
- SAME_ORIGIN.origin,
- { coop: "restrict-properties"});
-
- // We open popup and then ping it, it will respond after loading.
- const popup = window.open(unsafe_none_url);
- send(popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- // Make sure the popup will be closed once the test has run, keeping a clean
- // state.
- t.add_cleanup(() => {
- send(popup_token, `close()`);
- });
-
- // Now navigate this popup to a restrict-properties page.
- send(popup_token, `document.location = '${restrict_properties_url}'`);
- send(second_popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- // Navigate again to the original page.
- send(second_popup_token, `document.location = '${unsafe_none_url}'`);
- send(popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- // Give some time for things to settle across processes etc. before
- // proceeding with verifications.
- await new Promise(resolve => { t.step_timeout(resolve, 500); });
-
- // Verify that we have full access to the popup.
- assert_false(popup.closed, 'Popup is closed from opener?');
- assert_true(await getPopupHasOpener(popup_token) === "true",
- 'Popup has nulled opener?');
- assert_true(canAccessProperty(popup, "document"),
- 'Main page has dom access to the popup?');
- assert_true(canAccessProperty(popup, "frames"),
- 'Main page has cross origin access to the popup?');
-
-}, "COOP: restrict-properties has no impact in a navigation chain between " +
- "multiple unsafe-none pages.");
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers
deleted file mode 100644
index 073ce7adfbd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js
deleted file mode 100644
index 1247400a4e3..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js
+++ /dev/null
@@ -1,144 +0,0 @@
-// META: script=/common/get-host-info.sub.js
-// META: script=/common/utils.js
-// META: script=/common/dispatcher/dispatcher.js
-
-const executor_path = '/common/dispatcher/executor.html?pipe=';
-const cross_origin = get_host_info().OTHER_ORIGIN;
-const same_origin = get_host_info().ORIGIN;
-const coep_require_corp_header =
- '|header(Cross-Origin-Embedder-Policy,require-corp)';
-const corp_cross_origin_header =
- '|header(Cross-Origin-Resource-Policy,cross-origin)';
-const coop_restrict_properties_header =
- '|header(Cross-Origin-Opener-Policy,restrict-properties)';
-
-function iframePopupAboutBlankTest(
- origin, {expectedCrossOriginIsolated}, description) {
- promise_test(async t => {
- assert_true(crossOriginIsolated, 'Is main frame crossOriginIsolated?');
- assert_true(
- 'SharedArrayBuffer' in globalThis,
- 'Is SharedArrayBuffer defined in main frame?');
-
- const reply_token = token();
- const iframe_token = token();
-
- const iframe = document.createElement('iframe');
- iframe.src = origin + executor_path + coep_require_corp_header +
- corp_cross_origin_header + `&uuid=${iframe_token}`;
- document.body.appendChild(iframe);
-
- send(iframe_token, `send('${reply_token}', 'Iframe loaded');`);
- assert_equals(await receive(reply_token), 'Iframe loaded');
-
- send(iframe_token, `
- window.popup = window.open();
- send('${reply_token}', popup === null);
- `);
- assert_equals(await receive(reply_token), 'false', 'Is popup handle null?');
-
- send(
- iframe_token,
- `send('${reply_token}', popup.window.crossOriginIsolated);`);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is popup crossOriginIsolated?');
-
- send(iframe_token, `
- send('${reply_token}', 'SharedArrayBuffer' in popup.window.globalThis);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is SharedArrayBuffer defined in popup?');
-
- // Test whether the popup's subframe is crossOriginIsolated
- const popup_iframe_token = token();
- const popup_iframe_src = origin + executor_path + coep_require_corp_header +
- corp_cross_origin_header + `&uuid=${popup_iframe_token}`;
- send(iframe_token, `
- const iframe = window.popup.document.createElement('iframe');
- iframe.src = '${popup_iframe_src}';
- popup.document.body.appendChild(iframe);
- `);
-
- send(popup_iframe_token, `
- send('${reply_token}', 'Iframe in popup loaded');
- `);
- assert_equals(await receive(reply_token), 'Iframe in popup loaded');
-
- send(popup_iframe_token, `
- send('${reply_token}', crossOriginIsolated);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is iframe in popup crossOriginIsolated?');
-
- send(popup_iframe_token, `
- send('${reply_token}', 'SharedArrayBuffer' in globalThis);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is SharedArrayBuffer defined in iframe in popup?');
-
- // Test whether a nested iframe is crossOriginIsolated
- const popup_nested_iframe_token = token();
- const popup_nested_iframe_src = origin + executor_path +
- coep_require_corp_header + corp_cross_origin_header +
- `&uuid=${popup_nested_iframe_token}`;
- send(iframe_token, `
- blank_iframe = popup.document.createElement('iframe');
- blank_iframe.src = '';
- popup.document.body.appendChild(blank_iframe);
- nested_iframe =
- blank_iframe.contentDocument.createElement('iframe');
- nested_iframe.src = '${popup_nested_iframe_src}';
- blank_iframe.contentDocument.body.appendChild(nested_iframe);
- `);
-
- send(popup_nested_iframe_token, `
- send('${reply_token}', 'Nested iframe in popup loaded');
- `);
- assert_equals(await receive(reply_token), 'Nested iframe in popup loaded');
-
- send(popup_nested_iframe_token, `
- send('${reply_token}', crossOriginIsolated);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is nested iframe in popup crossOriginIsolated?');
-
- send(popup_nested_iframe_token, `
- send('${reply_token}', 'SharedArrayBuffer' in globalThis);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is SharedArrayBuffer defined in nested iframe in popup?');
-
- // Navigate the popup out of the initial empty document, with COOP:RP and
- // COEP: require-corp. Expect to be crossOriginIsolated.
- const popup_token = token();
- const popup_src = origin + executor_path + coop_restrict_properties_header +
- coep_require_corp_header + `&uuid=${popup_token}`;
- send(iframe_token, `popup.window.location = '${popup_src}';`);
-
- send(popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- send(popup_token, `send('${reply_token}', crossOriginIsolated);`);
- assert_equals(
- await receive(reply_token), 'true',
- 'Is popup crossOriginIsolated after navigation?');
-
- send(popup_token, `
- send('${reply_token}', 'SharedArrayBuffer' in globalThis);
- `);
- assert_equals(
- await receive(reply_token), 'true',
- 'Is SharedArrayBuffer defined in popup after navigation?');
- }, description);
-}
-
-iframePopupAboutBlankTest(
- cross_origin, {expectedCrossOriginIsolated: false}, 'Cross-origin iframe');
-iframePopupAboutBlankTest(
- same_origin, {expectedCrossOriginIsolated: true}, 'Same-origin iframe');
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers
deleted file mode 100644
index 19d0dbe4e18..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
-Cross-Origin-Embedder-Policy: require-corp
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html
deleted file mode 100644
index 8cf2679e190..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-1">
-<meta name="variant" content="?2-2">
-<meta name="variant" content="?3-3">
-<meta name="variant" content="?4-4">
-<meta name="variant" content="?5-5">
-<meta name="variant" content="?6-6">
-<meta name="variant" content="?7-7">
-<meta name="variant" content="?8-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-// This document has COOP: restrict-properties. The popup has COOP: same-origin.
-// Opening from an iframe should not be different from opening from the main
-// frame and the opener should be severed.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: same-origin via an iframe, ` +
- `with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'same-origin' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html
deleted file mode 100644
index f3af3ca7db1..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-2">
-<meta name="variant" content="?3-4">
-<meta name="variant" content="?5-6">
-<meta name="variant" content="?7-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-
-// This document has COOP: restrict-properties. The popup has COOP:
-// same-origin-allow-popups. Opening from an iframe should not be different from
-// opening from the main frame and the opener should be severed.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: same-origin-allow-popups ` +
- `via an iframe, with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'same-origin-allow-popups' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html
deleted file mode 100644
index 560dfd90511..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-2">
-<meta name="variant" content="?3-4">
-<meta name="variant" content="?5-6">
-<meta name="variant" content="?7-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-// This document has COOP: restrict-properties. The popup has COOP: unsafe-none.
-// Opening from an iframe should not be different from opening from the main
-// frame and the opener should be severed.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: unsafe-none via an iframe, ` +
- `with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'unsafe-none' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html
deleted file mode 100644
index 17840724d9e..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-2">
-<meta name="variant" content="?3-4">
-<meta name="variant" content="?5-6">
-<meta name="variant" content="?7-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-// This document has COOP: restrict-properties. The popup has COOP:
-// restrict-properties. Opening from an iframe should not be different from
-// opening from the main frame and the opener should be restricted if
-// cross-origin.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "preserved"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "preserved"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "preserved"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: restrict-properties via an ` +
- `iframe, with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'restrict-properties' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html
deleted file mode 100644
index 10929847ee6..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-
-<script>
-
-async function createCoopRestrictPropertiesPopup(popupToken, name) {
- const url = SAME_ORIGIN.origin + '/common/dispatcher/executor.html' +
- `?uuid=${popupToken}` +
- '&pipe=|header(Cross-Origin-Opener-Policy, restrict-properties)';
- const popup = window.open(url, name);
- add_completion_callback(() => popup.close());
-
- // Wait for the popup to be loaded.
- const replyToken = token();
- send(popupToken, `send('${replyToken}', 'Done loading')`);
- assert_equals(await receive(replyToken), 'Done loading');
-
- return popup;
-}
-
-promise_test(async t => {
- // Start by opening a first COOP: restrict-properties popup. No name is set to
- // begin with.
- const popupToken1 = token();
- const popup1 = await createCoopRestrictPropertiesPopup(popupToken1, '');
-
- // Once the popup is live, explicitly set a name.
- const name = token();
- send(popupToken1, `window.name = '${name}'`);
-
- // To make sure this name has been propagated to other processes, send a dummy
- // message from the popup to the main page, and wait for it to be received.
- // It should be delivered after the name change is replicated.
- const message_waiter = new Promise(resolve => {
- onmessage = (event) => {
- if (event.data == 'Waited enough') { resolve(); }
- }
- });
- send(popupToken1, `opener.postMessage('Waited enough', '*')`);
- await message_waiter;
-
- // Finally, call window.open with the same name. This should not resolve
- // across browsing context groups, and create a brand new popup.
- const popupToken2 = token();
- const popup2 = await createCoopRestrictPropertiesPopup(popupToken2, name);
- assert_not_equals(popup1, popup2,
- 'Named targeting resolved across isolation boundaries');
-
-}, 'Verify that named targeting does not work across isolation boundaries.');
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html
deleted file mode 100644
index e5313a6e222..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "severed",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "severed",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "severed",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers
deleted file mode 100644
index 46ad58d83bf..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: same-origin
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html
deleted file mode 100644
index 595a10a84bb..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers
deleted file mode 100644
index d83ed86fb9b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html
deleted file mode 100644
index 595a10a84bb..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html
deleted file mode 100644
index 595a10a84bb..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers
deleted file mode 100644
index 073ce7adfbd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html
deleted file mode 100644
index a84d52584e9..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with empty coop",
- "coop": "",
- "opener": "restricted"
- },
- {
- "title": "popup with coop unsafe-none",
- "coop": "unsafe-none",
- "opener": "restricted"
- },
- {
- "title": "popup with coop same-origin",
- "coop": "same-origin",
- "opener": "severed"
- },
- {
- "title": "popup with coop same-origin-allow-popups",
- "coop": "same-origin-allow-popups",
- "opener": "severed"
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted"
- }
-].forEach(variant => {
- popup_test(`Cross-origin ${variant.title}`, CROSS_ORIGIN,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html
deleted file mode 100644
index c0020fa23a4..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with empty coop",
- "coop": "",
- "opener": "restricted"
- },
- {
- "title": "popup with coop unsafe-none",
- "coop": "unsafe-none",
- "opener": "restricted"
- },
- {
- "title": "popup with coop same-origin",
- "coop": "same-origin",
- "opener": "severed"
- },
- {
- "title": "popup with coop same-origin-allow-popups",
- "coop": "same-origin-allow-popups",
- "opener": "severed"
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "preserved"
- }
-].forEach(variant => {
- popup_test(`Same-origin ${variant.title}`, SAME_ORIGIN,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html
deleted file mode 100644
index 7d115ac7e63..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!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="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with empty coop",
- "coop": "",
- "opener": "restricted"
- },
- {
- "title": "popup with coop unsafe-none",
- "coop": "unsafe-none",
- "opener": "restricted"
- },
- {
- "title": "popup with coop same-origin",
- "coop": "same-origin",
- "opener": "severed"
- },
- {
- "title": "popup with coop same-origin-allow-popups",
- "coop": "same-origin-allow-popups",
- "opener": "severed"
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted"
- }
-].forEach(variant => {
- popup_test(`Same-site ${variant.title}`, SAME_SITE,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html
deleted file mode 100644
index 9bc171a269c..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!doctype html>
-<title>
- Verify that we consider browsing context group reuse for COOP reporting.
-</title>
-<meta name="timeout" content="long">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=f1e361ab5854f2dcfe0224b19bc53199&report_only_id=b6fe666b74547291d52d72790adde05c"></script>
-<script>
-
-const same_origin = get_host_info().HTTPS_ORIGIN;
-const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
-
-promise_test(async test => {
- // To receive reports use the same hard-coded value as the one passed in the
- // headers and to "reporting-common.js".
- const report_token = "b6fe666b74547291d52d72790adde05c";
- const reportTo = reportToHeaders(report_token);
-
- // 1. Open a popup without any COOP. It should be in a
- // different virtual browsing context group.
- const opener_token = token(); // For this window.
- const initial_openee_token = token();
- const initial_openee_url = cross_origin + executor_path +
- `&uuid=${initial_openee_token}`;
- let openee = window.open(initial_openee_url);
-
- // 2. Navigate the openee to a COOP-RO: restrict-properties page. If the
- // policy was enforced, it would live in the same browsing context group as
- // this page. The virtual browsing context group should similarly be equal.
- // Note: We omit the reporting endpoint header, because it is not possible to
- // easily escape it. Since it is not necessary in this test, we skip it.
- const final_openee_token = token();
- const final_openee_url = same_origin + executor_path +
- reportTo.coopReportOnlyRestrictPropertiesHeader +
- `&uuid=${final_openee_token}`;
-
- send(initial_openee_token, `location.href = '${final_openee_url}';`);
- test.add_cleanup(() => send(final_openee_token, "window.close()"));
-
- // Wait for the final openee to load.
- send(final_openee_token,
- `send("${opener_token}", "Ready");
- `);
- assert_equals(await receive(opener_token), "Ready");
-
- // 3. Try to access the openee from the opener. No report should be sent.
- tryAccess(openee);
-
- let report =
- await receiveReport(report_token, "access-from-coop-page-to-openee")
- assert_equals(report, "timeout");
-
-}, "access-reporting-browsing-context-group-reuse");
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers
deleted file mode 100644
index 33abadd83dd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=f1e361ab5854f2dcfe0224b19bc53199", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b6fe666b74547291d52d72790adde05c"
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
deleted file mode 100644
index b89030f218f..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>Opening a restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=fb054dadb3a9ec17b5cd5c0152d2a7dd&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP unsafe-none, which mismatches with the
- // current document (opener) COOP report-only (restrict-properties) values.
- [
- SAME_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP unsafe-none, which mismatches with the
- // current document (opener) COOP report-only (restrict-properties) values.
- [
- CROSS_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a same-origin popup with COOP restrict-properties, which matches with
- // the current document (opener) COOP report-only (restrict-properties) value.
- [
- SAME_ORIGIN,
- "restrict-properties",
- "",
- "",
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
deleted file mode 100644
index 07ecad96f24..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fb054dadb3a9ec17b5cd5c0152d2a7dd", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2"
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
deleted file mode 100644
index 6b31f7e0098..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>Opening a restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=ed5a8be35e4e21c2ba960e6574e0a32c&report_only_id=fa22ddc676642edae42c75defb82ba2e"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP unsafe-none, which mismatches
- // with the current document (opener) COOP (restrict-properties) values.
- [
- SAME_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP unsafe-none, which mismatches
- // with the current document (opener) COOP (restrict-properties) values.
- [
- CROSS_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a same-origin popup with COOP restrict-properties, which matches with
- // the current document (opener) COOP (restrict-properties) value.
- [
- SAME_ORIGIN,
- "restrict-properties",
- "",
- "",
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
deleted file mode 100644
index a61e2919c8a..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties; report-to="coop-report-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=ed5a8be35e4e21c2ba960e6574e0a32c", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fa22ddc676642edae42c75defb82ba2e"
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
deleted file mode 100644
index c47e59cd8f1..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>reporting same origin with report-to</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- SAME_ORIGIN,
- "",
- "",
- `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`,
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- CROSS_ORIGIN,
- "",
- "",
- `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`,
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers
deleted file mode 100644
index 16903320bb5..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
-Referrer-Policy: origin
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
deleted file mode 100644
index ff60e8c5afd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>reporting same origin with report-to</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- SAME_ORIGIN,
- `restrict-properties; report-to="${popupReportEndpoint.name}"`,
- "",
- "",
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- CROSS_ORIGIN,
- `restrict-properties; report-to="${popupReportEndpoint.name}"`,
- "",
- "",
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers
deleted file mode 100644
index 16903320bb5..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
-Referrer-Policy: origin
diff --git a/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml
new file mode 100644
index 00000000000..4700eca4a12
--- /dev/null
+++ b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: writingsuggestions
+ files: "**"
diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html
index b177f47b757..5042557212e 100644
--- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html
+++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html
@@ -1,8 +1,8 @@
<!doctype html>
<html>
<body>
-<div style="width: 1em; color: white; background-color: black;">
- <marquee loop="1" behavior="alternate">m</marquee>
+<div style="vertical-align: text-bottom; display: inline-block;">
+ <div style="width: 10px; height: 10px; background-color: green;"></div>
</div>
</body>
</html>
diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html
index 57f49850321..f16c58bb85d 100644
--- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html
+++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html
@@ -1,12 +1,12 @@
<!doctype html>
<html>
<head>
-<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
-<link rel="match" href="marquee-with-trusted-types-ref.html">
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
+ <link rel="match" href="marquee-with-trusted-types-ref.html">
</head>
<body>
-<div style="width: 1em; color: white; background-color: black;">
- <marquee loop="1" behavior="alternate">m</marquee>
-</div>
+<marquee scrollamount="0">
+ <div style="width: 10px; height: 10px; background-color: green;"></div>
+</marquee>
</body>
</html>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html
new file mode 100644
index 00000000000..57ea51e367c
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/customizable-select-in-page.css">
+<link rel=stylesheet href="../customizable-select/resources/customizable-select-styles.css">
+<script src="resources/customizable-select-in-page.js"></script>
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-option selected">select multiple</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+</div>
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-option selected">select size=4</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+</div>
+
+<div class="customizable-select-in-page disabled" size=4>
+ <div class="customizable-select-option selected">select disabled</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+ <div class=customizable-select-option>disabled</div>
+</div>
+
+<!-- TODO(crbug.com/407801061): Fix padding and remove this div. -->
+<div style="position: absolute; top: 150px">
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-option selected">with disabled option</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+ <div class="customizable-select-option disabled">disabled</div>
+</div>
+
+<div class=customizable-select-in-page size=4>
+ <div class=customizable-select-legend>optgroup</div>
+ <div class=customizable-select-option>option in optgroup</div>
+ <div class=customizable-select-option>option out of optgroup</div>
+</div>
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-legend disabled">disabled optgroup</div>
+ <div class="customizable-select-option disabled">option in optgroup</div>
+ <div class=customizable-select-option>option out of optgroup</div>
+</div>
+
+<script>
+updateCustomizableSelectInPageSize();
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html
new file mode 100644
index 00000000000..b3bf75eb0ff
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/357649033">
+<link rel=match href="customizable-select-in-page-appearance-ref.html">
+
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+
+<select multiple>
+ <option selected>select multiple</option>
+ <option>two</option>
+ <option>three</option>
+</select>
+
+<select size=4>
+ <option selected>select size=4</option>
+ <option>two</option>
+ <option>three</option>
+</select>
+
+<select size=4 disabled>
+ <option selected>select disabled</option>
+ <option>two</option>
+ <option>three</option>
+ <option disabled>disabled</option>
+</select>
+
+<!-- TODO(crbug.com/407801061): Fix padding and remove this div. -->
+<div style="position: absolute; top: 150px">
+
+<select size=4>
+ <option selected>with disabled option</option>
+ <option>two</option>
+ <option>three</option>
+ <option disabled>disabled</option>
+</select>
+
+<select size=4>
+ <optgroup>
+ <legend>optgroup</legend>
+ <option>option in optgroup</option>
+ </optgroup>
+ <option>option out of optgroup</option>
+</select>
+
+<select size=4>
+ <optgroup disabled>
+ <legend>disabled optgroup</legend>
+ <option>option in optgroup</option>
+ </optgroup>
+ <option>option out of optgroup</option>
+</select>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html
new file mode 100644
index 00000000000..24e6e39ea48
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/357649033">
+<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>
+
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+
+<button id=beforemultiple>button before multiple</button>
+<select multiple>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<button id=beforesize>button before size=4</button>
+<select size=4>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<script>
+const tabKey = '\uE004';
+const enterKey = '\uE007';
+const spaceKey = '\uE00D';
+const arrowUp = '\uE013';
+const arrowDown = '\uE015';
+function pressKey(keyCode) {
+ return (new test_driver.Actions()
+ .keyDown(keyCode)
+ .keyUp(keyCode))
+ .send();
+}
+
+promise_test(async () => {
+ const select = document.querySelector('select[multiple]');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ beforemultiple.focus();
+ await pressKey(tabKey);
+ assert_equals(document.activeElement, optionOne,
+ 'The first option should get focus when keyboard focusing into a select.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionOne,
+ 'Focus should not be moved after pressing space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after the first space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should be selected after the first space.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after arrow down.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Disabled option should not be focusable.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second space.');
+ assert_equals(select.selectedOptions.length, 2,
+ 'Two options should be selected after second space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after second space.');
+ assert_equals(select.selectedOptions[1], optionTwo,
+ 'Second option should be selected after second space.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after third space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after third space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after third space.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after first enter.');
+ assert_equals(select.selectedOptions.length, 2,
+ 'Two options should be selected after first enter.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after first enter.');
+ assert_equals(select.selectedOptions[1], optionTwo,
+ 'Second option should be selected after first enter.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second enter.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after second enter.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after second enter.');
+
+ await pressKey(arrowUp);
+ assert_equals(document.activeElement, optionOne,
+ 'First option should be focused after arrow up.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after arrow up.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after arrow up.');
+}, 'Keyboard behavior for base appearance <select multiple>');
+
+promise_test(async () => {
+ const select = document.querySelector('select[size]');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ beforesize.focus();
+ await pressKey(tabKey);
+ assert_equals(document.activeElement, optionOne,
+ 'The first option should get focus when keyboard focusing into a select.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionOne,
+ 'Focus should not be moved after pressing space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after the first space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should be selected after the first space.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after arrow down.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Disabled option should not be focusable.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One options should be selected after second space.');
+ assert_equals(select.selectedOptions[0], optionTwo,
+ 'Second option should be selected after second space.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after third space.');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected after third space.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after first enter.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after first enter.');
+ assert_equals(select.selectedOptions[0], optionTwo,
+ 'Second option should be selected after first enter.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second enter.');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected after second enter.');
+
+ await pressKey(arrowUp);
+ assert_equals(document.activeElement, optionOne,
+ 'First option should be focused after arrow up.');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected after arrow up.');
+}, 'Keyboard behavior for base appearance <select size=4>');
+
+promise_test(async () => {
+ document.body.focus();
+
+ const selectMultiple = document.querySelector('select[multiple]');
+ selectMultiple.focus();
+ assert_not_equals(document.activeElement, selectMultiple, '<select multiple>');
+
+ const selectSize = document.querySelector('select[size]');
+ selectSize.focus();
+ assert_not_equals(document.activeElement, selectSize, '<select size=4>');
+}, 'Base appearance in-page selects should not be focusable.');
+
+// TODO(crbug.com/357649033): Test tab key while focused on an option after deciding behavior.
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html
new file mode 100644
index 00000000000..d5b93693cf7
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/357649033">
+<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>
+
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+
+<select multiple>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<select size=4>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<script>
+function click(element) {
+ return (new test_driver.Actions()
+ .pointerMove(1, 1, {origin: element})
+ .pointerDown()
+ .pointerUp())
+ .send();
+}
+
+function touch(element) {
+ return (new test_driver.Actions()
+ .addPointer('finger', 'touch')
+ .pointerMove(1, 1, {origin: element, sourceName: 'finger'})
+ .pointerDown({sourceName: 'finger'})
+ .pointerUp({sourceName: 'finger'}))
+ .send();
+}
+
+['mouse', 'touch'].forEach(inputType => {
+ const activate = inputType == 'touch' ? touch : click;
+
+ promise_test(async () => {
+ const select = document.querySelector('select[multiple]');
+ select.value = null;
+ select.removeAttribute('disabled');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ const disabledOption = select.querySelector('.disabled');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ await activate(optionOne);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after first click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should be selected after first click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 2,
+ 'There should be two selected options after second click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should stay selected after second click.');
+ assert_equals(select.selectedOptions[1], optionTwo,
+ 'Option two should be seleted after second click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after third click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should stay selected after third click.');
+
+ await activate(disabledOption);
+ assert_equals(select.selectedOptions.length, 1,
+ 'Disabled option should not be checkable.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Disabled option should not be checkable.');
+
+ select.setAttribute('disabled', '');
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 1,
+ 'Disabled select should not have checkable options.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Disabled select should not have checkable options.');
+ }, `${inputType}: input behavior for base appearance <select multiple>`);
+
+ promise_test(async () => {
+ const select = document.querySelector('select[size]');
+ select.value = null;
+ select.removeAttribute('disabled');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ const disabledOption = select.querySelector('.disabled');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ await activate(optionOne);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after first click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should be selected after first click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after second click.');
+ assert_equals(select.selectedOptions[0], optionTwo,
+ 'Option two should be selected after second click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 0,
+ 'There should be no selected options after third click.');
+
+ await activate(disabledOption);
+ assert_equals(select.selectedOptions.length, 0,
+ 'Disabled option should not be checkable.');
+
+ select.setAttribute('disabled', '');
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 0,
+ 'Disabled select should not have checkable options.');
+ }, `${inputType}: input behavior for base appearance <select size=4>`);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css
new file mode 100644
index 00000000000..deb080b4756
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css
@@ -0,0 +1,14 @@
+.customizable-select-in-page {
+ display: inline-block;
+ border: 1px solid;
+ overflow-inline: hidden;
+ overflow-block: scroll;
+}
+
+.customizable-select-in-page.disabled {
+ color: color-mix(in lab, currentColor 50%, transparent);
+}
+
+.customizable-select-in-page:not(.disabled) .customizable-select-legend.disabled {
+ color: color-mix(in lab, currentColor 50%, transparent);
+}
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js
new file mode 100644
index 00000000000..13230943321
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js
@@ -0,0 +1,13 @@
+function updateCustomizableSelectInPageSize() {
+ document.querySelectorAll('.customizable-select-in-page').forEach(select => {
+ const size = Number(select.getAttribute('size'));
+ if (size) {
+ let optionHeight = 0;
+ select.querySelectorAll('.customizable-select-option').forEach(option => {
+ const rect = option.getBoundingClientRect();
+ optionHeight = Math.max(optionHeight, rect.height);
+ });
+ select.style.height = (optionHeight * size) + 'px';
+ }
+ });
+}
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html
deleted file mode 100644
index 45a74da7559..00000000000
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<select multiple>
- <option>one</option>
- <option>two div button</option>
-</select>
-
-<select multiple size=2>
- <option>one</option>
- <option>two</option>
- <option>three</option>
- <option>four</option>
-</select>
-
-<select multiple>
- <option selected>option</option>
-</select>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html
deleted file mode 100644
index 48673b446bc..00000000000
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html class=reftest-wait>
-<link rel=author href="mailto:jarhar@chromium.org">
-<link rel=match href="select-multiple-base-appearance-ref.html">
-
-<style>
-select, ::picker(select) {
- appearance: base-select;
-}
-</style>
-
-<select multiple>
- <option>one</option>
- <option>
- two
- <div>div</div>
- <button>button</button>
- </option>
-</select>
-
-<select multiple size=2>
- <option>one</option>
- <option>two</option>
- <option>three</option>
- <option>four</option>
-</select>
-
-<select id=needsmultiple>
- <option selected>option</option>
-</select>
-
-<script>
-requestAnimationFrame(() => {
- document.getElementById('needsmultiple').setAttribute('multiple', '');
- requestAnimationFrame(() => {
- document.documentElement.classList.remove('reftest-wait');
- });
-});
-</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
index 1e000866099..5afb407640b 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
@@ -48,11 +48,9 @@
}
}
- async_test((t) => {
- window.onload = async () => {
- await assert_focus_order([before,within1,after1,dialog2,within2,after2,
- within3,after3,dialog4,within4,after4]);
- t.done();
- };
+ promise_test(async () => {
+ await new Promise(resolve => window.onload = resolve);
+ await assert_focus_order([before,within1,after1,dialog2,within2,after2,
+ within3,after3,dialog4,within4,after4]);
}, "The dialog element itself should not be keyboard focusable.");
</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
index 9a9c87167d5..6555f1b43bd 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
@@ -35,14 +35,8 @@ function openDialog(openMethod) {
assert_true(dialog.matches(':open'));
assert_equals(dialog.matches(':modal'),openMethod === 'modal');
}
-function getSignal(t) {
- const controller = new AbortController();
- const signal = controller.signal;
- t.add_cleanup(() => controller.abort());
- return signal;
-}
-async function setup(t,closedby) {
+function setup(t,closedby) {
t.add_cleanup(() => {
dialog.close();
dialog.removeAttribute('closedby');
@@ -52,16 +46,14 @@ async function setup(t,closedby) {
if (closedby) {
dialog.setAttribute('closedby',closedby);
}
- // Be sure any pending close events (from prior test cleanups) get fired.
- await waitForRender();
- return getSignal(t);
+ return t.get_signal();
}
['modeless','modal','open'].forEach(openMethod => {
[null,'any','closedrequest','none'].forEach(closedby => {
const testDescription = `for ${openMethod} dialog with closedby=${closedby}`;
promise_test(async (t) => {
- await setup(t,closedby);
+ setup(t,closedby);
openDialog(openMethod);
dialog.requestClose();
assert_false(dialog.open);
@@ -69,25 +61,35 @@ async function setup(t,closedby) {
},`requestClose basic behavior ${testDescription}`);
promise_test(async (t) => {
- const signal = await setup(t,closedby);
+ const signal = setup(t,closedby);
let events = [];
+ const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers();
dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
- dialog.addEventListener('close',() => events.push('close'),{signal});
+ dialog.addEventListener('close',() => {
+ events.push('close');
+ hasClosed();
+ },{signal});
openDialog(openMethod);
assert_array_equals(events,[]);
dialog.requestClose();
assert_false(dialog.open);
assert_false(dialog.matches(':open'));
assert_array_equals(events,['cancel'],'close is scheduled');
- await waitForRender();
+ await untilFullyClosed;
assert_array_equals(events,['cancel','close']);
},`requestClose fires both cancel and close ${testDescription}`);
promise_test(async (t) => {
- const signal = await setup(t,'none');
+ const signal = setup(t,'none');
let events = [];
+ const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers();
+ const { promise: untilFullyClosedAgain, resolve: hasClosedAgain } = Promise.withResolvers();
+ const closeResolvers = [hasClosed, hasClosedAgain];
dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
- dialog.addEventListener('close',() => events.push('close'),{signal});
+ dialog.addEventListener('close',() => {
+ events.push('close');
+ closeResolvers.shift()();
+ },{signal});
openDialog(openMethod);
dialog.setAttribute('closedby',closedby);
assert_array_equals(events,[]);
@@ -95,6 +97,7 @@ async function setup(t,closedby) {
assert_false(dialog.open,'Adding closedby after dialog is open');
assert_false(dialog.matches(':open'));
assert_array_equals(events,['cancel']);
+ await untilFullyClosed;
events=[];
openDialog(openMethod);
dialog.removeAttribute('closedby');
@@ -102,11 +105,13 @@ async function setup(t,closedby) {
dialog.requestClose();
assert_false(dialog.open,'Removing closedby after dialog is open');
assert_array_equals(events,['cancel']);
+ await untilFullyClosedAgain;
+ assert_array_equals(events,['cancel', 'close']);
},`closedby has no effect on dialog.requestClose() ${testDescription}`);
if (closedby != "none") {
promise_test(async (t) => {
- const signal = await setup(t,closedby);
+ const signal = setup(t,closedby);
let shouldPreventDefault = true;
dialog.addEventListener('cancel',(e) => {
if (shouldPreventDefault) {
@@ -124,7 +129,7 @@ async function setup(t,closedby) {
},`requestClose can be cancelled ${testDescription}`);
promise_test(async (t) => {
- const signal = await setup(t,closedby);
+ const signal = setup(t,closedby);
dialog.addEventListener('cancel',(e) => e.preventDefault(),{signal});
openDialog(openMethod);
// No user activation here.
@@ -136,7 +141,7 @@ async function setup(t,closedby) {
},`requestClose avoids abuse prevention logic ${testDescription}`);
promise_test(async (t) => {
- await setup(t,closedby);
+ setup(t,closedby);
openDialog(openMethod);
assert_equals(dialog.returnValue,'','Return value starts out empty');
const returnValue = 'The return value';
@@ -153,7 +158,7 @@ async function setup(t,closedby) {
},`requestClose(returnValue) passes along the return value ${testDescription}`);
promise_test(async (t) => {
- await setup(t,closedby);
+ setup(t,closedby);
dialog.addEventListener('cancel',(e) => e.preventDefault(),{once:true});
openDialog(openMethod);
dialog.returnValue = 'foo';
@@ -168,23 +173,27 @@ async function setup(t,closedby) {
});
promise_test(async (t) => {
- await setup(t);
+ setup(t);
dialog.open = true;
dialog.requestClose();
assert_false(dialog.open);
},`requestClose basic behavior when dialog is open via attribute`);
promise_test(async (t) => {
- const signal = await setup(t);
+ const signal = setup(t);
let events = [];
+ const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers();
dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
- dialog.addEventListener('close',() => events.push('close'),{signal});
+ dialog.addEventListener('close',() => {
+ events.push('close')
+ hasClosed();
+ },{signal});
dialog.open = true;
assert_array_equals(events,[]);
dialog.requestClose();
assert_false(dialog.open);
assert_array_equals(events,['cancel'],'close is scheduled');
- await waitForRender();
+ await untilFullyClosed;
assert_array_equals(events,['cancel','close']);
},`requestClose fires cancel and close when dialog is open via attribute`);
diff --git a/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html
new file mode 100644
index 00000000000..b2366285a41
--- /dev/null
+++ b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>Serializing CDATA in an HTML document</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(t => {
+ const doc = new DOMParser().parseFromString('<svg xmlns="http://www.w3.org/2000/svg"><![CDATA[<img>]]></svg>', 'application/xml');
+ const el = document.adoptNode(doc.documentElement);
+ assert_equals(el.outerHTML, '<svg xmlns="http://www.w3.org/2000/svg">&lt;img&gt;</svg>');
+});
+</script>
diff --git a/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml
new file mode 100644
index 00000000000..a1af3e21a48
--- /dev/null
+++ b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: pdf-viewer
+ files:
+ - plugins-and-mimetypes.html
diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini
new file mode 100644
index 00000000000..7de34991442
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini
@@ -0,0 +1,3 @@
+[set_geolocation_override.https.html]
+ expected:
+ if product != "chrome": ERROR
diff --git a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
new file mode 100644
index 00000000000..5cbcf546423
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>TestDriver bidi.emulation.set_geolocation_override method</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js?feature=bidi"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<script>
+ promise_setup(async () => {
+ // Ensure permission is granted before proceeding.
+ await test_driver.bidi.permissions.set_permission({
+ descriptor: {name: "geolocation"},
+ state: "granted",
+ });
+
+ // Ensure any previously set geolocation emulations are cleared.
+ await test_driver.bidi.emulation.set_geolocation_override(
+ {coordinates: null});
+ });
+
+ /** Get the current geolocation or error */
+ function get_current_geolocation() {
+ return new Promise(
+ resolve => window.navigator.geolocation.getCurrentPosition(
+ position => resolve(position.coords.toJSON()),
+ error => resolve({code: error.code, message: error.message}),
+ // Fail fast if geolocation is not available.
+ {timeout: 500}
+ ))
+ }
+
+ /** Asserts that relevant coordinate properties match */
+ function assert_coordinates_match(actual, expected) {
+ for (const key in expected) {
+ assert_equals(actual[key], expected[key],
+ `"${key}" should match the expected value ${expected[key]}`);
+ }
+ }
+
+ const SOME_COORDINATES = {
+ latitude: 52.51,
+ longitude: 13.39,
+ accuracy: 0.5,
+ altitude: 34,
+ altitudeAccuracy: 0.75,
+ heading: 180,
+ speed: 2.77
+ };
+
+ promise_test(async (t) => {
+ // Get the initial geolocation (might be error).
+ const initial_coords = await get_current_geolocation();
+
+ // Set the geolocation override
+ await test_driver.bidi.emulation.set_geolocation_override({
+ coordinates: SOME_COORDINATES
+ });
+
+ // Get the geolocation after setting the override.
+ const coords = await get_current_geolocation();
+ // Assert the coordinates match the override.
+ assert_coordinates_match(coords, SOME_COORDINATES);
+
+ // Clear the geolocation override.
+ await test_driver.bidi.emulation.set_geolocation_override(
+ {coordinates: null});
+ // Assert coordinates are set to the original value.
+ assert_coordinates_match(await get_current_geolocation(), initial_coords);
+ }, "emulate geolocation and clear override");
+</script>
diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl
index 215f375432e..5ce2d260f11 100644
--- a/tests/wpt/tests/interfaces/fedcm.idl
+++ b/tests/wpt/tests/interfaces/fedcm.idl
@@ -84,8 +84,10 @@ dictionary IdentityProviderAPIConfig {
dictionary IdentityProviderAccount {
required USVString id;
- required USVString name;
- required USVString email;
+ USVString name;
+ USVString email;
+ USVString tel;
+ USVString username;
USVString given_name;
USVString picture;
sequence<USVString> approved_clients;
diff --git a/tests/wpt/tests/interfaces/image-capture.idl b/tests/wpt/tests/interfaces/image-capture.idl
index 21e03d4db82..26cc7fab5cd 100644
--- a/tests/wpt/tests/interfaces/image-capture.idl
+++ b/tests/wpt/tests/interfaces/image-capture.idl
@@ -3,7 +3,7 @@
// (https://github.com/w3c/webref)
// Source: MediaStream Image Capture (https://w3c.github.io/mediacapture-image/)
-[Exposed=Window]
+[Exposed=Window, SecureContext]
interface ImageCapture {
constructor(MediaStreamTrack videoTrack);
Promise<Blob> takePhoto(optional PhotoSettings photoSettings = {});
diff --git a/tests/wpt/tests/interfaces/mediastream-recording.idl b/tests/wpt/tests/interfaces/mediastream-recording.idl
index 496bfcf2e27..68c891cdc91 100644
--- a/tests/wpt/tests/interfaces/mediastream-recording.idl
+++ b/tests/wpt/tests/interfaces/mediastream-recording.idl
@@ -56,7 +56,7 @@ interface BlobEvent : Event {
readonly attribute DOMHighResTimeStamp timecode;
};
-dictionary BlobEventInit {
+dictionary BlobEventInit : EventInit {
required Blob data;
DOMHighResTimeStamp timecode;
};
diff --git a/tests/wpt/tests/interfaces/turtledove.idl b/tests/wpt/tests/interfaces/turtledove.idl
index b9f50d47885..7f11cdc3790 100644
--- a/tests/wpt/tests/interfaces/turtledove.idl
+++ b/tests/wpt/tests/interfaces/turtledove.idl
@@ -206,6 +206,7 @@ partial interface Navigator {
[Exposed=InterestGroupScriptRunnerGlobalScope]
interface InterestGroupScriptRunnerGlobalScope {
readonly attribute PrivateAggregation? privateAggregation;
+ readonly attribute ProtectedAudienceUtilities protectedAudience;
};
dictionary PASignalValue {
@@ -220,6 +221,12 @@ dictionary PAExtendedHistogramContribution {
bigint filteringId = 0;
};
+[Exposed=InterestGroupScriptRunnerGlobalScope]
+interface ProtectedAudienceUtilities {
+ Uint8Array encodeUtf8(USVString input);
+ USVString decodeUtf8(Uint8Array bytes);
+};
+
[Exposed=InterestGroupBiddingAndScoringScriptRunnerGlobalScope]
interface ForDebuggingOnly {
undefined reportAdAuctionWin(USVString url);
diff --git a/tests/wpt/tests/interfaces/webcodecs.idl b/tests/wpt/tests/interfaces/webcodecs.idl
index 274ef96578a..3d4db1ed49d 100644
--- a/tests/wpt/tests/interfaces/webcodecs.idl
+++ b/tests/wpt/tests/interfaces/webcodecs.idl
@@ -141,7 +141,7 @@ dictionary AudioDecoderConfig {
required DOMString codec;
[EnforceRange] required unsigned long sampleRate;
[EnforceRange] required unsigned long numberOfChannels;
- BufferSource description;
+ AllowSharedBufferSource description;
};
dictionary VideoDecoderConfig {
diff --git a/tests/wpt/tests/interfaces/WebCryptoAPI.idl b/tests/wpt/tests/interfaces/webcrypto.idl
index ff7a89cd0d5..ff7a89cd0d5 100644
--- a/tests/wpt/tests/interfaces/WebCryptoAPI.idl
+++ b/tests/wpt/tests/interfaces/webcrypto.idl
diff --git a/tests/wpt/tests/interfaces/webgpu.idl b/tests/wpt/tests/interfaces/webgpu.idl
index de1f7c1e52b..4fec46a2557 100644
--- a/tests/wpt/tests/interfaces/webgpu.idl
+++ b/tests/wpt/tests/interfaces/webgpu.idl
@@ -109,6 +109,7 @@ dictionary GPUDeviceDescriptor
};
enum GPUFeatureName {
+ "core-features-and-limits",
"depth-clip-control",
"depth32float-stencil8",
"texture-compression-bc",
diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl
index 57f2a4a9890..37fcc32501e 100644
--- a/tests/wpt/tests/interfaces/webnn.idl
+++ b/tests/wpt/tests/interfaces/webnn.idl
@@ -36,6 +36,8 @@ interface MLContext {
undefined dispatch(MLGraph graph, MLNamedTensors inputs, MLNamedTensors outputs);
Promise<MLTensor> createTensor(MLTensorDescriptor descriptor);
+ Promise<MLTensor> createConstantTensor(
+ MLOperandDescriptor descriptor, AllowSharedBufferSource inputData);
Promise<ArrayBuffer> readTensor(MLTensor tensor);
Promise<undefined> readTensor(MLTensor tensor, AllowSharedBufferSource outputData);
@@ -133,6 +135,7 @@ interface MLTensor {
readonly attribute FrozenArray<unsigned long> shape;
readonly attribute boolean readable;
readonly attribute boolean writable;
+ readonly attribute boolean constant;
undefined destroy();
};
@@ -154,6 +157,9 @@ interface MLGraphBuilder {
// Create a scalar operand from the specified number of the specified type.
MLOperand constant(MLOperandDataType type, MLNumber value);
+ // Create an operand from a specified constant tensor.
+ MLOperand constant(MLTensor tensor);
+
// Compile the graph up to the specified output operands asynchronously.
Promise<MLGraph> build(MLNamedOperands outputs);
};
diff --git a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl
index 9befd640646..7ddbec7cc97 100644
--- a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl
+++ b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl
@@ -34,6 +34,10 @@ partial interface XRSession {
readonly attribute XRDepthUsage depthUsage;
readonly attribute XRDepthDataFormat depthDataFormat;
readonly attribute XRDepthType? depthType;
+ readonly attribute boolean? depthActive;
+
+ undefined pauseDepthSensing();
+ undefined resumeDepthSensing();
};
[SecureContext, Exposed=Window]
@@ -43,9 +47,10 @@ interface XRDepthInformation {
[SameObject] readonly attribute XRRigidTransform normDepthBufferFromNormView;
readonly attribute float rawValueToMeters;
- readonly attribute XRView? view;
};
+XRDepthInformation includes XRViewGeometry;
+
[Exposed=Window]
interface XRCPUDepthInformation : XRDepthInformation {
[SameObject] readonly attribute ArrayBuffer data;
diff --git a/tests/wpt/tests/interfaces/webxr.idl b/tests/wpt/tests/interfaces/webxr.idl
index 1098000d6c2..874994086a2 100644
--- a/tests/wpt/tests/interfaces/webxr.idl
+++ b/tests/wpt/tests/interfaces/webxr.idl
@@ -118,6 +118,11 @@ interface XRBoundedReferenceSpace : XRReferenceSpace {
readonly attribute FrozenArray<DOMPointReadOnly> boundsGeometry;
};
+[SecureContext, Exposed=Window] interface mixin XRViewGeometry {
+ readonly attribute Float32Array projectionMatrix;
+ [SameObject] readonly attribute XRRigidTransform transform;
+};
+
enum XREye {
"none",
"left",
@@ -126,13 +131,13 @@ enum XREye {
[SecureContext, Exposed=Window] interface XRView {
readonly attribute XREye eye;
- readonly attribute Float32Array projectionMatrix;
- [SameObject] readonly attribute XRRigidTransform transform;
readonly attribute double? recommendedViewportScale;
undefined requestViewportScale(double? scale);
};
+XRView includes XRViewGeometry;
+
[SecureContext, Exposed=Window] interface XRViewport {
readonly attribute long x;
readonly attribute long y;
diff --git a/tests/wpt/tests/interfaces/writing-assistance-apis.idl b/tests/wpt/tests/interfaces/writing-assistance-apis.idl
new file mode 100644
index 00000000000..916daee754e
--- /dev/null
+++ b/tests/wpt/tests/interfaces/writing-assistance-apis.idl
@@ -0,0 +1,193 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Writing Assistance APIs (https://webmachinelearning.github.io/writing-assistance-apis/)
+
+[Exposed=Window, SecureContext]
+interface Summarizer {
+ static Promise<Summarizer> create(optional SummarizerCreateOptions options = {});
+ static Promise<Availability> availability(optional SummarizerCreateCoreOptions options = {});
+
+ Promise<DOMString> summarize(
+ DOMString input,
+ optional SummarizerSummarizeOptions options = {}
+ );
+ ReadableStream summarizeStreaming(
+ DOMString input,
+ optional SummarizerSummarizeOptions options = {}
+ );
+
+ readonly attribute DOMString sharedContext;
+ readonly attribute SummarizerType type;
+ readonly attribute SummarizerFormat format;
+ readonly attribute SummarizerLength length;
+
+ readonly attribute FrozenArray<DOMString>? expectedInputLanguages;
+ readonly attribute FrozenArray<DOMString>? expectedContextLanguages;
+ readonly attribute DOMString? outputLanguage;
+
+ Promise<double> measureInputUsage(
+ DOMString input,
+ optional SummarizerSummarizeOptions options = {}
+ );
+ readonly attribute unrestricted double inputQuota;
+};
+Summarizer includes DestroyableModel;
+
+dictionary SummarizerCreateCoreOptions {
+ SummarizerType type = "key-points";
+ SummarizerFormat format = "markdown";
+ SummarizerLength length = "short";
+
+ sequence<DOMString> expectedInputLanguages;
+ sequence<DOMString> expectedContextLanguages;
+ DOMString outputLanguage;
+};
+
+dictionary SummarizerCreateOptions : SummarizerCreateCoreOptions {
+ AbortSignal signal;
+ CreateMonitorCallback monitor;
+
+ DOMString sharedContext;
+};
+
+dictionary SummarizerSummarizeOptions {
+ AbortSignal signal;
+ DOMString context;
+};
+
+enum SummarizerType { "tl;dr", "teaser", "key-points", "headline" };
+enum SummarizerFormat { "plain-text", "markdown" };
+enum SummarizerLength { "short", "medium", "long" };
+
+[Exposed=Window, SecureContext]
+interface Writer {
+ static Promise<Writer> create(optional WriterCreateOptions options = {});
+ static Promise<Availability> availability(optional WriterCreateCoreOptions options = {});
+
+ Promise<DOMString> write(
+ DOMString input,
+ optional WriterWriteOptions options = {}
+ );
+ ReadableStream writeStreaming(
+ DOMString input,
+ optional WriterWriteOptions options = {}
+ );
+
+ readonly attribute DOMString sharedContext;
+ readonly attribute WriterTone tone;
+ readonly attribute WriterFormat format;
+ readonly attribute WriterLength length;
+
+ readonly attribute FrozenArray<DOMString>? expectedInputLanguages;
+ readonly attribute FrozenArray<DOMString>? expectedContextLanguages;
+ readonly attribute DOMString? outputLanguage;
+
+ Promise<double> measureInputUsage(
+ DOMString input,
+ optional WriterWriteOptions options = {}
+ );
+ readonly attribute unrestricted double inputQuota;
+};
+Writer includes DestroyableModel;
+
+dictionary WriterCreateCoreOptions {
+ WriterTone tone = "neutral";
+ WriterFormat format = "markdown";
+ WriterLength length = "short";
+
+ sequence<DOMString> expectedInputLanguages;
+ sequence<DOMString> expectedContextLanguages;
+ DOMString outputLanguage;
+};
+
+dictionary WriterCreateOptions : WriterCreateCoreOptions {
+ AbortSignal signal;
+ CreateMonitorCallback monitor;
+
+ DOMString sharedContext;
+};
+
+dictionary WriterWriteOptions {
+ DOMString context;
+ AbortSignal signal;
+};
+
+enum WriterTone { "formal", "neutral", "casual" };
+enum WriterFormat { "plain-text", "markdown" };
+enum WriterLength { "short", "medium", "long" };
+
+[Exposed=Window, SecureContext]
+interface Rewriter {
+ static Promise<Rewriter> create(optional RewriterCreateOptions options = {});
+ static Promise<Availability> availability(optional RewriterCreateCoreOptions options = {});
+
+ Promise<DOMString> rewrite(
+ DOMString input,
+ optional RewriterRewriteOptions options = {}
+ );
+ ReadableStream rewriteStreaming(
+ DOMString input,
+ optional RewriterRewriteOptions options = {}
+ );
+
+ readonly attribute DOMString sharedContext;
+ readonly attribute RewriterTone tone;
+ readonly attribute RewriterFormat format;
+ readonly attribute RewriterLength length;
+
+ readonly attribute FrozenArray<DOMString>? expectedInputLanguages;
+ readonly attribute FrozenArray<DOMString>? expectedContextLanguages;
+ readonly attribute DOMString? outputLanguage;
+
+ Promise<double> measureInputUsage(
+ DOMString input,
+ optional RewriterRewriteOptions options = {}
+ );
+ readonly attribute unrestricted double inputQuota;
+};
+Rewriter includes DestroyableModel;
+
+dictionary RewriterCreateCoreOptions {
+ RewriterTone tone = "as-is";
+ RewriterFormat format = "as-is";
+ RewriterLength length = "as-is";
+
+ sequence<DOMString> expectedInputLanguages;
+ sequence<DOMString> expectedContextLanguages;
+ DOMString outputLanguage;
+};
+
+dictionary RewriterCreateOptions : RewriterCreateCoreOptions {
+ AbortSignal signal;
+ CreateMonitorCallback monitor;
+
+ DOMString sharedContext;
+};
+
+dictionary RewriterRewriteOptions {
+ DOMString context;
+ AbortSignal signal;
+};
+
+enum RewriterTone { "as-is", "more-formal", "more-casual" };
+enum RewriterFormat { "as-is", "plain-text", "markdown" };
+enum RewriterLength { "as-is", "shorter", "longer" };
+
+[Exposed=Window, SecureContext]
+interface CreateMonitor : EventTarget {
+ attribute EventHandler ondownloadprogress;
+};
+
+callback CreateMonitorCallback = undefined (CreateMonitor monitor);
+
+enum Availability {
+ "unavailable",
+ "downloadable",
+ "downloading",
+ "available"
+};
+
+interface mixin DestroyableModel {
+ undefined destroy();
+};
diff --git a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
index 714355f5c1c..467cf5d50c7 100644
--- a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
+++ b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
@@ -9,8 +9,8 @@
<script src=permission-helper.js></script>
</head>
<body>
- <iframe allow="camera 'src';microphone 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe>
-<iframe allow="camera 'src';microphone 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe>
+ <iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe>
+<iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe>
<script>
let deviceList;
diff --git a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html
index 856f2ce37ce..1af16659326 100644
--- a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html
+++ b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html
@@ -1,85 +1,62 @@
<!doctype html>
-<html>
-<head>
-<title>The pointerout event should not be fired if the pointer doesn't move</title>
+<title>
+ Layout change under a stationary pointer fires boundary events and no pointermove event
+</title>
<meta name="viewport" content="width=device-width">
-<link rel="help" href="https://github.com/w3c/pointerevents/issues/457">
+<link rel="help"
+ href="https://w3c.github.io/pointerevents/#boundary-events-caused-by-layout-changes">
<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="pointerevent_support.js"></script>
<style>
-#target{
- width:100px;
- height:100px;
- background-color:red;
-}
-
-#overlay{
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- background-color: rgba(0,0,0,0.2);
- z-index: 1000;
- text-align: center;
- display:none;
-}
+ div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 50px;
+ height: 50px;
+ }
+
+ #overlay {
+ z-index: 1000;
+ display: none;
+ }
</style>
-</head>
-<body>
-<h1>The pointerout event should not be fired if the pointer doesn't move</h1>
-<h4>
- Test Description: This test checks if the pointerout event dispatched unexpectedly.
- <ol>
- <li>Click on the black rectangle.
- <li>Don't move mouse after clicking.
- </ol>
-</h4>
-<p>
<div id="target"></div>
<div id="overlay"></div>
-<div id="log"></div>
<script>
-function waitForAnimationFrame() {
- return new Promise(resolve => {
- requestAnimationFrame(() => {
- requestAnimationFrame(resolve);
- });
- });
-}
+ "use strict";
-promise_test(async () => {
const target = document.getElementById("target");
+ const overlay = document.getElementById("overlay");
- let out_event_count = 0;
- target.addEventListener("pointerout", function() {
- out_event_count++;
- });
+ let logging_active = false;
+ let num_pointermoves = 0;
- // Wait for the click event on target element and update display style on
- // overlay element.
- const promise = new Promise(resolve => {
- target.addEventListener("click", async function() {
- const overlay = document.getElementById("overlay");
- overlay.style.display= 'block';
- await waitForAnimationFrame();
+ target.addEventListener("click", () => logging_active = true);
+ target.addEventListener("pointermove", () => {
+ if (logging_active) num_pointermoves++;
+ });
- overlay.style.display= 'none'
- await waitForAnimationFrame();
+ promise_test(async t => {
+ await test_driver.click(target);
- resolve();
- }, { once: true });
- });
+ let pointerout_promise = getEvent("pointerout", target);
+ overlay.style.display = "block";
+ await pointerout_promise;
- // Click target.
- test_driver.click(target);
- await promise;
+ let pointerover_promise = getEvent("pointerover", target);
+ overlay.style.display = "none";
+ await waitForAnimationFrames(2);
+ // Why does Chrome time out at the next line w/o the redundant wait above?
+ // Does chrome require something to request a main frame in order to detect
+ // the new pointer target after the style update to generate the event?
+ // https://crbug.com/413595088
+ await pointerover_promise;
- assert_equals(out_event_count, 0, "The pointerout event should not be fired");
-}, "The pointerout event should not be fired if the pointer doesn't move");
+ assert_equals(num_pointermoves, 0, "no pointermove events are expected");
+ }, "Layout change under a stationary pointer fires boundary events and no pointermove event");
</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/resources/chromium/webxr-test.js b/tests/wpt/tests/resources/chromium/webxr-test.js
index 0885b559e63..ce2503b1bbc 100644
--- a/tests/wpt/tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/tests/resources/chromium/webxr-test.js
@@ -757,30 +757,34 @@ class MockRuntime {
const viewport_size = 20;
return [{
eye: vrMojom.XREye.kLeft,
- fieldOfView: {
- upDegrees: 48.316,
- downDegrees: 50.099,
- leftDegrees: 50.899,
- rightDegrees: 35.197
+ geometry: {
+ fieldOfView: {
+ upDegrees: 48.316,
+ downDegrees: 50.099,
+ leftDegrees: 50.899,
+ rightDegrees: 35.197
+ },
+ mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
+ position: [-0.032, 0, 0],
+ orientation: [0, 0, 0, 1]
+ }))
},
- mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
- position: [-0.032, 0, 0],
- orientation: [0, 0, 0, 1]
- })),
viewport: { x: 0, y: 0, width: viewport_size, height: viewport_size }
},
{
eye: vrMojom.XREye.kRight,
- fieldOfView: {
- upDegrees: 48.316,
- downDegrees: 50.099,
- leftDegrees: 50.899,
- rightDegrees: 35.197
+ geometry: {
+ fieldOfView: {
+ upDegrees: 48.316,
+ downDegrees: 50.099,
+ leftDegrees: 50.899,
+ rightDegrees: 35.197
+ },
+ mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
+ position: [0.032, 0, 0],
+ orientation: [0, 0, 0, 1]
+ }))
},
- mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
- position: [0.032, 0, 0],
- orientation: [0, 0, 0, 1]
- })),
viewport: { x: viewport_size, y: 0, width: viewport_size, height: viewport_size }
}];
}
@@ -835,13 +839,15 @@ class MockRuntime {
return {
eye: viewEye,
- fieldOfView: fov,
- mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset)),
+ geometry: {
+ fieldOfView: fov,
+ mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset))
+ },
viewport: {
x: xOffset,
- y: 0,
- width: fakeXRViewInit.resolution.width,
- height: fakeXRViewInit.resolution.height
+ y: 0,
+ width: fakeXRViewInit.resolution.width,
+ height: fakeXRViewInit.resolution.height
},
isFirstPersonObserver: fakeXRViewInit.isFirstPersonObserver ? true : false,
viewOffset: composeGFXTransform(fakeXRViewInit.viewOffset)
@@ -915,12 +921,12 @@ class MockRuntime {
let frame_views = this.primaryViews_;
for (let i = 0; i < this.primaryViews_.length; i++) {
- this.primaryViews_[i].mojoFromView =
+ this.primaryViews_[i].geometry.mojoFromView =
this._getMojoFromViewerWithOffset(this.primaryViews_[i].viewOffset);
}
if (this.enabledFeatures_.includes(xrSessionMojom.XRSessionFeature.SECONDARY_VIEWS)) {
for (let i = 0; i < this.secondaryViews_.length; i++) {
- this.secondaryViews_[i].mojoFromView =
+ this.secondaryViews_[i].geometry.mojoFromView =
this._getMojoFromViewerWithOffset(this.secondaryViews_[i].viewOffset);
}
diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js
index f127e2b2c8d..6e8410b7ea4 100644
--- a/tests/wpt/tests/resources/testdriver.js
+++ b/tests/wpt/tests/resources/testdriver.js
@@ -254,12 +254,57 @@
}
},
/**
- * `log <https://w3c.github.io/webdriver-bidi/#module-log>`_ module.
+ * `emulation <https://www.w3.org/TR/webdriver-bidi/#module-emulation>`_ module.
+ */
+ emulation: {
+ /**
+ * Overrides the geolocation coordinates for the specified
+ * browsing contexts.
+ * Matches the `emulation.setGeolocationOverride
+ * <https://w3c.github.io/webdriver-bidi/#command-emulation-setGeolocationOverride>`_
+ * WebDriver BiDi command.
+ *
+ * @example
+ * await test_driver.bidi.emulation.set_geolocation_override({
+ * coordinates: {
+ * latitude: 52.51,
+ * longitude: 13.39,
+ * accuracy: 0.5,
+ * altitude: 34,
+ * altitudeAccuracy: 0.75,
+ * heading: 180,
+ * speed: 2.77
+ * }
+ * });
+ *
+ * @param {object} params - Parameters for the command.
+ * @param {null|object} params.coordinates - The optional
+ * geolocation coordinates to set. Matches the
+ * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#type-emulation-GeolocationCoordinates>`_
+ * value. If null or omitted, the emulation will be removed.
+ * @param {null|Array.<(Context)>} [params.contexts] The
+ * optional contexts parameter specifies which browsing contexts
+ * to set the geolocation override on. It should be either an
+ * array of Context objects (window or browsing context id), or
+ * null. If null or omitted, the override will be set on the
+ * current browsing context.
+ * @returns {Promise<void>} Resolves when the geolocation
+ * override is successfully set.
+ */
+ set_geolocation_override: function (params) {
+ // Ensure the bidi feature is enabled before calling the internal method
+ assertBidiIsEnabled();
+ return window.test_driver_internal.bidi.emulation.set_geolocation_override(
+ params);
+ },
+ },
+ /**
+ * `log <https://www.w3.org/TR/webdriver-bidi/#module-log>`_ module.
*/
log: {
entry_added: {
/**
- * @typedef {object} LogEntryAdded `log.entryAdded <https://w3c.github.io/webdriver-bidi/#event-log-entryAdded>`_ event.
+ * @typedef {object} LogEntryAdded `log.entryAdded <https://www.w3.org/TR/webdriver-bidi/#event-log-entryAdded>`_ event.
*/
/**
@@ -1576,6 +1621,12 @@
}
}
},
+ emulation: {
+ set_geolocation_override: function (params) {
+ throw new Error(
+ "bidi.emulation.set_geolocation_override is not implemented by testdriver-vendor.js");
+ }
+ },
log: {
entry_added: {
async subscribe() {
diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html
index f741cc634d7..323d984c989 100644
--- a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html
+++ b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html
@@ -21,7 +21,7 @@
}
#scroller {
- overflow: auto;
+ overflow: hidden;
height: 100px;
width: 100px;
will-change: transform; /* force compositing */
diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html
index ed8e8337a65..28973d2d185 100644
--- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html
+++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html
@@ -22,7 +22,7 @@
}
#scroller {
- overflow: auto;
+ overflow: hidden;
height: 100px;
width: 100px;
will-change: transform; /* force compositing */
diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html
index de50599fbaf..45ba3f99ccd 100644
--- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html
+++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html
@@ -22,7 +22,7 @@ drive two animations">
}
#scroller {
- overflow: auto;
+ overflow: hidden;
height: 100px;
width: 100px;
will-change: transform; /* force compositing */
diff --git a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html
index d75f30e664e..cdd2e0be40c 100644
--- a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html
+++ b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html
@@ -87,7 +87,7 @@
parseFloat(getComputedStyle(fieldset).borderBottom);
// Validate the start and end offsets for each view timeline.
- anims.forEach(async (anim) => {
+ for (let anim of anims) {
assert_equals(anim.timeline.source.id, 'fieldset');
assert_equals(anim.timeline.subject.tagName, 'INPUT');
const bounds = anim.effect.target.getBoundingClientRect();
@@ -96,13 +96,13 @@
const expectedEndOffset = bounds.bottom - fieldsetContentTop;
assert_approx_equals(
parseFloat(anim.timeline.startOffset),
- expectedStartOffset, 0.1,
+ expectedStartOffset, 0.5,
`Unexpected start offset for ${anim.effect.target.id}`);
assert_approx_equals(
parseFloat(anim.timeline.endOffset),
- expectedEndOffset, 0.1,
+ expectedEndOffset, 0.5,
`Unexpected end offset for ${anim.effect.target.id}`);
- });
+ };
}, 'Fieldset is a valid source for a view timeline');
}
diff --git a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
index a4a5f372838..5ab144b05ed 100644
--- a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
+++ b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
@@ -9,6 +9,13 @@
</head>
<body>
+ <div>
+ <template shadowrootmode="open">
+ <!-- This button shouldn't link to the real form in fancy-form-1 as it's in a different tree scope -->
+ <button id="button-in-shadow" form="fancy-form-1"></button>
+ </template>
+ </div>
+
<button id="reset-button-1" type="reset" form="fancy-form-1"></button>
<fancy-form-1 id="fancy-form-1">
<template shadowrootmode="open" shadowrootreferencetarget="real-form">
@@ -44,6 +51,9 @@
input.value = "new value";
const resetButton = document.getElementById(resetButtonId);
+ assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements.");
+ assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
assert_equals(input.value, "new value", "The input value should be updated to the new value.");
resetButton.click();
assert_equals(input.value, "default value", "The input value should be reset to the default value.");
@@ -56,5 +66,107 @@
document.getElementById('reset-button-3').setAttribute('form', "fancy-form-3");
testFormWithReferenceTarget('fancy-form-3', 'reset-button-3', "Reference target works with setAttribute('form')");
</script>
+
+ <form-associated-custom-button id="custom-button" form="fancy-form-4"></form-associated-custom-button>
+ <fancy-form-4 id="fancy-form-4">
+ <template shadowrootmode="open" shadowrootreferencetarget="real-form">
+ <form id="real-form">
+ <input type="text" value="default value">
+ <!-- The internal button of the custom button below shouldn't be associated with real-form -->
+ <form-associated-custom-button id="custom-button-in-shadow"></form-associated-custom-button>
+ </form>
+ </template>
+ </fancy-form-4>
+ <script>
+ class FormAssociatedCustomButton extends HTMLElement {
+ static formAssociated = true;
+ constructor() {
+ super();
+ this.internals_ = this.attachInternals();
+ const shadow = this.attachShadow({ mode: 'open' });
+ shadow.innerHTML = `<button>fancy button</button>`;
+ }
+ }
+ window.customElements.define("form-associated-custom-button", FormAssociatedCustomButton);
+ test(function () {
+ const customElement = document.getElementById("custom-button");
+ const fancyForm = document.getElementById("fancy-form-4");
+ const realForm = fancyForm.shadowRoot.getElementById("real-form");
+ const customElementInShadow = fancyForm.shadowRoot.getElementById("custom-button-in-shadow");
+ const input = realForm.firstElementChild;
+
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
+ assert_equals(realForm.elements[2], customElementInShadow, "The 3rd element should be the custom element inside the real form.");
+
+ // Swap the input and the custom element in real-form.
+ realForm.moveBefore(customElementInShadow, input);
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element.");
+ assert_equals(realForm.elements[1], customElementInShadow, "The 2nd element should be the custom element inside the real form.");
+ assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form.");
+
+ // Swap the referencing element and the fancy form
+ customElement.parentNode.moveBefore(fancyForm, customElement);
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ assert_equals(realForm.elements[0], customElementInShadow, "The first element should be the custom element inside the real form.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
+ assert_equals(realForm.elements[2], customElement, "The 3rd element should be the form-associated custom element.");
+ }, "Reference target works with form-associated custom element.");
+ </script>
+
+ <button id="reset-button-5" type="reset" form="fancy-form-5"></button>
+ <fancy-form-5 id="fancy-form-5">
+ <template shadowrootmode="open" shadowrootreferencetarget="nested-element">
+ <nested-element id="nested-element">
+ <template shadowrootmode="open" shadowrootreferencetarget="real-form">
+ <form id="real-form">
+ <input type="text" value="default value">
+ </form>
+ </template>
+ </nested-element>
+ <button id="button-in-shadow" form="nested-element"></button>
+ <div>
+ <template shadowrootmode="open">
+ <!-- This button shouldn't link to the real form in nested-element as it's in a different tree scope -->
+ <button id="button-in-different-shadow" form="nested-element"></button>
+ </template>
+ </div>
+ </template>
+ </fancy-form-5>
+ <script>
+ test(function () {
+ const fancyForm = document.getElementById("fancy-form-5");
+ const nestedElement = fancyForm.shadowRoot.getElementById("nested-element");
+ const buttonInShadow = fancyForm.shadowRoot.getElementById("button-in-shadow");
+ const realForm = nestedElement.shadowRoot.getElementById("real-form");
+ const input = realForm.firstElementChild;
+
+ input.value = "new value";
+ const resetButton = document.getElementById("reset-button-5");
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ // The elements in .elements property should be in tree order (preorder, depth-first).
+ assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
+ assert_equals(realForm.elements[2], buttonInShadow, "The 3rd element should be the button in the shadow dom.");
+ assert_equals(input.value, "new value", "The input value should be updated to the new value.");
+ resetButton.click();
+ assert_equals(input.value, "default value", "The input value should be reset to the default value.");
+
+ // Remove the button that's using reference target in the 1st level shadow.
+ buttonInShadow.remove();
+ assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements after removing the button.");
+
+ // Add a new button using reference target in the 1st level shadow.
+ const newButtonInShadow = document.createElement("button");
+ newButtonInShadow.setAttribute("form", "nested-element");
+ nestedElement.parentNode.insertBefore(newButtonInShadow, nestedElement);
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements after a new button is inserted.");
+ assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element.");
+ assert_equals(realForm.elements[1], newButtonInShadow, "The 2nd element should be the button in the shadow dom.");
+ assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form.");
+ }, "Reference target works with nested shadow trees.");
+ </script>
</body>
</html>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html
deleted file mode 100644
index c5796e48b76..00000000000
--- a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../resources/utils.js"></script>
-<script src="resources/utils.sub.js"></script>
-<script>
- setup(() => assertSpeculationRulesIsSupported());
-
- promise_test(async t => {
- let agent = await spawnWindow(t, { protocol: 'https' });
- let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
- await agent.forceSinglePrefetch(nextUrl);
-
- // Open new window with url to clear cache data through Clear-Site-Data header.
- // Ensure that the cache is cleared before the navigation.
- const gotMessage = new Promise(resolve => {
- window.addEventListener('message', e => {
- resolve(e.data);
- }, {
- once: true
- });
- });
- let cache_helper = "cache_helper=" + token() + "&";
- window.open("../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); await gotMessage;
- await gotMessage;
-
- await agent.navigate(nextUrl);
- // Because Clear-Site-Data response header is sent, prefetches are expected
- // to be evicted.
- // The navigation to nextURL is not expected to use the prefetch cache.
- assert_not_prefetched(await agent.getRequestHeaders());
- }, "clear-site-data cache headers should prevent it from being fetched");
-</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html
new file mode 100644
index 00000000000..48f6264e852
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<!--
+This file is marked as "tentative" until:
+* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and
+ https://github.com/WICG/nav-speculation/issues/357 is added to the specification.
+-->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script>
+ setup(() => assertSpeculationRulesIsSupported());
+
+ // Test that Clear-Site-Data header value "prefetchCache" clears prefetch cache
+ promise_test(async t => {
+ let agent = await spawnWindow(t, { protocol: 'https' });
+ let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
+ await agent.forceSinglePrefetch(nextUrl);
+
+ // Open new window with url to clear cache data through Clear-Site-Data header.
+ // Ensure that the cache is cleared before the navigation.
+ const gotMessage = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+ window.open("/../../clear-site-data/support/clear-site-data-prefetchCache.py");
+ await gotMessage;
+
+ await agent.navigate(nextUrl);
+ // Because Clear-Site-Data response header is sent, prefetches are expected
+ // to be evicted.
+ // The navigation to nextURL is not expected to use the prefetch cache.
+ assert_not_prefetched(await agent.getRequestHeaders());
+ }, "clear-site-data prefetchCache headers should prevent it from being fetched");
+
+ // Test that Clear-Site-Data header value "cache" clears prefetch cache
+ promise_test(async t => {
+ let agent = await spawnWindow(t, { protocol: 'https' });
+ let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
+ await agent.forceSinglePrefetch(nextUrl);
+
+ // Open new window with url to clear cache data through Clear-Site-Data header.
+ // Ensure that the cache is cleared before the navigation.
+ const gotMessage = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+ let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
+ window.open("/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
+ await gotMessage;
+
+ await agent.navigate(nextUrl);
+ // Because Clear-Site-Data response header is sent, prefetches are expected
+ // to be evicted.
+ // The navigation to nextURL is not expected to use the prefetch cache.
+ assert_not_prefetched(await agent.getRequestHeaders());
+ }, "clear-site-data cache headers should prevent it from being fetched");
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html
index 34b77f8bc47..db52e758750 100644
--- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html
+++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html
@@ -1,4 +1,9 @@
<!DOCTYPE html>
+<!--
+This file is marked as "tentative" until:
+* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and
+ https://github.com/WICG/nav-speculation/issues/357 is added to the specification.
+-->
<title>clear-site-data-cache cancels prerenders</title>
<meta name="timeout" content="long">
<body>
@@ -40,8 +45,7 @@ promise_test(async t => {
once: true
});
});
- let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
- window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
+ window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py");
await gotMessage;
// Because Clear-Site-Data response header is sent on a different origin than
diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html
index cb253d45eaa..23d862c5130 100644
--- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html
+++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html
@@ -1,4 +1,9 @@
<!DOCTYPE html>
+<!--
+This file is marked as "tentative" until:
+* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and
+ https://github.com/WICG/nav-speculation/issues/357 is added to the specification.
+-->
<title>clear-site-data-cache cancels prerenders</title>
<meta name="timeout" content="long">
<body>
@@ -13,6 +18,41 @@
<script>
setup(() => assertSpeculationRulesIsSupported());
+// Test that Clear-Site-Data header value "prerenderCache" clears prerender cache
+promise_test(async t => {
+
+ const rcHelper = new RemoteContextHelper();
+ const referrerRC = await rcHelper.addWindow({
+ origin: 'HTTPS_ORIGIN'
+ }, {
+ features: 'noopener'
+ });
+ const prerenderedRC = await addPrerenderRC(referrerRC, {
+ origin: 'HTTPS_ORIGIN'
+ });
+
+ const sameOrigin = get_host_info().HTTPS_ORIGIN;
+
+ // Open new window with url to clear cache data through Clear-Site-Data header.
+ // Ensure that the cache is cleared before the navigation.
+ const gotMessage = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+ window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py");
+ await gotMessage;
+
+ // Because Clear-Site-Data response header is sent, the existing prerender
+ // is expected to be canceled.
+ // And the navigation is expected to create another page instead of activation.
+ referrerRC.navigateTo(prerenderedRC.url);
+ assert_equals(await getActivationStart(prerenderedRC), 0);
+}, "clear-site-data prerenderCache headers should prevent it from being activated");
+
+// Test that Clear-Site-Data header value "cache" clears prerender cache
promise_test(async t => {
const rcHelper = new RemoteContextHelper();
@@ -37,7 +77,7 @@ promise_test(async t => {
});
});
let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
- new_window = window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
+ window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
await gotMessage;
// Because Clear-Site-Data response header is sent, the existing prerender
@@ -45,7 +85,7 @@ promise_test(async t => {
// And the navigation is expected to create another page instead of activation.
referrerRC.navigateTo(prerenderedRC.url);
assert_equals(await getActivationStart(prerenderedRC), 0);
-});
+}, "clear-site-data cache headers should prevent it from being activated");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
index b2ba5cd4c27..cf10f7f2e83 100644
--- a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
+++ b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
@@ -4,12 +4,64 @@
// See https://crbug.com/335506658 for details.
promise_test(async () => {
- let closed = new ReadableStream({
- pull(controller) {
- controller.enqueue('is there anybody in there?');
- }
- }).getReader().closed;
- // 3 GCs are actually required to trigger the bug at time of writing.
- for (let i = 0; i < 5; ++i)
- await garbageCollect();
+ const closed = new ReadableStream({
+ pull(controller) {
+ controller.enqueue('is there anybody in there?');
+ }
+ }).getReader().closed;
+ // 3 GCs are actually required to trigger the bug at time of writing.
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
}, 'Garbage-collecting a stream along with its reader should not crash');
+
+
+// See https://crbug.com/390646657 for details.
+promise_test(async () => {
+ const written = new WritableStream({
+ write(chunk) {
+ return new Promise(resolve => {});
+ }
+ }).getWriter().write('just nod if you can hear me');
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer with a pending write should not crash');
+
+
+promise_test(async () => {
+ const closed = new WritableStream({
+ write(chunk) { }
+ }).getWriter().closed;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash with closed promise is retained');
+
+promise_test(async () => {
+ const ready = new WritableStream({
+ write(chunk) { }
+ }, {highWaterMark: 0}).getWriter().ready;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied');
+
+promise_test(async () => {
+ let reader = new ReadableStream({
+ pull() { }
+ }).getReader();
+ const promise = reader.read();
+ reader = null;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream with a pending read should not crash');
+
+promise_test(async () => {
+ let reader = new ReadableStream({
+ type: "bytes",
+ pull() { return new Promise(resolve => {}); }
+ }).getReader({mode: "byob"});
+ const promise = reader.read(new Uint8Array(42));
+ reader = null;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream with a pending BYOB read should not crash');
+
+
diff --git a/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html
new file mode 100644
index 00000000000..b083538a8b8
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Fetch Priority - SVG Image element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<svg>
+<image id=image1 fetchpriority="high"/>
+<image id=image2 fetchpriority="low"/>
+<image id=image3 fetchpriority="auto"/>
+<image id=image4 fetchpriority="xyz"/>
+<image id=image5 />
+</svg>
+
+<script>
+ test(() => {
+ assert_equals(image1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the image element");
+ assert_equals(image2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the image element");
+ assert_equals(image3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the image element");
+ assert_equals(image4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the image element");
+ assert_equals(image5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the image element");
+ }, "fetchpriority attribute on <image> elements should reflect valid IDL values");
+
+ test(() => {
+ const image = document.createElementNS("http://www.w3.org/2000/svg", "image");
+ assert_equals(image.fetchPriority, "auto");
+ }, "default fetchpriority attribute on <image> elements should be 'auto'");
+</script>
diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html
new file mode 100644
index 00000000000..25765c5b93e
--- /dev/null
+++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tabbing through Non-Rendered SVG elements</title>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus">
+<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>
+
+<svg xmlns="http://www.w3.org/2000/svg">
+ <text tabindex='1' id="start" x="10" y="10">start</text>
+ <g x="30" y="10" style="display: none;">
+ <text tabindex='2' id="middle" x="30" y="10">middle</text>
+ </g>
+ <text tabindex='3' id="end" x="50" y="10">end</text>
+</svg>
+
+<script>
+ promise_test(async t => {
+ const start = document.getElementById('start');
+ const end = document.getElementById('end');
+
+ start.focus();
+ assert_equals(document.activeElement, start, "Start element should be focused initially");
+
+ // Simulate pressing the Tab key
+ await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab
+
+ // Verify that the focus moved to the end element and middle element is skipped
+ assert_equals(document.activeElement, end, "End element should be focused after pressing Tab");
+ }, "Hidden SVG Tab focus test");
+</script>
diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html
new file mode 100644
index 00000000000..fd9fd34275d
--- /dev/null
+++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tabbing through Non-Rendered SVG elements</title>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus">
+<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>
+
+<svg xmlns="http://www.w3.org/2000/svg">
+ <a href="#void" id="start">
+ <text tabindex='-1' x="10" y="10">start</text>
+ </a>
+ <g x="30" y="10" style="display: none;">
+ <a href="#void" id="middle">
+ <text tabindex='-1' x="30" y="10">middle</text>
+ </a>
+ </g>
+ <a href="#void" id="end">
+ <text tabindex='-1' x="50" y="10">end</text>
+ </a>
+</svg>
+
+<script>
+ promise_test(async t => {
+ const start = document.getElementById('start');
+ const end = document.getElementById('end');
+
+ start.focus();
+ assert_equals(document.activeElement, start, "Start element should be focused initially");
+
+ // Simulate pressing the Tab key
+ await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab
+
+ // Verify that the focus moved to the end element and middle element is skipped
+ assert_equals(document.activeElement, end, "End element should be focused after pressing Tab");
+ }, "Hidden SVG Tab focus test");
+</script>
diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html
new file mode 100644
index 00000000000..097cff57b5a
--- /dev/null
+++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tabbing through Non-Rendered SVG elements</title>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus">
+<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>
+
+<svg xmlns="http://www.w3.org/2000/svg">
+ <text tabindex='1' id="start" x="10" y="10">start</text>
+ <defs>
+ <text tabindex='2' id="middle" x="30" y="10">middle</text>
+ </defs>
+ <text tabindex='3' id="end" x="50" y="10">end</text>
+</svg>
+
+<script>
+ promise_test(async t => {
+ const start = document.getElementById('start');
+ const end = document.getElementById('end');
+
+ start.focus();
+ assert_equals(document.activeElement, start, "Start element should be focused initially");
+
+ // Simulate pressing the Tab key
+ await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab
+
+ // Verify that the focus moved to the end element and middle element is skipped
+ assert_equals(document.activeElement, end, "End element should be focused after pressing Tab");
+ }, "Hidden SVG Tab focus test");
+</script>
diff --git a/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html
new file mode 100644
index 00000000000..2f73e1e59a8
--- /dev/null
+++ b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Fetch Priority - SVG Script element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<svg>
+<script id=script1 href="resources/script.js" fetchpriority="high"></script>
+<script id=script2 href="resources/script.js" fetchpriority="low"></script>
+<script id=script3 href="resources/script.js" fetchpriority="auto"></script>
+<script id=script4 href="resources/script.js" fetchpriority="xyz"></script>
+<script id=script5 href="resources/script.js"></script>
+</svg>
+
+<script>
+ test(() => {
+ assert_equals(script1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the script element");
+ assert_equals(script2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the script element");
+ assert_equals(script3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the script element");
+ assert_equals(script4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the script element");
+ assert_equals(script5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the script element");
+ }, "fetchpriority attribute on SVG <script> elements should reflect valid IDL values");
+
+ test(() => {
+ const script = document.createElementNS("http://www.w3.org/2000/svg", "script");
+ assert_equals(script.fetchPriority, "auto");
+ }, "default fetchpriority attribute on SVG <script> elements should be 'auto'");
+</script>
diff --git a/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html
new file mode 100644
index 00000000000..9fe97b12d77
--- /dev/null
+++ b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<title>SVG Test: sibling-index() as cx property value should not crash</title>
+<link rel="help" href="https://crbug.com/407890255">
+<style>circle { cx: sibling-index(); }</style>
+<p>Pass if loading this page does not crash</p>
diff --git a/tests/wpt/tests/tools/ci/requirements_tc.txt b/tests/wpt/tests/tools/ci/requirements_tc.txt
index cb4ba194778..ada75c2f761 100644
--- a/tests/wpt/tests/tools/ci/requirements_tc.txt
+++ b/tests/wpt/tests/tools/ci/requirements_tc.txt
@@ -1,4 +1,4 @@
pygithub==2.6.1
pyyaml==6.0.1
requests==2.32.3
-taskcluster==83.5.6
+taskcluster==83.5.8
diff --git a/tests/wpt/tests/tools/requirements_tests.txt b/tests/wpt/tests/tools/requirements_tests.txt
index 833fdb3b876..ca00b8f1f98 100644
--- a/tests/wpt/tests/tools/requirements_tests.txt
+++ b/tests/wpt/tests/tools/requirements_tests.txt
@@ -2,5 +2,5 @@ httpx[http2]==0.27.2
json-e==4.7.0
jsonschema==4.17.3
pyyaml==6.0.1
-taskcluster==83.5.6
+taskcluster==83.5.8
mozterm==1.0.0
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
index 71187ee76d7..9925a4b511d 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
@@ -87,6 +87,34 @@ class BidiBluetoothSimulatePreconnectedPeripheralAction:
return await self.protocol.bidi_bluetooth.simulate_preconnected_peripheral(
context, address, name, manufacturer_data, known_service_uuids)
+
+class BidiEmulationSetGeolocationOverrideAction:
+ name = "bidi.emulation.set_geolocation_override"
+
+ def __init__(self, logger, protocol):
+ do_delayed_imports()
+ self.logger = logger
+ self.protocol = protocol
+
+ async def __call__(self, payload):
+ coordinates = payload['coordinates']
+ contexts = []
+ for context in payload["contexts"]:
+ # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the
+ # value is extracted from the serialized object.
+ if isinstance(context, str):
+ contexts.append(context)
+ elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
+ contexts.append(context.browsing_context)
+ else:
+ raise ValueError("Unexpected context type: %s" % context)
+ if len(contexts) == 0:
+ raise ValueError("At least one context must be provided")
+
+ return await self.protocol.bidi_emulation.set_geolocation_override(
+ coordinates, contexts)
+
+
class BidiSessionSubscribeAction:
name = "bidi.session.subscribe"
@@ -133,5 +161,6 @@ async_actions = [
BidiBluetoothHandleRequestDevicePrompt,
BidiBluetoothSimulateAdapterAction,
BidiBluetoothSimulatePreconnectedPeripheralAction,
+ BidiEmulationSetGeolocationOverrideAction,
BidiPermissionsSetPermissionAction,
BidiSessionSubscribeAction]
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 123c89c98b2..87403c2944d 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -39,6 +39,7 @@ from .protocol import (BaseProtocolPart,
VirtualSensorProtocolPart,
BidiBluetoothProtocolPart,
BidiBrowsingContextProtocolPart,
+ BidiEmulationProtocolPart,
BidiEventsProtocolPart,
BidiPermissionsProtocolPart,
BidiScriptProtocolPart,
@@ -263,6 +264,19 @@ class WebDriverBidiScriptProtocolPart(BidiScriptProtocolPart):
await_promise=True)
+class WebDriverBidiEmulationProtocolPart(BidiEmulationProtocolPart):
+ def __init__(self, parent):
+ super().__init__(parent)
+ self.webdriver = None
+
+ def setup(self):
+ self.webdriver = self.parent.webdriver
+
+ async def set_geolocation_override(self, coordinates, contexts):
+ return await self.webdriver.bidi_session.emulation.set_geolocation_override(
+ coordinates=coordinates, contexts=contexts)
+
+
class WebDriverBidiPermissionsProtocolPart(BidiPermissionsProtocolPart):
def __init__(self, parent):
super().__init__(parent)
@@ -810,6 +824,7 @@ class WebDriverBidiProtocol(WebDriverProtocol):
enable_bidi = True
implements = [WebDriverBidiBluetoothProtocolPart,
WebDriverBidiBrowsingContextProtocolPart,
+ WebDriverBidiEmulationProtocolPart,
WebDriverBidiEventsProtocolPart,
WebDriverBidiPermissionsProtocolPart,
WebDriverBidiScriptProtocolPart,
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
index 7630fe1f358..833dff45636 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
@@ -445,6 +445,18 @@ class BidiPermissionsProtocolPart(ProtocolPart):
pass
+class BidiEmulationProtocolPart(ProtocolPart):
+ """Protocol part for emulation"""
+ __metaclass__ = ABCMeta
+ name = "bidi_emulation"
+
+ @abstractmethod
+ async def set_geolocation_override(self,
+ coordinates: Optional[Mapping[str, Any]],
+ contexts: List[str]) -> None:
+ pass
+
+
class BidiScriptProtocolPart(ProtocolPart):
"""Protocol part for executing BiDi scripts"""
__metaclass__ = ABCMeta
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
index d83ba4192eb..ab8b04ba3cd 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
@@ -261,6 +261,17 @@
'bluetooth.requestDevicePromptUpdated', on_event);
};
+ window.test_driver_internal.bidi.emulation.set_geolocation_override =
+ function (params) {
+ return create_action("bidi.emulation.set_geolocation_override", {
+ // Default to the current window.
+ contexts: [window],
+ // Default to no coordinates.
+ coordinates: null,
+ ...(params ?? {})
+ });
+ }
+
window.test_driver_internal.bidi.log.entry_added.subscribe =
function (params) {
return subscribe({
diff --git a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html
index 852e49fa7fe..e6c9d8b4e16 100644
--- a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html
+++ b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html
@@ -15,8 +15,14 @@ promise_test(async (t) => {
await test_driver.clear_display_features();
});
- // When the viewport is not divided the segments property should be null.
- assert_equals(viewport.segments, null);
+ // When the viewport is not divided the segments property should return an
+ // array with one segment, the size of the viewport.
+ assert_equals(viewport.segments.length, 1);
+ let segment = viewport.segments[0];
+ assert_equals(segment.x, 0);
+ assert_equals(segment.y, 0);
+ assert_equals(segment.width, window.innerWidth);
+ assert_equals(segment.height, window.innerHeight);
// iframes do not receive segments information.
assert_equals(window.frames[0].viewport.segments, null);
@@ -88,7 +94,11 @@ promise_test(async (t) => {
});
await test_driver.clear_display_features();
assert_true(await promise);
- assert_equals(viewport.segments, null);
+ segment = viewport.segments[0];
+ assert_equals(segment.x, 0);
+ assert_equals(segment.y, 0);
+ assert_equals(segment.width, window.innerWidth);
+ assert_equals(segment.height, window.innerHeight);
// iframes do not receive segments information.
assert_equals(window.frames[0].viewport.segments, null);
diff --git a/tests/wpt/tests/viewport/viewport-segments.html b/tests/wpt/tests/viewport/viewport-segments.html
index 64f0eb9caef..cd24f2bd230 100644
--- a/tests/wpt/tests/viewport/viewport-segments.html
+++ b/tests/wpt/tests/viewport/viewport-segments.html
@@ -9,6 +9,9 @@
test(() => {
assert_true('segments' in viewport, "`segments` must be a property of viewport.");
- assert_equals(viewport.segments, null, "For a viewport not segmented, no segments must be exposed.");
+ assert_equals(viewport.segments[0].innerWidth, viewport.innerWidth,
+ "For a viewport not segmented, there should only one segment with the viewport size.");
+ assert_equals(viewport.segments[0].innerHeight, viewport.innerHeight,
+ "For a viewport not segmented, there should only one segment with the viewport size.");
});
</script>
diff --git a/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html
new file mode 100644
index 00000000000..812a7952738
--- /dev/null
+++ b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/414645284">
+<div id="target"></div>
+<script>
+ target.animate([
+ { offset: "calc(20% * sibling-index())" },
+ ], 2000);
+</script>
diff --git a/tests/wpt/tests/web-animations/resources/keyframe-tests.js b/tests/wpt/tests/web-animations/resources/keyframe-tests.js
index 2bcce1ecf47..34a84f45b20 100644
--- a/tests/wpt/tests/web-animations/resources/keyframe-tests.js
+++ b/tests/wpt/tests/web-animations/resources/keyframe-tests.js
@@ -541,11 +541,6 @@ const gKeyframesTests = [
output: [keyframe(offset(0.5), { left: '10px' })],
},
{
- desc: 'a single keyframe sequence with a complex calc() offset',
- input: [{ offset: 'calc(0.5 + 0.25 * sign(100em - 1px))', left: '10px' }],
- output: [keyframe(offset(0.75), { left: '10px' })],
- },
- {
desc: 'a one property keyframe sequence with some omitted offsets',
input: [{ offset: 0.00, left: '10px' },
{ offset: 0.25, left: '20px' },
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
index fdb9e8b3ca7..8322829ebaf 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
@@ -318,7 +318,7 @@ async def test_iframe(
event = await wait_for_future_safe(on_prompt_closed)
assert event == {
- "context": new_tab["context"],
+ "context": frame["context"],
"accepted": True,
"type": "alert",
}
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
index c24128004f7..a9051f662c8 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
@@ -197,7 +197,7 @@ async def test_iframe(
event = await wait_for_future_safe(on_entry)
assert event == {
- "context": new_tab["context"],
+ "context": frame["context"],
"type": "alert",
"handler": "dismiss",
"message": "in iframe",
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
index 79241287fbc..e804848e0be 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
@@ -114,6 +114,18 @@ async def test_params_coordinates_latitude_invalid_type(bidi_session, top_contex
)
+@pytest.mark.parametrize("value", [-90.1, 90.1])
+async def test_params_coordinates_latitude_invalid_value(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=value,
+ longitude=10,
+ ),
+ )
+
+
async def test_params_coordinates_longitude_missing(bidi_session, top_context):
with pytest.raises(error.InvalidArgumentException):
await bidi_session.emulation.set_geolocation_override(
@@ -136,6 +148,18 @@ async def test_params_coordinates_longitude_invalid_type(bidi_session, top_conte
)
+@pytest.mark.parametrize("value", [-180.5, 180.5])
+async def test_params_coordinates_longitude_invalid_value(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=value,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [False, "foo", [], {}])
async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
@@ -149,6 +173,18 @@ async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_contex
)
+async def test_params_coordinates_accuracy_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ accuracy=-1,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [False, "foo", [], {}])
async def test_params_coordinates_altitude_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
@@ -176,6 +212,19 @@ async def test_params_coordinates_altitude_accuracy_invalid_type(bidi_session, t
)
+async def test_params_coordinates_altitude_accuracy_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ altitude=10,
+ altitude_accuracy=-1,
+ ),
+ )
+
+
async def test_params_coordinates_altitude_accuracy_without_altitude(bidi_session, top_context):
with pytest.raises(error.InvalidArgumentException):
await bidi_session.emulation.set_geolocation_override(
@@ -201,6 +250,19 @@ async def test_params_coordinates_heading_invalid_type(bidi_session, top_context
)
+@pytest.mark.parametrize("value", [-0.5, 360, 360.5])
+async def test_params_coordinates_heading_invalid_value(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ heading=value,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [False, "foo", [], {}])
async def test_params_coordinates_speed_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
@@ -214,6 +276,18 @@ async def test_params_coordinates_speed_invalid_type(bidi_session, top_context,
)
+async def test_params_coordinates_speed_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ speed=-1.5,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [True, "foo", 42, {}])
async def test_params_user_contexts_invalid_type(bidi_session, value):
with pytest.raises(error.InvalidArgumentException):
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
index 9483a707eab..e8119d29d9e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
@@ -396,7 +396,7 @@ async def test_page_with_cached_script_javascript(
@pytest.mark.asyncio
-async def tst_page_with_cached_javascript_module(
+async def test_page_with_cached_javascript_module(
bidi_session,
url,
inline,
diff --git a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js
index fcf144200f6..de6a5761df4 100644
--- a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js
@@ -14,11 +14,8 @@
// MLOperand abs(MLOperand input);
-const getAbsPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 0, float16: 0};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
+const getAbsPrecisionTolerance = () => {
+ return {metricType: 'ULP', value: 0};
};
const absTests = [
@@ -538,6 +535,62 @@ const absTests = [
}
}
}
+ },
+
+ // int8 tests
+ {
+ 'name': 'abs int8 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'absInput': {
+ 'data': [
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ // abs(-128) would overflow when data type is int8
+ -127, 0, 126, 127
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'abs',
+ 'arguments': [{'input': 'absInput'}],
+ 'outputs': 'absOutput'
+ }],
+ 'expectedOutputs': {
+ 'absOutput': {
+ 'data': [127, 0, 126, 127],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'abs int32 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'absInput': {
+ 'data': [
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ // abs(-2147483648) would overflow when data type is int32
+ -2147483647, 0, 2147483646, 2147483647
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'abs',
+ 'arguments': [{'input': 'absInput'}],
+ 'outputs': 'absOutput'
+ }],
+ 'expectedOutputs': {
+ 'absOutput': {
+ 'data': [2147483647, 0, 2147483646, 2147483647],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js
index 0208e2ec605..d4192172046 100644
--- a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js
@@ -22,50 +22,6 @@ const getConcatPrecisionTolerance = (graphResources) => {
return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
};
-const buildAndExecuteGraphWithConcat =
- async (context, builder, graphResources) => {
- const graphInputs = graphResources.inputs;
- const operator = graphResources.operators[0];
-
- const inputOperands = [];
- const inputNameArray =
- operator.arguments[0][Object.keys(operator.arguments[0])[0]];
- for (const inputName of inputNameArray) {
- const operand =
- createOperand(context, builder, inputName, graphInputs[inputName]);
- inputOperands.push(operand);
- }
-
- let outputOperand = builder[operator.name](
- inputOperands,
- operator.arguments[1][Object.keys(operator.arguments[1])[0]]);
- const outputOperandName = Object.keys(graphResources.expectedOutputs)[0];
- const expectedDescriptor =
- graphResources.expectedOutputs[outputOperandName].descriptor;
- if (!context.opSupportLimits().output.dataTypes.includes(
- expectedDescriptor.dataType)) {
- const compatibleType = findCompatibleType(
- expectedDescriptor.dataType,
- context.opSupportLimits().output.dataTypes);
- outputOperand = builder.cast(outputOperand, compatibleType);
- expectedDescriptor.castedType = compatibleType;
- }
-
- assertDescriptorsEquals(outputOperand, expectedDescriptor);
-
- const namedOutputOperand = {};
- namedOutputOperand[outputOperandName] = outputOperand;
-
- // Compile the constructed graph.
- const graph = await builder.build(namedOutputOperand);
-
- // Execute the compiled graph.
- const result = await computeGraph(
- context, graph, graphInputs, graphResources.expectedOutputs);
-
- return {result, namedOutputOperand};
-};
-
const concatTests = [
{
'name': 'concat two float32 1D constant tensors of same shape along axis 0',
@@ -2428,7 +2384,7 @@ const concatTests = [
if (navigator.ml) {
concatTests.forEach((test) => {
webnn_conformance_test(
- buildAndExecuteGraphWithConcat, getConcatPrecisionTolerance, test);
+ buildAndExecuteGraph, getConcatPrecisionTolerance, test);
});
} else {
test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
diff --git a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js
index c03afc52516..8bc10475453 100644
--- a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js
@@ -14,11 +14,8 @@
// MLOperand neg(MLOperand input);
-const getNegPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 0, float16: 0};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
+const getNegPrecisionTolerance = () => {
+ return {metricType: 'ULP', value: 0};
};
const negTests = [
@@ -551,6 +548,62 @@ const negTests = [
}
}
}
+ },
+
+ // int8 tests
+ {
+ 'name': 'neg int8 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'negInput': {
+ 'data': [
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ // neg(-128) would overflow when data type is int8
+ -127, 0, 126, 127
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'neg',
+ 'arguments': [{'input': 'negInput'}],
+ 'outputs': 'negOutput'
+ }],
+ 'expectedOutputs': {
+ 'negOutput': {
+ 'data': [127, 0, -126, -127],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'neg int32 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'negInput': {
+ 'data': [
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ // neg(-2147483648) would overflow when data type is int32
+ -2147483647, 0, 2147483646, 2147483647
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'neg',
+ 'arguments': [{'input': 'negInput'}],
+ 'outputs': 'negOutput'
+ }],
+ 'expectedOutputs': {
+ 'negOutput': {
+ 'data': [2147483647, 0, -2147483646, -2147483647],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
index 8f6f2246b04..3b59c3bb49d 100644
--- a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
@@ -558,6 +558,372 @@ const subgraphTests = [
}
}
},
+ {
+ 'name': 'quantized tanh',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 0.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ 0.19882695376873016, 0.41167140007019043, 0.07934240251779556,
+ ],
+ 'descriptor': {shape: [2, 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
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [-128],
+ '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': 'tanh',
+ 'arguments': [{'input': 'dequantizedInput'}],
+ 'outputs': 'tanhOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'tanhOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedtanhOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedtanhOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.5921568870544434, 0.0470588281750679, 0.32156863808631897,
+ 0.19607844948768616, 0.38823533058166504, 0.0784313753247261,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized sigmoid',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 0.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ 0.19882695376873016, 0.41167140007019043, 0.07934240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.00390625],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.00390625],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [-128],
+ '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': 'sigmoid',
+ 'arguments': [{'input': 'dequantizedInput'}],
+ 'outputs': 'sigmoidOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'sigmoidOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedsigmoidOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedsigmoidOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.6640625, 0.51171875, 0.58203125,
+ 0.55078125, 0.6015625, 0.51953125,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized leaky relu',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 1.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ -0.1988269537687301, -0.0041167140007019, -0.0634240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ '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': 'leakyRelu',
+ 'arguments': [
+ {'input': 'dequantizedInput'},
+ {'options': {'alpha': 5.799162942273234}}
+ ],
+ 'outputs': 'leakyReluOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'leakyReluOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedleakyReluOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedleakyReluOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.49803924560546875, 0.0470588281750679, 0.3333333432674408,
+ -0.501960813999176, -0.02352941408753395, -0.364705890417099,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized concat',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ -0.990639865398407, -0.576785683631897, -0.32276400923728943,
+ -0.44735023379325867, -0.11028251051902771, -0.5945112705230713,
+ ],
+ 'descriptor': {shape: [3, 2], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputAScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputAZeroPoint': {
+ 'data': [127],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'inputB': {
+ 'data': [
+ 2, 27, 38,
+ ],
+ 'descriptor': {shape: [3, 1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'inputBScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputBZeroPoint': {
+ 'data': [127],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [127],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'inputA'},
+ {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'}
+ ],
+ 'outputs': 'quantizedInputA'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInputA'},
+ {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInputA'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'inputB'},
+ {'scale': 'inputBScale', 'zeroPoint': 'inputBZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInputB'
+ },
+ {
+ 'name': 'concat',
+ 'arguments': [
+ {
+ 'inputs': ['dequantizedInputA', 'dequantizedInputB']
+ },
+ {'axis': 1}
+ ],
+ 'outputs': 'concatOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'concatOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedConcatOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedConcatOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ -0.9921569228172302, -0.5764706134796143, -0.4901961088180542,
+ -0.32156863808631897, -0.44705885648727417, -0.3921568989753723,
+ -0.1098039299249649, -0.5960784554481506, -0.3490196168422699,
+ ],
+ 'descriptor': {shape: [3, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
index 16cc2a3fa67..63ef9fa9ff0 100644
--- a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
@@ -581,7 +581,61 @@ const reluTests = [
}
}
}
- }
+ },
+
+ // int8 tests
+ {
+ 'name': 'relu int8 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ -128, 0, 126, 127
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [0, 0, 126, 127],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'relu int32 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ -2147483648, 0, 2147483646, 2147483647
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [0, 0, 2147483646, 2147483647],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js
index 2f2fadf7282..85b15f5a000 100644
--- a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js
@@ -14,7 +14,16 @@
const getSubPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 1, float16: 1};
+ const toleranceValueDict = {
+ float32: 1,
+ float16: 1,
+ int8: 0,
+ uint8: 0,
+ int32: 0,
+ uint32: 0,
+ int64: 0,
+ uint64: 0
+ };
const expectedDataType =
getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
@@ -916,6 +925,208 @@ const subTests = [
}
}
}
+ },
+
+ // int8 tests
+ {
+ 'name': 'sub int8 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74,
+ 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'}
+ },
+ 'inputB': {
+ 'data': [
+ -49, 40, 7, 76, -81, 59, 11, 48, 65, 27, 30, -38,
+ -49, -78, 16, 35, -28, 28, 35, -3, -57, -21, 27, 32
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ // the range of int8 result: [-128, 127]
+ 'data': [
+ 122, -26, -76, -128, 6, -61, -94, -33, -127, 5, 52, -36,
+ 127, 126, -35, -120, 117, -6, 45, 100, 109, 110, -47, 67
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // uint8 tests
+ {
+ 'name': 'sub uint8 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [1, 10, 100, 255],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'}
+ },
+ 'inputB': {
+ // b should be lesser than or equal to a, otherwise the result would
+ // overflow when testing uint8 data type
+ 'data': [1, 8, 88, 254],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0, 2, 12, 1],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'sub int32 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74,
+ 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'}
+ },
+ 'inputB': {
+ 'data': [
+ -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38,
+ -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36,
+ 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'}
+ }
+ }
+ }
+ },
+
+ // uint32 tests
+ {
+ 'name': 'sub uint32 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [1, 10, 100, 1024],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'}
+ },
+ 'inputB': {
+ // b should be lesser than or equal to a, otherwise the result would
+ // overflow when testing uint32 data type
+ 'data': [1, 8, 88, 1000],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0, 2, 12, 24],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'}
+ }
+ }
+ }
+ },
+
+ // int64 tests
+ {
+ 'name': 'sub int64 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74,
+ 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'}
+ },
+ 'inputB': {
+ 'data': [
+ -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38,
+ -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36,
+ 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'}
+ }
+ }
+ }
+ },
+
+ // uint64 tests
+ {
+ 'name': 'sub uint64 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [1, 10, 100, 1024],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'}
+ },
+ 'inputB': {
+ // b should be lesser than or equal to a, otherwise the result would
+ // overflow when testing uint64 data type
+ 'data': [1, 8, 88, 1000],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0, 2, 12, 24],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js
index d19cb7cf760..50d7911a918 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -10,7 +10,7 @@ const operatorToleranceDict = {
leakyRelu: {float32: 1, float16: 2},
linear: {float32: 2, float16: 2},
prelu: {float32: 1, float16: 1},
- relu: {float32: 0, float16: 0},
+ relu: {float32: 0, float16: 0, int8: 0, int32: 0},
reshape: {float32: 0, float16: 0},
sigmoid: {float32: 34, float16: 10},
softplus: {float32: 18, float16: 18},
@@ -703,6 +703,10 @@ function validateContextSupportsGraph(context, graph) {
assert(
typeof inputName === 'string',
`the inputs' item of ${operatorName} should be a string.`);
+ if (!graph.inputs[inputName]) {
+ // intermediate input
+ continue;
+ }
validateInputOrConstantDataType(
inputName, operatorSupportLimits, 'inputs');
}
@@ -788,7 +792,21 @@ const buildAndExecuteGraph = async (context, builder, graphResources) => {
for (const argument of operator.arguments) {
for (const argumentName in argument) {
if (argumentName !== 'options') {
- if (graphInputs.hasOwnProperty(argument[argumentName])) {
+ if (operator.name === 'concat' && argumentName === 'inputs') {
+ const concatInputs = [];
+ for (const inputName of argument[argumentName]) {
+ if (graphInputs.hasOwnProperty(inputName)) {
+ const operandName = inputName;
+ const operand = createOperand(
+ context, builder, operandName, graphInputs[operandName]);
+ concatInputs.push(operand);
+ } else if (intermediateOperands.hasOwnProperty(inputName)) {
+ concatInputs.push(intermediateOperands[inputName]);
+ }
+ // concatInputs.push(intermediateOperands[inputName]);
+ }
+ argumentArray.push(concatInputs);
+ } else if (graphInputs.hasOwnProperty(argument[argumentName])) {
const operandName = argument[argumentName];
const operand = createOperand(
context, builder, operandName, graphInputs[operandName]);
diff --git a/tests/wpt/tests/webrtc-stats/supported-stats.https.html b/tests/wpt/tests/webrtc-stats/supported-stats.https.html
index 677736f3cd8..81aef5f94b9 100644
--- a/tests/wpt/tests/webrtc-stats/supported-stats.https.html
+++ b/tests/wpt/tests/webrtc-stats/supported-stats.https.html
@@ -69,6 +69,7 @@ function isPropertyTestable(type, property) {
],
'inbound-rtp': [
'fecSsrc', // requires FlexFEC to be negotiated.
+ 'fecBytesReceived', // requires FlexFEC to be negotiated.
],
'media-source': [
'echoReturnLoss', // requires gUM with an audio input device.
diff --git a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html
index aa66bfbb2bf..bc7831361ab 100644
--- a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html
+++ b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html
@@ -301,4 +301,28 @@
}] }));
}, `with empty urls should throw SyntaxError`);
+ test(() => {
+ const pc = new RTCPeerConnection({ iceServers: [{
+ urls: 'stun:stun1.example.net'
+ }] });
+ let config = pc.getConfiguration();
+ assert_equals(config.iceServers.length, 1);
+ pc.setConfiguration({});
+ config = pc.getConfiguration();
+ assert_equals(config.iceServers.length, 0);
+ }, `setConfiguration(config) - without iceServers removes ice servers`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [...Array(32)].map((_, i) => ({
+ urls: `stun:stun${i+1}.example.net`
+ })) });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 32);
+
+ for (let i = 0; i < 32; i++) {
+ const server = iceServers[i];
+ assert_array_equals(server.urls, [`stun:stun${i+1}.example.net`]);
+ }
+ }, `with 32 ice servers must succeed`);
</script>
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html
index 3fd83a76fe2..62df4293067 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html
@@ -319,18 +319,21 @@
of 16 characters. If one of the RIDs does not meet these requirements,
throw a TypeError.
*/
+
+["video", "audio"].forEach(kind => {
+
test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_idl_attribute(pc, 'addTransceiver');
assert_throws_js(TypeError, () =>
- pc.addTransceiver('video', {
+ pc.addTransceiver(kind, {
sendEncodings: [{
rid: '@Invalid!'
}]
}));
- }, 'addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError');
+ }, `addTransceiver("${kind}") with rid containing invalid non-alphanumeric characters should throw TypeError`);
test(t => {
const pc = new RTCPeerConnection();
@@ -338,22 +341,41 @@
assert_idl_attribute(pc, 'addTransceiver');
assert_throws_js(TypeError, () =>
- pc.addTransceiver('audio', {
+ pc.addTransceiver(kind, {
sendEncodings: [{
rid: 'a'.repeat(17)
}]
}));
- }, 'addTransceiver() with rid longer than 16 characters should throw TypeError');
+ }, `addTransceiver("${kind}") with rid longer than 16 characters should throw TypeError`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ assert_idl_attribute(pc, 'addTransceiver');
+
+ assert_throws_js(TypeError, () =>
+ pc.addTransceiver(kind, {
+ sendEncodings: [{rid: 'a'}, {rid: 'a'}]
+ }));
+ }, `addTransceiver("${kind}") with duplicate rids should throw TypeError`);
test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
- pc.addTransceiver('audio', {
+ pc.addTransceiver(kind, {
sendEncodings: [{
rid: 'foo'
}]
});
- }, `addTransceiver() with valid rid value should succeed`);
+ }, `addTransceiver("${kind}") with valid rid value should succeed`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ pc.addTransceiver('video', {
+ sendEncodings: [{rid: 'a'}, {rid: 'b'}]
+ });
+ }, `addTransceiver("${kind}") with multiple rid values should succeed`);
test(t => {
const pc = new RTCPeerConnection();
@@ -369,7 +391,8 @@
rid: 'foo'
}]
});
- }, `addTransceiver() with valid sendEncodings should succeed`);
+ }, `addTransceiver("${kind}") with valid sendEncodings should succeed`);
+});
/*
TODO
diff --git a/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html
new file mode 100644
index 00000000000..f3256106e90
--- /dev/null
+++ b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/webxr_util.js"></script>
+<script src="../../resources/webxr_math_utils.js"></script>
+<script src="../../resources/webxr_test_constants.js"></script>
+<script src="../../resources/webxr_test_asserts.js"></script>
+<script src="../../resources/webxr_test_constants_fake_depth.js"></script>
+<script src="../matchDepthViewValues.js"></script>
+
+<script>
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ depthSensingData: DEPTH_SENSING_DATA,
+};
+
+function matchDepthViewFalsePlaceholderTest(session) {
+ // Currently we just assert that we are able to get a session when
+ // matchDepthView is false. If we got to this point, we have a session.
+ return Promise.resolve();
+}
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/true),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['cpu-optimized'],
+ dataFormatPreference: [],
+ },
+ });
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/true),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['cpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: true,
+ },
+ });
+
+xr_session_promise_test("Ensures session can be created when matchDepthView=false, `cpu-optimized`",
+ matchDepthViewFalsePlaceholderTest,
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['cpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: false,
+ },
+ });
+
+</script>
diff --git a/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html
new file mode 100644
index 00000000000..1813ddd449e
--- /dev/null
+++ b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/webxr_util.js"></script>
+<script src="../../resources/webxr_math_utils.js"></script>
+<script src="../../resources/webxr_test_constants.js"></script>
+<script src="../../resources/webxr_test_asserts.js"></script>
+<script src="../../resources/webxr_test_constants_fake_depth.js"></script>
+<script src="../matchDepthViewValues.js"></script>
+
+<script>
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ depthSensingData: DEPTH_SENSING_DATA,
+};
+
+function matchDepthViewFalsePlaceholderTest(session) {
+ // Currently we just assert that we are able to get a session when
+ // matchDepthView is false. If we got to this point, we have a session.
+ return Promise.resolve();
+}
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/false),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['gpu-optimized'],
+ dataFormatPreference: [],
+ },
+ });
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/false),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['gpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: true,
+ },
+ });
+
+xr_session_promise_test("Ensures session can be created when matchDepthView=false, `gpu-optimized`",
+ matchDepthViewFalsePlaceholderTest,
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['gpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: false,
+ },
+ });
+
+</script>
diff --git a/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js
new file mode 100644
index 00000000000..597f9734d3f
--- /dev/null
+++ b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js
@@ -0,0 +1,31 @@
+'use strict';
+
+// import * as XrConstants from 'resources/webxr_test_constants.js'
+// import * as XrAsserts from 'resources/webxr_test_asserts.js'
+
+// TODO: Expand the WebXrTestApi to specify a viewGeometry that this can validate
+// as well.
+const depthViewGeometryTestGenerator = function(isCpuOptimized) {
+ return (session, controller, t, sessionObjects) => {
+
+ return session.requestReferenceSpace('viewer').then((viewerSpace) => new Promise((resolve) => {
+
+ const glBinding = new XRWebGLBinding(session, sessionObjects.gl);
+
+ const rafCb = function(time, frame) {
+ const pose = frame.getViewerPose(viewerSpace);
+ for(const view of pose.views) {
+ const depthInformation = isCpuOptimized ? frame.getDepthInformation(view)
+ : glBinding.getDepthInformation(view);
+ t.step(()=> {
+ assert_matrix_approx_equals(IDENTITY_MATRIX, depthInformation.projectionMatrix);
+ assert_transform_approx_equals(IDENTITY_TRANSFORM, depthInformation.transform);
+ });
+ }
+ resolve();
+ }
+
+ session.requestAnimationFrame(rafCb);
+ })); // Promise
+ }; // Test Func
+}; // Generator Func
diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
index 37602dbc1f6..435cfbe0d5c 100644
--- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
+++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
@@ -13,6 +13,3 @@
[WebGL test #588]
expected: FAIL
-
- [WebGL test #52]
- expected: FAIL