aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/meta-legacy-layout/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini241
-rw-r--r--tests/wpt/meta-legacy-layout/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/parsing/color-computed-relative-color.html.ini57
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/parsing/color-valid-relative-color.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-block-interpolation.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-inline-interpolation.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-001.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-002.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-sizing/dynamic-available-size-iframe.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini78
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini84
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini144
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-height.tentative.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-parsing.tentative.html.ini12
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/round-function.html.ini24
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom-view/elementsFromPoint-iframes.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom/getComputedStyle-pseudo-with-argument.html.ini24
-rw-r--r--tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-from.any.js.ini80
-rw-r--r--tests/wpt/meta-legacy-layout/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini14
-rw-r--r--tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/idlharness.https.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/permission-element/bounded-css-properties.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/permission-element/negative-offset-and-margin.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/navigation-timing/idlharness.window.js.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/resource-timing/nested-context-navigations-iframe.html.ini19
-rw-r--r--tests/wpt/meta-legacy-layout/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini26
-rw-r--r--tests/wpt/meta/MANIFEST.json2418
-rw-r--r--tests/wpt/meta/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini241
-rw-r--r--tests/wpt/meta/css/CSS2/text/white-space-pre-002.xht.ini2
-rw-r--r--tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini2
-rw-r--r--tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-paragraph.html.ini2
-rw-r--r--tests/wpt/meta/css/css-color/parsing/color-computed-relative-color.html.ini57
-rw-r--r--tests/wpt/meta/css/css-color/parsing/color-valid-relative-color.html.ini9
-rw-r--r--tests/wpt/meta/css/css-logical/animations/margin-block-interpolation.html.ini18
-rw-r--r--tests/wpt/meta/css/css-logical/animations/margin-inline-interpolation.html.ini18
-rw-r--r--tests/wpt/meta/css/css-position/sticky/position-sticky-padding-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-position/sticky/position-sticky-padding-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-sizing/dynamic-available-size-iframe.html.ini2
-rw-r--r--tests/wpt/meta/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini78
-rw-r--r--tests/wpt/meta/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini84
-rw-r--r--tests/wpt/meta/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini144
-rw-r--r--tests/wpt/meta/css/css-values/calc-size/calc-size-height.tentative.html.ini6
-rw-r--r--tests/wpt/meta/css/css-values/calc-size/calc-size-parsing.tentative.html.ini12
-rw-r--r--tests/wpt/meta/css/css-values/round-function.html.ini24
-rw-r--r--tests/wpt/meta/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini2
-rw-r--r--tests/wpt/meta/css/cssom-view/elementsFromPoint-iframes.html.ini3
-rw-r--r--tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini3
-rw-r--r--tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini2
-rw-r--r--tests/wpt/meta/css/cssom/getComputedStyle-pseudo-with-argument.html.ini24
-rw-r--r--tests/wpt/meta/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini3
-rw-r--r--tests/wpt/meta/dom/observable/tentative/observable-from.any.js.ini80
-rw-r--r--tests/wpt/meta/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini14
-rw-r--r--tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini2
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini2
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/dom/idlharness.https.html.ini6
-rw-r--r--tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini3
-rw-r--r--tests/wpt/meta/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.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-fieldset-element/disabled-003.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/permission-element/bounded-css-properties.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/permission-element/negative-offset-and-margin.html.ini3
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini5
-rw-r--r--tests/wpt/meta/navigation-timing/idlharness.window.js.ini6
-rw-r--r--tests/wpt/meta/resource-timing/test_resource_timing.https.html.ini3
-rw-r--r--tests/wpt/meta/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini2
-rw-r--r--tests/wpt/meta/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini26
-rw-r--r--tests/wpt/meta/webmessaging/with-ports/017.html.ini4
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put.any.js427
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put.htm35
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put10.htm29
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put11.htm29
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put12.htm29
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put13.htm29
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put14.htm32
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put15.htm31
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put16.htm25
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put2.htm36
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put3.htm48
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put4.htm40
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put5.htm34
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put6.htm47
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put7.htm47
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put8.htm47
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_put9.htm27
-rw-r--r--tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js581
-rw-r--r--tests/wpt/tests/accname/name/comp_label.html6
-rw-r--r--tests/wpt/tests/console/console-countReset-logging-manual.html6
-rw-r--r--tests/wpt/tests/credential-management/digital-identity.https.html6
-rw-r--r--tests/wpt/tests/credential-management/fedcm-authz/fedcm-continue-on-disallowed.https.html31
-rw-r--r--tests/wpt/tests/credential-management/fedcm-same-site-none/fedcm-same-site-none.https.html25
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm-helper.sub.js2
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py28
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json7
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/request-params-check.py2
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py15
-rw-r--r--tests/wpt/tests/credential-management/support/set_cookie.headers1
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-getComputedStyle-003.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained-dynamic.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-circular.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-001.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-002.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-003.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-004.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-005.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-006.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-001.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-002.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-003.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-004.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-005.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html6
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-001.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-002.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-003.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-004.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-fallback.tentative.html5
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-001-crash.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-002-crash.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-003-crash.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-004-crash.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-005-crash.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos-002.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-js-expose.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-nested.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-001.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-002.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-003.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-004.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-001.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-002.html6
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-003.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-004.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-005.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-006.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-007.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-vlr.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-vrl.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html1
-rw-r--r--tests/wpt/tests/css/css-anchor-position/inset-area-abs-inline-container.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/inset-area-basic.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/inset-area-inline-container.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/inset-area-wm-dir.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-computed.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-parsing.html10
-rw-r--r--tests/wpt/tests/css/css-anchor-position/parsing/position-try-parsing.html5
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-anchor-001.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-default-001.html)10
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-anchor-002.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-default-002.html)8
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-anchor-003.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-default-003.html)10
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-anchor-basics.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-default-basics.html)30
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-anchor-ref.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-default-ref.html)0
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-basics.html40
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-001.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-002.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-003.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-004.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-005.html2
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-001.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html3
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-options-limit.html53
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/property-interpolations.html4
-rw-r--r--tests/wpt/tests/css/css-anchor-position/try-tactic-base.html35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/try-tactic-basic.html69
-rw-r--r--tests/wpt/tests/css/css-anchor-position/try-tactic-sizing.html66
-rw-r--r--tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html2
-rw-r--r--tests/wpt/tests/css/css-break/grid/monolithic-overflow-print-ref.html19
-rw-r--r--tests/wpt/tests/css/css-break/grid/monolithic-overflow-print.html19
-rw-r--r--tests/wpt/tests/css/css-break/overflowing-block-002-print-ref.html23
-rw-r--r--tests/wpt/tests/css/css-break/overflowing-block-002-print.html25
-rw-r--r--tests/wpt/tests/css/css-break/overflowing-block-003-ref.html31
-rw-r--r--tests/wpt/tests/css/css-break/overflowing-block-003.html45
-rw-r--r--tests/wpt/tests/css/css-color/lab-l-over-100-1.html13
-rw-r--r--tests/wpt/tests/css/css-color/lab-l-over-100-2.html13
-rw-r--r--tests/wpt/tests/css/css-color/lab-l-over-100-ref.html4
-rw-r--r--tests/wpt/tests/css/css-color/lch-l-over-100-1.html13
-rw-r--r--tests/wpt/tests/css/css-color/lch-l-over-100-2.html13
-rw-r--r--tests/wpt/tests/css/css-color/lch-l-over-100-ref.html5
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-almost-0-ref.html9
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-almost-0.html21
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-almost-1-ref.html9
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-almost-1.html21
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-over-1-1.html13
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-over-1-2.html13
-rw-r--r--tests/wpt/tests/css/css-color/oklab-l-over-1-ref.html4
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-almost-0-ref.html9
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-almost-0.html21
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-almost-1-ref.html9
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-almost-1.html21
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-over-1-1.html13
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-over-1-2.html13
-rw-r--r--tests/wpt/tests/css/css-color/oklch-l-over-1-ref.html4
-rw-r--r--tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html11
-rw-r--r--tests/wpt/tests/css/css-color/parsing/color-valid-relative-color.html2
-rw-r--r--tests/wpt/tests/css/css-contain/contain-layout-ink-overflow-019.html1
-rw-r--r--tests/wpt/tests/css/css-contain/contain-layout-overflow-001.html1
-rw-r--r--tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print-ref.tentative.html20
-rw-r--r--tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print.tentative.html21
-rw-r--r--tests/wpt/tests/css/css-grid/parsing/grid-shorthand-serialization.html7
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001-ref.html1
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001.html2
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html31
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001.html32
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002-ref.html31
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002.html33
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003-ref.html32
-rw-r--r--tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003.html33
-rw-r--r--tests/wpt/tests/css/css-logical/animations/margin-block-interpolation.html26
-rw-r--r--tests/wpt/tests/css/css-logical/animations/margin-inline-interpolation.html26
-rw-r--r--tests/wpt/tests/css/css-nesting/parsing.html1
-rw-r--r--tests/wpt/tests/css/css-nesting/pseudo-where-crash.html9
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html1
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html1
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html1
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html1
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001-ref.html37
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001.html73
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002-ref.html38
-rw-r--r--tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002.html71
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/resources/common.js20
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-after-layout-change.tentative.html12
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-ensures-dom-order.html95
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html10
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html10
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-with-proximity-strictness.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html4
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-root-scroll.tentative.html3
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-scroll.tentative.html3
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/common-to-both-axes-supercedes-first-in-tree-order.html174
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html116
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-first-in-tree-order.html164
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame-target.html137
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame.html62
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element.html2
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/resources/common.js31
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/stash.py27
-rw-r--r--tests/wpt/tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-041.html9
-rw-r--r--tests/wpt/tests/css/css-syntax/custom-property-rule-ambiguity.html4
-rw-r--r--tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-002.html1
-rw-r--r--tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-004.html1
-rw-r--r--tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-002.html1
-rw-r--r--tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-004.html1
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/accent-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/background-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/border-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/caret-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/flood-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/lighting-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/outline-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/stop-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html6
-rw-r--r--tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html6
-rw-r--r--tests/wpt/tests/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html160
-rw-r--r--tests/wpt/tests/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html24
-rw-r--r--tests/wpt/tests/css/css-values/calc-size/calc-size-height.tentative.html1
-rw-r--r--tests/wpt/tests/css/css-values/calc-size/calc-size-parsing.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-values/calc-size/calc-size-width.tentative.html2
-rw-r--r--tests/wpt/tests/css/css-values/round-function.html10
-rw-r--r--tests/wpt/tests/css/css-values/round-mod-rem-invalid.html2
-rw-r--r--tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-ltr-001-ref.html33
-rw-r--r--tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-vhw-001.html29
-rw-r--r--tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-blank-001-ref.html13
-rw-r--r--tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-ltr-001-ref.html22
-rw-r--r--tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-vhw-001.html28
-rw-r--r--tests/wpt/tests/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html63
-rw-r--r--tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri-ref.html5
-rw-r--r--tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html17
-rw-r--r--tests/wpt/tests/css/cssom/cssstyledeclaration-csstext-setter.window.js64
-rw-r--r--tests/wpt/tests/css/cssom/getComputedStyle-pseudo-with-argument.html8
-rw-r--r--tests/wpt/tests/css/selectors/link-sharing-crash.html11
-rw-r--r--tests/wpt/tests/css/selectors/pseudo-where-crash.html7
-rw-r--r--tests/wpt/tests/document-picture-in-picture/hide-return-to-opener-button-manual.https.html21
-rw-r--r--tests/wpt/tests/dom/events/scrolling/scroll_support.js3
-rw-r--r--tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html41
-rw-r--r--tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-with-mutation-observer-takeRecords.html21
-rw-r--r--tests/wpt/tests/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js33
-rw-r--r--tests/wpt/tests/dom/observable/tentative/observable-from.any.js354
-rw-r--r--tests/wpt/tests/dom/ranges/Range-in-shadow-after-the-shadow-removed.html47
-rw-r--r--tests/wpt/tests/fenced-frame/content-shared-storage-get.https.html141
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html3
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html69
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html69
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html77
-rw-r--r--tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html26
-rw-r--r--tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html26
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html19
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html27
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js22
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html27
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js22
-rw-r--r--tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml1
-rw-r--r--tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml1
-rw-r--r--tests/wpt/tests/html/canvas/tools/name2dir.yaml1
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml-new/webgpu-access.yaml10
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html147
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles.html22
-rw-r--r--tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html1
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime-move-within-document.html31
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.sub.js (renamed from tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.js)11
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js2
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js2
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js2
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js2
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js2
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js2
-rw-r--r--tests/wpt/tests/html/semantics/permission-element/bounded-css-properties.html38
-rw-r--r--tests/wpt/tests/html/semantics/permission-element/negative-offset-and-margin.html21
-rw-r--r--tests/wpt/tests/html/semantics/popovers/popover-anchor-display.tentative.html4
-rw-r--r--tests/wpt/tests/html/semantics/popovers/popover-anchor-scroll-display.tentative.html2
-rw-r--r--tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html8
-rw-r--r--tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/minimize_restore_popup.html.ini2
-rw-r--r--tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/test_win_open_with_interaction.html.ini5
-rw-r--r--tests/wpt/tests/infrastructure/testdriver/minimize_restore_popup.html44
-rw-r--r--tests/wpt/tests/interfaces/css-view-transitions-2.idl4
-rw-r--r--tests/wpt/tests/interfaces/document-picture-in-picture.idl1
-rw-r--r--tests/wpt/tests/interfaces/html.idl1
-rw-r--r--tests/wpt/tests/interfaces/long-animation-frames.idl54
-rw-r--r--tests/wpt/tests/interfaces/longtasks.idl50
-rw-r--r--tests/wpt/tests/interfaces/mediacapture-streams.idl10
-rw-r--r--tests/wpt/tests/interfaces/navigation-timing.idl1
-rw-r--r--tests/wpt/tests/interfaces/permissions.idl2
-rw-r--r--tests/wpt/tests/interfaces/turtledove.idl3
-rw-r--r--tests/wpt/tests/interfaces/ua-client-hints.idl2
-rw-r--r--tests/wpt/tests/interfaces/web-animations-2.idl1
-rw-r--r--tests/wpt/tests/interfaces/webcodecs.idl24
-rw-r--r--tests/wpt/tests/interfaces/webnn.idl97
-rw-r--r--tests/wpt/tests/lint.ignore2
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1140268-1.html18
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1397439-1.html6
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1403465.html24
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1435015.html9
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1555757-1.html16
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1555757-2.html27
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1701975-1.html20
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/243159-2.xhtml25
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/306902-1.xml14
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/347506-1.xhtml23
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/355993-1.xhtml26
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/364686-1.xhtml11
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/368461-1.xhtml11
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/370884-1.xhtml14
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/382208-1.xhtml7
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/382396-1.xhtml7
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/384649-1.xhtml31
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/385265-1.xhtml13
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/385289-1.xhtml30
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/394150-1.xhtml27
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/395450-1.xhtml28
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/399676-1.xhtml7
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/400445-1.xhtml22
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/400904-1.xhtml20
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/410728-1.xml14
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/411603-1.html7
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/413274-1.xhtml18
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/418007-1.xhtml24
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/467914-1.html3
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/547843-1.xhtml1
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/700031.xhtml9
-rw-r--r--tests/wpt/tests/pointerevents/compat/pointerevent_touch_target_after_pointerdown_target_removed.tentative.html281
-rw-r--r--tests/wpt/tests/pointerevents/pointerevent_mouse_capture_change_hover.html12
-rw-r--r--tests/wpt/tests/selection/crashtests/selection-modify-line-boundary-around-shadow.html30
-rw-r--r--tests/wpt/tests/selection/selection-range-after-editinghost-removed.html69
-rw-r--r--tests/wpt/tests/selection/selection-range-after-textcontrol-removed.html55
-rw-r--r--tests/wpt/tests/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html96
-rw-r--r--tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js6
-rw-r--r--tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-invalid-rules.https.html9
-rw-r--r--tests/wpt/tests/svg/import/animate-elem-30-t-manual.svg2
-rw-r--r--tests/wpt/tests/svg/import/animate-elem-85-t-manual.svg18
-rw-r--r--tests/wpt/tests/svg/import/animate-pservers-grad-01-b-manual.svg10
-rw-r--r--tests/wpt/tests/tools/ci/tc/tasks/test.yml2
-rw-r--r--tests/wpt/tests/tools/ci/tc/tests/test_valid.py25
-rw-r--r--tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py8
-rw-r--r--tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py13
-rw-r--r--tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/session.py4
-rw-r--r--tests/wpt/tests/tools/wpt/android.py11
-rw-r--r--tests/wpt/tests/trusted-types/idlharness.window.js (renamed from tests/wpt/tests/trusted-types/idlharness.tentative.window.js.html)0
-rw-r--r--tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html1
-rw-r--r--tests/wpt/tests/webcodecs/audio-decoder.https.any.js13
-rw-r--r--tests/wpt/tests/webcodecs/video-decoder.https.any.js8
-rw-r--r--tests/wpt/tests/webcodecs/video-encoder-config.https.any.js8
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py7
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/__init__.py3
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/activate.py95
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py31
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/create/type.py16
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py35
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py26
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py111
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/set_files/conftest.py33
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/set_files/context.py80
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/set_files/files.py (renamed from tests/wpt/tests/webdriver/tests/bidi/input/set_files/set_files.py)125
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/input/set_files/invalid.py122
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/continue_response/request.py16
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/script/call_function/serialization_options.py28
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/new/connect.py9
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/status/status.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/subscribe/invalid.py81
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/session/unsubscribe/invalid.py111
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py39
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/partition.py33
-rw-r--r--tests/wpt/tests/webdriver/tests/classic/new_window/new_tab.py26
-rw-r--r--tests/wpt/tests/webdriver/tests/classic/new_window/new_window.py26
-rw-r--r--tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/support/html/files.html29
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/gpu/resample2d.https.any.js10
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/resample2d.https.any.js10
-rw-r--r--tests/wpt/tests/webnn/resources/test_data/resample2d.json527
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js27
-rw-r--r--tests/wpt/tests/webnn/validation_tests/constant.https.any.js142
-rw-r--r--tests/wpt/tests/webnn/validation_tests/gather.https.any.js62
-rw-r--r--tests/wpt/tests/webnn/validation_tests/input.https.any.js69
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/set-metadata.https.html53
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html129
-rw-r--r--tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-metadata.https.html140
-rw-r--r--tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-audio-jitterBufferTarget-stats.https.html18
-rw-r--r--tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats-helper.js70
-rw-r--r--tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats.html96
-rw-r--r--tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-video-jitterBufferTarget-stats.html18
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-createOffer.html2
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-description-attributes-timing.https.html4
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html14
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html6
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html2
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html6
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html7
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html2
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription.html2
-rw-r--r--tests/wpt/tests/workers/WorkerNavigator_userAgentData.https.html4
-rw-r--r--tests/wpt/tests/workers/support/WorkerNavigator.js4
490 files changed, 11128 insertions, 3246 deletions
diff --git a/tests/wpt/meta-legacy-layout/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini b/tests/wpt/meta-legacy-layout/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini
index 878a7c3f74a..1d48180b27e 100644
--- a/tests/wpt/meta-legacy-layout/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini
@@ -1,5 +1,242 @@
[eddsa.https.any.html]
- expected: ERROR
+ [EdDSA Ed25519 verification]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed25519 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed25519 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed25519 round trip]
+ expected: FAIL
+
+ [EdDSA Ed25519 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed25519 keys.]
+ expected: FAIL
+
+ [EdDSA Ed448 verification]
+ expected: FAIL
+
+ [EdDSA Ed448 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed448 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed448 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed448 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed448 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed448 round trip]
+ expected: FAIL
+
+ [EdDSA Ed448 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed448 keys.]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 0]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 1]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 2]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 3]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 4]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 5]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 6]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 7]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 8]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 9]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 10]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 11]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 12]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 13]
+ expected: FAIL
+
[eddsa.https.any.worker.html]
- expected: ERROR
+ [EdDSA Ed25519 verification]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed25519 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed25519 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed25519 round trip]
+ expected: FAIL
+
+ [EdDSA Ed25519 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed25519 keys.]
+ expected: FAIL
+
+ [EdDSA Ed448 verification]
+ expected: FAIL
+
+ [EdDSA Ed448 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed448 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed448 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed448 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed448 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed448 round trip]
+ expected: FAIL
+
+ [EdDSA Ed448 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed448 keys.]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 0]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 1]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 2]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 3]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 4]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 5]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 6]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 7]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 8]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 9]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 10]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 11]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 12]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 13]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini b/tests/wpt/meta-legacy-layout/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini
deleted file mode 100644
index 5496474410b..00000000000
--- a/tests/wpt/meta-legacy-layout/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[mix-blend-mode-animation.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-computed-relative-color.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-computed-relative-color.html.ini
index bf29c753411..7910b706539 100644
--- a/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-computed-relative-color.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-computed-relative-color.html.ini
@@ -3370,3 +3370,60 @@
[Property color value 'color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 r g b / alpha)']
expected: FAIL
+
+ [Property color value 'rgb(from rebeccapurple calc((r / 255) * 100%) calc((g / 255) * 100%) calc((b / 255) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'hsl(from rebeccapurple calc((h / 360) * 360deg) calc((s / 100) * 100%) calc((l / 100) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'hwb(from rebeccapurple calc((h / 360) * 360deg) calc((w / 100) * 100%) calc((b / 100) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'lab(from lab(25 20 50) calc((l / 100) * 100%) calc((a / 125) * 100%) calc((b / 125) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'oklab(from oklab(0.25 0.2 0.5) calc(l * 100%) calc((a / 0.4) * 100%) calc((b / 0.4) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'oklch(from oklch(0.7 0.45 30) calc(l * 100%) calc((c / 0.4) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(xyz 7 -20.5 100) xyz calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color-mix(in xyz, color(xyz 0.7 0.5 0.3), color(xyz 0.7 0.5 0.3)) xyz x y z / alpha)']
+ expected: FAIL
+
+ [Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color-mix(in xyz, color(xyz-d50 0.7 0.5 0.3), color(xyz-d50 0.7 0.5 0.3)) xyz-d50 x y z / alpha)']
+ expected: FAIL
+
+ [Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 x y z / alpha)']
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-valid-relative-color.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-valid-relative-color.html.ini
index 3a3198a2980..3ae55c836b3 100644
--- a/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-valid-relative-color.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-color/parsing/color-valid-relative-color.html.ini
@@ -3283,3 +3283,12 @@
[e.style['color'\] = "color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 r g b / alpha)" should set the property value]
expected: FAIL
+
+ [e.style['color'\] = "color(from color-mix(in xyz, color(xyz 0.7 0.5 0.3), color(xyz 0.7 0.5 0.3)) xyz x y z / alpha)" should set the property value]
+ expected: FAIL
+
+ [e.style['color'\] = "color(from color-mix(in xyz, color(xyz-d50 0.7 0.5 0.3), color(xyz-d50 0.7 0.5 0.3)) xyz-d50 x y z / alpha)" should set the property value]
+ expected: FAIL
+
+ [e.style['color'\] = "color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 x y z / alpha)" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini b/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini
index 2b2e0fce8eb..80111fb0236 100644
--- a/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-flexbox/abspos/position-absolute-013.html.ini
@@ -1,5 +1,4 @@
[position-absolute-013.html]
- expected: TIMEOUT
[.flexbox 309]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-block-interpolation.html.ini b/tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-block-interpolation.html.ini
new file mode 100644
index 00000000000..9ed9f243664
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-block-interpolation.html.ini
@@ -0,0 +1,18 @@
+[margin-block-interpolation.html]
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (-0.3) should be [7px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (0) should be [10px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (0.3) should be [13px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (0.6) should be [16px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (1) should be [20px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (1.5) should be [25px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-inline-interpolation.html.ini b/tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-inline-interpolation.html.ini
new file mode 100644
index 00000000000..e7ff928b03a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-logical/animations/margin-inline-interpolation.html.ini
@@ -0,0 +1,18 @@
+[margin-inline-interpolation.html]
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (-0.3) should be [7px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (0) should be [10px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (0.3) should be [13px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (0.6) should be [16px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (1) should be [20px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (1.5) should be [25px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-001.html.ini
new file mode 100644
index 00000000000..5800d47e755
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-001.html.ini
@@ -0,0 +1,2 @@
+[position-sticky-padding-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-002.html.ini
new file mode 100644
index 00000000000..57078a93de2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-position/sticky/position-sticky-padding-002.html.ini
@@ -0,0 +1,2 @@
+[position-sticky-padding-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-sizing/dynamic-available-size-iframe.html.ini b/tests/wpt/meta-legacy-layout/css/css-sizing/dynamic-available-size-iframe.html.ini
new file mode 100644
index 00000000000..35256741d38
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-sizing/dynamic-available-size-iframe.html.ini
@@ -0,0 +1,2 @@
+[dynamic-available-size-iframe.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini
new file mode 100644
index 00000000000..4a1aebd46cb
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini
@@ -0,0 +1,78 @@
+[canonical-order-outline-sub-properties-001.html]
+ [testing outline: blue]
+ expected: FAIL
+
+ [testing outline: invert]
+ expected: FAIL
+
+ [testing outline: 4px]
+ expected: FAIL
+
+ [testing outline: solid]
+ expected: FAIL
+
+ [testing outline: solid 5px]
+ expected: FAIL
+
+ [testing outline: 6px dashed]
+ expected: FAIL
+
+ [testing outline: dotted blue]
+ expected: FAIL
+
+ [testing outline: dotted invert]
+ expected: FAIL
+
+ [testing outline: blue solid]
+ expected: FAIL
+
+ [testing outline: invert solid]
+ expected: FAIL
+
+ [testing outline: black 4px]
+ expected: FAIL
+
+ [testing outline: invert 4px]
+ expected: FAIL
+
+ [testing outline: 5px blue]
+ expected: FAIL
+
+ [testing outline: 5px invert]
+ expected: FAIL
+
+ [testing outline: black solid 6px]
+ expected: FAIL
+
+ [testing outline: invert solid 6px]
+ expected: FAIL
+
+ [testing outline: blue 4px dotted]
+ expected: FAIL
+
+ [testing outline: invert 4px dotted]
+ expected: FAIL
+
+ [testing outline: dashed 5px black]
+ expected: FAIL
+
+ [testing outline: dashed 5px invert]
+ expected: FAIL
+
+ [testing outline: solid blue 6px]
+ expected: FAIL
+
+ [testing outline: solid invert 6px]
+ expected: FAIL
+
+ [testing outline: 4px dotted black]
+ expected: FAIL
+
+ [testing outline: 4px dotted invert]
+ expected: FAIL
+
+ [testing outline: 5px blue dashed]
+ expected: FAIL
+
+ [testing outline: 5px invert dashed]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini
index dad7beac230..c814fd636a2 100644
--- a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini
@@ -334,3 +334,87 @@
[Web Animations: property <height> from [0\] to [calc-size(max-content, size)\] at (1.25) should be [125px\]]
expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini
index 0a3d25827ee..7903a1dbc54 100644
--- a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini
@@ -166,3 +166,147 @@
[Web Animations: property <width> from [calc-size(min-content, 0px)\] to [calc-size(min-content, size)\] at (1.25) should be [125px\]]
expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-height.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-height.tentative.html.ini
index 9a753b3a13b..1d0e72e7a8a 100644
--- a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-height.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-height.tentative.html.ini
@@ -88,3 +88,9 @@
[resolved height for height in definite height container: calc-size(any, 31% + 12px)]
expected: FAIL
+
+ [resolved height for height in auto height container: calc-size(auto, size * 1.5)]
+ expected: FAIL
+
+ [resolved height for height in definite height container: calc-size(auto, size * 1.5)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-parsing.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-parsing.tentative.html.ini
index 24d7ae6ee1d..718f44321fa 100644
--- a/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-parsing.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-parsing.tentative.html.ini
@@ -40,3 +40,15 @@
[e.style['width'\] = "calc-size(calc-size(min-content, size), size)" should set the property value]
expected: FAIL
+
+ [e.style['width'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
+
+ [e.style['min-width'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
+
+ [e.style['height'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
+
+ [e.style['min-height'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-values/round-function.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/round-function.html.ini
index ec981e25fe1..7bd83004aa4 100644
--- a/tests/wpt/meta-legacy-layout/css/css-values/round-function.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-values/round-function.html.ini
@@ -838,3 +838,27 @@
[calc(0 - round(to-zero, -18, 10)) should be used-value-equivalent to 10]
expected: FAIL
+
+ [round(1.5) should be used-value-equivalent to 2]
+ expected: FAIL
+
+ [round(up, 1.5) should be used-value-equivalent to 2]
+ expected: FAIL
+
+ [round(down, 1.5) should be used-value-equivalent to 1]
+ expected: FAIL
+
+ [round(to-zero, 1.5) should be used-value-equivalent to 1]
+ expected: FAIL
+
+ [round(-1.5) should be used-value-equivalent to -1]
+ expected: FAIL
+
+ [round(up, -1.5) should be used-value-equivalent to -1]
+ expected: FAIL
+
+ [round(down, -1.5) should be used-value-equivalent to -2]
+ expected: FAIL
+
+ [round(to-zero, -1.5) should be used-value-equivalent to -1]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini
new file mode 100644
index 00000000000..b0b04c01253
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini
@@ -0,0 +1,2 @@
+[viewport-units-scrollbars-auto-vhw-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/elementsFromPoint-iframes.html.ini
index 314c2710dc9..78f6aab8d85 100644
--- a/tests/wpt/meta-legacy-layout/css/cssom-view/elementsFromPoint-iframes.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/cssom-view/elementsFromPoint-iframes.html.ini
@@ -1,3 +1,6 @@
[elementsFromPoint-iframes.html]
[elementsFromPoint on the root document for points in iframe elements]
expected: FAIL
+
+ [elementsFromPoint on inner documents]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini b/tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini
new file mode 100644
index 00000000000..54be6839527
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini
@@ -0,0 +1,2 @@
+[CSSStyleSheet-constructable-insertRule-base-uri.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom/getComputedStyle-pseudo-with-argument.html.ini b/tests/wpt/meta-legacy-layout/css/cssom/getComputedStyle-pseudo-with-argument.html.ini
index 4a0d0c68841..a1903ed413d 100644
--- a/tests/wpt/meta-legacy-layout/css/cssom/getComputedStyle-pseudo-with-argument.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/cssom/getComputedStyle-pseudo-with-argument.html.ini
@@ -40,3 +40,27 @@
[This pseudo-element should not parse: ::view-transition-group(*)]
expected: FAIL
+
+ [This pseudo-element should not parse: :highlight(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: ::view-transition-image-pair(*)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: ::view-transition-old(*)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: ::view-transition-new(*)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-group(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-image-pair(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-old(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-new(name)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini b/tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini
new file mode 100644
index 00000000000..eb3e0818641
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini
@@ -0,0 +1,3 @@
+[script-does-not-run-on-child-removal.window.html]
+ [Script execution is never triggered on child removals]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-from.any.js.ini b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-from.any.js.ini
new file mode 100644
index 00000000000..511526b2d27
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/dom/observable/tentative/observable-from.any.js.ini
@@ -0,0 +1,80 @@
+[observable-from.any.html]
+ [from(): Observable.from() is a function]
+ expected: FAIL
+
+ [from(): Failed conversions]
+ expected: FAIL
+
+ [from(): Given an observable, it returns that exact observable]
+ expected: FAIL
+
+ [from(): Given an array]
+ expected: FAIL
+
+ [from(): Iterable converts to Observable]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (one observable)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (many observables)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] next() throws error]
+ expected: FAIL
+
+ [from(): Converts Promise to Observable]
+ expected: FAIL
+
+ [from(): Converts rejected Promise to Observable. No `unhandledrejection` event when error is handled by subscription]
+ expected: FAIL
+
+ [from(): Rejections not handled by subscription are reported to the global, and still not sent as an unhandledrejection event]
+ expected: FAIL
+
+ [from(): Observable that implements @@iterator protocol gets converted as an Observable, not iterator]
+ expected: FAIL
+
+ [from(): Promise that implements @@iterator protocol gets converted as an iterable, not Promise]
+ expected: FAIL
+
+
+[observable-from.any.worker.html]
+ [from(): Observable.from() is a function]
+ expected: FAIL
+
+ [from(): Failed conversions]
+ expected: FAIL
+
+ [from(): Given an observable, it returns that exact observable]
+ expected: FAIL
+
+ [from(): Given an array]
+ expected: FAIL
+
+ [from(): Iterable converts to Observable]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (one observable)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (many observables)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] next() throws error]
+ expected: FAIL
+
+ [from(): Converts Promise to Observable]
+ expected: FAIL
+
+ [from(): Converts rejected Promise to Observable. No `unhandledrejection` event when error is handled by subscription]
+ expected: FAIL
+
+ [from(): Rejections not handled by subscription are reported to the global, and still not sent as an unhandledrejection event]
+ expected: FAIL
+
+ [from(): Observable that implements @@iterator protocol gets converted as an Observable, not iterator]
+ expected: FAIL
+
+ [from(): Promise that implements @@iterator protocol gets converted as an iterable, not Promise]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini b/tests/wpt/meta-legacy-layout/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini
new file mode 100644
index 00000000000..15ff6f9f14f
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini
@@ -0,0 +1,14 @@
+[Range-in-shadow-after-the-shadow-removed.html?mode=open]
+ [Range in shadow should stay in the shadow after the host is removed]
+ expected: FAIL
+
+ [Range in shadow should stay in the shadow after the host parent is removed]
+ expected: FAIL
+
+
+[Range-in-shadow-after-the-shadow-removed.html?mode=closed]
+ [Range in shadow should stay in the shadow after the host is removed]
+ expected: FAIL
+
+ [Range in shadow should stay in the shadow after the host parent is removed]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini
index f9de5391ad6..36a410bfecb 100644
--- a/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/fetch/metadata/generated/css-images.sub.tentative.html.ini
@@ -146,3 +146,6 @@
[list-style-image sec-fetch-site - HTTPS downgrade-upgrade]
expected: FAIL
+
+ [border-image sec-fetch-site - HTTPS downgrade (header not sent)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini
new file mode 100644
index 00000000000..c1275567154
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini
@@ -0,0 +1,2 @@
+[pageswap-push-with-cross-origin-redirect.sub.html]
+ expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini
new file mode 100644
index 00000000000..4843ecd671f
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini
@@ -0,0 +1,2 @@
+[pageswap-replace-with-cross-origin-redirect.sub.html]
+ expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini
new file mode 100644
index 00000000000..0880906d129
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini
@@ -0,0 +1,2 @@
+[pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html]
+ expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini
deleted file mode 100644
index 4ecd6d9f753..00000000000
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[navigation-unload-cross-origin.sub.window.html]
- [Cross-origin navigation started from unload handler must be ignored]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini
new file mode 100644
index 00000000000..addd810a23d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.disconnected-font-size-math.html]
+ expected: CRASH
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
deleted file mode 100644
index 5ef89398095..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html]
- [getTextureFormat() returns RGBA16F for a float16 context]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
deleted file mode 100644
index d0dd1552396..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html]
- [getTextureFormat() returns RGBA8 or BGRA8 for a typical context]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini
new file mode 100644
index 00000000000..5c8a8ac3b42
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini
@@ -0,0 +1,2 @@
+[offscreencanvas-worker-font-load-crash.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
deleted file mode 100644
index 5ef89398095..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html]
- [getTextureFormat() returns RGBA16F for a float16 context]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini
deleted file mode 100644
index 6250c94a0e1..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.html]
- [getTextureFormat() returns RGBA16F for a float16 context]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
deleted file mode 100644
index d0dd1552396..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html]
- [getTextureFormat() returns RGBA8 or BGRA8 for a typical context]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini
deleted file mode 100644
index e137417e456..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.html]
- [getTextureFormat() returns RGBA8 or BGRA8 for a typical context]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/idlharness.https.html.ini b/tests/wpt/meta-legacy-layout/html/dom/idlharness.https.html.ini
index a26ec9c194c..4cf9d394ec2 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/idlharness.https.html.ini
@@ -5138,3 +5138,9 @@
[HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type]
expected: FAIL
+
+ [HTMLElement interface: attribute writingSuggestions]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "writingSuggestions" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini b/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
index 8b8af2b9c2e..2ef0896e3b3 100644
--- a/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
@@ -1,3 +1,4 @@
[document-base-url-window-initiator-is-not-opener.https.window.html]
+ expected: TIMEOUT
[window.open() gets base url from initiator not opener.]
expected: [FAIL, PASS, TIMEOUT]
diff --git a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index d169bd2e9fa..222af3948d5 100644
--- a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,4 +1,5 @@
[supported-elements.html]
+ expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini
new file mode 100644
index 00000000000..e496953d4cb
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini
@@ -0,0 +1,2 @@
+[headings-styles-no-h1-in-section.tentative.html]
+ expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index 4b77e7d8e61..7df8f9458e9 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-2.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index f2378357bcc..76e34322dca 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
- expected: CRASH
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/permission-element/bounded-css-properties.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/permission-element/bounded-css-properties.html.ini
new file mode 100644
index 00000000000..1550ee5cbed
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/permission-element/bounded-css-properties.html.ini
@@ -0,0 +1,3 @@
+[bounded-css-properties.html]
+ [Properties with out-of-bounds values should be corrected]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/permission-element/negative-offset-and-margin.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/permission-element/negative-offset-and-margin.html.ini
index 2fbc21dcde6..3d6e5550fe3 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/permission-element/negative-offset-and-margin.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/permission-element/negative-offset-and-margin.html.ini
@@ -4,3 +4,6 @@
[Positive margins/offset are unaffected]
expected: FAIL
+
+ [Expressions margins/offset should always return at least 0px]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/navigation-timing/idlharness.window.js.ini b/tests/wpt/meta-legacy-layout/navigation-timing/idlharness.window.js.ini
index 89e59978de2..fb0b3394055 100644
--- a/tests/wpt/meta-legacy-layout/navigation-timing/idlharness.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/navigation-timing/idlharness.window.js.ini
@@ -106,3 +106,9 @@
[PerformanceNavigationTiming interface: performance.getEntriesByType("navigation")[0\] must inherit property "criticalCHRestart" with the proper type]
expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute notRestoredReasons]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: performance.getEntriesByType("navigation")[0\] must inherit property "notRestoredReasons" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resource-timing/nested-context-navigations-iframe.html.ini b/tests/wpt/meta-legacy-layout/resource-timing/nested-context-navigations-iframe.html.ini
deleted file mode 100644
index 4164d42f08e..00000000000
--- a/tests/wpt/meta-legacy-layout/resource-timing/nested-context-navigations-iframe.html.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[nested-context-navigations-iframe.html]
- expected: TIMEOUT
- [Test that iframe refreshes are not observable by the parent]
- expected: NOTRUN
-
- [Test that crossorigin iframe refreshes are not observable by the parent]
- expected: NOTRUN
-
- [Test that cross-site iframe refreshes are not observable by the parent]
- expected: NOTRUN
-
- [Test that iframe navigations are not observable by the parent]
- expected: NOTRUN
-
- [Test that crossorigin iframe navigations are not observable by the parent]
- expected: NOTRUN
-
- [Test that cross-site iframe navigations are not observable by the parent]
- expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini b/tests/wpt/meta-legacy-layout/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini
new file mode 100644
index 00000000000..1c8381ae567
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini
@@ -0,0 +1,2 @@
+[selection-modify-line-boundary-around-shadow.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini b/tests/wpt/meta-legacy-layout/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini
new file mode 100644
index 00000000000..ca18d1156b2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini
@@ -0,0 +1,26 @@
+[selection-range-in-shadow-after-the-shadow-removed.tentative.html?mode=closed]
+ [Selection range in shadow should not be as a selection range after the host is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host parent is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceWith)]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceChild]
+ expected: FAIL
+
+
+[selection-range-in-shadow-after-the-shadow-removed.tentative.html?mode=open]
+ [Selection range in shadow should not be as a selection range after the host is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host parent is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceWith)]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceChild]
+ expected: FAIL
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 06e2c3d496d..5a0a92b31fd 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -559,35 +559,35 @@
},
"css-anchor-position": {
"anchor-scroll-composited-scrolling-001-crash.html": [
- "005a27393a23b8efc70b2f52bd3c1f479d36b70c",
+ "4dd9bad60eae27737e7b69739dc8f6629204c8bb",
[
null,
{}
]
],
"anchor-scroll-composited-scrolling-002-crash.html": [
- "83ce1468252532d4ddc3c8b5bb31bf1b9fcef9cf",
+ "80dabbb6661e56aa9450574d3c545668946bda09",
[
null,
{}
]
],
"anchor-scroll-composited-scrolling-003-crash.html": [
- "594c844bfb5c7e374c19029ca02e84453ba5357a",
+ "f46d902ffee7ce2867a1d422d25973bca7dc6dc6",
[
null,
{}
]
],
"anchor-scroll-composited-scrolling-004-crash.html": [
- "226a1b099c3b120d4450dda13a6f0dffeacbf9ac",
+ "ee5ad2f41ae3a7b99f65c38de00e03595c380e9f",
[
null,
{}
]
],
"anchor-scroll-composited-scrolling-005-crash.html": [
- "639e2e064a79bfecac4eb131a4f3726e3d9bab3c",
+ "c5e44a79e797316249fa46e1e870e26ca9a13a5e",
[
null,
{}
@@ -3576,6 +3576,13 @@
null,
{}
]
+ ],
+ "pseudo-where-crash.html": [
+ "c069872c60be3368d919ebfe158601b195857512",
+ [
+ null,
+ {}
+ ]
]
},
"css-overflow": {
@@ -5128,6 +5135,20 @@
]
}
},
+ "link-sharing-crash.html": [
+ "3bcce92d49d67bd694028db2549b65eb5644fdca",
+ [
+ null,
+ {}
+ ]
+ ],
+ "pseudo-where-crash.html": [
+ "ad683ac8b9e0223666b6e3ccfc951a9817be0d32",
+ [
+ null,
+ {}
+ ]
+ ],
"spurious-brace-crash.html": [
"b1a462a9690ea40836c0d7cb0cdf9779b9702750",
[
@@ -6185,6 +6206,17 @@
}
},
"offscreen": {
+ "manual": {
+ "the-offscreen-canvas": {
+ "offscreencanvas-worker-font-load-crash.html": [
+ "1baf7847deab9f46cce410f39087b3f9db389ca6",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
+ },
"set-proprietary-font-names-001-crash.html": [
"dfa661655ec6210a7e8ca7de415973cff628b706",
[
@@ -7000,6 +7032,13 @@
{}
]
],
+ "1140268-1.html": [
+ "5e5510ba7fd920896c28c7d1f52ff4268af3ae16",
+ [
+ null,
+ {}
+ ]
+ ],
"1221888-1.html": [
"741daa7503fb5a997478bbcc252aeb7cbdd093cf",
[
@@ -7021,6 +7060,27 @@
{}
]
],
+ "1397439-1.html": [
+ "b617f8e0ed83d11f18e1dbbcab0d2bf445d3b7c5",
+ [
+ null,
+ {}
+ ]
+ ],
+ "1403465.html": [
+ "924392757b318ffa5d9e75fc0630247a4207c2ac",
+ [
+ null,
+ {}
+ ]
+ ],
+ "1435015.html": [
+ "329aaca22f8ef02c05750cc221fc03e577ac8e7f",
+ [
+ null,
+ {}
+ ]
+ ],
"151054-1.xml": [
"f634d089f3cebe9bb671f7b807edc333242c6063",
[
@@ -7028,6 +7088,20 @@
{}
]
],
+ "1555757-1.html": [
+ "04f2b27a6020aa542047e46920dfa7b749bb70b5",
+ [
+ null,
+ {}
+ ]
+ ],
+ "1555757-2.html": [
+ "eff048784a184a166efbc532e10190b8b67a2334",
+ [
+ null,
+ {}
+ ]
+ ],
"1600635.html": [
"d6ad31588539f4a84c0330a99644afefef605ddf",
[
@@ -7035,6 +7109,20 @@
{}
]
],
+ "1701975-1.html": [
+ "c7d54ca996f2af02863bf24e3a698fc2fa29a165",
+ [
+ null,
+ {}
+ ]
+ ],
+ "243159-2.xhtml": [
+ "ff0326816d8041ac9b1568b271390e456b8ead4e",
+ [
+ null,
+ {}
+ ]
+ ],
"289180-1.xml": [
"8d1f2e843c570ce5d427eb23bc911f2eabc75464",
[
@@ -7042,6 +7130,13 @@
{}
]
],
+ "306902-1.xml": [
+ "24e8c068a0d3e10f031eec95b7b10f90b05457fa",
+ [
+ null,
+ {}
+ ]
+ ],
"307826-1.xhtml": [
"02d436e8259f6f4f28589cb01e5e11405eae36ec",
[
@@ -7126,6 +7221,13 @@
{}
]
],
+ "347506-1.xhtml": [
+ "4119389a56d5a518d7cd6cd16dc9b0de03a4f54e",
+ [
+ null,
+ {}
+ ]
+ ],
"347507-1.xhtml": [
"274ae48ff2167c5961cab67da79c13be2d91b75e",
[
@@ -7175,6 +7277,13 @@
{}
]
],
+ "355993-1.xhtml": [
+ "cbbddf013aafd02f01a1134d2f921a5a51ec3ba8",
+ [
+ null,
+ {}
+ ]
+ ],
"364685-1.xhtml": [
"ab2b56a2f80352afe80ca7425f6575a28ac69869",
[
@@ -7182,6 +7291,13 @@
{}
]
],
+ "364686-1.xhtml": [
+ "add9238d8fa929a1150fbf14cb25c7dd60fe4803",
+ [
+ null,
+ {}
+ ]
+ ],
"366012-1.xhtml": [
"55f29f3ac3e440f99d1eca9f355fe8f0a8d10a76",
[
@@ -7210,6 +7326,13 @@
{}
]
],
+ "368461-1.xhtml": [
+ "d5baccf523eddfdb99fe3069e6eb7621e2e1248e",
+ [
+ null,
+ {}
+ ]
+ ],
"370791-1.xhtml": [
"d72eb5f709f43451894a3dbf5c408aecfc0186dd",
[
@@ -7224,6 +7347,13 @@
{}
]
],
+ "370884-1.xhtml": [
+ "3959d4b1781ed3dde767fbd30ae4407dbfd86f8f",
+ [
+ null,
+ {}
+ ]
+ ],
"372483-1.xhtml": [
"41edd7d9b71c03ec8dfb10a1650fe05d53c89477",
[
@@ -7287,6 +7417,27 @@
{}
]
],
+ "382208-1.xhtml": [
+ "88d2728bfe6656e29f177ddb42b6df535cdf6bbb",
+ [
+ null,
+ {}
+ ]
+ ],
+ "382396-1.xhtml": [
+ "89af7ea18ddb99cf38444bf1034465d858141b6c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "384649-1.xhtml": [
+ "e2ba50cdeec72e3b2e2ab8d884022794ef230135",
+ [
+ null,
+ {}
+ ]
+ ],
"385226-1.xhtml": [
"b1d261eb380b250693318b24e93ad6add9b89971",
[
@@ -7294,6 +7445,20 @@
{}
]
],
+ "385265-1.xhtml": [
+ "7994653ffa78ecf1df691d96f6f63d03d7cf55ae",
+ [
+ null,
+ {}
+ ]
+ ],
+ "385289-1.xhtml": [
+ "8f0e871aaf4a5ca99c7abf57089a3f40b39f5634",
+ [
+ null,
+ {}
+ ]
+ ],
"393760-1.xhtml": [
"cb5c2d7a129df166d1445b558045fd131c68341d",
[
@@ -7301,6 +7466,20 @@
{}
]
],
+ "394150-1.xhtml": [
+ "ee54a8dd3b77542d22012f228ca00682341b9e53",
+ [
+ null,
+ {}
+ ]
+ ],
+ "395450-1.xhtml": [
+ "79510267bacc1e848b7a5d678ac64674d77cd2a6",
+ [
+ null,
+ {}
+ ]
+ ],
"397518-1.xhtml": [
"bc460ead11ca2779dd401c730f5f6493e7edf2e0",
[
@@ -7315,6 +7494,20 @@
{}
]
],
+ "399676-1.xhtml": [
+ "82b547e5eafe208ffe9a1f044a09c739242f42f6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "400445-1.xhtml": [
+ "9cb71dbbd6e12f1fb7536eda562fbc4619f5002f",
+ [
+ null,
+ {}
+ ]
+ ],
"400475-1.xhtml": [
"13ff2fcb6303837499112433b1ba24f4b90e6108",
[
@@ -7322,6 +7515,13 @@
{}
]
],
+ "400904-1.xhtml": [
+ "a00f42fd0200f5c645d9e932d10606bc328b9057",
+ [
+ null,
+ {}
+ ]
+ ],
"402400-1.xhtml": [
"5212d67f163f04f294096bb035cc486f9f7fd1c8",
[
@@ -7357,6 +7557,20 @@
{}
]
],
+ "410728-1.xml": [
+ "deaeb8fc5536d56c9d67ec17b5e13b16f4bd7ae3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "411603-1.html": [
+ "596565fbc38e3bce53ef812418673279f9324266",
+ [
+ null,
+ {}
+ ]
+ ],
"412237-1.xml": [
"2e8f13b73e0ea6a6969b8546428d2f66c8025657",
[
@@ -7371,6 +7585,13 @@
{}
]
],
+ "413274-1.xhtml": [
+ "19d8fab0fdee28beca010007fecc03a7f669af4d",
+ [
+ null,
+ {}
+ ]
+ ],
"416907-1.xhtml": [
"94a9abde2129a12ca0b83714f13204554b7acc2b",
[
@@ -7378,6 +7599,13 @@
{}
]
],
+ "418007-1.xhtml": [
+ "f07a693444eb1d4c035a2dc4ee2c808ca9f4bd01",
+ [
+ null,
+ {}
+ ]
+ ],
"420420-1.xhtml": [
"db17b277a781d4b37b371a3a686aac9772cc653a",
[
@@ -7420,6 +7648,13 @@
{}
]
],
+ "467914-1.html": [
+ "4f518f09df3274a6a6bf40e1967b168271117922",
+ [
+ null,
+ {}
+ ]
+ ],
"476547-1.xhtml": [
"0cece35eaa3945cae201d82e9bfe8c01732f9ce4",
[
@@ -7434,6 +7669,13 @@
{}
]
],
+ "547843-1.xhtml": [
+ "0ad086d90c39ff324972551c8d7b1925a388202a",
+ [
+ null,
+ {}
+ ]
+ ],
"557474-1.html": [
"1bf8d534ca259896654a9671fa0fddd7c8da6a9e",
[
@@ -7455,6 +7697,13 @@
{}
]
],
+ "700031.xhtml": [
+ "70f924279efa2b010e65cb8384f347d59081c065",
+ [
+ null,
+ {}
+ ]
+ ],
"713606-1.html": [
"a0d4939a83fb8754e74d22847df1d156315c38b8",
[
@@ -7721,6 +7970,13 @@
{}
]
],
+ "selection-modify-line-boundary-around-shadow.html": [
+ "bfca0402a7096a61b17d8dfa68f736f76fd3dcfa",
+ [
+ null,
+ {}
+ ]
+ ],
"selection-modify-line-next-to-textarea.html": [
"b685add01c004885a32e22211acad17843f1d132",
[
@@ -10048,7 +10304,7 @@
]
],
"console-countReset-logging-manual.html": [
- "7fe01f50edbfa180a575511dbbf6694f5f51e133",
+ "f0a9358fba5d74b82bb39000d5d42f18d6ea2795",
[
null,
{}
@@ -20102,6 +20358,15 @@
}
}
},
+ "document-picture-in-picture": {
+ "hide-return-to-opener-button-manual.https.html": [
+ "17cd6657ddae58350638f02813f736ed5b10597e",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"dpub-aam": {
"manual": {
"doc-abstract-manual.html": [
@@ -24322,7 +24587,7 @@
]
],
"animate-elem-30-t-manual.svg": [
- "d27f9a1d6dafdaff3ed4ee17f6616ca5bd1bf83b",
+ "bfc4cb48612a9aa38edc3f720d65f9726586a57c",
[
null,
{}
@@ -24560,7 +24825,7 @@
]
],
"animate-elem-85-t-manual.svg": [
- "6c09ffb3b59f4c035a9cf4aaae1895bda9244663",
+ "c5ded325cd88498f9f65a3dc8e946747e004f67f",
[
null,
{}
@@ -24651,7 +24916,7 @@
]
],
"animate-pservers-grad-01-b-manual.svg": [
- "98456fb0736ee3286148fa29f03b21e53ce7f2cd",
+ "15672bac5fc0f3dfa03422ce8194103416e4c591",
[
null,
{}
@@ -30715,6 +30980,21 @@
{}
]
],
+ "grid": {
+ "monolithic-overflow-print.html": [
+ "9b174caf96cb69c201115910fe746bd74153017b",
+ [
+ null,
+ [
+ [
+ "/css/css-break/grid/monolithic-overflow-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"ink-overflow-001-print.html": [
"495153d3d423b014aa40aeed87ea0a899edce1f5",
[
@@ -30741,6 +31021,19 @@
{}
]
],
+ "overflowing-block-002-print.html": [
+ "3cba4b421fab252b1efbd28d19bbf3d470aafdce",
+ [
+ null,
+ [
+ [
+ "/css/css-break/overflowing-block-002-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"overflowing-block-print.html": [
"daa9e24f33a49546f852fe387814ec9aa8b56e90",
[
@@ -31034,6 +31327,21 @@
]
]
},
+ "css-grid": {
+ "grid-fragmentation-between-rows-001-print.tentative.html": [
+ "01fd97528fc5f470400b569f6169799d143d8259",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/grid-fragmentation-between-rows-001-print-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"css-multicol": {
"auto-fill-auto-size-001-print.html": [
"6652fe18e9d41ea08b25b8436698c6149776e404",
@@ -120433,34 +120741,8 @@
{}
]
],
- "anchor-default-001.html": [
- "1700a84aa8814e0f6e0533125803609fa6568535",
- [
- null,
- [
- [
- "/css/css-anchor-position/anchor-default-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "anchor-default-002.html": [
- "c0a962ad3679a7b96f906e6a213f2aeb74f10a97",
- [
- null,
- [
- [
- "/css/css-anchor-position/anchor-default-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"anchor-position-circular.html": [
- "8efbeb09e2030487f7f3fcd077fb53550a57dc94",
+ "85fca57421cb1380b8b83c1fe778cefb1e14ce79",
[
null,
[
@@ -120473,7 +120755,7 @@
]
],
"anchor-position-top-layer-001.html": [
- "055459551b8c94cf884ca4ea5266e6c590e29cbc",
+ "a8513bb74ca02918d8cdc274669d583f450a2318",
[
null,
[
@@ -120486,7 +120768,7 @@
]
],
"anchor-position-top-layer-002.html": [
- "a87a9d7eedd8995e7eba1753e26cfe4addbcd0c5",
+ "9ce0b8e5f9fe50bc6d38829ae7f43f98a40256cf",
[
null,
[
@@ -120499,7 +120781,7 @@
]
],
"anchor-position-top-layer-003.html": [
- "96d5219c5ce5500d5a44f6c64e27a71587b43fba",
+ "3bc815af0cab70a754f7f353e496715e147812bd",
[
null,
[
@@ -120512,7 +120794,7 @@
]
],
"anchor-position-top-layer-004.html": [
- "c986e3f98d3c7146cb1dea40351e562b33f0178d",
+ "ad0a7b8b32f278d8a2f57a9e60e2bca6a0e1cf1f",
[
null,
[
@@ -120525,7 +120807,7 @@
]
],
"anchor-position-top-layer-005.html": [
- "cf39c77736738d571e5350730eb4f86afcfa5063",
+ "51aa482aee52eb3766caef80380c854e94866de3",
[
null,
[
@@ -120538,7 +120820,7 @@
]
],
"anchor-position-top-layer-006.html": [
- "c13284b854843faf3a7a756c45dca9b6e374cc82",
+ "a3b9e63c06b59b9f308fd221c8619fda18ef65ac",
[
null,
[
@@ -120551,7 +120833,7 @@
]
],
"anchor-scroll-001.html": [
- "8609795c8a6d0207aeb0d5f840f6d820c7cd9025",
+ "b9dfc56e2effe4d9e9c6d48002dd052ae64f6b4e",
[
null,
[
@@ -120564,7 +120846,7 @@
]
],
"anchor-scroll-chained-001.tentative.html": [
- "60ad128022640e06c1eb751c7b6fbeadc27f959b",
+ "1235f8fad4388cc4486e6871d614d732aba12472",
[
null,
[
@@ -120577,7 +120859,7 @@
]
],
"anchor-scroll-chained-002.tentative.html": [
- "e180c5646826b223fe579a22fbb7826076f51c17",
+ "9c60799e0bb40f4fed1d9e19e0091aae3d410bdb",
[
null,
[
@@ -120590,7 +120872,7 @@
]
],
"anchor-scroll-chained-003.tentative.html": [
- "8912fcb699403583adc681f1fe01632769726577",
+ "b441c92bf15f4f5a3917132cfd959e3244dfa52b",
[
null,
[
@@ -120603,7 +120885,7 @@
]
],
"anchor-scroll-chained-004.tentative.html": [
- "5834eb1f4cb2df427d99267765beff672c108e29",
+ "f1765a9870f37e7f752f8cc9274319bbbe661bad",
[
null,
[
@@ -120616,7 +120898,7 @@
]
],
"anchor-scroll-chained-fallback.tentative.html": [
- "32cd9de0054b713c623d3adab27fe53d981bdf92",
+ "d2300da818291fbf7f6f35c5e78c99b1231a5003",
[
null,
[
@@ -120629,7 +120911,7 @@
]
],
"anchor-scroll-composited-scrolling-006.html": [
- "6e57accc457f9fd341af6c3eead652f77c8e3e05",
+ "49c6dc780c785f7dcf52aadd0d536c55ee72c2c4",
[
null,
[
@@ -120642,7 +120924,7 @@
]
],
"anchor-scroll-fixedpos-002.html": [
- "5b2aa2dd50ba52048097bc1dd5afcb4a91f06ff3",
+ "1a05d8b93a1049616592cd09e656eb2bf102ecf0",
[
null,
[
@@ -120655,7 +120937,7 @@
]
],
"anchor-scroll-fixedpos.html": [
- "a32ef3f7c497a6bd403109bb776e4efc15f2cfa2",
+ "7923ed789de055a8d7a7e1b99a549f022499832d",
[
null,
[
@@ -120668,7 +120950,7 @@
]
],
"anchor-scroll-nested.html": [
- "557f748c02988b6f230aedce8b1dad7d154b5df6",
+ "291fe0d7103fa310f48a4ea3a3963b98ccdea361",
[
null,
[
@@ -120681,7 +120963,7 @@
]
],
"anchor-scroll-to-sticky-001.html": [
- "abab944751ed2d98fd3e7b4515e0499b0f3e8148",
+ "a6c3b0572533a2cb689ce23655f0b16ff47ea3b9",
[
null,
[
@@ -120694,7 +120976,7 @@
]
],
"anchor-scroll-to-sticky-002.html": [
- "357421ecf1b36123703a83929c5edd38e3a65601",
+ "e2d91fe4dd69664f9504cd6ba93d33e40617ee14",
[
null,
[
@@ -120707,7 +120989,7 @@
]
],
"anchor-scroll-to-sticky-003.html": [
- "0e770044913669c995ef4e4ea0fb1df646f9b4c1",
+ "b40f5cc8d519f023176c803ad1cf9e475f6153d9",
[
null,
[
@@ -120720,7 +121002,7 @@
]
],
"anchor-scroll-to-sticky-004.html": [
- "f7878ae8df8d198f111bd3fb7241b2a6a1b2b881",
+ "30325ce1e0fa146af4f082481f90569dda2dff19",
[
null,
[
@@ -120733,7 +121015,7 @@
]
],
"anchor-scroll-update-001.html": [
- "f11797edadb669cfe870988f9f2ae02d0c74e032",
+ "aa49fbcc6db54a74e6899ff8b1c2fb7a03d851ab",
[
null,
[
@@ -120746,7 +121028,7 @@
]
],
"anchor-scroll-update-002.html": [
- "19447952b0be25d0407d0e4dea43795dcd0570dc",
+ "5695db2a1cded6d3f56f6fd259dd5939833a57ca",
[
null,
[
@@ -120759,7 +121041,7 @@
]
],
"anchor-scroll-update-003.html": [
- "57a524c483fd2fd7308620263b09f0a28bc95e59",
+ "2e1532badfac6983d1727b19f4d597b1be54b171",
[
null,
[
@@ -120772,7 +121054,7 @@
]
],
"anchor-scroll-update-004.html": [
- "d20a7b660a69428755a33b8c3cb47585a7594bf8",
+ "87138fb2d92a8da80e19c2c6a546de2f75b9c6fe",
[
null,
[
@@ -120785,7 +121067,7 @@
]
],
"anchor-scroll-update-005.html": [
- "c2e7248c80c5ede1ac79384bfc42b51bae649b36",
+ "37874bba5528a1c3b9345801bdfd7cedd463759c",
[
null,
[
@@ -120798,7 +121080,7 @@
]
],
"anchor-scroll-update-006.html": [
- "2535c68f78738bae0f8f8e87cbb24ce8d0a35606",
+ "81defee7cf4c3d8a0dfa03391b4d52becbb585db",
[
null,
[
@@ -120811,7 +121093,7 @@
]
],
"anchor-scroll-update-007.html": [
- "4859f01d66084e5356d1e737224797f55b17fce5",
+ "33050348c4d2908f080868cce0d08311352a6eb2",
[
null,
[
@@ -120824,7 +121106,7 @@
]
],
"anchor-scroll-vlr.html": [
- "00406c825e924bca5c5dd30d452fde1fc3fcc92a",
+ "76186f9cad7daa74a3e9faa31db12df5d020979d",
[
null,
[
@@ -120837,7 +121119,7 @@
]
],
"anchor-scroll-vrl.html": [
- "2432d72899343f2aa3d95b05a0918080980ef077",
+ "13ea8b37abdd702de8e45cae81de0d29cc400430",
[
null,
[
@@ -120850,7 +121132,7 @@
]
],
"inset-area-abs-inline-container.html": [
- "52344614f0b31a57d470ab773420295e53f1cb49",
+ "3b8b25b3af095340b5a16ef0c59c2eb129135c6a",
[
null,
[
@@ -120863,7 +121145,7 @@
]
],
"inset-area-inline-container.html": [
- "91c9b09735118e0d351af9531a91dd590ea4fde9",
+ "08aa1b921d3033c804c06824b863f229f2e19fdf",
[
null,
[
@@ -120875,6 +121157,32 @@
{}
]
],
+ "position-anchor-001.html": [
+ "d927b6b902c97a565725d33874db9ce8055ea703",
+ [
+ null,
+ [
+ [
+ "/css/css-anchor-position/position-anchor-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "position-anchor-002.html": [
+ "d55338e1e9725db3cc1edf98c04c9388cc7dc6f5",
+ [
+ null,
+ [
+ [
+ "/css/css-anchor-position/position-anchor-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"sticky-anchor-position-invalid.html": [
"d1efeed5f29263fe3a16d60cbdaf9d2c26357ce5",
[
@@ -130675,7 +130983,7 @@
]
],
"table-cell-background-local-003.html": [
- "e2662bec1fa75049c07cbc07c24449e37c4c56a7",
+ "5641d3d41c0a8770feb120f2898df5262688ca6a",
[
null,
[
@@ -130684,7 +130992,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"table-cell-background-local.html": [
@@ -139762,6 +140086,19 @@
{}
]
],
+ "overflowing-block-003.html": [
+ "786a61a4927f32dc853fc9964feab8cf652472e4",
+ [
+ null,
+ [
+ [
+ "/css/css-break/overflowing-block-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"parallel-flow-trailing-margin-001.html": [
"a6391cd9d4738676417f69223038f9f603ea83d1",
[
@@ -144105,7 +144442,7 @@
]
],
"lab-l-over-100-1.html": [
- "287eba982456112335f95f9f5d999698dab4287a",
+ "be8833593d7dde1456ffabc7cef6023061e95e91",
[
null,
[
@@ -144118,7 +144455,7 @@
]
],
"lab-l-over-100-2.html": [
- "e85d289d21fa0b3269b7bfb3ab22f810c79547fe",
+ "20a95680947532c7852589d6e38c2005e6b085cb",
[
null,
[
@@ -144261,7 +144598,7 @@
]
],
"lch-l-over-100-1.html": [
- "6e0c62330c39d329bb71323caf393e8d4426e535",
+ "12d594d1a340f864b0de6d0bf54ce8047c63464d",
[
null,
[
@@ -144274,7 +144611,7 @@
]
],
"lch-l-over-100-2.html": [
- "7752d0dc0eb4d59cbb12364441b59732d025fd1d",
+ "68789b9c859f758fa938ddeaf41b3afb2cb105df",
[
null,
[
@@ -144442,8 +144779,34 @@
{}
]
],
+ "oklab-l-almost-0.html": [
+ "e8cc1b9042d44b70fd98448ef3ef92a6bb5aac0a",
+ [
+ null,
+ [
+ [
+ "/css/css-color/oklab-l-almost-0-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "oklab-l-almost-1.html": [
+ "352e7b58aa6a94a25cc0d14248f1da04a192daeb",
+ [
+ null,
+ [
+ [
+ "/css/css-color/oklab-l-almost-1-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"oklab-l-over-1-1.html": [
- "612fe32acb1a8314aca1fff850080edd9e77107b",
+ "a16fe7886f83b7ad5dabe4878341618060abeff5",
[
null,
[
@@ -144456,7 +144819,7 @@
]
],
"oklab-l-over-1-2.html": [
- "11948f014bfd279daced1c65571cb9aacd228413",
+ "6300cb8af3bc581b3f42199de94303e6c698952b",
[
null,
[
@@ -144611,8 +144974,34 @@
{}
]
],
+ "oklch-l-almost-0.html": [
+ "c171befe6428ffcd19c82761f0389a04cbdd3dbc",
+ [
+ null,
+ [
+ [
+ "/css/css-color/oklch-l-almost-0-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "oklch-l-almost-1.html": [
+ "c98cea292f9f5c7a79db3d0e88ab8427cf377c1a",
+ [
+ null,
+ [
+ [
+ "/css/css-color/oklch-l-almost-1-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"oklch-l-over-1-1.html": [
- "4eb3cda8462639e740c4e606252fc9784dab580e",
+ "c734723541d10f7ab0c2d2b18995c70ba1aff8ec",
[
null,
[
@@ -144625,7 +145014,7 @@
]
],
"oklch-l-over-1-2.html": [
- "de8b1a6cdd05c32267cded3a633456db04127888",
+ "59eac2b367764b855952c152de3bce8c627e548f",
[
null,
[
@@ -149649,7 +150038,7 @@
]
],
"contain-layout-ink-overflow-019.html": [
- "d4909aa70f597b31ca0c13a7c63ce3a810d44ccc",
+ "5cda6cd5bebb2f3353778eb17285b4dd487ca881",
[
null,
[
@@ -149658,7 +150047,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"contain-layout-ink-overflow-020.html": [
@@ -149675,7 +150080,7 @@
]
],
"contain-layout-overflow-001.html": [
- "5bf984e2bf12263526165048c4aeb0e9236c5bbb",
+ "05c66fa1e985261dcf8bab284ad05c9b88e293ba",
[
null,
[
@@ -149684,7 +150089,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"contain-layout-overflow-002.html": [
@@ -193543,65 +193964,13 @@
]
},
"text-box-trim": {
- "text-box-trim-half-leading-block-box-001-ref.html": [
- "4fc498a27bded7e4e870a055128f003383792bee",
- [
- null,
- [
- [
- "/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"text-box-trim-half-leading-block-box-001.html": [
- "9ad9ffc3fc68184745549c4759ea9534fc174527",
+ "2cbf1c26dbfa97b92a8e1a2739dae24b2042d4e3",
[
null,
[
[
- "/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "text-box-trim-half-leading-inline-box-001.html": [
- "130b68c6eb2ecfa400f9c13356a700200f49f13a",
- [
- null,
- [
- [
- "/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "text-box-trim-half-leading-inline-box-002.html": [
- "631b53697c1f6e0a1aff0153ad95e5c01cf4042b",
- [
- null,
- [
- [
- "/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
- "text-box-trim-half-leading-inline-box-003.html": [
- "4c7e33663b53fa22fa3578c3260701692d48f8b8",
- [
- null,
- [
- [
- "/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003-ref.html",
+ "/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001-ref.html",
"=="
]
],
@@ -210636,7 +211005,7 @@
]
],
"scrollbar-gutter-002.html": [
- "129eb2c08590c98505e36f63da173d1c8a4bf98d",
+ "531af61b5d35e1638586fa0383f3ce27cacc762a",
[
null,
[
@@ -210645,7 +211014,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"scrollbar-gutter-abspos-001.html": [
@@ -210753,7 +211138,7 @@
]
],
"scrollbar-gutter-vertical-lr-002.html": [
- "9e5dcd299eba99e4ab6f077149a841011805c0a5",
+ "b74aa642ca1966e044d2d3a5a145dc9130916b72",
[
null,
[
@@ -210762,11 +211147,27 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"scrollbar-gutter-vertical-rl-002.html": [
- "d68d4e5d3cba0353da274f9c75c558c0a8324092",
+ "398751845cf3d01dc47254e146d9bb1ada18bf40",
[
null,
[
@@ -210775,7 +211176,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"scrollbars-chrome-bug-001.html": [
@@ -215164,7 +215581,7 @@
]
],
"position-sticky-in-fixed-container.html": [
- "359ec2fd337e76e5ba1540754c87375c4090c1e2",
+ "75c2d67259e39513e6fbc7e5daa8d3b227a8ab9c",
[
null,
[
@@ -215173,7 +215590,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"position-sticky-inline.html": [
@@ -215293,6 +215726,32 @@
{}
]
],
+ "position-sticky-padding-001.html": [
+ "6bd4952c28fef635144b855db08efbf950f67a1c",
+ [
+ null,
+ [
+ [
+ "/css/css-position/sticky/position-sticky-padding-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "position-sticky-padding-002.html": [
+ "972288fd3a840945ef7ac3e7cf7e33aa3fdda986",
+ [
+ null,
+ [
+ [
+ "/css/css-position/sticky/position-sticky-padding-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"position-sticky-rendering.html": [
"a4e03c59d8faba77884e4a290dd188044dcb23a6",
[
@@ -226818,6 +227277,19 @@
{}
]
],
+ "grid-aspect-ratio-041.html": [
+ "8fe724308a48770ed35c7979f172eff420a4b967",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"intrinsic-size-001.html": [
"5b2c6049bd935c928f29c50bf4ad7afae41c4576",
[
@@ -247537,7 +248009,7 @@
]
],
"trailing-space-and-text-alignment-002.html": [
- "30e37908a22b669af58753fbacd3fcaaa2147803",
+ "6ee7d03d9d5e1734fd0649605c0bb5a67bd931fc",
[
null,
[
@@ -247546,7 +248018,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"trailing-space-and-text-alignment-003.html": [
@@ -247563,7 +248051,7 @@
]
],
"trailing-space-and-text-alignment-004.html": [
- "3d7aad05418bce1691ec766a598f6c1d51c00aed",
+ "69d74051f7fff67ba9d397e401da45150329f84f",
[
null,
[
@@ -247572,7 +248060,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"trailing-space-and-text-alignment-005.html": [
@@ -247602,7 +248106,7 @@
]
],
"trailing-space-and-text-alignment-rtl-002.html": [
- "0422506b516abcff0d0bd3b3e422426c67fa1e43",
+ "3da84ae5123332dd79ec30062a682fbb7cbf1afa",
[
null,
[
@@ -247611,7 +248115,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"trailing-space-and-text-alignment-rtl-003.html": [
@@ -247628,7 +248148,7 @@
]
],
"trailing-space-and-text-alignment-rtl-004.html": [
- "7705d6dfb147925308590869b061f174503e34ad",
+ "480969efc0dc7b90af54518b45788e711da7c87f",
[
null,
[
@@ -247637,7 +248157,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"trailing-space-and-text-alignment-rtl-005.html": [
@@ -279538,6 +280074,32 @@
{}
]
],
+ "viewport-units-scrollbars-auto-vhw-001.html": [
+ "04b959fa49a4bf44ae88a12209f67c910166f82f",
+ [
+ null,
+ [
+ [
+ "/css/css-values/viewport-units-scrollbars-auto-ltr-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "viewport-units-scrollbars-scroll-vhw-001.html": [
+ "c44edc2da804a12ae1971357772f4fc7051087bc",
+ [
+ null,
+ [
+ [
+ "/css/css-values/viewport-units-scrollbars-scroll-ltr-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"viewport-units-writing-mode-font-size.html": [
"fd1a4aaca5d61b51f932b1b39cf6e1719bb75824",
[
@@ -285550,6 +286112,189 @@
{}
]
],
+ "web-animations-api-parse-pseudo-argument.html": [
+ "40c9a0d0c2ec81624a06523c7b000d1a902507c0",
+ [
+ "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group( first )",
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-ref.html?first-pseudo=::view-transition-group( first )",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
+ "/css/css-view-transitions/web-animations-api-ref.html",
+ "=="
+ ],
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group( first",
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-ref.html?first-pseudo=::view-transition-group( first",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
+ "/css/css-view-transitions/web-animations-api-ref.html",
+ "=="
+ ],
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group( first)",
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-ref.html?first-pseudo=::view-transition-group( first)",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
+ "/css/css-view-transitions/web-animations-api-ref.html",
+ "=="
+ ],
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group(first",
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-ref.html?first-pseudo=::view-transition-group(first",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
+ "/css/css-view-transitions/web-animations-api-ref.html",
+ "=="
+ ],
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group(first )",
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-ref.html?first-pseudo=::view-transition-group(first )",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
+ "/css/css-view-transitions/web-animations-api-ref.html",
+ "=="
+ ],
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ],
+ [
+ "css/css-view-transitions/web-animations-api-parse-pseudo-argument.html?first-pseudo=::view-transition-group(first)",
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-ref.html?first-pseudo=::view-transition-group(first)",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ [
+ "/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html",
+ "/css/css-view-transitions/web-animations-api-ref.html",
+ "=="
+ ],
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"web-animations-api.html": [
"6d8395ebb72e4a3ec8c7a663031361d602c4f25f",
[
@@ -301100,6 +301845,19 @@
{}
]
],
+ "CSSStyleSheet-constructable-insertRule-base-uri.html": [
+ "22f298a34eb5de6eb27c13130df0162e98503d30",
+ [
+ null,
+ [
+ [
+ "/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"HTMLLinkElement-disabled-alternate.html": [
"f1457c0dcf04d27a52a29fc860e94e81d432e5af",
[
@@ -320617,7 +321375,7 @@
]
],
"fieldset-overflow.html": [
- "83813f9020910200ba5cc4b66450c02430dd6c37",
+ "089b0d9300bea4cccbe3cce540a72d833c1cef5a",
[
null,
[
@@ -320626,7 +321384,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
],
"fieldset-painting-order.html": [
@@ -325050,7 +325824,7 @@
]
],
"popover-anchor-display.tentative.html": [
- "d50dd6c857b24f5e75e979d6356151e5cf7b65c8",
+ "bddc44006dfba675982454f55807c8af39b5a983",
[
null,
[
@@ -325076,7 +325850,7 @@
]
],
"popover-anchor-scroll-display.tentative.html": [
- "7ed6cf1adf8d11ce5ab121340879ea95dd170991",
+ "2c6b0bafb942bb30c618e58de98dd032e38904f0",
[
null,
[
@@ -336029,7 +336803,7 @@
},
"responsive": {
"toggle-animated-iframe-visibility.html": [
- "f50ffaad34722afd3e626e6b41ccddf5f02ce0eb",
+ "b5c32f26d8df952e0e5e673af41473e2f8474027",
[
null,
[
@@ -336038,7 +336812,23 @@
"=="
]
],
- {}
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 50
+ ]
+ ]
+ ]
+ ]
+ }
]
]
},
@@ -339845,7 +340635,7 @@
[]
],
"eddsa.js": [
- "7817b78cff6293620aaf4bcc35807a0437a0c48b",
+ "4952df502d83ce3464af11a85b91d6a0c0d727eb",
[]
],
"eddsa_vectors.js": [
@@ -364591,6 +365381,10 @@
"126f911a58c80a62de06b6062cdb4488549471b9",
[]
],
+ "accounts_check_same_site_strict.py": [
+ "a6f385feac1ccf0885b44c43a0d0e737e4c308f6",
+ []
+ ],
"client_metadata.py": [
"72ddcc5cd62569fa280adcab9490e84b851e6780",
[]
@@ -364647,6 +365441,10 @@
"a40fc100eee697ed7dcd451626409af18606442e",
[]
],
+ "manifest_check_same_site_strict.json": [
+ "d7304159834804c417f498acebc45f59e588dcbb",
+ []
+ ],
"manifest_id_assertion_endpoint_returns_error.json": [
"e098cc4511a1980392097d0a26c020db3243ae35",
[]
@@ -364712,7 +365510,7 @@
[]
],
"request-params-check.py": [
- "b774496d5dab3e9bbce92f94cb0dc27128b909d4",
+ "6c610e6e201dd157de1338546fd6970a946e5fb6",
[]
],
"resolve.html": [
@@ -364739,6 +365537,10 @@
"7ec81c390a9ea116e0a1809e08159a1d1c40e5a1",
[]
],
+ "token_check_same_site_strict.py": [
+ "8a4b3a234bdb99f38354f706d740b823ccc6e785",
+ []
+ ],
"token_with_account_id.py": [
"52fb20184bc081186e7f9aaab7561dc87c8906bd",
[]
@@ -364769,7 +365571,7 @@
]
},
"fedcm-helper.sub.js": [
- "765b3cc48a90198c8bd053eab039cd0e1f5ba768",
+ "25fdb0995c1a2b9dfde35a3dd1d90f780b6064d1",
[]
],
"fedcm-iframe-level2.html": [
@@ -364833,7 +365635,7 @@
[]
],
"set_cookie.headers": [
- "b19ff933a6f5854923bdaf378e91d5fa63e341b0",
+ "4226ff4c9975cccb5ea799b769a6e797eea12b8b",
[]
]
}
@@ -382526,10 +383328,6 @@
"40ccc2b044b3da3be44582522d99e5a138b6f354",
[]
],
- "anchor-default-ref.html": [
- "4d7de12447c8297b8f0fc04338d80a028a3e9798",
- []
- ],
"anchor-position-top-layer-ref.html": [
"dc7f77f2b3441ebee25f3e40a9480b668ee79ea4",
[]
@@ -382538,6 +383336,10 @@
"ecf54f1a9ac2d756cb78f4d2c0690c1ac8b65916",
[]
],
+ "position-anchor-ref.html": [
+ "4d7de12447c8297b8f0fc04338d80a028a3e9798",
+ []
+ ],
"reference": {
"anchor-position-circular-ref.html": [
"6beb7c77e998b6750859580f910e97b005430e4b",
@@ -385156,6 +385958,12 @@
"5effc82452da07054ca2c3e2d74e3a9b0f84d9ea",
[]
],
+ "grid": {
+ "monolithic-overflow-print-ref.html": [
+ "58cc0828d2cd31182dac2b5e8ee555721d0ed39e",
+ []
+ ]
+ },
"line-after-unbreakable-float-after-padding-ref.html": [
"9a329b2446849d8f13b9d88cb5f73934536c3767",
[]
@@ -385192,6 +386000,14 @@
"ad74e1f53d4f27fde674dfb964366f8574cac9c1",
[]
],
+ "overflowing-block-002-print-ref.html": [
+ "0322ba04a07a7c0e36b2c4f2f9f25bc4f357ed3c",
+ []
+ ],
+ "overflowing-block-003-ref.html": [
+ "a8f86d1cfe4af41a575f22a9896bb8233a964858",
+ []
+ ],
"overflowing-block-print-ref.html": [
"cf345b59638f28ddf423ed343a269178ab47f1b9",
[]
@@ -385695,7 +386511,7 @@
[]
],
"lab-l-over-100-ref.html": [
- "57328cfa7c5569850f1d69fbcb6cab7c81b68478",
+ "eccc492079d2d7510319a60b20e7ad780bd5579c",
[]
],
"lch-004-ref.html": [
@@ -385715,7 +386531,7 @@
[]
],
"lch-l-over-100-ref.html": [
- "67766274e59aced21539d94499d3a324d11b8478",
+ "291772e166fb93f557fc1aac117716fc8ff82ba8",
[]
],
"mossgreensquare-ref.html": [
@@ -385738,8 +386554,16 @@
"c71e428aa2a88250fa5a09304885143fe6b9ae29",
[]
],
+ "oklab-l-almost-0-ref.html": [
+ "244321ea69d2d89dc1bd306fb78048ca322421c1",
+ []
+ ],
+ "oklab-l-almost-1-ref.html": [
+ "72cdf3544705d9373dd6ad595d7563a183fb5018",
+ []
+ ],
"oklab-l-over-1-ref.html": [
- "eb380dcb750e6fe1eb2a329544dc960cc4b6d891",
+ "f050bbc6434ee6e8e10d45ee4340695bfd95fbb5",
[]
],
"oklch-004-ref.html": [
@@ -385758,8 +386582,16 @@
"fd1deb36f4a7632beaf6cda83b4fa2ba9f46cf96",
[]
],
+ "oklch-l-almost-0-ref.html": [
+ "e019136f96f73efaba80b5e7aba95ac3a95e6abd",
+ []
+ ],
+ "oklch-l-almost-1-ref.html": [
+ "e1f29eaa1853c0f4454283763cf23488578dcecc",
+ []
+ ],
"oklch-l-over-1-ref.html": [
- "2c7815c5f0e408197241367e2bb38e7b7df8dfdc",
+ "ae1b5e00e57039e8f0e8d3ea3db3495acc02472b",
[]
],
"opacity-overlapping-letters-ref.html": [
@@ -399254,6 +400086,10 @@
]
}
},
+ "grid-fragmentation-between-rows-001-print-ref.tentative.html": [
+ "78464712c5cb698fd26a7a12b6c522d4bda946d6",
+ []
+ ],
"grid-item-non-auto-height-stretch-ref.html": [
"1249dbaa8c88cd1436741b6bcf526efb183a35a6",
[]
@@ -401503,16 +402339,8 @@
"e9a2fc218b369825c991e3109986481a922e671f",
[]
],
- "text-box-trim-half-leading-inline-box-001-ref.html": [
- "54df108fb9c581638784b1b28cd120fc59fa6c4e",
- []
- ],
- "text-box-trim-half-leading-inline-box-002-ref.html": [
- "0a615e6222cbe9c1cc656bc41b812619129eb2e5",
- []
- ],
- "text-box-trim-half-leading-inline-box-003-ref.html": [
- "bf0fb3283d353a06707542838a15938837e7a025",
+ "text-box-trim-half-leading-block-box-001-ref.html": [
+ "2dfe344ce35f59888337a34f1ae864925f9a35e4",
[]
]
}
@@ -405531,6 +406359,14 @@
"2a29b435a7ee5e53b5294bac40314847aec903ca",
[]
],
+ "position-sticky-padding-001-ref.html": [
+ "efe584bc8854a2f3c30ad959a8583ebc6f985684",
+ []
+ ],
+ "position-sticky-padding-002-ref.html": [
+ "cc9d447d1c6c74d4f465f9359f3f7785182bb06e",
+ []
+ ],
"position-sticky-rendering-ref.html": [
"b4411c3bed42e864e12ac4c333625693cf1625a6",
[]
@@ -406886,12 +407722,20 @@
"35b0684b26febc6255702b0560a46cb816596725",
[]
],
+ "prefer-targeted-element-main-frame-target.html": [
+ "6bc47d15efd151e252aa5e34e516cefc310205ac",
+ []
+ ],
"resources": {
"common.js": [
- "2d74baae577c9c16ca5c4a2f60363d292a596c10",
+ "1fd88949b39b56d65e096e0822f0709232e2d8e5",
[]
]
- }
+ },
+ "stash.py": [
+ "a70672ecf008efb3d5f3a8f797fad29abeb0fe97",
+ []
+ ]
}
},
"support": {
@@ -406924,7 +407768,7 @@
"css-scroll-snap-2": {
"resources": {
"common.js": [
- "1a2edab90bba958141c6e5a1b28fa3bd53408ddb",
+ "e29f9bc5b3e1af0e74301577c1c5a6164ce30fc3",
[]
],
"user-scroll-common.js": [
@@ -417284,6 +418128,18 @@
"bc914522c7fcf556c69ba56d2d0ba792d7e92b89",
[]
],
+ "viewport-units-scrollbars-auto-ltr-001-ref.html": [
+ "a8cc95cdda1d35a2a0dda0365e90b0b4d4662788",
+ []
+ ],
+ "viewport-units-scrollbars-scroll-blank-001-ref.html": [
+ "f0718d0e8d28f562e93a27c357cf826ffeeb17df",
+ []
+ ],
+ "viewport-units-scrollbars-scroll-ltr-001-ref.html": [
+ "fe9a454525c215343acfc1eeb60f3750df57654e",
+ []
+ ],
"viewport-units-writing-mode-font-size-ref.html": [
"1e09173353f9e6de48db31d595c68dbe58bba52b",
[]
@@ -420530,6 +421386,10 @@
"b45332345902c6197f02a8181f737e1e4ab7cc81",
[]
],
+ "CSSStyleSheet-constructable-insertRule-base-uri-ref.html": [
+ "2696593a45acdb27bf1cdeea26f95ccd491409dd",
+ []
+ ],
"HTMLLinkElement-disabled-alternate-ref.html": [
"5d87bfdaf5b0533f2ea7088a870ca45474d065f4",
[]
@@ -424166,7 +425026,7 @@
},
"scrolling": {
"scroll_support.js": [
- "a0aefe636ab8d5efbf8d3f6e4a6a1ad404344b2b",
+ "e536b7d7488cf964ec5da5abdc45d5f3852d8909",
[]
],
"scrollend-event-fires-to-iframe-inner-frame.html": [
@@ -435326,15 +436186,15 @@
[]
],
"name2dir-canvas.yaml": [
- "79b5fb61f283e6443861cd8e3a28022be20e6f50",
+ "1e0caff5b982da5ef914aaae6e376bf749ac412c",
[]
],
"name2dir-offscreen.yaml": [
- "3f59fd8eead9e0e11809319f5ffd924698e9fce7",
+ "6e4b3f42b2b3615a057fe61935560d826e773c64",
[]
],
"name2dir.yaml": [
- "b0e541289f59f832ae48f2fef826e355c1990e84",
+ "ae69c153780ed2398466bfa12287462bf04c3bfa",
[]
],
"templates": {
@@ -435465,10 +436325,6 @@
"video.yaml": [
"f9b48fb8daa2a247e9e22a18b5e891be3351bda9",
[]
- ],
- "webgpu-access.yaml": [
- "fcf38d1f3d050dcdc48fbfdd06ad0f2f800ba9b5",
- []
]
}
}
@@ -442439,8 +443295,8 @@
"bb625942f88c51d4eb6058586c96d574ec354e1d",
[]
],
- "sandbox-top-navigation-helper.js": [
- "e38334f4148aed427aaf2086e2a4f5ace60c480e",
+ "sandbox-top-navigation-helper.sub.js": [
+ "bec8f6a64af5f44d020f0cfb8b0ec4938d6f7025",
[]
],
"subframe.html": [
@@ -448360,6 +449216,10 @@
"e3b4bf3e4dca4eae1138c6be4f62105621765ae6",
[]
],
+ "minimize_restore_popup.html.ini": [
+ "6075b58d09cc51dc5069e446287246df76b1d5e8",
+ []
+ ],
"set_get_window_rect.html.ini": [
"a01f56c1953af25ab7128c8dda0b31bf7e54b347",
[]
@@ -448368,10 +449228,6 @@
"026e6823515d14e6069d5cb572e18a2a7413ffe4",
[]
],
- "test_win_open_with_interaction.html.ini": [
- "b1e77bd8e59cff54667270b01eb96cd19e7601e3",
- []
- ],
"virtual_authenticator.html.ini": [
"b5683f8fa991a1760b40f37d01f082e4b5a49696",
[]
@@ -449004,7 +449860,7 @@
[]
],
"css-view-transitions-2.idl": [
- "89e57e251b1783e2d5c3641cfbf9861adcf87487",
+ "d1e4eeb11e581d8f63b99fe5e08c83801aba16e8",
[]
],
"css-view-transitions.idl": [
@@ -449044,7 +449900,7 @@
[]
],
"document-picture-in-picture.idl": [
- "f54f437a9365a7f8540fb1bb1c42a3c9118cbf57",
+ "888855b38f2d0d4881974b7f7a6703ca674e4847",
[]
],
"dom.idl": [
@@ -449156,7 +450012,7 @@
[]
],
"html.idl": [
- "7211231980f6d71e04bd0f33ac415b86c7440c00",
+ "d2caf12b5bf6046c3a03869178066be97b074757",
[]
],
"idle-detection.idl": [
@@ -449227,8 +450083,12 @@
"10e2e1f012e92139a1f6cdfe3bf4f4d7e52474d1",
[]
],
+ "long-animation-frames.idl": [
+ "79a42ca8f0a5a853712062db8ef55a025f6476db",
+ []
+ ],
"longtasks.idl": [
- "e5b6ece16a1c373905f1b8a8561b1dc402704311",
+ "3717469fd09ac2c7cba97585d5c4afee4d101b98",
[]
],
"magnetometer.idl": [
@@ -449276,7 +450136,7 @@
[]
],
"mediacapture-streams.idl": [
- "373f0c328d93d5ca2699c68a523860f69debe1f9",
+ "f2ca21389e921ff29e5c5cb5ccc96278a00d6777",
[]
],
"mediacapture-transform.idl": [
@@ -449304,7 +450164,7 @@
[]
],
"navigation-timing.idl": [
- "355950160e336d9c1331816f2b2f72cb5ff6e4c5",
+ "b381b486e1978fa771268d13694fabf5d9529378",
[]
],
"netinfo.idl": [
@@ -449372,7 +450232,7 @@
[]
],
"permissions.idl": [
- "fbcb674e5618af1e96b9044cbd0b29ef82d06c14",
+ "62c2e3ad76f0ebe99b46b3ea4aa6ec6451bdad31",
[]
],
"picture-in-picture.idl": [
@@ -449564,11 +450424,11 @@
[]
],
"turtledove.idl": [
- "8a2d7bb594f56d163acbc0cd88605857f1c608ca",
+ "87aec6e6bca8e178d54f7f867f3d5f9dea50b1d7",
[]
],
"ua-client-hints.idl": [
- "6a40e1bdc4bae6dddcb649d7f146fb6aba74b516",
+ "5d44b0dd80a1997674daa7972a3ce3e5d8a7a04c",
[]
],
"uievents.idl": [
@@ -449616,7 +450476,7 @@
[]
],
"web-animations-2.idl": [
- "f9f68a0d49a5ba71ade7e4a62546020d3adc22c5",
+ "4c3af535149ec218d0ed99c59dee90e14ec4d5ab",
[]
],
"web-animations.idl": [
@@ -449688,7 +450548,7 @@
[]
],
"webcodecs.idl": [
- "48d89d0b47783dbd59b1fe6a6d920909bd7d8551",
+ "aa823aa52dfe94540bcd7d295af33f405d6e16d9",
[]
],
"webcrypto-secure-curves.idl": [
@@ -449724,7 +450584,7 @@
[]
],
"webnn.idl": [
- "50ee64b185ab933d95b20731daf7cf1d04a10f74",
+ "0b8ea7cb3440a2b016643669bb976a11c0c095a5",
[]
],
"webrtc-encoded-transform.idl": [
@@ -450199,7 +451059,7 @@
]
},
"lint.ignore": [
- "ebe734d00836233082291ab02ed0db2ca51a7936",
+ "0258a1117aa473e3fba1c9c45fc89685cf9221ad",
[]
],
"loading": {
@@ -460736,7 +461596,7 @@
]
},
"router-rules.js": [
- "5a1c53671b9ef175d83a966290f49c120707a525",
+ "c3aef4272f2cf5e9e2b54fbf0fd72557ae46221a",
[]
],
"simple-test-for-condition-main-resource.html": [
@@ -463789,7 +464649,7 @@
],
"tasks": {
"test.yml": [
- "d62312737c843cd2050b5a9730f7a7b3ba8f8c5e",
+ "c172e6b7314022829f0dc0f08421198e8a0f0de6",
[]
]
},
@@ -463825,7 +464685,7 @@
[]
],
"test_valid.py": [
- "6960a2cc47e6f7e7c67ec4dd3c2d000399bb1a8c",
+ "62bb09a1c3c0394379bba3f26ce087298adc508e",
[]
]
}
@@ -473882,7 +474742,7 @@
[]
],
"browsing_context.py": [
- "cdb5e11816dbbe2f57f3c2df7134d4fbdebca9db",
+ "f2d2fad858c21edc2ca9618cf5c84a3ac96428ca",
[]
],
"input.py": [
@@ -473898,11 +474758,11 @@
[]
],
"script.py": [
- "737426a5d54641eae811844b84ad128426d25ef0",
+ "01855766d8c1e6fe6cf042fe9605e2cf857c44c3",
[]
],
"session.py": [
- "fe1c0385105a13fda3087117779a1e8b83c8d07a",
+ "725aab1bec72fa68a2b516e035c857d4cc1f570c",
[]
],
"storage.py": [
@@ -473983,7 +474843,7 @@
[]
],
"android.py": [
- "15a4c413d5b20449db7f0c920c1b303e33f5bd1f",
+ "f25350db078a8612e37f262b98b847a914e5ce2a",
[]
],
"browser.py": [
@@ -475189,10 +476049,6 @@
"604e765da46d85fe8ab85d3097fe7c2cbe00a930",
[]
],
- "idlharness.tentative.window.js.html": [
- "07847fdb39ea21b3feeebc10501d3aa6bdf97881",
- []
- ],
"no-require-trusted-types-for-report-only.html.headers": [
"aa00fcc15a30ef1f8968be44abc1a9e934a31979",
[]
@@ -477785,12 +478641,12 @@
},
"browsing_context": {
"__init__.py": [
- "dbacac8cf89722be67d37c32d3139c462846009f",
+ "51b3c64b42d3e2527d93445f3bc308d0105e2528",
[]
],
"activate": {
"__init__.py": [
- "5d0b52a5ac4497fbf6bb2f2ab3037048f78a0643",
+ "86f9ace3ee2d4618a2dcdf2fa3f5cae3c77e1702",
[]
]
},
@@ -477994,6 +478850,10 @@
"__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
[]
+ ],
+ "conftest.py": [
+ "f114ca701e5e9bf798c069e55252a20886f7e9a2",
+ []
]
}
},
@@ -478722,7 +479582,7 @@
[]
],
"fixtures_bidi.py": [
- "9566e6ebd19283b9d6cf9174bf4e2320d1e79fa7",
+ "7f3e4f9a9a72db37d21fbbc37db92246ccc605e0",
[]
],
"fixtures_http.py": [
@@ -478747,7 +479607,7 @@
[]
],
"files.html": [
- "3a710f0989e6cd8d07c688a4ae83b6dc80dc4445",
+ "be2479184463d9f851237b4112418079e9b76a88",
[]
],
"frames.html": [
@@ -479285,6 +480145,10 @@
"248902c6658a5142e7ed21689d246f6576894c31",
[]
],
+ "resample2d.json": [
+ "605d1b55c017a57748547bd472ccbc3375ab2381",
+ []
+ ],
"reshape.json": [
"ada3daa4e2de4beaa718f976f0af094c4652cd1e",
[]
@@ -479347,7 +480211,7 @@
]
},
"utils.js": [
- "0e404dbcd07e4b935e4b5bee35f07785ded19c19",
+ "375c71174a8d110ee729ab452b097c0bed2522c0",
[]
],
"utils_validation.js": [
@@ -479549,6 +480413,10 @@
"be8cb028f08842589d6c2f06391bc5c8469048d2",
[]
],
+ "RTCRtpReceiver-jitterBufferTarget-stats-helper.js": [
+ "31d80926d33b559fd31c5da4b0dea8d18e3ab34c",
+ []
+ ],
"RTCRtpSynchronizationSource-helper.js": [
"c8a3e45aae9ff952215d68a4a2b5cfdfc6278e4f",
[]
@@ -483221,7 +484089,7 @@
[]
],
"WorkerNavigator.js": [
- "76834e16c7ad19f57cb9fd9329375ec092910b7c",
+ "4258384ac444758694f7f7cba78548a4c7fe6f09",
[]
],
"WorkerSendingPerformanceNow.js": [
@@ -488103,116 +488971,83 @@
{}
]
],
- "idbobjectstore_put.htm": [
- "e277ce54a2022a6fda5b64b5a10a7bef1f8e3b8a",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put10.htm": [
- "6882e8e4b5c5bc0404bff41816dee36580abf2a5",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put11.htm": [
- "a5ed2db357b56f1d690e61b8c2fda58020d2e8a6",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put12.htm": [
- "0693980277dd66d6d5e137bdc0ed5dcc2d8c1718",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put13.htm": [
- "8ae6561fc5c61765310d2cc12752ba77095076c5",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put14.htm": [
- "bc5647f4c11a87140f87d09582b10e2d353af376",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put15.htm": [
- "e7affaddd444f44b21119ca0c15cb7dcea90599e",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put16.htm": [
- "e298ba88493f322c611ad964f6804d46584d8239",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put2.htm": [
- "733e2cb1549fc66213ac1931e4ed483fe13a5f19",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put3.htm": [
- "b7792bdaf1d848a689ca9a18048a21e390b223c2",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put4.htm": [
- "4a59836eb6313ed6bd213049c98d0f241c2a1f2b",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put5.htm": [
- "6e945e27d2a1870ebbbc107be50d5ed60b8a3744",
- [
- null,
- {}
- ]
- ],
- "idbobjectstore_put6.htm": [
- "f0b6f0b98dca08dc9f167f6776a6c58bc56149b6",
+ "idbobjectstore_put.any.js": [
+ "89303291e9d6923b4c769f6eddb2360e60e171be",
[
- null,
- {}
- ]
- ],
- "idbobjectstore_put7.htm": [
- "e41959f21102dc91eb257b4e717445905236ed2b",
+ "IndexedDB/idbobjectstore_put.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBObjectStore.put()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
+ ],
[
- null,
- {}
- ]
- ],
- "idbobjectstore_put8.htm": [
- "2bec639d322d675f35f223c0bd49ef83cd3cf63b",
+ "IndexedDB/idbobjectstore_put.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBObjectStore.put()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
+ ],
[
- null,
- {}
- ]
- ],
- "idbobjectstore_put9.htm": [
- "dff9415d691c4316f03787fd97076786bbdbbbe9",
+ "IndexedDB/idbobjectstore_put.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBObjectStore.put()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
+ ],
[
- null,
- {}
+ "IndexedDB/idbobjectstore_put.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBObjectStore.put()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
]
],
"idbrequest-onupgradeneeded.htm": [
@@ -497962,7 +498797,7 @@
]
],
"comp_label.html": [
- "8b569ba6fff7b0e89a7a9db4c33cea08445be3a2",
+ "3eda2a5367b857aeab4eb15ee4980a7776700cb7",
[
null,
{
@@ -519042,7 +519877,7 @@
]
],
"digital-identity.https.html": [
- "1a9e09dbf3cfb69f1ecfe52a28f45d07e7113b6c",
+ "82630e2a5bd23502f23233f4a533b8e7a1ea8b03",
[
null,
{
@@ -519069,6 +519904,15 @@
]
],
"fedcm-authz": {
+ "fedcm-continue-on-disallowed.https.html": [
+ "fcda3a3dd591c694d341f5a04fa42ce667ea1ad6",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"fedcm-continue-on.https.html": [
"3ce1f51e370535791961bf984d1f6ffc77b3ffbf",
[
@@ -519491,6 +520335,17 @@
}
]
],
+ "fedcm-same-site-none": {
+ "fedcm-same-site-none.https.html": [
+ "77ecdaff9fe36e3bb4606798e9f69b4708cd2856",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
"fedcm-store.https.html": [
"d1e6ef464c4f3eb8e2d4118d1a5e2dc498410e05",
[
@@ -521448,42 +522303,28 @@
]
],
"anchor-center-htb-htb.html": [
- "7012208044af1c3ce7bafdfddfedf4f0c103e2cd",
+ "20abb2ed096c934bb47447d64d5b717012f8ef47",
[
null,
{}
]
],
"anchor-center-htb-vrl.html": [
- "584424d306fb54fcd62302e61734c0da0dec8ac2",
+ "099d9cd15b43ae33024fc1fb659563bb5141baa2",
[
null,
{}
]
],
"anchor-center-vrl-htb.html": [
- "c7ee2302626eb8fad64aaa54768b231f18b98dd3",
+ "3e4f485cec3d730ecbadb695fc214269f2e101ea",
[
null,
{}
]
],
"anchor-center-vrl-vrl.html": [
- "d314dc7f2fc696d2baf661e29b65da22a1aad028",
- [
- null,
- {}
- ]
- ],
- "anchor-default-003.html": [
- "00c20324344d0d888aace7f5414ba7e5354af786",
- [
- null,
- {}
- ]
- ],
- "anchor-default-basics.html": [
- "783cb539cc39bc68040b74fc9ac28c1bf2be38df",
+ "fe40c731419c42ff286e24d653082220358cf137",
[
null,
{}
@@ -521504,7 +522345,7 @@
]
],
"anchor-getComputedStyle-003.html": [
- "da9ec4a1451ad9f47290b9ef268a69b22d5ca928",
+ "fc384ab4cdf749e5dcbc16fbe0f3403360234ef9",
[
null,
{}
@@ -521602,14 +522443,14 @@
]
],
"anchor-name-style-contained-dynamic.html": [
- "50cec96f366ada5a2afee57444f560f936c77ea4",
+ "1413fe9d772b67e4cd59b923e81b99fe8f7ac4eb",
[
null,
{}
]
],
"anchor-name-style-contained.html": [
- "a5295758891e4e29353e3e1942c547b7d5c92ea5",
+ "b88afe4107dd573aa7a2ec1b03e7501a7196948f",
[
null,
{}
@@ -521840,126 +522681,126 @@
]
],
"anchor-scroll-002.html": [
- "8ef6f500a1f2fbc562def420ac79ca9939d50f03",
+ "2c51e6a1a3ab74ff7963c5e77f0ec8dcc0d1f408",
[
null,
{}
]
],
"anchor-scroll-003.html": [
- "c1b31c0becf286b0b155578f29c6b7e9a6cd9e1e",
+ "6c0dd08355c47152b281e07b759a9b4c513af180",
[
null,
{}
]
],
"anchor-scroll-004.html": [
- "d08279118d9e9ca848fd9fb9e6e56fc77ade42ff",
+ "c0e0afb23f143e157b163cd28af96db62496b457",
[
null,
{}
]
],
"anchor-scroll-005.html": [
- "a9a7d24d2b9ccd9af9a9771f66c7a3da433a1efa",
+ "f8f26b719f07c2d38324f3e1b7e0287e2b7ffd51",
[
null,
{}
]
],
"anchor-scroll-006.html": [
- "2ffd026b55296f105e37141646f12d999cd56d5b",
+ "9c8a8c0ac2fe3cdb8942cbe08dc6a97591a5dc30",
[
null,
{}
]
],
"anchor-scroll-007.html": [
- "ec519106190c7cebe095a2dc4396cfe94486fb61",
+ "7e288d713f6b6f71e765398c894a966b4a0ed212",
[
null,
{}
]
],
"anchor-scroll-js-expose.html": [
- "1ef44d03c2202dfc053f27c0e12e2a397634267e",
+ "3b3f1a06086ae85d2fa1944cc1c2beb41935656b",
[
null,
{}
]
],
"anchor-scroll-position-try-001.html": [
- "b696ae0060c544390ed2b26e6f4071af53afd6b6",
+ "3130018e73d921fb7d742fc1e7591672c4130488",
[
null,
{}
]
],
"anchor-scroll-position-try-002.html": [
- "3b84124705c58514d66d437c19113a76848d19eb",
+ "52bbcd62fc1931e3e3ed9d81cebc12e39d1411be",
[
null,
{}
]
],
"anchor-scroll-position-try-003.html": [
- "dd9fdc92c2e7b93b3254f1a19097fb422a7f3da8",
+ "b89a574d768edf3b13e7ac90d51aecddec553380",
[
null,
{}
]
],
"anchor-scroll-position-try-004.html": [
- "0aab60b7a81c247d1a2621f5e3d04e71b1b44693",
+ "bf0bee972deadd0c45f037c0fc455cda2923623c",
[
null,
{}
]
],
"anchor-scroll-position-try-005.html": [
- "e2dac13abd745dfa1a60804dc3ff77bbae492f66",
+ "197a9e4f79c2a89fb8d4d3e1e8f7239ae696cd4c",
[
null,
{}
]
],
"anchor-scroll-position-try-006.html": [
- "1f9004de54f717d66091f5fb0965dac24ac15f3b",
+ "132c45c89c75d69030db21539c7d84a996fa6c42",
[
null,
{}
]
],
"anchor-scroll-position-try-007.html": [
- "32b7f641732662c7cc4bc132a52401cf2210e281",
+ "a02bd35a669a920272ab8f05c199d0e831a5e58f",
[
null,
{}
]
],
"anchor-scroll-position-try-008.html": [
- "99f180bb46338deb32640d2143a24b9a99d508ad",
+ "2deddd587ef2a52a0548cf6498f2393e5f351e10",
[
null,
{}
]
],
"anchor-scroll-position-try-009.html": [
- "0267d1987be687fd04031c895df486d108d0f628",
+ "0d7d6b077fc734b72283c87c383d85f54c34573b",
[
null,
{}
]
],
"anchor-scroll-position-try-010.html": [
- "133649c720f0a8f80741fcabfcec27a2d7b344a2",
+ "21f32ad068e64d6231c42f56ec172b83a309eac6",
[
null,
{}
]
],
"anchor-scroll-position-try-011.html": [
- "005a4ee728cbf6566f9a32b1626b04324c42c36f",
+ "5de84610105129ca6b86c0c83bd64a85bdde1b68",
[
null,
{}
@@ -522036,14 +522877,14 @@
]
],
"at-position-try-cssom.html": [
- "d4a1f4fa24c04bfb1be8fab64ad33ec035a44dd3",
+ "dc248f4e511e66c20a384cbe23b407fb576ccb19",
[
null,
{}
]
],
"at-position-try-invalidation-shadow-dom.html": [
- "e5d6c51a0b95bcd3ba873b05d982054a7d1a49f9",
+ "50e67de1aef6d9a5ae647d30b36cd9fad880476e",
[
null,
{}
@@ -522071,7 +522912,7 @@
]
],
"inset-area-basic.html": [
- "4a636355583d4a41d168f5128b67ce5451fc112f",
+ "bf5daefe9abe701e632bc70c40289a60046b8ac2",
[
null,
{}
@@ -522106,7 +522947,7 @@
]
],
"inset-area-wm-dir.html": [
- "5268cba7e5ec5dfbd1b0d0b675bb94c19fee3cdd",
+ "c475810a1975c10936903dea0d7b39c9f0c7196f",
[
null,
{}
@@ -522114,14 +522955,14 @@
],
"parsing": {
"position-try-options-computed.html": [
- "ac84b8fa4b312890070a0c256e9f6561304d8196",
+ "f0944b7faaa6e1960163d560c0a0f64d4c1bed9e",
[
null,
{}
]
],
"position-try-options-parsing.html": [
- "cb250a178d4236405ba26bdf19935f4d8c1b3c87",
+ "303cc4d0dd2de76ac8e3e33d6a498f6d203041a7",
[
null,
{}
@@ -522142,50 +522983,57 @@
]
],
"position-try-parsing.html": [
- "8c36ddbaace11770b015c2f2d55c77c9b736b7db",
+ "7f50459710629cefd0282a8d78a60e8d760e719f",
[
null,
{}
]
]
},
- "position-fallback-basics.html": [
- "bfeb921de1bab4b194f0bb07b46bc7208c5e2166",
+ "position-anchor-003.html": [
+ "6117027e22029cdef83e9c01190af1fbb90c75ac",
+ [
+ null,
+ {}
+ ]
+ ],
+ "position-anchor-basics.html": [
+ "f9fe9dd6f8f1ad73076536ca00e8ea5ddc37df25",
[
null,
{}
]
],
"position-fallback-bounds-001.html": [
- "ebd1e78fb9a86fd595a4607fa7285f5734ce5726",
+ "f379b691e0bf1b345fd5e2622dc47a5b81bdbc3d",
[
null,
{}
]
],
"position-fallback-bounds-002.html": [
- "159484ad33b366c09e5d2c404660e8d3f4ad9617",
+ "960a530b97b1967f8493000826a631a69115b547",
[
null,
{}
]
],
"position-fallback-bounds-003.html": [
- "9da7bf9ccd774b28aaa5dc83dd7d8a3f6b458902",
+ "1bee43b36161205b3ebd1cc33c2d2dc347c5674c",
[
null,
{}
]
],
"position-fallback-bounds-004.html": [
- "eeee710e0fa242eafea6f1957e84c86958fec256",
+ "15bdf11327617b0fe8140ba67dd6f1cb2eb207e8",
[
null,
{}
]
],
"position-fallback-bounds-005.html": [
- "fecd4328a5996b5cd6c30e186b0343043a3642b9",
+ "d1e9fd7f51e8b38769a6d54423d51da913c0f89e",
[
null,
{}
@@ -522206,7 +523054,7 @@
]
],
"position-try-001.html": [
- "a15c808d95658ee022723ff37985ad66c279c31e",
+ "47fcbb8393962aff84d21c85db140ee7c7dd95cf",
[
null,
{}
@@ -522234,7 +523082,7 @@
]
],
"position-try-cascade-layer-reorder.html": [
- "6c09fd0ea17b17b27428408751f7b60230382391",
+ "4f38806f604f612065783c9b3253fb1f6bda0184",
[
null,
{}
@@ -522268,6 +523116,13 @@
{}
]
],
+ "position-try-options-limit.html": [
+ "32a4f592fa05fcc4b4f058a60c92d2b37d0afb75",
+ [
+ null,
+ {}
+ ]
+ ],
"position-try-pseudo-element.html": [
"5895f2a4077b697b4d59dec4e0cb2dbace4aefd6",
[
@@ -522276,14 +523131,35 @@
]
],
"position-try-tree-scoped.html": [
- "a8fe0106833d08d8c015c7c9ebe6ecb2efb52dca",
+ "d0c94fd6797dc7a87d129769f06a55cfca3d88a5",
[
null,
{}
]
],
"property-interpolations.html": [
- "878f46375b7505df39034580154c0491e0cee365",
+ "1b8621a21300d7574f22e69746f46394ba479cbf",
+ [
+ null,
+ {}
+ ]
+ ],
+ "try-tactic-base.html": [
+ "b52c3d15e0f231dc384f538e785d24935544a082",
+ [
+ null,
+ {}
+ ]
+ ],
+ "try-tactic-basic.html": [
+ "472e204096ddfec2e0ecc54eda86b3d248623001",
+ [
+ null,
+ {}
+ ]
+ ],
+ "try-tactic-sizing.html": [
+ "432992491dd8828f08f2db2d6b4a1df6abcc96f3",
[
null,
{}
@@ -525390,7 +526266,7 @@
]
],
"color-computed-relative-color.html": [
- "b6e628e78a50e4e111bfc8cc34882a718ae43cb2",
+ "95c8eee226b6c28bb2e970cb9c1d3c372613df2e",
[
null,
{}
@@ -525537,7 +526413,7 @@
]
],
"color-valid-relative-color.html": [
- "652c0c8fc458d965f0f7460290ab9538331030b1",
+ "5f83f0f0746c376be9b9c5ef57b22379854fe374",
[
null,
{}
@@ -534576,7 +535452,7 @@
]
],
"grid-shorthand-serialization.html": [
- "7751fd883b2938dcbaf85e7a66e2c24a1b620579",
+ "29bab75f617eb53642a3ec29b0689c6b8cbfbcf0",
[
null,
{}
@@ -535904,6 +536780,20 @@
{}
]
],
+ "margin-block-interpolation.html": [
+ "be4b6fdd8e0b8bd24d1545ffb3fa4651227bdbfa",
+ [
+ null,
+ {}
+ ]
+ ],
+ "margin-inline-interpolation.html": [
+ "86408ea6e94271efc7aa7e2c05b99538ba7d1b81",
+ [
+ null,
+ {}
+ ]
+ ],
"padding-block-interpolation.html": [
"881c36e323d6e7b390856193e166b09ff6366b73",
[
@@ -537353,7 +538243,7 @@
]
],
"parsing.html": [
- "f29eff9730788fc264355734e30ece9838d96225",
+ "a97716ff9d5a4d59b7090992bc9dc11268c36aff",
[
null,
{}
@@ -540934,6 +541824,15 @@
]
],
"multiple-aligned-targets": {
+ "common-to-both-axes-supercedes-first-in-tree-order.html": [
+ "d9989316e40d18d13b69c74bcabead8551b469fe",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"nested-supercedes-common-to-both-axes.html": [
"15743026bc3ea726e573d5a6311f87f8a68e8cab",
[
@@ -540944,7 +541843,16 @@
]
],
"prefer-common-to-both-axes.html": [
- "09b81e7c0dad69746012a6738b2f21689b699806",
+ "a44c8d7c48a593f03b6f18100d5524065a919951",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "prefer-first-in-tree-order.html": [
+ "f4b32e10c72b618268e18b63e0e50cc310a9c4f0",
[
null,
{
@@ -540979,6 +541887,15 @@
}
]
],
+ "prefer-targeted-element-main-frame.html": [
+ "6221b0e4b51c238e10a4ec32c47737da62a1d13a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"prefer-targeted-element-positioned.html": [
"3a2b1a90892436f1a074f89d06c633b40330ed50",
[
@@ -540989,7 +541906,7 @@
]
],
"prefer-targeted-element.html": [
- "1f7f087180df8377130b8284e5c3a50a186e280d",
+ "ceb9bd2ee06139720a085b0a932e1a779454546d",
[
null,
{
@@ -541410,14 +542327,7 @@
},
"snapchanged": {
"snapchanged-after-layout-change.tentative.html": [
- "293400edda2305d360c10d6b5a9d720a70ae1ef2",
- [
- null,
- {}
- ]
- ],
- "snapchanged-ensures-dom-order.html": [
- "10bc73b622c34396c39c5940ca1b2046d49b7630",
+ "a3ba05fdf5e9ffa42ab5689349e33b3c9a0aee15",
[
null,
{}
@@ -541431,21 +542341,21 @@
]
],
"snapchanged-on-programmatic-root-scroll.tentative.html": [
- "2e33c3c970f6595a614473aab4606df60e40e89c",
+ "98ec2e5d75c5258207281be1839d669bb0e242f5",
[
null,
{}
]
],
"snapchanged-on-programmatic-scroll.tentative.html": [
- "6082e0901309dd9ea023c49ea90f3f377f0038b7",
+ "9dff856f344b4bc4430afe5544bcaedb8f1a5554",
[
null,
{}
]
],
"snapchanged-on-user-root-scroll.tentative.html": [
- "5405d778bf0f5ad500087343fff834c666669f45",
+ "127376caa2f3e0f98c032e7f4debfdd2ac582aaa",
[
null,
{
@@ -541454,7 +542364,7 @@
]
],
"snapchanged-on-user-scroll.tentative.html": [
- "4f362007225f92b5a99414f1117cc78f3272afd3",
+ "91194642b5589b61b419c6091f4a082adb555ed5",
[
null,
{
@@ -541470,7 +542380,7 @@
]
],
"snapchanged-with-proximity-strictness.tentative.html": [
- "cb55054e6f834e0b989139d869037a2286e9274f",
+ "96cab337398654fd778eb42b6a84167b72c9363d",
[
null,
{}
@@ -541479,7 +542389,7 @@
},
"snapchanging": {
"snapchanging-after-layout-change.tentative.html": [
- "5474b7ddce2416ef3075dd103b52a41814eb6b24",
+ "0c0bfb623e106800597c0f0caafcd4afb2f27b75",
[
null,
{
@@ -541488,7 +542398,7 @@
]
],
"snapchanging-on-programmatic-root-scroll.tentative.html": [
- "d031811c17e8e28e04cc20b3ce5c5711ab83d755",
+ "5d75715edb7be4a5eae7d55f1a28ec031d080f13",
[
null,
{
@@ -541497,7 +542407,7 @@
]
],
"snapchanging-on-programmatic-scroll.tentative.html": [
- "5a0de1deb329297f011768cf0c13c28fc8a1aab6",
+ "25cdc44c662c90ba03db38e3ddb36c33dc9c7d2c",
[
null,
{
@@ -541506,7 +542416,7 @@
]
],
"snapchanging-on-user-root-scroll.tentative.html": [
- "29d0239e2d692d4369f849a820c5c85adce6e47f",
+ "e1a1e8aff6cc616eebb00d260b5b48b90e1b6d69",
[
null,
{
@@ -541515,7 +542425,7 @@
]
],
"snapchanging-on-user-scroll.tentative.html": [
- "2c1f9742b622050d07367b5b6f3ddffe60a9381c",
+ "35ee8a51965483fcd0627ebdb5950a1ef4901d8a",
[
null,
{
@@ -543617,7 +544527,7 @@
]
],
"custom-property-rule-ambiguity.html": [
- "50728bc94c258397f57312fbe8f837bf68b354ca",
+ "b1adce7f9eb7a3225e525696e7d5dfb9e2fdf700",
[
null,
{}
@@ -549536,7 +550446,7 @@
},
"properties": {
"accent-color.html": [
- "a02a8493be32e879085415061497bd8c79726f04",
+ "8cd0b986e8665ee6a4e9830b9346f5a4957b89b8",
[
null,
{}
@@ -549669,7 +550579,7 @@
]
],
"background-color.html": [
- "d0a55d52d4d00ed56610297ec3e3d5a08e600e38",
+ "f684a40fb62528d123c224e16db4bc62254e23e6",
[
null,
{}
@@ -549739,7 +550649,7 @@
]
],
"border-color.html": [
- "a38f7c7d80600679b4de765ee7fd33794cd681bd",
+ "3ce4ca94fce9e616074827e8cc57b48652d5e202",
[
null,
{}
@@ -549837,7 +550747,7 @@
]
],
"caret-color.html": [
- "b79beacf4be6aa58c06709633d1e0ec30743693d",
+ "5ea78a08d389852e0346c913c9c6b98ec9252961",
[
null,
{}
@@ -549886,7 +550796,7 @@
]
],
"color.html": [
- "58555ff8052fc04e2f9da56e45b9d2e6dced85f1",
+ "f56182977c58a482f240f82930a8af9d20bd360f",
[
null,
{}
@@ -549900,7 +550810,7 @@
]
],
"column-rule-color.html": [
- "ea27c9eaec6418953f1fc57dd5a6504995eb676a",
+ "3d35b856d71f2de9c87e83aa1ace57b3b4d8cf5d",
[
null,
{}
@@ -550117,7 +551027,7 @@
]
],
"flood-color.html": [
- "99ee9f05adff154ebe56bc3806c195b81dbde7d2",
+ "bb3ddc9fc9aeb948d47cf87ed20dbb123cfbfd52",
[
null,
{}
@@ -550404,7 +551314,7 @@
]
],
"lighting-color.html": [
- "5d69f2fa4aa3a276f30e89cded7ac0cc28e2b179",
+ "aec16433723313664ba37974c5190be08a540ad7",
[
null,
{}
@@ -550572,7 +551482,7 @@
]
],
"outline-color.html": [
- "e779d709fe253cd518a0e9b0d85ebb4260c173cf",
+ "6bfec87a8c799e621d7c7c5d8b3b33a09c35c62f",
[
null,
{}
@@ -550803,7 +551713,7 @@
]
],
"stop-color.html": [
- "36b364bd4f3b87812a6449da638a8a54633439e7",
+ "83dcf0218a0cf8903ae066bb14c04032a65fa3dd",
[
null,
{}
@@ -550915,7 +551825,7 @@
]
],
"text-decoration-color.html": [
- "f49a5739fdbad8a46dd6a997b8bd18fe9892e9c6",
+ "b76f82c3ea13fe06ab3318435fb456949b0d8ea9",
[
null,
{}
@@ -550964,7 +551874,7 @@
]
],
"text-emphasis-color.html": [
- "8f106e6054f6a97206f5150373d6287488dab623",
+ "8623d3dfb9b741c7243f45374e22f71ebadad0cb",
[
null,
{}
@@ -551515,6 +552425,13 @@
{}
]
],
+ "canonical-order-outline-sub-properties-001.html": [
+ "aeb98ffa425434a00bab2020799d59b350fcded8",
+ [
+ null,
+ {}
+ ]
+ ],
"caret-color-computed.html": [
"0428c783f5b0b0efc664d18529f8cae22acf72e2",
[
@@ -552061,14 +552978,14 @@
"calc-size": {
"animation": {
"calc-size-height-interpolation.tentative.html": [
- "525c38805d66ccf00719d3ce64a2703c32629042",
+ "04c44d0904e6d2b7e487b1eacb2daa6be1dbab02",
[
null,
{}
]
],
"calc-size-width-interpolation.tentative.html": [
- "ff72ba6a0d84bcafffb75cd6c7f87731a053219a",
+ "b8b24935c3758c8aff82c52de95b0bf189df4d00",
[
null,
{}
@@ -552076,21 +552993,21 @@
]
},
"calc-size-height.tentative.html": [
- "3c97ceb15876010c8ef145bd5c5c3b5a5318623d",
+ "61e59f83db491f4d8f7849d5e07cb79d99689204",
[
null,
{}
]
],
"calc-size-parsing.tentative.html": [
- "bc0048f826eaad91acfa194db5431aaa98c6137b",
+ "e51247c872672653f6ae29c69d8d1d4c2765899f",
[
null,
{}
]
],
"calc-size-width.tentative.html": [
- "c8000f345f73b9019128bea3ceb2dbc65d9eb307",
+ "96b2719c5d18fa6b0f96d9de196b77a045e8d8d5",
[
null,
{}
@@ -552511,7 +553428,7 @@
]
],
"round-function.html": [
- "29ec60ea44585b87386d0cc5b6e4df2b5b1230a2",
+ "338ecaed9044d9dc270557bc15c97b4531b74ace",
[
null,
{}
@@ -552525,7 +553442,7 @@
]
],
"round-mod-rem-invalid.html": [
- "01268091908f8366472ae5a6bfea040859e663c8",
+ "5e22012743e7346a6486ec5953ad3eb3bbc32e5f",
[
null,
{}
@@ -554452,6 +555369,13 @@
{}
]
],
+ "cssstyledeclaration-csstext-setter.window.js": [
+ "4474358ed0f74d3a48c34ba2753aa7fd18efafc7",
+ [
+ "css/cssom/cssstyledeclaration-csstext-setter.window.html",
+ {}
+ ]
+ ],
"cssstyledeclaration-csstext.html": [
"686684e614f6f9ab0956fde06ca556654538930c",
[
@@ -554754,7 +555678,7 @@
]
],
"getComputedStyle-pseudo-with-argument.html": [
- "452f2bb2c63e13615c1c66cc57702b40226e1d37",
+ "bc23ad180bb009c88cb2cc9222e79f8bd863f5e1",
[
null,
{}
@@ -563887,7 +564811,14 @@
]
],
"Node-appendChild-script-in-script.tentative.html": [
- "71081b49fec1322d12c07efc5eb735d9fef2c2e6",
+ "39c439332366816dc8b6b7dce3873648dde26a6c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "Node-appendChild-script-with-mutation-observer-takeRecords.html": [
+ "33598e640821086bb4ade5a381f161cf7a3aebe9",
[
null,
{}
@@ -563941,6 +564872,13 @@
"dom/nodes/insertion-removing-steps/insertion-removing-steps-script.window.html",
{}
]
+ ],
+ "script-does-not-run-on-child-removal.window.js": [
+ "ed5bfbaa60116c4994ab7602d022d53154365716",
+ [
+ "dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.html",
+ {}
+ ]
]
},
"prepend-on-Document.html": [
@@ -564071,6 +565009,17 @@
{}
]
],
+ "observable-from.any.js": [
+ "80408ddced7ef5dd6c81855e6d26f0326d413226",
+ [
+ "dom/observable/tentative/observable-from.any.html",
+ {}
+ ],
+ [
+ "dom/observable/tentative/observable-from.any.worker.html",
+ {}
+ ]
+ ],
"observable-map.any.js": [
"275505fb5d02fd4de353fa44311fdc696e3772be",
[
@@ -564310,6 +565259,17 @@
}
]
],
+ "Range-in-shadow-after-the-shadow-removed.html": [
+ "54ea8aabeab7337e15fd51bfb121b7a73066d6b1",
+ [
+ "dom/ranges/Range-in-shadow-after-the-shadow-removed.html?mode=closed",
+ {}
+ ],
+ [
+ "dom/ranges/Range-in-shadow-after-the-shadow-removed.html?mode=open",
+ {}
+ ]
+ ],
"Range-insertNode.html": [
"b0a9d43f982dd621738d019cd881b02f02cd4a36",
[
@@ -583965,6 +584925,15 @@
}
]
],
+ "content-shared-storage-get.https.html": [
+ "8afa8de54160ea130300f6973390816e8b3d7e88",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"coop-bcg-swap.https.html": [
"5a414fdfa168ca3aef0eeef67199e8d71c47fdc4",
[
@@ -613123,7 +614092,7 @@
},
"pageswap": {
"pageswap-cross-origin.sub.html": [
- "44479cf0debbbfd6fb582fba69c48bdc9e1c6555",
+ "4b68c32378fc7edbc88c6d95def9788b61aeb4ee",
[
null,
{
@@ -613174,6 +614143,13 @@
{}
]
],
+ "pageswap-push-with-cross-origin-redirect.sub.html": [
+ "8ecf920b510a99d24f05048cd35f8c7e2b9e6f97",
+ [
+ null,
+ {}
+ ]
+ ],
"pageswap-push-with-redirect.html": [
"8252fff84d6de401ea577fc22f218aa358f1e67d",
[
@@ -613195,6 +614171,20 @@
{}
]
],
+ "pageswap-replace-with-cross-origin-redirect.sub.html": [
+ "c6ced62057f48ae4a37430553de14c58dfa35ff8",
+ [
+ null,
+ {}
+ ]
+ ],
+ "pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html": [
+ "55438307212ead6fb2c941bbfabc3d898ce98680",
+ [
+ null,
+ {}
+ ]
+ ],
"pageswap-traverse-navigation-no-bfcache.https.html": [
"9e8c0e100ebed2b874556acebf00a1d09045de04",
[
@@ -626771,22 +627761,6 @@
]
]
},
- "webgpu-access": {
- "2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html": [
- "a76c49d2d47fb71db18597791fe001a887d399f0",
- [
- null,
- {}
- ]
- ],
- "2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html": [
- "ef576133742f45a19412809062bdddc67b949de6",
- [
- null,
- {}
- ]
- ]
- },
"wide-gamut-canvas": {
"2d.color.space.p3.fillText.html": [
"9c3d1b337477aa2029082580687833afee1e4118",
@@ -640470,36 +641444,6 @@
]
]
},
- "webgpu-access": {
- "2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html": [
- "cd478e666fd4eeb6a6b4cafc18eacc2fb31d9ad9",
- [
- null,
- {}
- ]
- ],
- "2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js": [
- "f24b8aa85047c904699c97f95860471e5c1e22cc",
- [
- "html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.html",
- {}
- ]
- ],
- "2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html": [
- "d77a2984087be5977ba1fcf3f834eafb03b8ccf6",
- [
- null,
- {}
- ]
- ],
- "2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js": [
- "4d4137e2d3c63c0ab9161ec5f25e1177d83fd862",
- [
- "html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.html",
- {}
- ]
- ]
- },
"wide-gamut-canvas": {
"2d.color.space.p3.to.p3.html": [
"e1391e9010e735c47182d35b0e56f38449eaa76c",
@@ -648808,8 +649752,15 @@
}
},
"sections-and-headings": {
+ "headings-styles-no-h1-in-section.tentative.html": [
+ "61610c2fd6c8ce6df5efdaf0f48fffd4662bd9b8",
+ [
+ null,
+ {}
+ ]
+ ],
"headings-styles.html": [
- "63e6a83e883d7dbbf600165746fc61b016ae6053",
+ "be531adfcf5b261de59b03cbf3a49cd526309530",
[
null,
{}
@@ -651266,6 +652217,13 @@
]
],
"offsets-into-the-media-resource": {
+ "currentTime-move-within-document.html": [
+ "22b579d720963f79cf13ef17e25c69141182cf31",
+ [
+ null,
+ {}
+ ]
+ ],
"currentTime.html": [
"e9b65899412a1db28eeafc3721aabee9e0aa3af9",
[
@@ -653754,7 +654712,7 @@
]
],
"sandbox-top-navigation-child-cross-origin.tentative.sub.window.js": [
- "fa71972222b094285f624a8b190f267624c4e8df",
+ "95d53e1fe3297f3f07011dc4f29597515cd95135",
[
"html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.html",
{
@@ -653789,14 +654747,14 @@
],
[
"script",
- "./resources/sandbox-top-navigation-helper.js"
+ "./resources/sandbox-top-navigation-helper.sub.js"
]
]
}
]
],
"sandbox-top-navigation-child.tentative.sub.window.js": [
- "53faa99a4083e593d5e3effab4f682a66b3ada98",
+ "1d5ea93830a6fcbf86c197fa45de3f6a029cb285",
[
"html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.html",
{
@@ -653831,14 +654789,14 @@
],
[
"script",
- "./resources/sandbox-top-navigation-helper.js"
+ "./resources/sandbox-top-navigation-helper.sub.js"
]
]
}
]
],
"sandbox-top-navigation-cross-site.tentative.sub.window.js": [
- "fcd53e0780e52e2ae1f059525a615f5904d162e6",
+ "26db4eeaca556347fa955cb859a6b60087bcc551",
[
"html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.html",
{
@@ -653877,14 +654835,14 @@
],
[
"script",
- "./resources/sandbox-top-navigation-helper.js"
+ "./resources/sandbox-top-navigation-helper.sub.js"
]
]
}
]
],
"sandbox-top-navigation-escalate-privileges.tentative.sub.window.js": [
- "a5cda9b0b981cc0a5281f85897ede3f87481e252",
+ "2ea0ba606e46ad345f88633ac3243b6109fb11db",
[
"html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.html",
{
@@ -653919,14 +654877,14 @@
],
[
"script",
- "./resources/sandbox-top-navigation-helper.js"
+ "./resources/sandbox-top-navigation-helper.sub.js"
]
]
}
]
],
"sandbox-top-navigation-grandchild.tentative.sub.window.js": [
- "a07148f8029cad59b12d17d9945909b4f5311594",
+ "326c1dd54a5b1b30439d82635a38cef1baa57e5a",
[
"html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.html",
{
@@ -653961,14 +654919,14 @@
],
[
"script",
- "./resources/sandbox-top-navigation-helper.js"
+ "./resources/sandbox-top-navigation-helper.sub.js"
]
]
}
]
],
"sandbox-top-navigation-user-activation.tentative.sub.window.js": [
- "9e0ea57a99e403d70593e588a3c5afe30fc44c2a",
+ "5079c8ad144608d04a4a755088097230553bb44d",
[
"html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.html",
{
@@ -654007,7 +654965,7 @@
],
[
"script",
- "./resources/sandbox-top-navigation-helper.js"
+ "./resources/sandbox-top-navigation-helper.sub.js"
]
]
}
@@ -658689,6 +659647,13 @@
}
},
"permission-element": {
+ "bounded-css-properties.html": [
+ "98c3d70e98bbe4df28ca765f4e8db3016d8a2974",
+ [
+ null,
+ {}
+ ]
+ ],
"invalid-css-properties.html": [
"c7186563f0ae6d8c2c2a8ab2b1d2dcd6c5c9283d",
[
@@ -658697,7 +659662,7 @@
]
],
"negative-offset-and-margin.html": [
- "860e637e0a9f540bd786e4fcc1c3c1c3604cbfe0",
+ "97290bb4df3c1ea7c310cd775d6cfec6635287a4",
[
null,
{}
@@ -669185,7 +670150,7 @@
]
],
"navigator_user_agent.https.html": [
- "10b3dd22497aeda1cbd28e3ae53e67819d8ecde8",
+ "3fbe3eaa62bd7e42b0c2cae0a6242bf319bf70fa",
[
null,
{}
@@ -671265,6 +672230,15 @@
}
]
],
+ "minimize_restore_popup.html": [
+ "99245083b5990341358ff461a039ad45dab0abee",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"send_keys.html": [
"71ca4405f48dae89c820775a10f1d000866380d8",
[
@@ -688773,6 +689747,15 @@
"testdriver": true
}
]
+ ],
+ "pointerevent_touch_target_after_pointerdown_target_removed.tentative.html": [
+ "124133d25ccd199441847fe4f86509e745c6e79a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
]
},
"idlharness.https.window.js": [
@@ -689356,7 +690339,7 @@
]
],
"pointerevent_mouse_capture_change_hover.html": [
- "ef824dafd963bc97f59283d833d0e0cb4fe97fc8",
+ "eb4600093872368185ac8f7133a6c1c8dcd9430c",
[
null,
{
@@ -708774,6 +709757,43 @@
}
]
],
+ "selection-range-after-editinghost-removed.html": [
+ "921903062ac6089ec6608acb7c664056c38844f4",
+ [
+ null,
+ {}
+ ]
+ ],
+ "selection-range-after-textcontrol-removed.html": [
+ "e618f10f1d88e14f379f2db0df7c3896d75182dc",
+ [
+ "selection/selection-range-after-textcontrol-removed.html?textControl=number",
+ {}
+ ],
+ [
+ "selection/selection-range-after-textcontrol-removed.html?textControl=password",
+ {}
+ ],
+ [
+ "selection/selection-range-after-textcontrol-removed.html?textControl=text",
+ {}
+ ],
+ [
+ "selection/selection-range-after-textcontrol-removed.html?textControl=textarea",
+ {}
+ ]
+ ],
+ "selection-range-in-shadow-after-the-shadow-removed.tentative.html": [
+ "e9f63715a2f15453f3aec8624b2d8af098f0604e",
+ [
+ "selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html?mode=closed",
+ {}
+ ],
+ [
+ "selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html?mode=open",
+ {}
+ ]
+ ],
"setBaseAndExtent.html": [
"13108bb506d2ff38d9aef7d1a23eb087360c7ee8",
[
@@ -712053,7 +713073,7 @@
]
],
"static-router-invalid-rules.https.html": [
- "86a50215f2e2ad7e523ce8c1c9d1359be5e7b374",
+ "9ef7cfdc9f34766e905f4b4469f212313f6d0d9d",
[
null,
{}
@@ -728859,6 +729879,24 @@
{}
]
],
+ "idlharness.window.js": [
+ "07847fdb39ea21b3feeebc10501d3aa6bdf97881",
+ [
+ "trusted-types/idlharness.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/WebIDLParser.js"
+ ],
+ [
+ "script",
+ "/resources/idlharness.js"
+ ]
+ ]
+ }
+ ]
+ ],
"no-require-trusted-types-for-report-only.html": [
"651bf0a7199beab43e4f00d3c72462ffda1905f2",
[
@@ -743491,7 +744529,7 @@
]
],
"audio-decoder.https.any.js": [
- "79ba22157abba6dcc890fd72b3328bdd0b7f7093",
+ "666d3a159f16adb593ff3f942b409957f7e0f749",
[
"webcodecs/audio-decoder.https.any.html",
{
@@ -746773,7 +747811,7 @@
]
],
"video-decoder.https.any.js": [
- "77a610bd4ea2ca090ba029cdf1239e83184873b8",
+ "5b3193b8c37a4558945e5e2ae29639c26980ef89",
[
"webcodecs/video-decoder.https.any.html",
{
@@ -746806,7 +747844,7 @@
]
],
"video-encoder-config.https.any.js": [
- "5011bfdd0a8506f3c236d3cdaf197458f5cc9a45",
+ "8d554e4f4dbb935d12a6c7e3aa606fc50db01424",
[
"webcodecs/video-encoder-config.https.any.html",
{
@@ -752515,6 +753553,57 @@
}
]
],
+ "resample2d.https.any.js": [
+ "dd8e441946e1b5defdd36d9054f00495d98f574b",
+ [
+ "webnn/conformance_tests/gpu/resample2d.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API resample2d operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/conformance_tests/gpu/resample2d.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API resample2d operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"reshape.https.any.js": [
"b0217d2e67bcf343e6b00171329793d1e570f11e",
[
@@ -753689,6 +754778,57 @@
}
]
],
+ "resample2d.https.any.js": [
+ "0b5b3e00320299d2092e0137cc0e33849f38fe37",
+ [
+ "webnn/conformance_tests/resample2d.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API resample2d operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/conformance_tests/resample2d.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API resample2d operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"reshape.https.any.js": [
"c0dafb176c41c4d9d6d9dc169fbb834821a8d09e",
[
@@ -754413,6 +755553,57 @@
}
]
],
+ "constant.https.any.js": [
+ "bf84454b8ac338bc3fae07dd9134603734937e51",
+ [
+ "webnn/validation_tests/constant.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API constant interface"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/validation_tests/constant.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API constant interface"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"elementwise_binary.https.any.js": [
"97a1a2b93c9821116df58a38f50e3e5b4fa49c03",
[
@@ -754464,6 +755655,57 @@
}
]
],
+ "gather.https.any.js": [
+ "67ac7d7be39a0b42d7f6e19afe1a825703292110",
+ [
+ "webnn/validation_tests/gather.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API gather operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/validation_tests/gather.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API gather operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"gru.https.any.js": [
"295baab9c286610ca8fcbb0ca7c6d0bd12b898c2",
[
@@ -754515,6 +755757,57 @@
}
]
],
+ "input.https.any.js": [
+ "cbdb7aeb7c3866dd942c2048a8d180b84ad41bca",
+ [
+ "webnn/validation_tests/input.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API input interface"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/validation_tests/input.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API input interface"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"layer_normalization.https.any.js": [
"7dbcf5c74a71bc63e8b0b12907386f69e0ffa05f",
[
@@ -755095,14 +756388,14 @@
]
],
"RTCPeerConnection-createOffer.html": [
- "704fa3c6467e377447b140fbcd7b27cb1d9d20dc",
+ "7287980a5b4a5ed5116217914e7ddd9c885166ed",
[
null,
{}
]
],
"RTCPeerConnection-description-attributes-timing.https.html": [
- "2d2565c3e1e0734a42231522d77129506491d2c1",
+ "bb23d2a39a19883fb60528113af10e4565edf385",
[
null,
{}
@@ -755308,21 +756601,21 @@
]
],
"RTCPeerConnection-setLocalDescription-answer.html": [
- "4c207890960c78954bea5c230688b38ca430582e",
+ "1d80eb8295c0547ec1c0951a8c5366a3d7f7f21e",
[
null,
{}
]
],
"RTCPeerConnection-setLocalDescription-offer.html": [
- "88f1de5ed892ce0cf3f4f3b114b6775678fb1f26",
+ "2be83a01ce465ad459b1d08998bafd4cf6d27b43",
[
null,
{}
]
],
"RTCPeerConnection-setLocalDescription-parameterless.https.html": [
- "5a7a76319a0571961d7dacc3d1562327089587bd",
+ "23d1e09a9dbf6c8c48deb8b92d5e0b2b8a87f851",
[
null,
{}
@@ -755336,7 +756629,7 @@
]
],
"RTCPeerConnection-setLocalDescription-rollback.html": [
- "787edc92e7a393c0ed6f0a210209d83c96c8fd9b",
+ "08d0393cb76b6a778abc7ff4ee39cfce31d47f30",
[
null,
{}
@@ -755364,7 +756657,7 @@
]
],
"RTCPeerConnection-setRemoteDescription-offer.html": [
- "9da03fe7a1596356ea1f44591e6036938d912d16",
+ "d95ecafc336b151428081ed2c830f31e90a768f4",
[
null,
{}
@@ -755385,7 +756678,7 @@
]
],
"RTCPeerConnection-setRemoteDescription-rollback.html": [
- "0e6213d70832fecc25aae7954f6cf5190b4f0a48",
+ "a72fa6673826bc5512da26e9da2be93833a1db9f",
[
null,
{}
@@ -755408,7 +756701,7 @@
]
],
"RTCPeerConnection-setRemoteDescription.html": [
- "c170f766bd3655b16c0eea1c5514e9e15aac8402",
+ "e2bec7dd91759bd6ef13f7f2eb931b8317ee73ad",
[
null,
{}
@@ -756448,15 +757741,6 @@
}
]
],
- "set-metadata.https.html": [
- "c4699598cf92f53fcf2c4765ef46704a4f7ef6fa",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
"sframe-keys.https.html": [
"c87ac12e2965af471eb30a5b60f35f43d3924d43",
[
@@ -756506,6 +757790,15 @@
}
]
],
+ "RTCEncodedAudioFrame-metadata.https.html": [
+ "1e420e6f725230a540a669f1f17fd1ebeceb78f1",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"RTCEncodedAudioFrame-receive-cloned.https.html": [
"3077632a3b4408b2874b3345abfee511e4832710",
[
@@ -756542,6 +757835,15 @@
}
]
],
+ "RTCEncodedVideoFrame-metadata.https.html": [
+ "a2c684c1f1594522c893f461e4bf9072caa9f0a2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"RTCEncodedVideoFrame-serviceworker-failure.https.html": [
"e725e5ce12cec388270e9a10f760af77db7d402e",
[
@@ -756631,8 +757933,8 @@
}
]
],
- "RTCRtpReceiver-jitterBufferTarget-stats.html": [
- "33f71800bd8ed53eb7b0446e6535997bccb7b01a",
+ "RTCRtpReceiver-audio-jitterBufferTarget-stats.https.html": [
+ "d728ec5a9c9758e0b754ef754e881b6aa5e0f7c3",
[
null,
{
@@ -756647,6 +757949,15 @@
{}
]
],
+ "RTCRtpReceiver-video-jitterBufferTarget-stats.html": [
+ "022dbe70c50b97757ca82cfc38a062d63393c73d",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"RTCRtpSynchronizationSource-captureTimestamp.html": [
"22ca5709b5f4f4e6bd4daf91e3a9c9504845b7f7",
[
@@ -774333,7 +775644,7 @@
]
],
"WorkerNavigator_userAgentData.https.html": [
- "8c22d8f8672b36ffee651ef594e13f17f8fc4175",
+ "a46c530cefe3ef1ade047b0016e184060b8c0666",
[
null,
{}
@@ -801244,7 +802555,7 @@
"browsing_context": {
"activate": {
"activate.py": [
- "0abbbbac38e3477b4998892c5e93c940e319e0d4",
+ "f6e5b9d27a8a90584c290555b7ba6b8b2192b77c",
[
null,
{}
@@ -801329,7 +802640,7 @@
},
"context_created": {
"context_created.py": [
- "d77209842c1a0010b842b02c19180da6a323d827",
+ "35692a9684547f70a83639c1c7d090333d1d5dfa",
[
null,
{}
@@ -801368,7 +802679,7 @@
]
],
"type.py": [
- "55ce7b44282a86f195f874b10b4cab0e58f3cd37",
+ "cc6d7e51ab6863654b51e9afd10209c69117012d",
[
null,
{}
@@ -801471,7 +802782,7 @@
]
],
"invalid.py": [
- "ff00de91ed00a33a27904bfd2622bfa3a3484d68",
+ "ecd3173e8784a8973453f1ad54e7ade61d235381",
[
null,
{}
@@ -801491,20 +802802,6 @@
{}
]
],
- "ownership.py": [
- "b1830c740a90ef77f0260e3d4dae4e37f6ba0f9d",
- [
- null,
- {}
- ]
- ],
- "sandbox.py": [
- "efa431bf190aaec7305958a079032e7264932a2b",
- [
- null,
- {}
- ]
- ],
"serialization_options.py": [
"9d7e7a861380b51b15b0c15e18db93559fd5a94f",
[
@@ -801925,15 +803222,22 @@
]
},
"set_files": {
- "invalid.py": [
- "f0efeaa69c579e39286312cde12e4c36d86921a3",
+ "context.py": [
+ "f9a39f2bfbcbddcae2e3d6b3a969efa5c68d418e",
[
null,
{}
]
],
- "set_files.py": [
- "642bd3e5423d57238ef57863b7ba36010c10730e",
+ "files.py": [
+ "7a31f3e14a4ec640f5e7a6a042824041f58c39c3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "invalid.py": [
+ "6527f462c9b91beac01d7212639613dfda8d6167",
[
null,
{}
@@ -802125,7 +803429,7 @@
]
],
"request.py": [
- "579f1da2882559ce5d0c2030d48b9be06f7917e5",
+ "ae9c94d955e997aea907e60289fa32231a812f8f",
[
null,
{}
@@ -802394,7 +803698,7 @@
]
],
"serialization_options.py": [
- "4084ec482093a88b8d55d59a719710908ad248bc",
+ "68c8cf9c1cb50bdd0ba5fe4ea0edf6391601ecd8",
[
null,
{}
@@ -802659,7 +803963,7 @@
"session": {
"new": {
"connect.py": [
- "d5872cd3ba542c92f70bd7280598637f903e5aa2",
+ "523899c3364d6d13e82612556ffeb9e7c9d8e214",
[
null,
{}
@@ -802668,7 +803972,7 @@
},
"status": {
"status.py": [
- "13d131bfec5dfc7116a60ab09c2f1354405ef73a",
+ "f62ad4c5620623749b6f4e770deadddae3c72251",
[
null,
{}
@@ -802691,7 +803995,7 @@
]
],
"invalid.py": [
- "056f6827281e9e0a56b01f76ca296133f38fadf4",
+ "e553a2e501ebfcef65dc302bcf53c22af975e496",
[
null,
{}
@@ -802714,7 +804018,7 @@
]
],
"invalid.py": [
- "9039f27e47c49798c55f568ee13e21f2d60cd956",
+ "c286bc09ee04d72aa4048e67078084d985bdcdc3",
[
null,
{}
@@ -802762,7 +804066,7 @@
]
],
"partition.py": [
- "1af0cfb759c18a1f8f2b940ee949f4c3486a833f",
+ "632e7ffa26c626e79a054df056913f73ba50c9b6",
[
null,
{}
@@ -802841,7 +804145,7 @@
]
],
"partition.py": [
- "9283ee0732912e2a77f51ec25e8cbe413759161a",
+ "bb171c6141165ce321b3cd72cd861a187d2b7c9b",
[
null,
{}
@@ -803979,14 +805283,14 @@
]
],
"new_tab.py": [
- "f6cacf3c3586bc2962e67be4cacf3fbbc838216d",
+ "53810e7fb627bba03c33cfcdb8c3beec8f9c8951",
[
null,
{}
]
],
"new_window.py": [
- "d47dacdc083a45f30895f9b59cd58eadcf5bac0e",
+ "cc10d2fb867158c04da9dcdc3185b34f07f017b8",
[
null,
{}
diff --git a/tests/wpt/meta/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini
index 878a7c3f74a..1d48180b27e 100644
--- a/tests/wpt/meta/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini
+++ b/tests/wpt/meta/WebCryptoAPI/sign_verify/eddsa.https.any.js.ini
@@ -1,5 +1,242 @@
[eddsa.https.any.html]
- expected: ERROR
+ [EdDSA Ed25519 verification]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed25519 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed25519 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed25519 round trip]
+ expected: FAIL
+
+ [EdDSA Ed25519 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed25519 keys.]
+ expected: FAIL
+
+ [EdDSA Ed448 verification]
+ expected: FAIL
+
+ [EdDSA Ed448 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed448 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed448 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed448 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed448 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed448 round trip]
+ expected: FAIL
+
+ [EdDSA Ed448 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed448 keys.]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 0]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 1]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 2]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 3]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 4]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 5]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 6]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 7]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 8]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 9]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 10]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 11]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 12]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 13]
+ expected: FAIL
+
[eddsa.https.any.worker.html]
- expected: ERROR
+ [EdDSA Ed25519 verification]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed25519 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed25519 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed25519 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed25519 round trip]
+ expected: FAIL
+
+ [EdDSA Ed25519 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed25519 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed25519 keys.]
+ expected: FAIL
+
+ [EdDSA Ed448 verification]
+ expected: FAIL
+
+ [EdDSA Ed448 verification with altered signature after call]
+ expected: FAIL
+
+ [EdDSA Ed448 with altered data after call]
+ expected: FAIL
+
+ [EdDSA Ed448 using privateKey to verify]
+ expected: FAIL
+
+ [EdDSA Ed448 using publicKey to sign]
+ expected: FAIL
+
+ [EdDSA Ed448 no verify usage]
+ expected: FAIL
+
+ [EdDSA Ed448 round trip]
+ expected: FAIL
+
+ [EdDSA Ed448 signing with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verifying with wrong algorithm name]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to shortened signature]
+ expected: FAIL
+
+ [EdDSA Ed448 verification failure due to altered data]
+ expected: FAIL
+
+ [Sign and verify using generated Ed448 keys.]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 0]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 1]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 2]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 3]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 4]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 5]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 6]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 7]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 8]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 9]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 10]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 11]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 12]
+ expected: FAIL
+
+ [Ed25519 Verification checks with small-order key of order - Test 13]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/CSS2/text/white-space-pre-002.xht.ini b/tests/wpt/meta/css/CSS2/text/white-space-pre-002.xht.ini
deleted file mode 100644
index f5c3a019215..00000000000
--- a/tests/wpt/meta/css/CSS2/text/white-space-pre-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[white-space-pre-002.xht]
- expected: FAIL
diff --git a/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini b/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini
deleted file mode 100644
index 5496474410b..00000000000
--- a/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[mix-blend-mode-animation.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-paragraph.html.ini b/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-paragraph.html.ini
deleted file mode 100644
index fb5b6fd0006..00000000000
--- a/tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-paragraph.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[mix-blend-mode-paragraph.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-color/parsing/color-computed-relative-color.html.ini b/tests/wpt/meta/css/css-color/parsing/color-computed-relative-color.html.ini
index bf29c753411..7910b706539 100644
--- a/tests/wpt/meta/css/css-color/parsing/color-computed-relative-color.html.ini
+++ b/tests/wpt/meta/css/css-color/parsing/color-computed-relative-color.html.ini
@@ -3370,3 +3370,60 @@
[Property color value 'color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 r g b / alpha)']
expected: FAIL
+
+ [Property color value 'rgb(from rebeccapurple calc((r / 255) * 100%) calc((g / 255) * 100%) calc((b / 255) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'hsl(from rebeccapurple calc((h / 360) * 360deg) calc((s / 100) * 100%) calc((l / 100) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'hwb(from rebeccapurple calc((h / 360) * 360deg) calc((w / 100) * 100%) calc((b / 100) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'lab(from lab(25 20 50) calc((l / 100) * 100%) calc((a / 125) * 100%) calc((b / 125) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'oklab(from oklab(0.25 0.2 0.5) calc(l * 100%) calc((a / 0.4) * 100%) calc((b / 0.4) * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'oklch(from oklch(0.7 0.45 30) calc(l * 100%) calc((c / 0.4) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(display-p3 0.7 0.5 0.3) display-p3 calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color(xyz 7 -20.5 100) xyz calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color-mix(in xyz, color(xyz 0.7 0.5 0.3), color(xyz 0.7 0.5 0.3)) xyz x y z / alpha)']
+ expected: FAIL
+
+ [Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color-mix(in xyz, color(xyz-d50 0.7 0.5 0.3), color(xyz-d50 0.7 0.5 0.3)) xyz-d50 x y z / alpha)']
+ expected: FAIL
+
+ [Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))']
+ expected: FAIL
+
+ [Property color value 'color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 x y z / alpha)']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color/parsing/color-valid-relative-color.html.ini b/tests/wpt/meta/css/css-color/parsing/color-valid-relative-color.html.ini
index 3a3198a2980..3ae55c836b3 100644
--- a/tests/wpt/meta/css/css-color/parsing/color-valid-relative-color.html.ini
+++ b/tests/wpt/meta/css/css-color/parsing/color-valid-relative-color.html.ini
@@ -3283,3 +3283,12 @@
[e.style['color'\] = "color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 r g b / alpha)" should set the property value]
expected: FAIL
+
+ [e.style['color'\] = "color(from color-mix(in xyz, color(xyz 0.7 0.5 0.3), color(xyz 0.7 0.5 0.3)) xyz x y z / alpha)" should set the property value]
+ expected: FAIL
+
+ [e.style['color'\] = "color(from color-mix(in xyz, color(xyz-d50 0.7 0.5 0.3), color(xyz-d50 0.7 0.5 0.3)) xyz-d50 x y z / alpha)" should set the property value]
+ expected: FAIL
+
+ [e.style['color'\] = "color(from color-mix(in xyz, color(xyz-d65 0.7 0.5 0.3), color(xyz-d65 0.7 0.5 0.3)) xyz-d65 x y z / alpha)" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-logical/animations/margin-block-interpolation.html.ini b/tests/wpt/meta/css/css-logical/animations/margin-block-interpolation.html.ini
new file mode 100644
index 00000000000..9ed9f243664
--- /dev/null
+++ b/tests/wpt/meta/css/css-logical/animations/margin-block-interpolation.html.ini
@@ -0,0 +1,18 @@
+[margin-block-interpolation.html]
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (-0.3) should be [7px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (0) should be [10px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (0.3) should be [13px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (0.6) should be [16px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (1) should be [20px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-block> from [10px\] to [20px\] at (1.5) should be [25px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-logical/animations/margin-inline-interpolation.html.ini b/tests/wpt/meta/css/css-logical/animations/margin-inline-interpolation.html.ini
new file mode 100644
index 00000000000..e7ff928b03a
--- /dev/null
+++ b/tests/wpt/meta/css/css-logical/animations/margin-inline-interpolation.html.ini
@@ -0,0 +1,18 @@
+[margin-inline-interpolation.html]
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (-0.3) should be [7px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (0) should be [10px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (0.3) should be [13px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (0.6) should be [16px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (1) should be [20px\]]
+ expected: FAIL
+
+ [Web Animations: property <margin-inline> from [10px\] to [20px\] at (1.5) should be [25px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-position/sticky/position-sticky-padding-001.html.ini b/tests/wpt/meta/css/css-position/sticky/position-sticky-padding-001.html.ini
new file mode 100644
index 00000000000..5800d47e755
--- /dev/null
+++ b/tests/wpt/meta/css/css-position/sticky/position-sticky-padding-001.html.ini
@@ -0,0 +1,2 @@
+[position-sticky-padding-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-position/sticky/position-sticky-padding-002.html.ini b/tests/wpt/meta/css/css-position/sticky/position-sticky-padding-002.html.ini
new file mode 100644
index 00000000000..57078a93de2
--- /dev/null
+++ b/tests/wpt/meta/css/css-position/sticky/position-sticky-padding-002.html.ini
@@ -0,0 +1,2 @@
+[position-sticky-padding-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-sizing/dynamic-available-size-iframe.html.ini b/tests/wpt/meta/css/css-sizing/dynamic-available-size-iframe.html.ini
new file mode 100644
index 00000000000..35256741d38
--- /dev/null
+++ b/tests/wpt/meta/css/css-sizing/dynamic-available-size-iframe.html.ini
@@ -0,0 +1,2 @@
+[dynamic-available-size-iframe.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini b/tests/wpt/meta/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini
new file mode 100644
index 00000000000..4a1aebd46cb
--- /dev/null
+++ b/tests/wpt/meta/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html.ini
@@ -0,0 +1,78 @@
+[canonical-order-outline-sub-properties-001.html]
+ [testing outline: blue]
+ expected: FAIL
+
+ [testing outline: invert]
+ expected: FAIL
+
+ [testing outline: 4px]
+ expected: FAIL
+
+ [testing outline: solid]
+ expected: FAIL
+
+ [testing outline: solid 5px]
+ expected: FAIL
+
+ [testing outline: 6px dashed]
+ expected: FAIL
+
+ [testing outline: dotted blue]
+ expected: FAIL
+
+ [testing outline: dotted invert]
+ expected: FAIL
+
+ [testing outline: blue solid]
+ expected: FAIL
+
+ [testing outline: invert solid]
+ expected: FAIL
+
+ [testing outline: black 4px]
+ expected: FAIL
+
+ [testing outline: invert 4px]
+ expected: FAIL
+
+ [testing outline: 5px blue]
+ expected: FAIL
+
+ [testing outline: 5px invert]
+ expected: FAIL
+
+ [testing outline: black solid 6px]
+ expected: FAIL
+
+ [testing outline: invert solid 6px]
+ expected: FAIL
+
+ [testing outline: blue 4px dotted]
+ expected: FAIL
+
+ [testing outline: invert 4px dotted]
+ expected: FAIL
+
+ [testing outline: dashed 5px black]
+ expected: FAIL
+
+ [testing outline: dashed 5px invert]
+ expected: FAIL
+
+ [testing outline: solid blue 6px]
+ expected: FAIL
+
+ [testing outline: solid invert 6px]
+ expected: FAIL
+
+ [testing outline: 4px dotted black]
+ expected: FAIL
+
+ [testing outline: 4px dotted invert]
+ expected: FAIL
+
+ [testing outline: 5px blue dashed]
+ expected: FAIL
+
+ [testing outline: 5px invert dashed]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini b/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini
index dad7beac230..c814fd636a2 100644
--- a/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini
+++ b/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html.ini
@@ -334,3 +334,87 @@
[Web Animations: property <height> from [0\] to [calc-size(max-content, size)\] at (1.25) should be [125px\]]
expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [CSS Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Web Animations: property <height> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [225px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini b/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini
index 0a3d25827ee..7903a1dbc54 100644
--- a/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini
+++ b/tests/wpt/meta/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html.ini
@@ -166,3 +166,147 @@
[Web Animations: property <width> from [calc-size(min-content, 0px)\] to [calc-size(min-content, size)\] at (1.25) should be [125px\]]
expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (-0.25) should be [150px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from [calc-size(auto, size)\] to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [CSS Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.25) should be [250px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.5) should be [300px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (0.75) should be [350px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1) should be [400px\]]
+ expected: FAIL
+
+ [Web Animations: property <width> from neutral to [calc-size(auto, size * 2)\] at (1.25) should be [450px\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-size/calc-size-height.tentative.html.ini b/tests/wpt/meta/css/css-values/calc-size/calc-size-height.tentative.html.ini
index 9a753b3a13b..1d0e72e7a8a 100644
--- a/tests/wpt/meta/css/css-values/calc-size/calc-size-height.tentative.html.ini
+++ b/tests/wpt/meta/css/css-values/calc-size/calc-size-height.tentative.html.ini
@@ -88,3 +88,9 @@
[resolved height for height in definite height container: calc-size(any, 31% + 12px)]
expected: FAIL
+
+ [resolved height for height in auto height container: calc-size(auto, size * 1.5)]
+ expected: FAIL
+
+ [resolved height for height in definite height container: calc-size(auto, size * 1.5)]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/calc-size/calc-size-parsing.tentative.html.ini b/tests/wpt/meta/css/css-values/calc-size/calc-size-parsing.tentative.html.ini
index 24d7ae6ee1d..718f44321fa 100644
--- a/tests/wpt/meta/css/css-values/calc-size/calc-size-parsing.tentative.html.ini
+++ b/tests/wpt/meta/css/css-values/calc-size/calc-size-parsing.tentative.html.ini
@@ -40,3 +40,15 @@
[e.style['width'\] = "calc-size(calc-size(min-content, size), size)" should set the property value]
expected: FAIL
+
+ [e.style['width'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
+
+ [e.style['min-width'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
+
+ [e.style['height'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
+
+ [e.style['min-height'\] = "calc-size(auto, size)" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/round-function.html.ini b/tests/wpt/meta/css/css-values/round-function.html.ini
index 15fe573f603..a432e2fcba1 100644
--- a/tests/wpt/meta/css/css-values/round-function.html.ini
+++ b/tests/wpt/meta/css/css-values/round-function.html.ini
@@ -550,3 +550,27 @@
[calc(0 - round(to-zero, -18, 10)) should be used-value-equivalent to 10]
expected: FAIL
+
+ [round(1.5) should be used-value-equivalent to 2]
+ expected: FAIL
+
+ [round(up, 1.5) should be used-value-equivalent to 2]
+ expected: FAIL
+
+ [round(down, 1.5) should be used-value-equivalent to 1]
+ expected: FAIL
+
+ [round(to-zero, 1.5) should be used-value-equivalent to 1]
+ expected: FAIL
+
+ [round(-1.5) should be used-value-equivalent to -1]
+ expected: FAIL
+
+ [round(up, -1.5) should be used-value-equivalent to -1]
+ expected: FAIL
+
+ [round(down, -1.5) should be used-value-equivalent to -2]
+ expected: FAIL
+
+ [round(to-zero, -1.5) should be used-value-equivalent to -1]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini b/tests/wpt/meta/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini
new file mode 100644
index 00000000000..b0b04c01253
--- /dev/null
+++ b/tests/wpt/meta/css/css-values/viewport-units-scrollbars-auto-vhw-001.html.ini
@@ -0,0 +1,2 @@
+[viewport-units-scrollbars-auto-vhw-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/meta/css/cssom-view/elementsFromPoint-iframes.html.ini
index 314c2710dc9..78f6aab8d85 100644
--- a/tests/wpt/meta/css/cssom-view/elementsFromPoint-iframes.html.ini
+++ b/tests/wpt/meta/css/cssom-view/elementsFromPoint-iframes.html.ini
@@ -1,3 +1,6 @@
[elementsFromPoint-iframes.html]
[elementsFromPoint on the root document for points in iframe elements]
expected: FAIL
+
+ [elementsFromPoint on inner documents]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini
index 647c7fb29b2..f4121525268 100644
--- a/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini
+++ b/tests/wpt/meta/css/cssom-view/scroll-behavior-smooth-navigation.html.ini
@@ -4,6 +4,3 @@
[Make sure the page is ready for animation.]
expected: FAIL
-
- [Smooth scrolling while doing history navigation.]
- expected: FAIL
diff --git a/tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini b/tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini
new file mode 100644
index 00000000000..54be6839527
--- /dev/null
+++ b/tests/wpt/meta/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html.ini
@@ -0,0 +1,2 @@
+[CSSStyleSheet-constructable-insertRule-base-uri.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom/getComputedStyle-pseudo-with-argument.html.ini b/tests/wpt/meta/css/cssom/getComputedStyle-pseudo-with-argument.html.ini
index 4a0d0c68841..a1903ed413d 100644
--- a/tests/wpt/meta/css/cssom/getComputedStyle-pseudo-with-argument.html.ini
+++ b/tests/wpt/meta/css/cssom/getComputedStyle-pseudo-with-argument.html.ini
@@ -40,3 +40,27 @@
[This pseudo-element should not parse: ::view-transition-group(*)]
expected: FAIL
+
+ [This pseudo-element should not parse: :highlight(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: ::view-transition-image-pair(*)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: ::view-transition-old(*)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: ::view-transition-new(*)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-group(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-image-pair(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-old(name)]
+ expected: FAIL
+
+ [This pseudo-element should not parse: :view-transition-new(name)]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini b/tests/wpt/meta/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini
new file mode 100644
index 00000000000..eb3e0818641
--- /dev/null
+++ b/tests/wpt/meta/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js.ini
@@ -0,0 +1,3 @@
+[script-does-not-run-on-child-removal.window.html]
+ [Script execution is never triggered on child removals]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/observable/tentative/observable-from.any.js.ini b/tests/wpt/meta/dom/observable/tentative/observable-from.any.js.ini
new file mode 100644
index 00000000000..87b4f25d234
--- /dev/null
+++ b/tests/wpt/meta/dom/observable/tentative/observable-from.any.js.ini
@@ -0,0 +1,80 @@
+[observable-from.any.worker.html]
+ [from(): Observable.from() is a function]
+ expected: FAIL
+
+ [from(): Failed conversions]
+ expected: FAIL
+
+ [from(): Given an observable, it returns that exact observable]
+ expected: FAIL
+
+ [from(): Given an array]
+ expected: FAIL
+
+ [from(): Iterable converts to Observable]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (one observable)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (many observables)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] next() throws error]
+ expected: FAIL
+
+ [from(): Converts Promise to Observable]
+ expected: FAIL
+
+ [from(): Converts rejected Promise to Observable. No `unhandledrejection` event when error is handled by subscription]
+ expected: FAIL
+
+ [from(): Rejections not handled by subscription are reported to the global, and still not sent as an unhandledrejection event]
+ expected: FAIL
+
+ [from(): Observable that implements @@iterator protocol gets converted as an Observable, not iterator]
+ expected: FAIL
+
+ [from(): Promise that implements @@iterator protocol gets converted as an iterable, not Promise]
+ expected: FAIL
+
+
+[observable-from.any.html]
+ [from(): Observable.from() is a function]
+ expected: FAIL
+
+ [from(): Failed conversions]
+ expected: FAIL
+
+ [from(): Given an observable, it returns that exact observable]
+ expected: FAIL
+
+ [from(): Given an array]
+ expected: FAIL
+
+ [from(): Iterable converts to Observable]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (one observable)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] side-effects (many observables)]
+ expected: FAIL
+
+ [from(): [Symbol.iterator\] next() throws error]
+ expected: FAIL
+
+ [from(): Converts Promise to Observable]
+ expected: FAIL
+
+ [from(): Converts rejected Promise to Observable. No `unhandledrejection` event when error is handled by subscription]
+ expected: FAIL
+
+ [from(): Rejections not handled by subscription are reported to the global, and still not sent as an unhandledrejection event]
+ expected: FAIL
+
+ [from(): Observable that implements @@iterator protocol gets converted as an Observable, not iterator]
+ expected: FAIL
+
+ [from(): Promise that implements @@iterator protocol gets converted as an iterable, not Promise]
+ expected: FAIL
diff --git a/tests/wpt/meta/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini b/tests/wpt/meta/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini
new file mode 100644
index 00000000000..b2003b5c788
--- /dev/null
+++ b/tests/wpt/meta/dom/ranges/Range-in-shadow-after-the-shadow-removed.html.ini
@@ -0,0 +1,14 @@
+[Range-in-shadow-after-the-shadow-removed.html?mode=closed]
+ [Range in shadow should stay in the shadow after the host is removed]
+ expected: FAIL
+
+ [Range in shadow should stay in the shadow after the host parent is removed]
+ expected: FAIL
+
+
+[Range-in-shadow-after-the-shadow-removed.html?mode=open]
+ [Range in shadow should stay in the shadow after the host is removed]
+ expected: FAIL
+
+ [Range in shadow should stay in the shadow after the host parent is removed]
+ expected: FAIL
diff --git a/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini
index 4b5c3e26586..7b4cf2c5ae7 100644
--- a/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini
+++ b/tests/wpt/meta/fetch/metadata/generated/css-images.sub.tentative.html.ini
@@ -185,3 +185,6 @@
[border-image sec-fetch-site - HTTPS downgrade (header not sent)]
expected: FAIL
+
+ [background-image sec-fetch-site - HTTPS downgrade (header not sent)]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini
new file mode 100644
index 00000000000..c1275567154
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html.ini
@@ -0,0 +1,2 @@
+[pageswap-push-with-cross-origin-redirect.sub.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini
new file mode 100644
index 00000000000..4843ecd671f
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html.ini
@@ -0,0 +1,2 @@
+[pageswap-replace-with-cross-origin-redirect.sub.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini
new file mode 100644
index 00000000000..0880906d129
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html.ini
@@ -0,0 +1,2 @@
+[pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini b/tests/wpt/meta/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini
new file mode 100644
index 00000000000..addd810a23d
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html.ini
@@ -0,0 +1,2 @@
+[canvas.2d.disconnected-font-size-math.html]
+ expected: CRASH
diff --git a/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
index 5cdcce07c65..17247137cb1 100644
--- a/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/text/canvas.2d.disconnected.html.ini
@@ -1,2 +1,2 @@
[canvas.2d.disconnected.html]
- expected: FAIL
+ expected: CRASH
diff --git a/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini b/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
deleted file mode 100644
index 5ef89398095..00000000000
--- a/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html]
- [getTextureFormat() returns RGBA16F for a float16 context]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini b/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
deleted file mode 100644
index d0dd1552396..00000000000
--- a/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html]
- [getTextureFormat() returns RGBA8 or BGRA8 for a typical context]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini
new file mode 100644
index 00000000000..5c8a8ac3b42
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html.ini
@@ -0,0 +1,2 @@
+[offscreencanvas-worker-font-load-crash.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
deleted file mode 100644
index 5ef89398095..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html]
- [getTextureFormat() returns RGBA16F for a float16 context]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini
deleted file mode 100644
index 6250c94a0e1..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.html]
- [getTextureFormat() returns RGBA16F for a float16 context]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
deleted file mode 100644
index d0dd1552396..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html]
- [getTextureFormat() returns RGBA8 or BGRA8 for a typical context]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini
deleted file mode 100644
index e137417e456..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.html]
- [getTextureFormat() returns RGBA8 or BGRA8 for a typical context]
- expected: FAIL
diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini
index 91e2de01021..0f176855ed7 100644
--- a/tests/wpt/meta/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini
@@ -4856,3 +4856,9 @@
[HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type]
expected: FAIL
+
+ [HTMLElement interface: attribute writingSuggestions]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "writingSuggestions" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini
index 4f3c59e1742..b0c997e92a8 100644
--- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini
+++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/document-with-fragment-valid.html.ini
@@ -1,4 +1,3 @@
[document-with-fragment-valid.html]
- expected: TIMEOUT
[Autofocus elements in top-level browsing context's documents with URL fragments should be skipped.]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini b/tests/wpt/meta/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini
new file mode 100644
index 00000000000..e496953d4cb
--- /dev/null
+++ b/tests/wpt/meta/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html.ini
@@ -0,0 +1,2 @@
+[headings-styles-no-h1-in-section.tentative.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index 24903b5f66f..d7e7d1b9815 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-1.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index ef88bb2e2fd..7da2bc5ac80 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
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 ff6467094b8..ccdaf8d61b2 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,3 +1,3 @@
[iframe_sandbox_popups_nonescaping-3.html]
[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-fieldset-element/disabled-003.html.ini b/tests/wpt/meta/html/semantics/forms/the-fieldset-element/disabled-003.html.ini
new file mode 100644
index 00000000000..5983b46a9ab
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/forms/the-fieldset-element/disabled-003.html.ini
@@ -0,0 +1,2 @@
+[disabled-003.html]
+ expected: CRASH
diff --git a/tests/wpt/meta/html/semantics/permission-element/bounded-css-properties.html.ini b/tests/wpt/meta/html/semantics/permission-element/bounded-css-properties.html.ini
new file mode 100644
index 00000000000..1550ee5cbed
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/permission-element/bounded-css-properties.html.ini
@@ -0,0 +1,3 @@
+[bounded-css-properties.html]
+ [Properties with out-of-bounds values should be corrected]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/permission-element/negative-offset-and-margin.html.ini b/tests/wpt/meta/html/semantics/permission-element/negative-offset-and-margin.html.ini
index 0e7adcb5ef9..3381f7de8e7 100644
--- a/tests/wpt/meta/html/semantics/permission-element/negative-offset-and-margin.html.ini
+++ b/tests/wpt/meta/html/semantics/permission-element/negative-offset-and-margin.html.ini
@@ -1,3 +1,6 @@
[negative-offset-and-margin.html]
[Negative margins/offset should be changed to 0px]
expected: FAIL
+
+ [Expressions margins/offset should always return at least 0px]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini b/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini
index 7237f5792de..dbe1def99e3 100644
--- a/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini
@@ -1,10 +1,9 @@
[promise-job-entry-different-function-realm.html]
- expected: TIMEOUT
[Fulfillment handler on fulfilled promise]
expected: FAIL
[Rejection handler on pending-then-rejected promise]
- expected: TIMEOUT
+ expected: FAIL
[Thenable resolution]
expected: FAIL
@@ -13,4 +12,4 @@
expected: FAIL
[Fulfillment handler on pending-then-fulfilled promise]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/navigation-timing/idlharness.window.js.ini b/tests/wpt/meta/navigation-timing/idlharness.window.js.ini
index 89e59978de2..fb0b3394055 100644
--- a/tests/wpt/meta/navigation-timing/idlharness.window.js.ini
+++ b/tests/wpt/meta/navigation-timing/idlharness.window.js.ini
@@ -106,3 +106,9 @@
[PerformanceNavigationTiming interface: performance.getEntriesByType("navigation")[0\] must inherit property "criticalCHRestart" with the proper type]
expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute notRestoredReasons]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: performance.getEntriesByType("navigation")[0\] must inherit property "notRestoredReasons" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/resource-timing/test_resource_timing.https.html.ini b/tests/wpt/meta/resource-timing/test_resource_timing.https.html.ini
index 5a2e10ff69c..dac51c99110 100644
--- a/tests/wpt/meta/resource-timing/test_resource_timing.https.html.ini
+++ b/tests/wpt/meta/resource-timing/test_resource_timing.https.html.ini
@@ -68,3 +68,6 @@
[PerformanceEntry has correct protocol attribute (xmlhttprequest)]
expected: FAIL
+
+ [PerformanceEntry has correct name, initiatorType, startTime, and duration (img)]
+ expected: FAIL
diff --git a/tests/wpt/meta/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini b/tests/wpt/meta/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini
new file mode 100644
index 00000000000..1c8381ae567
--- /dev/null
+++ b/tests/wpt/meta/selection/crashtests/selection-modify-line-boundary-around-shadow.html.ini
@@ -0,0 +1,2 @@
+[selection-modify-line-boundary-around-shadow.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini b/tests/wpt/meta/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini
new file mode 100644
index 00000000000..ca18d1156b2
--- /dev/null
+++ b/tests/wpt/meta/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html.ini
@@ -0,0 +1,26 @@
+[selection-range-in-shadow-after-the-shadow-removed.tentative.html?mode=closed]
+ [Selection range in shadow should not be as a selection range after the host is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host parent is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceWith)]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceChild]
+ expected: FAIL
+
+
+[selection-range-in-shadow-after-the-shadow-removed.tentative.html?mode=open]
+ [Selection range in shadow should not be as a selection range after the host is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host parent is removed]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceWith)]
+ expected: FAIL
+
+ [Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceChild]
+ expected: FAIL
diff --git a/tests/wpt/meta/webmessaging/with-ports/017.html.ini b/tests/wpt/meta/webmessaging/with-ports/017.html.ini
new file mode 100644
index 00000000000..c7946fc91b4
--- /dev/null
+++ b/tests/wpt/meta/webmessaging/with-ports/017.html.ini
@@ -0,0 +1,4 @@
+[017.html]
+ expected: TIMEOUT
+ [origin of the script that invoked the method, about:blank]
+ expected: TIMEOUT
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_put.any.js
new file mode 100644
index 00000000000..89303291e9d
--- /dev/null
+++ b/tests/wpt/tests/IndexedDB/idbobjectstore_put.any.js
@@ -0,0 +1,427 @@
+// META: global=window,worker
+// META: title=IDBObjectStore.put()
+// META: script=resources/support.js
+// @author Microsoft <https://www.microsoft.com>
+// @author Intel <http://www.intel.com>
+
+'use strict';
+
+async_test(t => {
+ let db;
+ const record = { key: 1, property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ objStore.put(record);
+ };
+
+ open_rq.onsuccess = function(e) {
+ const rq = db.transaction("store", "readonly",
+ { durability: 'relaxed' })
+ .objectStore("store")
+ .get(record.key);
+
+ rq.onsuccess = t.step_func(function(e) {
+ assert_equals(e.target.result.property, record.property);
+ assert_equals(e.target.result.key, record.key);
+ t.done();
+ });
+ };
+}, 'put() with an inline key');
+
+async_test(t => {
+ let db;
+ const key = 1;
+ const record = { property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store");
+
+ objStore.put(record, key);
+ };
+
+ open_rq.onsuccess = function(e) {
+ const rq = db.transaction("store", "readonly", {durability: 'relaxed'})
+ .objectStore("store")
+ .get(key);
+
+ rq.onsuccess = t.step_func(function(e) {
+ assert_equals(e.target.result.property, record.property);
+
+ t.done();
+ });
+ };
+},'put() with an out-of-line key');
+
+async_test(t => {
+ let db;
+ let success_event;
+ const record = { key: 1, property: "data" };
+ const record_put = { key: 1, property: "changed", more: ["stuff", 2] };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+ objStore.put(record);
+
+ const rq = objStore.put(record_put);
+ rq.onerror = fail(t, "error on put");
+
+ rq.onsuccess = t.step_func(function(e) {
+ success_event = true;
+ });
+ };
+
+ open_rq.onsuccess = function(e) {
+ assert_true(success_event);
+
+ const rq = db.transaction("store", "readonly",
+ { durability: 'relaxed' })
+ .objectStore("store")
+ .get(1);
+
+ rq.onsuccess = t.step_func(function(e) {
+ const rec = e.target.result;
+
+ assert_equals(rec.key, record_put.key);
+ assert_equals(rec.property, record_put.property);
+ assert_array_equals(rec.more, record_put.more);
+
+ t.done();
+ });
+ };
+}, 'put() record with key already exists');
+
+async_test(t => {
+ const record = { key: 1, property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ let db = e.target.result;
+ const objStore = db.createObjectStore("store", {
+ autoIncrement: true });
+ objStore.createIndex("i1", "property", { unique: true });
+ objStore.put(record);
+
+ const rq = objStore.put(record);
+ rq.onsuccess = fail(t, "success on putting duplicate indexed record");
+
+ rq.onerror = t.step_func(function(e) {
+ assert_equals(rq.error.name, "ConstraintError");
+ assert_equals(e.target.error.name, "ConstraintError");
+
+ assert_equals(e.type, "error");
+
+ e.preventDefault();
+ e.stopPropagation();
+ });
+ };
+
+ // Defer done, giving a spurious rq.onsuccess a chance to run
+ open_rq.onsuccess = function(e) {
+ t.done();
+ };
+}, 'put() where an index has unique:true specified');
+
+async_test(t => {
+ let db;
+ const record = { test: { obj: { key: 1 } }, property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store",
+ { keyPath: "test.obj.key" });
+ objStore.put(record);
+ };
+
+ open_rq.onsuccess = function(e) {
+ const rq = db.transaction("store", "readonly",
+ { durability: 'relaxed' })
+ .objectStore("store")
+ .get(record.test.obj.key);
+
+ rq.onsuccess = t.step_func(function(e) {
+ assert_equals(e.target.result.property, record.property);
+
+ t.done();
+ });
+ };
+}, 'Object store\'s key path is an object attribute');
+
+async_test(t => {
+ let db;
+ const record = { property: "data" };
+ const expected_keys = [1, 2, 3, 4];
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key",
+ autoIncrement: true });
+
+ objStore.put(record);
+ objStore.put(record);
+ objStore.put(record);
+ objStore.put(record);
+ };
+
+ open_rq.onsuccess = function(e) {
+ let actual_keys = [];
+ const rq = db.transaction("store", "readonly", { durability: 'relaxed' })
+ .objectStore("store")
+ .openCursor();
+
+ rq.onsuccess = t.step_func(function(e) {
+ const cursor = e.target.result;
+
+ if (cursor) {
+ actual_keys.push(cursor.value.key);
+ cursor.continue();
+ } else {
+ assert_array_equals(actual_keys, expected_keys);
+ t.done();
+ }
+ });
+ };
+ }, 'autoIncrement and inline keys');
+
+async_test(t => {
+ let db;
+ const record = { property: "data" };
+ const expected_keys = [1, 2, 3, 4];
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key",
+ autoIncrement: true });
+
+ objStore.put(record);
+ objStore.put(record);
+ objStore.put(record);
+ objStore.put(record);
+ };
+
+ open_rq.onsuccess = function(e) {
+ const actual_keys = [];
+ const rq = db.transaction("store", "readonly",
+ { durability: 'relaxed' })
+ .objectStore("store")
+ .openCursor();
+
+ rq.onsuccess = t.step_func(function(e) {
+ const cursor = e.target.result;
+
+ if(cursor) {
+ actual_keys.push(cursor.value.key);
+ cursor.continue();
+ } else {
+ assert_array_equals(actual_keys, expected_keys);
+ t.done();
+ }
+ });
+ };
+}, 'autoIncrement and out-of-line keys');
+
+async_test(t => {
+ let db;
+ const record = { property: "data" };
+ const expected_keys = [1, 2, 3, 4];
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store",
+ { keyPath: "test.obj.key", autoIncrement: true });
+
+ objStore.put(record);
+ objStore.put(record);
+ objStore.put(record);
+ objStore.put(record);
+ };
+
+ open_rq.onsuccess = function(e) {
+ const actual_keys = [];
+ const rq = db.transaction("store", "readonly",
+ { durability: 'relaxed' })
+ .objectStore("store")
+ .openCursor();
+
+ rq.onsuccess = t.step_func(function(e) {
+ const cursor = e.target.result;
+
+ if (cursor) {
+ actual_keys.push(cursor.value.test.obj.key);
+ cursor.continue();
+ } else {
+ assert_array_equals(actual_keys, expected_keys);
+ t.done();
+ }
+ });
+ };
+}, 'Object store has autoIncrement:true and the key path is an object \
+attribute');
+
+async_test(t => {
+ const record = { key: 1, property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ let rq;
+ const db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.put(record, 1);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to put() a record that does not meet the constraints of an object \
+store\'s inline key requirements');
+
+async_test(t => {
+ const record = { property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ let db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.put(record);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to call put() without an key parameter when the object store uses \
+out-of-line keys');
+
+async_test(t => {
+ const record = { key: { value: 1 }, property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ const db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.put(record);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to put() a record where the record\'s key does not meet the \
+constraints of a valid key');
+
+async_test(t => {
+ const record = { property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ const db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.put(record);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to put() a record where the record\'s in-line key is not defined');
+
+async_test(t => {
+ const record = { property: "data" };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ const db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store");
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.put(record, { value: 1 });
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to put() a record where the out of line key provided does not \
+meet the constraints of a valid key');
+
+async_test(t => {
+ const record = { key: 1, indexedProperty: { property: "data" } };
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ const db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ objStore.createIndex("index", "indexedProperty");
+
+ rq = objStore.put(record);
+
+ assert_true(rq instanceof IDBRequest);
+ rq.onsuccess = function() {
+ t.done();
+ };
+ };
+}, 'put() a record where a value being indexed does not meet the constraints \
+of a valid key');
+
+async_test(t => {
+ let db;
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(event) {
+ db = event.target.result;
+ db.createObjectStore("store", { keyPath: "pKey" });
+ };
+
+ open_rq.onsuccess = function(event) {
+ const txn = db.transaction("store", "readonly",
+ { durability: 'relaxed' });
+ const ostore = txn.objectStore("store");
+ t.step(function() {
+ assert_throws_dom("ReadOnlyError", function() {
+ ostore.put({ pKey: "primaryKey_0" });
+ });
+ });
+ t.done();
+ };
+}, 'If the transaction this IDBObjectStore belongs to has its mode set to \
+readonly, throw ReadOnlyError');
+
+async_test(t => {
+ let ostore;
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(event) {
+ const db = event.target.result;
+ ostore = db.createObjectStore("store", { keyPath: "pKey" });
+ db.deleteObjectStore("store");
+ assert_throws_dom("InvalidStateError", function() {
+ ostore.put({ pKey: "primaryKey_0" });
+ });
+ t.done();
+ };
+}, 'If the object store has been deleted, the implementation must throw a \
+DOMException of type InvalidStateError');
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put.htm
deleted file mode 100644
index e277ce54a20..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put.htm
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - put with an inline key </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { key: 1, property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { keyPath: "key" });
-
- objStore.put(record);
- };
-
- open_rq.onsuccess = function(e) {
- var rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .get(record.key);
-
- rq.onsuccess = t.step_func(function(e) {
- assert_equals(e.target.result.property, record.property);
- assert_equals(e.target.result.key, record.key);
- t.done();
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put10.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put10.htm
deleted file mode 100644
index 6882e8e4b5c..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put10.htm
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - Attempt to call 'put' without an key parameter when the object store uses out-of-line keys </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- var rq,
- objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.put(record); });
-
- assert_equals(rq, undefined);
- t.done();
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put11.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put11.htm
deleted file mode 100644
index a5ed2db357b..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put11.htm
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - Attempt to put a record where the record's key does not meet the constraints of a valid key </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { key: { value: 1 }, property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- var rq,
- objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.put(record); });
-
- assert_equals(rq, undefined);
- t.done();
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put12.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put12.htm
deleted file mode 100644
index 0693980277d..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put12.htm
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - Attempt to put a record where the record's in-line key is not defined </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- var rq,
- objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.put(record); });
-
- assert_equals(rq, undefined);
- t.done();
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put13.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put13.htm
deleted file mode 100644
index 8ae6561fc5c..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put13.htm
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - Attempt to put a record where the out of line key provided does not meet the constraints of a valid key </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- var rq,
- objStore = db.createObjectStore("store");
-
- assert_throws_dom("DataError",
- function() { rq = objStore.put(record, { value: 1 }); });
-
- assert_equals(rq, undefined);
- t.done();
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put14.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put14.htm
deleted file mode 100644
index bc5647f4c11..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put14.htm
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - Put a record where a value being indexed does not meet the constraints of a valid key </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { key: 1, indexedProperty: { property: "data" } };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- var rq,
- objStore = db.createObjectStore("store", { keyPath: "key" });
-
- objStore.createIndex("index", "indexedProperty");
-
- rq = objStore.put(record);
-
- assert_true(rq instanceof IDBRequest);
- rq.onsuccess = function() {
- t.done();
- }
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put15.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put15.htm
deleted file mode 100644
index e7affaddd44..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put15.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - If the transaction this IDBObjectStore belongs to has its mode set to readonly, throw ReadOnlyError</title>
-<link rel="author" title="Intel" href="http://www.intel.com">
-<link rel="help" href="https://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#widl-IDBObjectStore-put-IDBRequest-any-value-any-key">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-<div id="log"></div>
-<script>
- var db,
- t = async_test();
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function (event) {
- db = event.target.result;
- db.createObjectStore("store", {keyPath:"pKey"});
- }
-
- open_rq.onsuccess = function (event) {
- var txn = db.transaction("store", "readonly", {durability: 'relaxed'});
- var ostore = txn.objectStore("store");
- t.step(function(){
- assert_throws_dom("ReadOnlyError", function(){
- ostore.put({pKey: "primaryKey_0"});
- });
- });
- t.done();
- }
-</script>
-
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put16.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put16.htm
deleted file mode 100644
index e298ba88493..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put16.htm
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - If the object store has been deleted, the implementation must throw a DOMException of type InvalidStateError</title>
-<link rel="author" title="Intel" href="http://www.intel.com">
-<link rel="help" href="https://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#widl-IDBObjectStore-put-IDBRequest-any-value-any-key">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-<div id="log"></div>
-<script>
- var db,
- ostore,
- t = async_test();
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function (event) {
- db = event.target.result;
- ostore = db.createObjectStore("store", {keyPath:"pKey"});
- db.deleteObjectStore("store");
- assert_throws_dom("InvalidStateError", function(){
- ostore.put({pKey: "primaryKey_0"});
- });
- t.done();
- }
-</script>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put2.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put2.htm
deleted file mode 100644
index 733e2cb1549..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put2.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - put with an out-of-line key </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- key = 1,
- record = { property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store");
-
- objStore.put(record, key);
- };
-
- open_rq.onsuccess = function(e) {
- var rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .get(key);
-
- rq.onsuccess = t.step_func(function(e) {
- assert_equals(e.target.result.property, record.property);
-
- t.done();
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put3.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put3.htm
deleted file mode 100644
index b7792bdaf1d..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put3.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - record with same key already exists </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db, success_event,
- t = async_test(),
- record = { key: 1, property: "data" },
- record_put = { key: 1, property: "changed", more: ["stuff", 2] };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { keyPath: "key" });
- objStore.put(record);
-
- var rq = objStore.put(record_put);
- rq.onerror = fail(t, "error on put");
-
- rq.onsuccess = t.step_func(function(e) {
- success_event = true;
- });
- };
-
- open_rq.onsuccess = function(e) {
- assert_true(success_event);
-
- var rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .get(1);
-
- rq.onsuccess = t.step_func(function(e) {
- var rec = e.target.result;
-
- assert_equals(rec.key, record_put.key);
- assert_equals(rec.property, record_put.property);
- assert_array_equals(rec.more, record_put.more);
-
- t.done();
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put4.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put4.htm
deleted file mode 100644
index 4a59836eb63..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put4.htm
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - put where an index has unique:true specified </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- record = { key: 1, property: "data" };
-
- var open_rq = createdb(async_test());
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { autoIncrement: true });
- objStore.createIndex("i1", "property", { unique: true });
- objStore.put(record);
-
- var rq = objStore.put(record);
- rq.onsuccess = fail(this, "success on putting duplicate indexed record")
-
- rq.onerror = this.step_func(function(e) {
- assert_equals(rq.error.name, "ConstraintError");
- assert_equals(e.target.error.name, "ConstraintError");
-
- assert_equals(e.type, "error");
-
- e.preventDefault();
- e.stopPropagation();
- });
- };
-
- // Defer done, giving a spurious rq.onsuccess a chance to run
- open_rq.onsuccess = function(e) {
- this.done();
- }
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put5.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put5.htm
deleted file mode 100644
index 6e945e27d2a..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put5.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - object store's key path is an object attribute </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { test: { obj: { key: 1 } }, property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { keyPath: "test.obj.key" });
- objStore.put(record);
- };
-
- open_rq.onsuccess = function(e) {
- var rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .get(record.test.obj.key);
-
- rq.onsuccess = t.step_func(function(e) {
- assert_equals(e.target.result.property, record.property);
-
- t.done();
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put6.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put6.htm
deleted file mode 100644
index f0b6f0b98dc..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put6.htm
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - autoIncrement and inline keys </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { property: "data" },
- expected_keys = [ 1, 2, 3, 4 ];
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { keyPath: "key", autoIncrement: true });
-
- objStore.put(record);
- objStore.put(record);
- objStore.put(record);
- objStore.put(record);
- };
-
- open_rq.onsuccess = function(e) {
- var actual_keys = [],
- rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .openCursor();
-
- rq.onsuccess = t.step_func(function(e) {
- var cursor = e.target.result;
-
- if (cursor) {
- actual_keys.push(cursor.value.key);
- cursor.continue();
- }
- else {
- assert_array_equals(actual_keys, expected_keys);
- t.done();
- }
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put7.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put7.htm
deleted file mode 100644
index e41959f2110..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put7.htm
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - autoIncrement and out-of-line keys </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { property: "data" },
- expected_keys = [ 1, 2, 3, 4 ];
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { autoIncrement: true });
-
- objStore.put(record);
- objStore.put(record);
- objStore.put(record);
- objStore.put(record);
- };
-
- open_rq.onsuccess = function(e) {
- var actual_keys = [],
- rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .openCursor();
-
- rq.onsuccess = t.step_func(function(e) {
- var cursor = e.target.result;
-
- if (cursor) {
- actual_keys.push(cursor.key);
- cursor.continue();
- }
- else {
- assert_array_equals(actual_keys, expected_keys);
- t.done();
- }
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put8.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put8.htm
deleted file mode 100644
index 2bec639d322..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put8.htm
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - object store has autoIncrement:true and the key path is an object attribute </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var db,
- t = async_test(),
- record = { property: "data" },
- expected_keys = [ 1, 2, 3, 4 ];
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var objStore = db.createObjectStore("store", { keyPath: "test.obj.key", autoIncrement: true });
-
- objStore.put(record);
- objStore.put(record);
- objStore.put(record);
- objStore.put(record);
- };
-
- open_rq.onsuccess = function(e) {
- var actual_keys = [],
- rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .openCursor();
-
- rq.onsuccess = t.step_func(function(e) {
- var cursor = e.target.result;
-
- if (cursor) {
- actual_keys.push(cursor.value.test.obj.key);
- cursor.continue();
- }
- else {
- assert_array_equals(actual_keys, expected_keys);
- t.done();
- }
- });
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_put9.htm b/tests/wpt/tests/IndexedDB/idbobjectstore_put9.htm
deleted file mode 100644
index dff9415d691..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_put9.htm
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBObjectStore.put() - Attempt to put a record that does not meet the constraints of an object store's inline key requirements </title>
-<link rel="author" title="Microsoft" href="http://www.microsoft.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/support.js"></script>
-
-<script>
- var t = async_test(),
- record = { key: 1, property: "data" };
-
- var open_rq = createdb(t);
- open_rq.onupgradeneeded = function(e) {
- var rq,
- db = e.target.result,
- objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.put(record, 1); });
-
- assert_equals(rq, undefined);
- t.done();
- };
-</script>
-
-<div id="log"></div>
diff --git a/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js b/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js
index 7817b78cff6..4952df502d8 100644
--- a/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js
+++ b/tests/wpt/tests/WebCryptoAPI/sign_verify/eddsa.js
@@ -1,363 +1,214 @@
function run_test() {
- setup({explicit_done: true});
-
var subtle = self.crypto.subtle; // Change to test prefixed implementations
- // When are all these tests really done? When all the promises they use have resolved.
- var all_promises = [];
-
// Source file [algorithm_name]_vectors.js provides the getTestVectors method
// for the algorithm that drives these tests.
var testVectors = getTestVectors();
- // Test verification first, because signing tests rely on that working
testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
- var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, vector.data)
- .then(function(is_verified) {
- assert_true(is_verified, "Signature verified");
- }, function(err) {
- assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
- });
-
- return operation;
- }, vector.name + " verification");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested verification.
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " verification");
- });
-
- all_promises.push(promise);
- });
+ var algorithm = {name: vector.algorithmName};
- // Test verification with an altered buffer after call
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
+ // Test verification first, because signing tests rely on that working
+ promise_test(async() => {
+ let isVerified = false;
+ let key;
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
+ isVerified = await subtle.verify(algorithm, key, vector.signature, vector.data)
+ } catch (err) {
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
+ };
+ assert_true(isVerified, "Signature verified");
+ }, vector.name + " verification");
+
+ // Test verification with an altered buffer after call
+ promise_test(async() => {
+ let isVerified = false;
+ let key;
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
var signature = copyBuffer(vector.signature);
- var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.data)
- .then(function(is_verified) {
- assert_true(is_verified, "Signature verified");
- }, function(err) {
- assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
- });
-
- signature[0] = 255 - signature[0];
- return operation;
- }, vector.name + " verification with altered signature after call");
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " verification with altered signature after call");
- });
-
- all_promises.push(promise);
- });
-
- // Check for successful verification even if data is altered after call.
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
+ [isVerified] = await Promise.all([
+ subtle.verify(algorithm, key, signature, vector.data),
+ signature[0] = 255 - signature[0]
+ ]);
+ } catch (err) {
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
+ };
+ assert_true(isVerified, "Signature verified");
+ }, vector.name + " verification with altered signature after call");
+
+ // Check for successful verification even if data is altered after call.
+ promise_test(async() => {
+ let isVerified = false;
+ let key;
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
var data = copyBuffer(vector.data);
- var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, data)
- .then(function(is_verified) {
- assert_true(is_verified, "Signature verified");
- }, function(err) {
- assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
- });
-
- data[0] = 255 - data[0];
- return operation;
- }, vector.name + " with altered data after call");
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " with altered data after call");
- });
-
- all_promises.push(promise);
- });
-
- // Check for failures due to using privateKey to verify.
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
- return subtle.verify(algorithm, vector.privateKey, vector.signature, vector.data)
- .then(function(data) {
- assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name + ": " + err.message + "'");
- }, function(err) {
- assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'");
- });
- }, vector.name + " using privateKey to verify");
-
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " using privateKey to verify");
- });
-
- all_promises.push(promise);
- });
-
- // Check for failures due to using publicKey to sign.
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
- return subtle.sign(algorithm, vector.publicKey, vector.data)
- .then(function(signature) {
- assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name + ": " + err.message + "'");
- }, function(err) {
- assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'");
- });
- }, vector.name + " using publicKey to sign");
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " using publicKey to sign");
- });
-
- all_promises.push(promise);
- });
-
- // Check for failures due to no "verify" usage.
- testVectors.forEach(function(originalVector) {
- var vector = Object.assign({}, originalVector);
-
- var promise = importVectorKeys(vector, [], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
- return subtle.verify(algorithm, vector.publicKey, vector.signature, vector.data)
- .then(function(data) {
- assert_unreached("Should have thrown error for no verify usage in " + vector.name + ": " + err.message + "'");
- }, function(err) {
- assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'");
- });
- }, vector.name + " no verify usage");
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " no verify usage");
- });
-
- all_promises.push(promise);
- });
-
- // Check for successful signing and verification.
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
- return subtle.sign(algorithm, vector.privateKey, vector.data)
- .then(function(signature) {
- assert_true(equalBuffers(signature, vector.signature), "Signing did not give the expected output");
- // Can we verify the signature?
- return subtle.verify(algorithm, vector.publicKey, signature, vector.data)
- .then(function(is_verified) {
- assert_true(is_verified, "Round trip verification works");
- return signature;
- }, function(err) {
- assert_unreached("verify error for test " + vector.name + ": " + err.message + "'");
- });
- }, function(err) {
- assert_unreached("sign error for test " + vector.name + ": '" + err.message + "'");
- });
- }, vector.name + " round trip");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested signing or verifying
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " round trip");
- });
-
- all_promises.push(promise);
- });
-
- // Test signing with the wrong algorithm
- testVectors.forEach(function(vector) {
- // Want to get the key for the wrong algorithm
- var promise = subtle.generateKey({name: "HMAC", hash: "SHA-1"}, false, ["sign", "verify"])
- .then(function(wrongKey) {
- var algorithm = {name: vector.algorithmName};
- return importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- promise_test(function(test) {
- var operation = subtle.sign(algorithm, wrongKey, vector.data)
- .then(function(signature) {
- assert_unreached("Signing should not have succeeded for " + vector.name);
- }, function(err) {
- assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'");
- });
-
- return operation;
- }, vector.name + " signing with wrong algorithm name");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested verification.
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " signing with wrong algorithm name");
- });
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("Generate wrong key for test " + vector.name + " failed: '" + err.message + "'");
- }, "generate wrong key step: " + vector.name + " signing with wrong algorithm name");
- });
-
- all_promises.push(promise);
- });
-
- // Test verification with the wrong algorithm
- testVectors.forEach(function(vector) {
- // Want to get the key for the wrong algorithm
- var promise = subtle.generateKey({name: "HMAC", hash: "SHA-1"}, false, ["sign", "verify"])
- .then(function(wrongKey) {
- return importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
- promise_test(function(test) {
- var operation = subtle.verify(algorithm, wrongKey, vector.signature, vector.data)
- .then(function(signature) {
- assert_unreached("Verifying should not have succeeded for " + vector.name);
- }, function(err) {
- assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'");
- });
-
- return operation;
- }, vector.name + " verifying with wrong algorithm name");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested verification.
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " verifying with wrong algorithm name");
- });
- }, function(err) {
- promise_test(function(test) {
- assert_unreached("Generate wrong key for test " + vector.name + " failed: '" + err.message + "'");
- }, "generate wrong key step: " + vector.name + " verifying with wrong algorithm name");
- });
-
- all_promises.push(promise);
- });
-
- // Test verification fails with wrong signature
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
+ [isVerified] = await Promise.all([
+ subtle.verify(algorithm, key, vector.signature, data),
+ data[0] = 255 - data[0]
+ ]);
+ } catch (err) {
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
+ };
+ assert_true(isVerified, "Signature verified");
+ }, vector.name + " with altered data after call");
+
+ // Check for failures due to using privateKey to verify.
+ promise_test(async() => {
+ let isVerified = false;
+ let key;
+ try {
+ key = await subtle.importKey("pkcs8", vector.privateKeyBuffer, algorithm, false, ["sign"]);
+ isVerified = await subtle.verify(algorithm, key, vector.signature, vector.data)
+ assert_unreached("Should have thrown error for using privateKey to verify in " + vector.name);
+ } catch (err) {
+ if (err instanceof AssertionError)
+ throw err;
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'");
+ };
+ assert_false(isVerified, "Signature verified");
+ }, vector.name + " using privateKey to verify");
+
+ // Check for failures due to using publicKey to sign.
+ promise_test(async() => {
+ let isVerified = false;
+ let key;
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
+ let signature = await subtle.sign(algorithm, key, vector.data);
+ assert_unreached("Should have thrown error for using publicKey to sign in " + vector.name);
+ } catch (err) {
+ if (err instanceof AssertionError)
+ throw err;
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'");
+ };
+ }, vector.name + " using publicKey to sign");
+
+ // Check for failures due to no "verify" usage.
+ promise_test(async() => {
+ let isVerified = false;
+ let key;
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, []);
+ isVerified = await subtle.verify(algorithm, key, vector.signature, vector.data)
+ assert_unreached("Should have thrown error for no verify usage in " + vector.name);
+ } catch (err) {
+ if (err instanceof AssertionError)
+ throw err;
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_equals(err.name, "InvalidAccessError", "Should throw InvalidAccessError instead of '" + err.message + "'");
+ };
+ assert_false(isVerified, "Signature verified");
+ }, vector.name + " no verify usage");
+
+ // Check for successful signing and verification.
+ var algorithm = {name: vector.algorithmName};
+ promise_test(async() => {
+ let isVerified = false;
+ let privateKey, publicKey;
+ let signature;
+ try {
+ privateKey = await subtle.importKey("pkcs8", vector.privateKeyBuffer, algorithm, false, ["sign"]);
+ publicKey = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
+ signature = await subtle.sign(algorithm, privateKey, vector.data);
+ isVerified = await subtle.verify(algorithm, publicKey, vector.signature, vector.data)
+ } catch (err) {
+ assert_false(publicKey === undefined || privateKey === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_false(signature === undefined, "sign error for test " + vector.name + ": '" + err.message + "'");
+ assert_unreached("verify error for test " + vector.name + ": " + err.message + "'");
+ };
+ assert_true(isVerified, "Round trip verification works");
+ }, vector.name + " round trip");
+
+ // Test signing with the wrong algorithm
+ var algorithm = {name: vector.algorithmName};
+ promise_test(async() => {
+ let wrongKey;
+ try {
+ wrongKey = await subtle.generateKey({name: "HMAC", hash: "SHA-1"}, false, ["sign", "verify"])
+ let signature = await subtle.sign(algorithm, wrongKey, vector.data);
+ assert_unreached("Signing should not have succeeded for " + vector.name);
+ } catch (err) {
+ if (err instanceof AssertionError)
+ throw err;
+ assert_false(wrongKey === undefined, "Generate wrong key for test " + vector.name + " failed: '" + err.message + "'");
+ assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'");
+ };
+ }, vector.name + " signing with wrong algorithm name");
+
+ // Test verification with the wrong algorithm
+ var algorithm = {name: vector.algorithmName};
+ promise_test(async() => {
+ let wrongKey;
+ try {
+ wrongKey = await subtle.generateKey({name: "HMAC", hash: "SHA-1"}, false, ["sign", "verify"])
+ let isVerified = await subtle.verify(algorithm, wrongKey, vector.signature, vector.data)
+ assert_unreached("Verifying should not have succeeded for " + vector.name);
+ } catch (err) {
+ if (err instanceof AssertionError)
+ throw err;
+ assert_false(wrongKey === undefined, "Generate wrong key for test " + vector.name + " failed: '" + err.message + "'");
+ assert_equals(err.name, "InvalidAccessError", "Should have thrown InvalidAccessError instead of '" + err.message + "'");
+ };
+ }, vector.name + " verifying with wrong algorithm name");
+
+ // Test verification fails with wrong signature
+ var algorithm = {name: vector.algorithmName};
+ promise_test(async() => {
+ let key;
+ let isVerified = true;
var signature = copyBuffer(vector.signature);
signature[0] = 255 - signature[0];
- promise_test(function(test) {
- var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.data)
- .then(function(is_verified) {
- assert_false(is_verified, "Signature NOT verified");
- }, function(err) {
- assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
- });
-
- return operation;
- }, vector.name + " verification failure due to altered signature");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested verification.
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " verification failure due to altered signature");
- });
-
- all_promises.push(promise);
- });
-
- // Test verification fails with short (odd length) signature
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
+ isVerified = await subtle.verify(algorithm, key, signature, vector.data)
+ } catch (err) {
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
+ };
+ assert_false(isVerified, "Signature verified");
+ }, vector.name + " verification failure due to altered signature");
+
+ // Test verification fails with short (odd length) signature
+ promise_test(async() => {
+ let key;
+ let isVerified = true;
var signature = vector.signature.slice(1); // Skip the first byte
- promise_test(function(test) {
- var operation = subtle.verify(algorithm, vector.publicKey, signature, vector.data)
- .then(function(is_verified) {
- assert_false(is_verified, "Signature NOT verified");
- }, function(err) {
- assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
- });
-
- return operation;
- }, vector.name + " verification failure due to shortened signature");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested verification.
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " verification failure due to shortened signature");
- });
-
- all_promises.push(promise);
- });
-
- // Test verification fails with wrong data
- testVectors.forEach(function(vector) {
- var promise = importVectorKeys(vector, ["verify"], ["sign"])
- .then(function(vectors) {
- var algorithm = {name: vector.algorithmName};
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
+ isVerified = await subtle.verify(algorithm, key, signature, vector.data)
+ } catch (err) {
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
+ };
+ assert_false(isVerified, "Signature verified");
+ }, vector.name + " verification failure due to shortened signature");
+
+ // Test verification fails with wrong data
+ promise_test(async() => {
+ let key;
+ let isVerified = true;
var data = copyBuffer(vector.data);
data[0] = 255 - data[0];
- promise_test(function(test) {
- var operation = subtle.verify(algorithm, vector.publicKey, vector.signature, data)
- .then(function(is_verified) {
- assert_false(is_verified, "Signature NOT verified");
- }, function(err) {
- assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
- });
-
- return operation;
- }, vector.name + " verification failure due to altered data");
-
- }, function(err) {
- // We need a failed test if the importVectorKey operation fails, so
- // we know we never tested verification.
- promise_test(function(test) {
- assert_unreached("importVectorKeys failed for " + vector.name + ". Message: ''" + err.message + "''");
- }, "importVectorKeys step: " + vector.name + " verification failure due to altered data");
- });
-
- all_promises.push(promise);
- });
-
-
- promise_test(function() {
- return Promise.all(all_promises)
- .then(function() {done();})
- .catch(function() {done();})
- }, "setup");
-
- // Test that generated keys are valid for signing and verifying.
- testVectors.forEach(function(vector) {
- var algorithm = {name: vector.algorithmName};
+ try {
+ key = await subtle.importKey("spki", vector.publicKeyBuffer, algorithm, false, ["verify"]);
+ isVerified = await subtle.verify(algorithm, key, vector.signature, data)
+ } catch (err) {
+ assert_false(key === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
+ assert_unreached("Verification should not throw error " + vector.name + ": " + err.message + "'");
+ };
+ assert_false(isVerified, "Signature verified");
+ }, vector.name + " verification failure due to altered data");
+
+ // Test that generated keys are valid for signing and verifying.
promise_test(async() => {
let key = await subtle.generateKey(algorithm, false, ["sign", "verify"]);
let signature = await subtle.sign(algorithm, key.privateKey, vector.data);
@@ -371,17 +222,14 @@ function run_test() {
Object.keys(kSmallOrderTestCases).forEach(function (algorithmName) {
var algorithm = {name: algorithmName};
kSmallOrderTestCases[algorithmName].forEach(function(test) {
- // Test low-order public keys
promise_test(async() => {
let isVerified = true;
let publicKey;
try {
- publicKey = await subtle.importKey("raw", test.keyData,
- algorithm,
- false, ["verify"])
- isVerified = await subtle.verify(algorithmName, publicKey, test.signature, test.message);
+ publicKey = await subtle.importKey("raw", test.keyData, algorithm, false, ["verify"])
+ isVerified = await subtle.verify(algorithm, publicKey, test.signature, test.message);
} catch (err) {
- assert_equals(isVerified, test.verified, "Signature verification result.");
+ assert_false(publicKey === undefined, "importKey failed for " + vector.name + ". Message: ''" + err.message + "''");
assert_unreached("The operation shouldn't fail, but it thown this error: " + err.name + ": " + err.message + ".");
}
assert_false(isVerified, "Signature verification result.");
@@ -389,41 +237,6 @@ function run_test() {
});
});
- // A test vector has all needed fields for signing and verifying, EXCEPT that the
- // key field may be null. This function replaces that null with the Correct
- // CryptoKey object.
- //
- // Returns a Promise that yields an updated vector on success.
- function importVectorKeys(vector, publicKeyUsages, privateKeyUsages) {
- var publicPromise, privatePromise;
-
- if (vector.publicKey !== null) {
- publicPromise = new Promise(function(resolve, reject) {
- resolve(vector);
- });
- } else {
- publicPromise = subtle.importKey(vector.publicKeyFormat, vector.publicKeyBuffer, {name: vector.algorithmName}, false, publicKeyUsages)
- .then(function(key) {
- vector.publicKey = key;
- return vector;
- }); // Returns a copy of the sourceBuffer it is sent.
- }
-
- if (vector.privateKey !== null) {
- privatePromise = new Promise(function(resolve, reject) {
- resolve(vector);
- });
- } else {
- privatePromise = subtle.importKey(vector.privateKeyFormat, vector.privateKeyBuffer, {name: vector.algorithmName}, false, privateKeyUsages)
- .then(function(key) {
- vector.privateKey = key;
- return vector;
- });
- }
-
- return Promise.all([publicPromise, privatePromise]);
- }
-
// Returns a copy of the sourceBuffer it is sent.
function copyBuffer(sourceBuffer) {
var source = new Uint8Array(sourceBuffer);
diff --git a/tests/wpt/tests/accname/name/comp_label.html b/tests/wpt/tests/accname/name/comp_label.html
index 8b569ba6fff..3eda2a5367b 100644
--- a/tests/wpt/tests/accname/name/comp_label.html
+++ b/tests/wpt/tests/accname/name/comp_label.html
@@ -186,6 +186,12 @@ x
x
</button>
+<span style="display: none">
+<button data-expectedlabel="" data-testname="Hidden button's label should be the empty string" class="ex">
+x
+</button>
+</span>
+
<!-- Step 2B: LabelledBy supercedes 2D: AriaLabel, also see wpt/accname/name/comp_labelledby.html -->
<a href="#" aria-labelledby="span6" aria-label="foo" data-expectedlabel="label" data-testname="link's aria-labelledby name supercedes aria-label" class="ex">x</a>
<span id="span6">label</span>
diff --git a/tests/wpt/tests/console/console-countReset-logging-manual.html b/tests/wpt/tests/console/console-countReset-logging-manual.html
index 7fe01f50edb..f0a9358fba5 100644
--- a/tests/wpt/tests/console/console-countReset-logging-manual.html
+++ b/tests/wpt/tests/console/console-countReset-logging-manual.html
@@ -24,21 +24,25 @@
console.count();
console.countReset();
console.count();
+console.countReset();
console.count(undefined);
console.countReset(undefined);
console.count(undefined);
+console.countReset(undefined);
console.count("default");
console.countReset("default");
console.count("default");
+console.countReset("default");
console.count({toString() {return "default"}});
console.countReset({toString() {return "default"}});
console.count({toString() {return "default"}});
+console.countReset({toString() {return "default"}});
console.count("a label");
-console.countReset();
+console.countReset("a label");
console.count("a label");
console.countReset("b"); // should produce a warning
diff --git a/tests/wpt/tests/credential-management/digital-identity.https.html b/tests/wpt/tests/credential-management/digital-identity.https.html
index 1a9e09dbf3c..82630e2a5bd 100644
--- a/tests/wpt/tests/credential-management/digital-identity.https.html
+++ b/tests/wpt/tests/credential-management/digital-identity.https.html
@@ -39,6 +39,7 @@ function buildValidNavigatorIdentityRequest() {
return {
digital: {
providers: [{
+ protocol: "protocol",
selector: {
format: ['mdoc'],
doctype: 'org.iso.18013.5.1.mDL',
@@ -94,8 +95,9 @@ promise_test(async t => {
promise_test(async t => {
let request = buildValidNavigatorIdentityRequest();
- let {token} = await navigator.identity.get(request);
- assert_equals("fake_test_token", token);
+ let credential = await navigator.identity.get(request);
+ assert_equals("protocol", credential.protocol);
+ assert_equals("fake_test_token", credential.data);
}, "navigator.identity.get() API works in toplevel frame.");
promise_test(async t => {
diff --git a/tests/wpt/tests/credential-management/fedcm-authz/fedcm-continue-on-disallowed.https.html b/tests/wpt/tests/credential-management/fedcm-authz/fedcm-continue-on-disallowed.https.html
new file mode 100644
index 00000000000..fcda3a3dd59
--- /dev/null
+++ b/tests/wpt/tests/credential-management/fedcm-authz/fedcm-continue-on-disallowed.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>Federated Credential Management API network request tests.</title>
+<link rel="help" href="https://fedidcg.github.io/FedCM">
+<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>
+
+<body>
+
+<script type="module">
+import {fedcm_test,
+ request_options_with_mediation_required,
+ select_manifest,
+ fedcm_get_and_select_first_account} from '../support/fedcm-helper.sub.js';
+
+fedcm_test(async t => {
+ // First, do a regular fedcm request so we that we can be considered
+ // a returning user below.
+ let options = request_options_with_mediation_required();
+ await fedcm_get_and_select_first_account(t, options);
+
+ // Now do a silent mediation request.
+ options = request_options_with_mediation_required('manifest_with_continue_on.json');
+ options.mediation = 'silent';
+ await select_manifest(t, options);
+ const cred_promise = fedcm_get_and_select_first_account(t, options);
+ return promise_rejects_dom(t, 'NetworkError', cred_promise);
+}, "continue_on with mediation:silent should fail");
+
+</script>
diff --git a/tests/wpt/tests/credential-management/fedcm-same-site-none/fedcm-same-site-none.https.html b/tests/wpt/tests/credential-management/fedcm-same-site-none/fedcm-same-site-none.https.html
new file mode 100644
index 00000000000..77ecdaff9fe
--- /dev/null
+++ b/tests/wpt/tests/credential-management/fedcm-same-site-none/fedcm-same-site-none.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>Federated Credential Management API SameSite=None tests.</title>
+<link rel="help" href="https://fedidcg.github.io/FedCM">
+<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>
+
+<body>
+
+<script type="module">
+import {fedcm_test,
+ alt_request_options_with_mediation_required,
+ select_manifest,
+ fedcm_get_and_select_first_account} from '../support/fedcm-helper.sub.js';
+
+fedcm_test(async t => {
+ const options = alt_request_options_with_mediation_required('manifest_check_same_site_strict.json');
+ await select_manifest(t, options);
+ const cred = await fedcm_get_and_select_first_account(t, options);
+ assert_equals(cred.token, "token");
+ assert_equals(cred.isAutoSelected, false);
+}, "FedCM requests should be considered cross-origin and therefore not send SameSite=Strict cookies.");
+
+</script>
diff --git a/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js b/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js
index 765b3cc48a9..25fdb0995c1 100644
--- a/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js
+++ b/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js
@@ -22,7 +22,7 @@ export function open_and_wait_for_popup(origin, path) {
// Set the identity provider cookie.
export function set_fedcm_cookie(host) {
if (host == undefined) {
- document.cookie = 'cookie=1; SameSite=Strict; Path=/credential-management/support; Secure';
+ document.cookie = 'cookie=1; SameSite=None; Path=/credential-management/support; Secure';
return Promise.resolve();
} else {
return open_and_wait_for_popup(host, '/credential-management/support/set_cookie');
diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py b/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py
new file mode 100644
index 00000000000..a6f385feac1
--- /dev/null
+++ b/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py
@@ -0,0 +1,28 @@
+import importlib
+error_checker = importlib.import_module("credential-management.support.fedcm.request-params-check")
+
+def main(request, response):
+ request_error = error_checker.accountsCheck(request)
+ if (request_error):
+ return request_error
+ if request.cookies.get(b"same_site_strict") == b"1":
+ return (546, [], "Should not send SameSite=Strict cookies")
+ if request.headers.get(b"Sec-Fetch-Site") != b"cross-site":
+ return (538, [], "Wrong Sec-Fetch-Site header")
+
+ response.headers.set(b"Content-Type", b"application/json")
+
+ return """
+{
+ "accounts": [{
+ "id": "1234",
+ "given_name": "John",
+ "name": "John Doe",
+ "email": "john_doe@idp.example",
+ "picture": "https://idp.example/profile/123",
+ "approved_clients": ["123", "456", "789"],
+ "login_hints": ["john_doe"],
+ "domain_hints": ["idp.example", "example"]
+ }]
+}
+"""
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json b/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json
new file mode 100644
index 00000000000..d7304159834
--- /dev/null
+++ b/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json
@@ -0,0 +1,7 @@
+{
+ "accounts_endpoint": "accounts_check_same_site_strict.py",
+ "client_metadata_endpoint": "client_metadata.py",
+ "id_assertion_endpoint": "token_check_same_site_strict.py",
+ "login_url": "login.html"
+}
+
diff --git a/tests/wpt/tests/credential-management/support/fedcm/request-params-check.py b/tests/wpt/tests/credential-management/support/fedcm/request-params-check.py
index b774496d5da..6c610e6e201 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/request-params-check.py
+++ b/tests/wpt/tests/credential-management/support/fedcm/request-params-check.py
@@ -17,8 +17,6 @@ def commonUncredentialedRequestCheck(request):
def commonCredentialedRequestCheck(request):
if request.cookies.get(b"cookie") != b"1":
return (537, [], "Missing cookie")
- if request.headers.get(b"Sec-Fetch-Site") != b"none":
- return (538, [], "Wrong Sec-Fetch-Site header")
def commonPostCheck(request):
if not request.headers.get(b"Origin"):
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py b/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py
new file mode 100644
index 00000000000..8a4b3a234bd
--- /dev/null
+++ b/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py
@@ -0,0 +1,15 @@
+import importlib
+error_checker = importlib.import_module("credential-management.support.fedcm.request-params-check")
+
+def main(request, response):
+ request_error = error_checker.tokenCheck(request)
+ if (request_error):
+ return request_error
+ if request.cookies.get(b"same_site_strict") == b"1":
+ return (546, [], "Should not send SameSite=Strict cookies")
+
+ response.headers.set(b"Content-Type", b"application/json")
+ response.headers.set(b"Access-Control-Allow-Origin", request.headers.get(b"Origin"))
+ response.headers.set(b"Access-Control-Allow-Credentials", "true")
+
+ return "{\"token\": \"token\"}"
diff --git a/tests/wpt/tests/credential-management/support/set_cookie.headers b/tests/wpt/tests/credential-management/support/set_cookie.headers
index b19ff933a6f..4226ff4c997 100644
--- a/tests/wpt/tests/credential-management/support/set_cookie.headers
+++ b/tests/wpt/tests/credential-management/support/set_cookie.headers
@@ -1,2 +1,3 @@
Content-Type: text/html
Set-Cookie: cookie=1; SameSite=None; Secure
+Set-Cookie: same_site_strict=1; SameSite=Strict; Secure
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html
index 7012208044a..20abb2ed096 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-htb.html
@@ -21,7 +21,7 @@
}
.target {
- anchor-default: --anchor;
+ position-anchor: --anchor;
position: absolute;
background: cyan;
justify-self: anchor-center;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html
index 584424d306f..099d9cd15b4 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-htb-vrl.html
@@ -22,7 +22,7 @@
.target {
writing-mode: vertical-rl;
- anchor-default: --anchor;
+ position-anchor: --anchor;
position: absolute;
background: cyan;
align-self: anchor-center;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html
index c7ee2302626..3e4f485cec3 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-htb.html
@@ -23,7 +23,7 @@
.target {
writing-mode: horizontal-tb;
- anchor-default: --anchor;
+ position-anchor: --anchor;
position: absolute;
background: cyan;
align-self: anchor-center;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html
index d314dc7f2fc..fe40c731419 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-center-vrl-vrl.html
@@ -22,7 +22,7 @@
}
.target {
- anchor-default: --anchor;
+ position-anchor: --anchor;
position: absolute;
background: cyan;
justify-self: anchor-center;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-getComputedStyle-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-getComputedStyle-003.html
index da9ec4a1451..fc384ab4cdf 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-getComputedStyle-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-getComputedStyle-003.html
@@ -52,7 +52,7 @@ body {
}
#target1 {
- anchor-default: --a1;
+ position-anchor: --a1;
}
#anchor2 {
@@ -62,7 +62,7 @@ body {
}
#target2 {
- anchor-default: --a2;
+ position-anchor: --a2;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained-dynamic.html b/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained-dynamic.html
index 50cec96f366..1413fe9d772 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained-dynamic.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained-dynamic.html
@@ -19,7 +19,7 @@
}
.target {
position: absolute;
- anchor-default: var(--anchor-name);
+ position-anchor: var(--anchor-name);
top: anchor(bottom, 50px);
}
#a1 { --anchor-name: --a1; }
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained.html b/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained.html
index a5295758891..b88afe4107d 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-name-style-contained.html
@@ -19,7 +19,7 @@
}
.target {
position: absolute;
- anchor-default: var(--anchor-name);
+ position-anchor: var(--anchor-name);
top: anchor(bottom, 50px);
}
#a1 { --anchor-name: --a1; }
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-circular.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-circular.html
index 8efbeb09e20..85fca57421c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-circular.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-circular.html
@@ -15,7 +15,7 @@ div {
#anchored1 {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: orange;
@@ -24,7 +24,7 @@ div {
#anchored2 {
position: absolute;
- anchor-default: --a2;
+ position-anchor: --a2;
left: anchor(--a2 left);
top: anchor(--a2 bottom);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-001.html
index 055459551b8..a8513bb74ca 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-001.html
@@ -21,7 +21,7 @@
width: 100px;
height: 100px;
background: lime;
- anchor-default: --a;
+ position-anchor: --a;
outline: none;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-002.html
index a87a9d7eedd..9ce0b8e5f9f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-002.html
@@ -21,7 +21,7 @@
width: 100px;
height: 100px;
background: lime;
- anchor-default: --a;
+ position-anchor: --a;
outline: none;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-003.html
index 96d5219c5ce..3bc815af0ca 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-003.html
@@ -21,7 +21,7 @@
width: 100px;
height: 100px;
background: lime;
- anchor-default: --a;
+ position-anchor: --a;
outline: none;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-004.html
index c986e3f98d3..ad0a7b8b32f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-004.html
@@ -21,7 +21,7 @@
width: 100px;
height: 100px;
background: lime;
- anchor-default: --a;
+ position-anchor: --a;
outline: none;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-005.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-005.html
index cf39c777367..51aa482aee5 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-005.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-005.html
@@ -22,7 +22,7 @@
width: 100px;
height: 100px;
background: lime;
- anchor-default: --a;
+ position-anchor: --a;
}
body {
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-006.html
index c13284b8548..a3b9e63c06b 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-position-top-layer-006.html
@@ -22,7 +22,7 @@
width: 100px;
height: 100px;
background: lime;
- anchor-default: --a;
+ position-anchor: --a;
}
body {
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-001.html
index 8609795c8a6..b9dfc56e2ef 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-001.html
@@ -40,7 +40,7 @@ body {
position: absolute;
left: anchor(--anchor left);
bottom: anchor(--anchor top);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -48,7 +48,7 @@ body {
position: absolute;
left: anchor(--anchor left);
top: anchor(--anchor bottom);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-002.html
index 8ef6f500a1f..2c51e6a1a3a 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-002.html
@@ -45,7 +45,7 @@ body {
height: 50px;
top: anchor(--a1 top);
left: anchor(--a1 right);
- anchor-default: --a1;
+ position-anchor: --a1;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-003.html
index c1b31c0becf..6c0dd08355c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-003.html
@@ -47,7 +47,7 @@ body {
position: absolute;
left: anchor(--a left);
bottom: anchor(--a top);
- anchor-default: --a;
+ position-anchor: --a;
width: 50px;
height: 50px;
background: lime;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-004.html
index d08279118d9..c0e0afb23f1 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-004.html
@@ -32,7 +32,7 @@ body {
.target {
position: absolute;
- anchor-default: --a;
+ position-anchor: --a;
top: anchor(--a bottom);
left: anchor(--a left);
color: lime;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-005.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-005.html
index a9a7d24d2b9..f8f26b719f0 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-005.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-005.html
@@ -33,7 +33,7 @@ body {
width: 100px;
height: 100px;
bottom: anchor(--a top);
- anchor-default: --a;
+ position-anchor: --a;
background: lime;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html
index 2ffd026b552..9c8a8c0ac2f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-006.html
@@ -50,21 +50,21 @@ body {
/* Needs scroll adjustment in x axis only */
#target1 {
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(left);
top: anchor(--scroller1 bottom);
}
/* Needs scroll adjustment in y axis only */
#target2 {
- anchor-default: --a2;
+ position-anchor: --a2;
top: anchor(top);
left: anchor(--scroller2 right);
}
/* No scroll adjustment needed */
#target3 {
- anchor-default: --a3;
+ position-anchor: --a3;
top: anchor(--scroller3 bottom);
left: anchor(--scroller3 right);
}
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html
index ec519106190..7e288d713f6 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-007.html
@@ -56,7 +56,7 @@ body {
height: 50px;
left: anchor(--a3 left);
top: anchor(--a1 top);
- anchor-default: --a2;
+ position-anchor: --a2;
background: lime;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-001.tentative.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-001.tentative.html
index 60ad1280226..1235f8fad43 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-001.tentative.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-001.tentative.html
@@ -25,7 +25,7 @@ div {
#anchored1 {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
@@ -34,7 +34,7 @@ div {
#anchored2 {
position: absolute;
- anchor-default: --a2;
+ position-anchor: --a2;
left: anchor(--a2 left);
top: anchor(--a2 bottom);
background: lime;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-002.tentative.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-002.tentative.html
index e180c564682..9c60799e0bb 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-002.tentative.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-002.tentative.html
@@ -31,7 +31,7 @@ div {
#anchored1 {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
@@ -40,7 +40,7 @@ div {
#anchored2 {
position: absolute;
- anchor-default: --a2;
+ position-anchor: --a2;
left: anchor(--a2 left);
top: anchor(--a2 bottom);
background: lime;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-003.tentative.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-003.tentative.html
index 8912fcb6994..b441c92bf15 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-003.tentative.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-003.tentative.html
@@ -31,7 +31,7 @@ div {
#anchored1 {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
@@ -41,7 +41,7 @@ div {
#anchored2 {
position: absolute;
- anchor-default: --a2;
+ position-anchor: --a2;
left: anchor(--a2 left);
top: anchor(--a2 bottom);
background: lime;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-004.tentative.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-004.tentative.html
index 5834eb1f4cb..f1765a9870f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-004.tentative.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-004.tentative.html
@@ -37,7 +37,7 @@ div {
#anchored1 {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
@@ -45,7 +45,7 @@ div {
#anchored2 {
position: absolute;
- anchor-default: --a2;
+ position-anchor: --a2;
left: anchor(--a2 left);
top: anchor(--a2 bottom);
background: lime;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-fallback.tentative.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-fallback.tentative.html
index 32cd9de0054..d2300da8182 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-fallback.tentative.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-fallback.tentative.html
@@ -27,7 +27,7 @@ div {
#anchored1 {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
background: green;
position-try-options: --fallback;
anchor-name: --a2;
@@ -37,7 +37,7 @@ div {
#anchored2 {
position: absolute;
- anchor-default: --a2;
+ position-anchor: --a2;
left: anchor(--a2 left);
top: anchor(--a2 bottom);
background: lime;
@@ -46,6 +46,7 @@ div {
@position-try --fallback {
left: anchor(--a1 right);
top: anchor(--a1 top);
+ bottom: auto;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-001-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-001-crash.html
index 005a27393a2..4dd9bad60ea 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-001-crash.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-001-crash.html
@@ -23,7 +23,7 @@
#anchored {
position: absolute;
- anchor-default: --a;
+ position-anchor: --a;
left: anchor(--a left);
bottom: anchor(--a top);
width: 100px;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-002-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-002-crash.html
index 83ce1468252..80dabbb6661 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-002-crash.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-002-crash.html
@@ -23,7 +23,7 @@
position: fixed;
top: anchor(--a bottom);
left: anchor(--a left);
- anchor-default: --a;
+ position-anchor: --a;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-003-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-003-crash.html
index 594c844bfb5..f46d902ffee 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-003-crash.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-003-crash.html
@@ -23,7 +23,7 @@
position: fixed;
top: anchor(--a bottom);
left: anchor(--a left);
- anchor-default: --a;
+ position-anchor: --a;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-004-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-004-crash.html
index 226a1b099c3..ee5ad2f41ae 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-004-crash.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-004-crash.html
@@ -23,7 +23,7 @@
position: fixed;
top: anchor(--a bottom);
left: anchor(--a left);
- anchor-default: --a;
+ position-anchor: --a;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-005-crash.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-005-crash.html
index 639e2e064a7..c5e44a79e79 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-005-crash.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-005-crash.html
@@ -23,7 +23,7 @@
position: fixed;
top: anchor(--a bottom);
left: anchor(--a left);
- anchor-default: --a;
+ position-anchor: --a;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html
index 6e57accc457..49c6dc780c7 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html
@@ -29,7 +29,7 @@ body {
background: red;
left: 0;
bottom: anchor(--a top);
- anchor-default: --a;
+ position-anchor: --a;
}
#overlap {
position: absolute;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos-002.html
index 5b2aa2dd50b..1a05d8b93a1 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos-002.html
@@ -23,7 +23,7 @@ div {
#anchored {
position: fixed;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 right);
top: anchor(--a1 top);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos.html
index a32ef3f7c49..7923ed789de 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fixedpos.html
@@ -22,7 +22,7 @@ div {
#anchored {
position: fixed;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 right);
top: anchor(--a1 top);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-js-expose.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-js-expose.html
index 1ef44d03c22..3b3f1a06086 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-js-expose.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-js-expose.html
@@ -35,7 +35,7 @@
bottom: anchor(--anchor top);
width: 100px;
height: 100px;
- anchor-default: --anchor;
+ position-anchor: --anchor;
background-color: green;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-nested.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-nested.html
index 557f748c029..291fe0d7103 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-nested.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-nested.html
@@ -41,7 +41,7 @@ body {
width: 50px;
height: 50px;
left: anchor(--anchor left);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
.above {
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html
index b696ae0060c..3130018e73d 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html
@@ -35,7 +35,7 @@
#anchored {
position: absolute;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --f1, --f2;
width: 100px; height: 100px;
/* Above the anchor */
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html
index 3b84124705c..52bbcd62fc1 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html
@@ -31,7 +31,7 @@ body {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
top: anchor(--a top);
left: anchor(--a right);
position-try-options: --pf;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html
index dd9fdc92c2e..b89a574d768 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html
@@ -39,7 +39,7 @@
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html
index 0aab60b7a81..bf0bee972de 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html
@@ -33,7 +33,7 @@ body {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf1, --pf2;
/* Top of the anchor */
bottom: anchor(--a top);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html
index e2dac13abd7..197a9e4f79c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html
@@ -32,7 +32,7 @@ body {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
top: anchor(--a top);
left: anchor(--a right);
position-try-options: --pf;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html
index 1f9004de54f..132c45c89c7 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html
@@ -28,7 +28,7 @@ body {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try: --pf1, --pf2, --pf3;
inset-block-start: anchor(--a end);
inset-inline-start: anchor(--a end);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html
index 32b7f641732..a02bd35a669 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html
@@ -32,7 +32,7 @@ html {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf1, --pf2, --pf3;
inset-block-start: anchor(--a end);
inset-inline-start: anchor(--a end);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html
index 99f180bb463..2deddd587ef 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html
@@ -33,7 +33,7 @@ html {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf1, --pf2, --pf3;
inset-block-start: anchor(--a end);
inset-inline-start: anchor(--a end);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html
index 0267d1987be..0d7d6b077fc 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html
@@ -32,7 +32,7 @@ html {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf1, --pf2, --pf3;
inset-block-start: anchor(--a end);
inset-inline-start: anchor(--a end);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html
index 133649c720f..21f32ad068e 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html
@@ -33,7 +33,7 @@ html {
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf1, --pf2, --pf3;
inset-block-start: anchor(--a end);
inset-inline-start: anchor(--a end);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html
index 005a4ee728c..5de84610105 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html
@@ -45,7 +45,7 @@
width: 100px;
height: 100px;
background: green;
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --pf1, --pf2, --pf3;
bottom: anchor(--a top);
left: anchor(--a right);
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-001.html
index abab944751e..a6c3b057253 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-001.html
@@ -27,7 +27,7 @@ div {
#anchored {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-002.html
index 357421ecf1b..e2d91fe4dd6 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-002.html
@@ -28,7 +28,7 @@ div {
#anchored {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-003.html
index 0e770044913..b40f5cc8d51 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-003.html
@@ -27,7 +27,7 @@ div {
#anchored {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-004.html
index f7878ae8df8..30325ce1e0f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-to-sticky-004.html
@@ -30,7 +30,7 @@ div {
#anchored {
position: absolute;
- anchor-default: --a1;
+ position-anchor: --a1;
left: anchor(--a1 left);
top: anchor(--a1 bottom);
background: green;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-001.html
index f11797edadb..aa49fbcc6db 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-001.html
@@ -41,7 +41,7 @@ body {
position: absolute;
left: anchor(--anchor left);
bottom: anchor(--anchor top);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -49,7 +49,7 @@ body {
position: absolute;
left: anchor(--anchor left);
top: anchor(--anchor bottom);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-002.html
index 19447952b0b..5695db2a1cd 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-002.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html class="reftest-wait">
-<title>Anchored elements should update location on `anchor-default` property changes</title>
+<title>Anchored elements should update location on `position-anchor` property changes</title>
<link rel="author" href="mailto:xiaochengh@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/">
<link rel="match" href="reference/anchor-scroll-ref.html">
@@ -75,8 +75,8 @@ function raf() {
async function runTest() {
await raf();
await raf();
- document.getElementById('inner-anchored').style.anchorDefault = '--anchor';
- document.getElementById('outer-anchored').style.anchorDefault = '--anchor';
+ document.getElementById('inner-anchored').style.positionAnchor = '--anchor';
+ document.getElementById('outer-anchored').style.positionAnchor = '--anchor';
document.documentElement.classList.remove('reftest-wait');
}
runTest();
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-003.html
index 57a524c483f..2e1532badfa 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-003.html
@@ -37,7 +37,7 @@ body {
position: absolute;
left: anchor(--anchor left);
bottom: anchor(--anchor top);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -45,7 +45,7 @@ body {
position: absolute;
left: anchor(--anchor left);
top: anchor(--anchor bottom);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-004.html
index d20a7b660a6..87138fb2d92 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-004.html
@@ -49,7 +49,7 @@ body {
position: absolute;
left: anchor(--anchor left);
bottom: anchor(--anchor top);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -57,7 +57,7 @@ body {
position: absolute;
left: anchor(--anchor left);
top: anchor(--anchor bottom);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-005.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-005.html
index c2e7248c80c..37874bba552 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-005.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-005.html
@@ -24,7 +24,7 @@
background-color: green;
top: anchor(--a top);
left: 0;
- anchor-default: --a;
+ position-anchor: --a;
}
</style>
<div id="cb">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-006.html
index 2535c68f787..81defee7cf4 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-006.html
@@ -24,7 +24,7 @@
background-color: green;
top: anchor(--a top);
left: 0;
- anchor-default: --a;
+ position-anchor: --a;
}
</style>
<div id="cb">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-007.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-007.html
index 4859f01d660..33050348c4d 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-007.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-update-007.html
@@ -37,7 +37,7 @@ body {
position: absolute;
left: anchor(--anchor left);
bottom: anchor(--anchor top);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -45,7 +45,7 @@ body {
position: fixed;
left: anchor(--anchor left);
top: anchor(--anchor bottom);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vlr.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vlr.html
index 00406c825e9..76186f9cad7 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vlr.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vlr.html
@@ -50,7 +50,7 @@ body {
position: absolute;
top: anchor(--anchor top);
left: anchor(--anchor right);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -58,7 +58,7 @@ body {
position: absolute;
top: anchor(--anchor top);
right: anchor(--anchor left);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vrl.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vrl.html
index 2432d728993..13ea8b37abd 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vrl.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-vrl.html
@@ -50,7 +50,7 @@ body {
position: absolute;
top: anchor(--anchor top);
left: anchor(--anchor right);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#outer-anchored {
@@ -58,7 +58,7 @@ body {
position: absolute;
top: anchor(--anchor top);
right: anchor(--anchor left);
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html b/tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html
index d4a1f4fa24c..dc248f4e511 100644
--- a/tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html
@@ -37,7 +37,7 @@ test(t => {
}
#anchor { top: 100px; left: 0; anchor-name: --a; }
#not-anchor { top: 200px; left: 0; anchor-name: --b; }
- #target { position-try-options: --pf; anchor-default: --a; left: 999999px; }
+ #target { position-try-options: --pf; position-anchor: --a; left: 999999px; }
`);
const positionTryRule = style.sheet.cssRules[0];
@@ -52,7 +52,7 @@ test(t => {
// These properties are disallowed in `@position-try` rule, and hence should not affect
// position fallback.
- positionTryRule.style.setProperty('anchor-default', '--b');
+ positionTryRule.style.setProperty('position-anchor', '--b');
positionTryRule.style.setProperty('position', 'static');
assert_equals(target.getBoundingClientRect().left, 100);
assert_equals(target.getBoundingClientRect().top, 100);
diff --git a/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html b/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html
index e5d6c51a0b9..50e67de1aef 100644
--- a/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html
@@ -5,6 +5,7 @@
<script src="/resources/testharnessreport.js"></script>
<style>
body { margin: 0; }
+ #host { width: 200px }
</style>
<div id="host">
diff --git a/tests/wpt/tests/css/css-anchor-position/inset-area-abs-inline-container.html b/tests/wpt/tests/css/css-anchor-position/inset-area-abs-inline-container.html
index 52344614f0b..3b8b25b3af0 100644
--- a/tests/wpt/tests/css/css-anchor-position/inset-area-abs-inline-container.html
+++ b/tests/wpt/tests/css/css-anchor-position/inset-area-abs-inline-container.html
@@ -25,7 +25,7 @@
position: absolute;
align-self: stretch;
justify-self: stretch;
- anchor-default: --anchor;
+ position-anchor: --anchor;
background-color: blue;
}
#top-left { inset-area: top / left; }
diff --git a/tests/wpt/tests/css/css-anchor-position/inset-area-basic.html b/tests/wpt/tests/css/css-anchor-position/inset-area-basic.html
index 4a636355583..bf5daefe9ab 100644
--- a/tests/wpt/tests/css/css-anchor-position/inset-area-basic.html
+++ b/tests/wpt/tests/css/css-anchor-position/inset-area-basic.html
@@ -31,7 +31,7 @@
position: absolute;
align-self: stretch;
justify-self: stretch;
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#anchor {
margin-top: 150px;
@@ -116,6 +116,6 @@
test_inset_area("y-end / y-self-start", {left:0, top:0, width:0, height:0});
// No implicit anchor means the inset-area should not apply.
- anchored.style.anchorDefault = "implicit";
+ anchored.style.positionAnchor = "implicit";
test_inset_area("all / top", {left:0, top:0, width:0, height:0});
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/inset-area-inline-container.html b/tests/wpt/tests/css/css-anchor-position/inset-area-inline-container.html
index 91c9b097351..08aa1b921d3 100644
--- a/tests/wpt/tests/css/css-anchor-position/inset-area-inline-container.html
+++ b/tests/wpt/tests/css/css-anchor-position/inset-area-inline-container.html
@@ -23,7 +23,7 @@
}
.anchored {
position: absolute;
- anchor-default: --anchor;
+ position-anchor: --anchor;
background-color: blue;
}
#top-left { inset-area: top / left; }
diff --git a/tests/wpt/tests/css/css-anchor-position/inset-area-wm-dir.html b/tests/wpt/tests/css/css-anchor-position/inset-area-wm-dir.html
index 5268cba7e5e..c475810a197 100644
--- a/tests/wpt/tests/css/css-anchor-position/inset-area-wm-dir.html
+++ b/tests/wpt/tests/css/css-anchor-position/inset-area-wm-dir.html
@@ -31,7 +31,7 @@
position: absolute;
align-self: stretch;
justify-self: stretch;
- anchor-default: --anchor;
+ position-anchor: --anchor;
}
#anchor {
margin-top: 150px;
diff --git a/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-computed.html b/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-computed.html
index ac84b8fa4b3..f0944b7faaa 100644
--- a/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-computed.html
+++ b/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-computed.html
@@ -16,7 +16,7 @@
test_computed_value("position-try-options", "flip-start");
test_computed_value("position-try-options", "flip-block, flip-inline");
test_computed_value("position-try-options", "--foo, --bar");
- test_computed_value("position-try-options", "flip-start flip-inline flip-block", "flip-block flip-inline flip-start");
+ test_computed_value("position-try-options", "flip-start flip-inline flip-block");
test_computed_value("position-try-options", "flip-start --flop", "--flop flip-start");
test_computed_value("position-try-options", "--flop flip-start");
diff --git a/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-parsing.html b/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-parsing.html
index cb250a178d4..303cc4d0dd2 100644
--- a/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-parsing.html
+++ b/tests/wpt/tests/css/css-anchor-position/parsing/position-try-options-parsing.html
@@ -13,22 +13,28 @@
test_valid_value("position-try-options", "revert");
test_valid_value("position-try-options", "none");
test_valid_value("position-try-options", "flip-block");
+ test_valid_value("position-try-options", "flip-block ", 'flip-block');
test_valid_value("position-try-options", "flip-start, flip-block");
- test_valid_value("position-try-options", "flip-start flip-inline, flip-block", "flip-inline flip-start, flip-block");
+ test_valid_value("position-try-options", "flip-start flip-inline, flip-block");
test_valid_value("position-try-options", "flip-start, flip-start");
+ test_valid_value("position-try-options", "flip-start flip-inline flip-block");
test_valid_value("position-try-options", "flip-block, --foo");
test_valid_value("position-try-options", "--bar, flip-block flip-start");
test_valid_value("position-try-options", "--foo, --bar, --baz");
test_valid_value("position-try-options", "--bar flip-block");
- test_valid_value("position-try-options", "--bar flip-inline flip-block", "--bar flip-block flip-inline");
+ test_valid_value("position-try-options", "--bar flip-inline flip-block");
test_valid_value("position-try-options", "flip-inline --foo", "--foo flip-inline");
test_valid_value("position-try-options", "flip-inline flip-start --foo", "--foo flip-inline flip-start");
test_invalid_value("position-try-options", "none, flip-start");
test_invalid_value("position-try-options", "flip-block flip-block");
+ test_invalid_value("position-try-options", "flip-block flip-inline flip-inline");
+ test_invalid_value("position-try-options", "flip-block, flip-inline flip-inline");
test_invalid_value("position-try-options", "--bar flip-block --foo");
test_invalid_value("position-try-options", "--foo --bar");
test_invalid_value("position-try-options", "flip-inline --bar flip-block");
test_invalid_value("position-try-options", "-foo");
test_invalid_value("position-try-options", "foo");
+ test_invalid_value("position-try-options", "flip-start 123");
+ test_invalid_value("position-try-options", "--foo 123");
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/parsing/position-try-parsing.html b/tests/wpt/tests/css/css-anchor-position/parsing/position-try-parsing.html
index 8c36ddbaace..7f504597106 100644
--- a/tests/wpt/tests/css/css-anchor-position/parsing/position-try-parsing.html
+++ b/tests/wpt/tests/css/css-anchor-position/parsing/position-try-parsing.html
@@ -11,8 +11,7 @@
test_valid_value("position-try", "most-height none");
test_valid_value("position-try", "--bar, --baz");
test_valid_value("position-try", "most-inline-size --baz, flip-inline");
- test_valid_value("position-try", "most-block-size flip-inline flip-block, --bar, --baz",
- "most-block-size flip-block flip-inline, --bar, --baz");
+ test_valid_value("position-try", "most-block-size flip-inline flip-block, --bar, --baz");
test_valid_value("position-try", "normal none", "none");
test_valid_value("position-try", "most-width none");
test_valid_value("position-try", "normal --foo", "--foo");
@@ -40,6 +39,6 @@
});
test_shorthand_value("position-try", "most-inline-size flip-inline flip-block, --foo, --bar", {
"position-try-order": "most-inline-size",
- "position-try-options": "flip-block flip-inline, --foo, --bar",
+ "position-try-options": "flip-inline flip-block, --foo, --bar",
});
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-001.html b/tests/wpt/tests/css/css-anchor-position/position-anchor-001.html
index 1700a84aa88..d927b6b902c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-anchor-001.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
-<title>Tests the 'anchor-default' property</title>
-<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#anchor-default">
+<title>Tests the 'position-anchor' property</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#position-anchor">
<link rel="author" href="mailto:xiaochengh@chromium.org">
-<link rel="match" href="anchor-default-ref.html">
+<link rel="match" href="position-anchor-ref.html">
<style>
.anchor {
width: 100px;
@@ -34,7 +34,7 @@ body {
}
#target1 {
- anchor-default: --a1;
+ position-anchor: --a1;
}
#anchor2 {
@@ -44,7 +44,7 @@ body {
}
#target2 {
- anchor-default: --a2;
+ position-anchor: --a2;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-002.html b/tests/wpt/tests/css/css-anchor-position/position-anchor-002.html
index c0a962ad367..d55338e1e97 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-anchor-002.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
-<title>Tests that 'anchor-default' property value is tree-scoped</title>
-<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#anchor-default">
+<title>Tests that 'position-anchor' property value is tree-scoped</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#position-anchor">
<link rel="author" href="mailto:xiaochengh@chromium.org">
-<link rel="match" href="anchor-default-ref.html">
+<link rel="match" href="position-anchor-ref.html">
<style>
.anchor {
width: 100px;
@@ -61,7 +61,7 @@ for (let host of document.querySelectorAll('.anchor')) {
shadow.innerHTML = `
<style>
:host { anchor-name: --a; }
- ::slotted(.target) { anchor-default: --a; }
+ ::slotted(.target) { position-anchor: --a; }
</style>
<slot></slot>
`;
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-003.html b/tests/wpt/tests/css/css-anchor-position/position-anchor-003.html
index 00c20324344..6117027e220 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-anchor-003.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
-<title>Tests that layout is updated on anchor-default value changes</title>
-<link rel="help" href="https://drafts4.csswg.org/css-anchor-position-1/#anchor-default">
+<title>Tests that layout is updated on position-anchor value changes</title>
+<link rel="help" href="https://drafts4.csswg.org/css-anchor-position-1/#position-anchor">
<link rel="author" href="mailto:xiaochengh@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -13,11 +13,11 @@
background: lime;
top: anchor(top);
left: anchor(right);
- anchor-default: --a;
+ position-anchor: --a;
}
#target.after {
- anchor-default: --b;
+ position-anchor: --b;
}
#anchor1, #anchor2 {
@@ -51,5 +51,5 @@ test(() => {
// #target should be anchored to #anchor2 now
assert_equals(target.offsetLeft, 200);
assert_equals(target.offsetTop, 100);
-}, 'Layout is updated on `anchor-default` changes');
+}, 'Layout is updated on `position-anchor` changes');
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-basics.html b/tests/wpt/tests/css/css-anchor-position/position-anchor-basics.html
index 783cb539cc3..f9fe9dd6f8f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-basics.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-anchor-basics.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
-<title>Tests basics of the 'anchor-default' property</title>
-<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#propdef-anchor-default">
+<title>Tests basics of the 'position-anchor' property</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#propdef-position-anchor">
<link rel="author" href="mailto:xiaochengh@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -14,28 +14,28 @@
</div>
<script>
-// anchor-default: <anchor-element>
+// position-anchor: <anchor-element>
// <anchor-element> = implicit | <dashed-ident>
-test_valid_value('anchor-default', 'implicit');
-test_valid_value('anchor-default', '--foo');
-test_invalid_value('anchor-default', 'none');
-test_invalid_value('anchor-default', 'foo-bar');
-test_invalid_value('anchor-default', '--foo --bar')
-test_invalid_value('anchor-default', '--foo, --bar')
-test_invalid_value('anchor-default', '100px');
-test_invalid_value('anchor-default', '100%');
+test_valid_value('position-anchor', 'implicit');
+test_valid_value('position-anchor', '--foo');
+test_invalid_value('position-anchor', 'none');
+test_invalid_value('position-anchor', 'foo-bar');
+test_invalid_value('position-anchor', '--foo --bar')
+test_invalid_value('position-anchor', '--foo, --bar')
+test_invalid_value('position-anchor', '100px');
+test_invalid_value('position-anchor', '100%');
// Computed value: as specified
-test_computed_value('anchor-default', 'implicit');
-test_computed_value('anchor-default', '--foo');
+test_computed_value('position-anchor', 'implicit');
+test_computed_value('position-anchor', '--foo');
// Initial: implicit
// Inherited: no
-assert_not_inherited('anchor-default', 'implicit', '--foo');
+assert_not_inherited('position-anchor', 'implicit', '--foo');
// Animation type: discrete
test_no_interpolation({
- property: 'anchor-default',
+ property: 'position-anchor',
from: '--foo',
to: 'implicit',
});
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-ref.html b/tests/wpt/tests/css/css-anchor-position/position-anchor-ref.html
index 4d7de12447c..4d7de12447c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-ref.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-anchor-ref.html
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-basics.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-basics.html
deleted file mode 100644
index bfeb921de1b..00000000000
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-basics.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<title>Tests basics of the 'position-fallback' property</title>
-<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#propdef-position-fallback">
-<link rel="author" href="mailto:xiaochengh@chromium.org">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-<script src="/css/support/computed-testcommon.js"></script>
-<script src="/css/support/inheritance-testcommon.js"></script>
-<script src="/css/support/interpolation-testcommon.js"></script>
-
-<div id="container">
- <div id="target"></div>
-</div>
-
-<script>
-// position-fallback: none | <dashed-ident>
-test_valid_value('position-fallback', 'none');
-test_valid_value('position-fallback', '--foo');
-test_invalid_value('position-fallback', 'foo-bar');
-test_invalid_value('position-fallback', '--foo --bar')
-test_invalid_value('position-fallback', '--foo, --bar')
-test_invalid_value('position-fallback', '100px');
-test_invalid_value('position-fallback', '100%');
-
-// Computed value: as specified
-test_computed_value('position-fallback', 'none');
-test_computed_value('position-fallback', '--foo');
-
-// Initial: none
-// Inherited: no
-assert_not_inherited('position-fallback', 'none', '--foo');
-
-// Animation type: discrete
-test_no_interpolation({
- property: 'position-fallback',
- from: '--foo',
- to: 'none',
-});
-</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-001.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-001.html
index ebd1e78fb9a..f379b691e0b 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-001.html
@@ -48,12 +48,12 @@ body {
}
#target1 {
- anchor-default: --a1;
+ position-anchor: --a1;
bottom: anchor(top);
position-try-options: --bottom;
}
#target2 {
- anchor-default: --a2;
+ position-anchor: --a2;
top: anchor(bottom);
position-try-options: --top;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-002.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-002.html
index 159484ad33b..960a530b97b 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-002.html
@@ -48,13 +48,13 @@ body {
}
#target1 {
- anchor-default: --a1;
+ position-anchor: --a1;
bottom: anchor(top);
position-try: --bottom;
writing-mode: vertical-rl;
}
#target2 {
- anchor-default: --a2;
+ position-anchor: --a2;
top: anchor(bottom);
position-try: --top;
writing-mode: vertical-lr;
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-003.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-003.html
index 9da7bf9ccd7..1bee43b3616 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-003.html
@@ -37,7 +37,7 @@ body {
width: 100px;
height: 100px;
background-color: lime;
- anchor-default: --a;
+ position-anchor: --a;
position-fallback-bounds: --bounds;
position-try-options: --corner1, --corner2, --corner3;
bottom: anchor(top);
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-004.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-004.html
index eeee710e0fa..15bdf113276 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-004.html
@@ -55,7 +55,7 @@ body {
height: 100px;
background-color: lime;
left: anchor(left);
- anchor-default: --a;
+ position-anchor: --a;
position-fallback-bounds: --bounds;
position-try-options: --bottom;
bottom: anchor(top);
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-005.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-005.html
index fecd4328a59..d1e9fd7f51e 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-005.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-005.html
@@ -43,7 +43,7 @@
background: lime;
left: anchor(left);
bottom: anchor(top);
- anchor-default: --a;
+ position-anchor: --a;
position-try-options: --bottom;
position-fallback-bounds: --bounds1;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/position-try-001.html b/tests/wpt/tests/css/css-anchor-position/position-try-001.html
index a15c808d956..47fcbb83939 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-try-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-001.html
@@ -103,12 +103,12 @@
data-offset-x=150 data-offset-y=25
data-expected-width=35 data-expected-height=40></div>
</div>
- <!-- If the `cb` is narrower, no rules fit. The last rule is used. -->
+ <!-- If the `cb` is narrower, no rules fit. The base style is used. -->
<div class="cb" style="width: 185px">
<div class="spacer"></div>
<div class="anchor1"></div>
<div class="target"
data-offset-x=150 data-offset-y=25
- data-expected-width=35 data-expected-height=40></div>
+ data-expected-width=40 data-expected-height=15></div>
</div>
</body>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html b/tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html
index 6c09fd0ea17..4f38806f604 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html
@@ -48,6 +48,7 @@ function createTargetWithStyle(test, style) {
test(t => {
const target = createTargetWithStyle(t, `
@position-try --fallback {
+ left: auto;
right: anchor(--a left);
}
@position-try --fallback {
@@ -60,10 +61,12 @@ test(t => {
test(t => {
const target = createTargetWithStyle(t, `
@position-try --fallback {
+ left: auto;
bottom: anchor(--a top);
}
@layer {
@position-try --fallback {
+ left: auto;
top: anchor(--a bottom);
}
}
diff --git a/tests/wpt/tests/css/css-anchor-position/position-try-options-limit.html b/tests/wpt/tests/css/css-anchor-position/position-try-options-limit.html
new file mode 100644
index 00000000000..32a4f592fa0
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-options-limit.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning Test: position options list limit</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#fallback-apply">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ }
+ .positioned {
+ width: 200px;
+ height: 200px;
+ position: absolute;
+ top: 0;
+ left: 10px; /* overflowing #container */
+ }
+
+ @position-try --bar {
+ left: 0; /* not overflowing #container */
+ }
+ #t1 {
+ /* If --foo is not found, we should still try --bar even if we limit the
+ number of applied position options to five because the --foo's are not
+ added to the `position options list` per spec. */
+ position-try-options: --foo, --foo, --foo, --foo, --foo, --foo, --foo, --bar;
+ }
+
+ /* --f1 .. --f4 all overflowing #container */
+ @position-try --f1 { left: 10px; }
+ @position-try --f2 { left: 10px; }
+ @position-try --f3 { left: 10px; }
+ @position-try --f4 { left: 10px; }
+ @position-try --f5 { left: 20px; width: 20px; /* not overflowing #container */ }
+ #t2 {
+ position-try-options: --f1, --f2, --f3, --f4, --f5;
+ }
+
+</style>
+<div id="container">
+ <div id="t1" class="positioned"></div>
+ <div id="t2" class="positioned"></div>
+</div>
+<script>
+ test(() => {
+ assert_equals(t1.offsetLeft, 0, "The --bar try option should be applied");
+ }, "Try options which are not found are not part of the limit");
+
+ test(() => {
+ assert_equals(t2.offsetLeft, 20, "The --f5 try option should be applied");
+ }, "Must support At least five try options");
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html b/tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html
index a8fe0106833..d0c94fd6797 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html
@@ -13,6 +13,7 @@
}
.abs {
+ width: 100px;
position: absolute;
left: 999999px; /* force fallback */
}
@@ -70,6 +71,9 @@
<style>
+ #host_slotted_part {
+ width: 100px;
+ }
@position-try --host-slot-part {
left: 1px;
}
diff --git a/tests/wpt/tests/css/css-anchor-position/property-interpolations.html b/tests/wpt/tests/css/css-anchor-position/property-interpolations.html
index 878f46375b7..1b8621a2130 100644
--- a/tests/wpt/tests/css/css-anchor-position/property-interpolations.html
+++ b/tests/wpt/tests/css/css-anchor-position/property-interpolations.html
@@ -19,12 +19,12 @@
});
test_no_interpolation({
- property: 'anchor-default',
+ property: 'position-anchor',
from: 'implicit',
to: '--foo',
});
test_no_interpolation({
- property: 'anchor-default',
+ property: 'position-anchor',
from: '--foo',
to: '--bar',
});
diff --git a/tests/wpt/tests/css/css-anchor-position/try-tactic-base.html b/tests/wpt/tests/css/css-anchor-position/try-tactic-base.html
new file mode 100644
index 00000000000..b52c3d15e0f
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/try-tactic-base.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning: try-tactic, base values</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-options-try-tactic">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #cb {
+ position: absolute;
+ width: 400px;
+ height: 200px;
+ border: 1px solid black;
+ }
+ #target {
+ position: absolute;
+ /* Does not fit initially */
+ width: 150px;
+ height: 300px;
+ border: 3px solid skyblue;
+ }
+</style>
+<div id=cb>
+ <div id=target></div>
+</div>
+<script>
+ test(() => {
+ let cs = getComputedStyle(target);
+ assert_equals(cs.width, '150px');
+ assert_equals(cs.height, '300px');
+
+ target.style.positionTryOptions = 'flip-start';
+
+ assert_equals(cs.width, '300px');
+ assert_equals(cs.height, '150px');
+ }, 'flip-start affects base values');
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/try-tactic-basic.html b/tests/wpt/tests/css/css-anchor-position/try-tactic-basic.html
new file mode 100644
index 00000000000..472e204096d
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/try-tactic-basic.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning: try-tactic</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-options-try-tactic">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @position-try --pf {
+ left:10px;
+ top:20px;
+ }
+ #cb {
+ position: absolute;
+ width: 400px;
+ height: 400px;
+ border: 1px solid black;
+ }
+ #target {
+ position: absolute;
+ left: 99999px; /* force fallback */
+ width: 30px;
+ height: 40px;
+ background-color: skyblue;
+ }
+</style>
+<div id=cb>
+ <div id=target></div>
+</div>
+<script>
+ function test_try_tactic(try_tactic, expected_offsets) {
+ target.style.positionTryOptions = `--pf ${try_tactic}`;
+ test(() => {
+ assert_equals(target.offsetLeft, expected_offsets.left, 'offsetLeft');
+ assert_equals(target.offsetTop, expected_offsets.top, 'offsetTop');
+ assert_equals(target.offsetWidth, expected_offsets.width, 'offsetWidth');
+ assert_equals(target.offsetHeight, expected_offsets.height, 'offsetHeight');
+ }, target.style.positionTryOptions);
+ }
+
+ test_try_tactic('', {left:10, top:20, width:30, height:40});
+
+ // bottom:20px
+ test_try_tactic('flip-block', {left:10, top:340, width:30, height:40});
+
+ // right:10px
+ test_try_tactic('flip-inline', {left:360, top:20, width:30, height:40});
+
+ // right:10px; bottom:20px
+ test_try_tactic('flip-block flip-inline', {left:360, top:340, width:30, height:40});
+ test_try_tactic('flip-inline flip-block', {left:360, top:340, width:30, height:40});
+
+ // left:20px; top:10px; width:40px; height:30px
+ test_try_tactic('flip-start', {left:20, top:10, width:40, height:30});
+ test_try_tactic('flip-block flip-start flip-inline', {left:20, top:10, width:40, height:30});
+ test_try_tactic('flip-inline flip-start flip-block', {left:20, top:10, width:40, height:30});
+
+ // left:20px; bottom:10px; width:40px; height:30px
+ test_try_tactic('flip-start flip-block', {left:20, top:360, width:40, height:30});
+ test_try_tactic('flip-inline flip-start', {left:20, top:360, width:40, height:30});
+
+ // right:20px; top:10px; width:40px; height:30px
+ test_try_tactic('flip-start flip-inline', {left:340, top:10, width:40, height:30});
+ test_try_tactic('flip-block flip-start', {left:340, top:10, width:40, height:30});
+
+ // right:20px; bottom:10px; width:40px; height:30px
+ test_try_tactic('flip-start flip-block flip-inline', {left:340, top:360, width:40, height:30});
+ test_try_tactic('flip-start flip-inline flip-block', {left:340, top:360, width:40, height:30});
+ test_try_tactic('flip-inline flip-block flip-start', {left:340, top:360, width:40, height:30});
+ test_try_tactic('flip-block flip-inline flip-start', {left:340, top:360, width:40, height:30});
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/try-tactic-sizing.html b/tests/wpt/tests/css/css-anchor-position/try-tactic-sizing.html
new file mode 100644
index 00000000000..432992491dd
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/try-tactic-sizing.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning: try-tactic, sizing properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-options-try-tactic">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @position-try --pf {
+ left:50px;
+ top:50px;
+
+ min-width: 1px;
+ min-height: 2px;
+ max-width: 100px;
+ max-height: 200px;
+ }
+ #cb {
+ position: absolute;
+ width: 400px;
+ height: 400px;
+ border: 1px solid black;
+ }
+ #target {
+ position: absolute;
+ left: 99999px; /* force fallback */
+ width: 30px;
+ height: 40px;
+ background-color: skyblue;
+ }
+</style>
+<div id=cb>
+ <div id=target></div>
+</div>
+<script>
+ test(() => {
+ target.style.positionTryOptions = '--pf flip-block';
+ let cs = getComputedStyle(target);
+ assert_equals(cs.width, '30px');
+ assert_equals(cs.height, '40px');
+ assert_equals(cs.minWidth, '1px');
+ assert_equals(cs.minHeight, '2px');
+ assert_equals(cs.maxWidth, '100px');
+ assert_equals(cs.maxHeight, '200px');
+ }, 'flip-block does not affect sizing');
+
+ test(() => {
+ target.style.positionTryOptions = '--pf flip-inline';
+ let cs = getComputedStyle(target);
+ assert_equals(cs.width, '30px');
+ assert_equals(cs.height, '40px');
+ assert_equals(cs.minWidth, '1px');
+ assert_equals(cs.minHeight, '2px');
+ assert_equals(cs.maxWidth, '100px');
+ assert_equals(cs.maxHeight, '200px');
+ }, 'flip-inline does not affect sizing');
+
+ test(() => {
+ target.style.positionTryOptions = '--pf flip-start';
+ let cs = getComputedStyle(target);
+ assert_equals(cs.width, '40px');
+ assert_equals(cs.height, '30px');
+ assert_equals(cs.minWidth, '2px');
+ assert_equals(cs.minHeight, '1px');
+ assert_equals(cs.maxWidth, '200px');
+ assert_equals(cs.maxHeight, '100px');
+ }, 'flip-start affects sizing');
+</script>
diff --git a/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html b/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html
index e2662bec1fa..5641d3d41c0 100644
--- a/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html
+++ b/tests/wpt/tests/css/css-backgrounds/table-cell-background-local-003.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="UTF-8">
-
+ <meta name="fuzzy" content="1;0-50">
<title>CSS Backgrounds and Borders Test: table cell background-image with local attachment</title>
<!--
diff --git a/tests/wpt/tests/css/css-break/grid/monolithic-overflow-print-ref.html b/tests/wpt/tests/css/css-break/grid/monolithic-overflow-print-ref.html
new file mode 100644
index 00000000000..58cc0828d2c
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/grid/monolithic-overflow-print-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com" />
+<p style="height: 50vh">Test passes if there is two purple rectangles at the start of both page 2 and 3 when printing the page (Ctrl+P, with "print backgrounds" enabled).</p>
+<div style="display:grid; grid-template-columns:1fr 1fr; break-before:page;">
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+</div>
+<div style="display:grid; grid-template-columns:1fr 1fr; break-before:page;">
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/grid/monolithic-overflow-print.html b/tests/wpt/tests/css/css-break/grid/monolithic-overflow-print.html
new file mode 100644
index 00000000000..9b174caf96c
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/grid/monolithic-overflow-print.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com">
+<link rel="help" href="https://issues.chromium.org/issues/327643792">
+<link rel="match" href="./monolithic-overflow-print-ref.html">
+<p style="height: 50vh">Test passes if there is two purple rectangles at the start of both page 2 and 3 when printing the page (Ctrl+P, with "print backgrounds" enabled).</p>
+<div style="display:grid; grid-template-columns:1fr 1fr;">
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:75vh;">
+ <div style="height:75vh; width: 100px; background:purple;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/overflowing-block-002-print-ref.html b/tests/wpt/tests/css/css-break/overflowing-block-002-print-ref.html
new file mode 100644
index 00000000000..0322ba04a07
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/overflowing-block-002-print-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<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-break-3/#parallel-flows">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=563436">
+<link rel="stylesheet" href="/fonts/ahem.css">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.content {
+ font: 0.5in/1 Ahem;
+ color: white;
+ word-break: break-all;
+ border: 0.5in solid purple;
+ margin-right: 2in;
+}
+</style>
+
+<!-- The content is printed in two pages. -->
+<div class="content">XXXXXXXXXXXX</div>
diff --git a/tests/wpt/tests/css/css-break/overflowing-block-002-print.html b/tests/wpt/tests/css/css-break/overflowing-block-002-print.html
new file mode 100644
index 00000000000..3cba4b421fa
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/overflowing-block-002-print.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="match" href="overflowing-block-002-print-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-break-3/#parallel-flows">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=563436">
+<link rel="stylesheet" href="/fonts/ahem.css">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.content {
+ position: absolute;
+ font: 0.5in/1 Ahem;
+ color: white;
+ word-break: break-all;
+ border: 0.5in solid purple;
+ margin-right: 2in;
+}
+</style>
+
+<!-- The content is printed in two pages. -->
+<div class="content">XXXXXXXXXXXX</div>
diff --git a/tests/wpt/tests/css/css-break/overflowing-block-003-ref.html b/tests/wpt/tests/css/css-break/overflowing-block-003-ref.html
new file mode 100644
index 00000000000..a8f86d1cfe4
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/overflowing-block-003-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+<style>
+.multicol {
+ width: 150px;
+ height: 50px;
+ columns: 2;
+ column-gap: 0;
+ column-fill: auto;
+ border: 3px solid black;
+ margin: 10px;
+}
+.outer {
+ width: 50px;
+ height: 100px;
+ background: green;
+}
+</style>
+
+<p>This test passes if there are two 50x50 green squares in each black box.</p>
+
+<div class="multicol">
+ <div class="outer"></div>
+</div>
+
+<div class="multicol">
+ <div class="outer"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/overflowing-block-003.html b/tests/wpt/tests/css/css-break/overflowing-block-003.html
new file mode 100644
index 00000000000..786a61a4927
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/overflowing-block-003.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="match" href="overflowing-block-003-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-break-3/#parallel-flows">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=563436">
+<link rel="stylesheet" href="/fonts/ahem.css">
+
+<style>
+.multicol {
+ width: 150px;
+ height: 50px;
+ columns: 2;
+ column-gap: 0;
+ column-fill: auto;
+ border: 3px solid black;
+ margin: 10px;
+}
+.outer {
+ margin-right: 25px;
+}
+.inner {
+ background: green;
+ color: green;
+ font: 25px/1 Ahem;
+ word-break: break-all;
+}
+</style>
+
+<p>This test passes if there are two 50x50 green squares in each black box.</p>
+
+<div class="multicol">
+ <div class="outer">
+ <div class="inner" style="float: left">
+ AAAA BBBB
+ </div>
+ </div>
+</div>
+
+<div class="multicol">
+ <div class="outer" style="height: 0">
+ <div class="inner" style="height: 100px"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-color/lab-l-over-100-1.html b/tests/wpt/tests/css/css-color/lab-l-over-100-1.html
index 287eba98245..be8833593d7 100644
--- a/tests/wpt/tests/css/css-color/lab-l-over-100-1.html
+++ b/tests/wpt/tests/css/css-color/lab-l-over-100-1.html
@@ -5,13 +5,16 @@
<link rel="match" href="lab-l-over-100-ref.html">
<meta name="assert" content="lab() with lightness greater than 100">
<style>
- .ref { background-color: lab(100 150 20); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: lab(100 150 20); height: 100px}
/* l = 150 should clamp back to 100 */
- .test { background-color: lab(150 150 20); width: 100px; height: 100px}
+ .test { background-color: lab(150 150 20); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/lab-l-over-100-2.html b/tests/wpt/tests/css/css-color/lab-l-over-100-2.html
index e85d289d21f..20a95680947 100644
--- a/tests/wpt/tests/css/css-color/lab-l-over-100-2.html
+++ b/tests/wpt/tests/css/css-color/lab-l-over-100-2.html
@@ -5,13 +5,16 @@
<link rel="match" href="lab-l-over-100-ref.html">
<meta name="assert" content="lab() with lightness greater than 100%">
<style>
- .ref { background-color: lab(100% 150 20); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: lab(100% 150 20); height: 100px}
/* l = 150 should clamp back to 100 */
- .test { background-color: lab(150% 150 20); width: 100px; height: 100px}
+ .test { background-color: lab(150% 150 20); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/lab-l-over-100-ref.html b/tests/wpt/tests/css/css-color/lab-l-over-100-ref.html
index 57328cfa7c5..eccc492079d 100644
--- a/tests/wpt/tests/css/css-color/lab-l-over-100-ref.html
+++ b/tests/wpt/tests/css/css-color/lab-l-over-100-ref.html
@@ -2,10 +2,10 @@
<meta charset="utf-8">
<title>CSS Color 4: Verify lightness in Lab is always clamped to a value between 0 to 100</title>
<style>
- .ref { background-color: lab(100 150 20); width: 100px; height: 200px}
+ .ref { background-color: lab(100 150 20); border: 1px solid black; width: 200px; height: 200px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
+ <p>Test passes if you see a square border with a single color inside.</p>
<div class="ref"></div>
</body>
diff --git a/tests/wpt/tests/css/css-color/lch-l-over-100-1.html b/tests/wpt/tests/css/css-color/lch-l-over-100-1.html
index 6e0c62330c3..12d594d1a34 100644
--- a/tests/wpt/tests/css/css-color/lch-l-over-100-1.html
+++ b/tests/wpt/tests/css/css-color/lch-l-over-100-1.html
@@ -5,13 +5,16 @@
<link rel="match" href="lch-l-over-100-ref.html">
<meta name="assert" content="lch() with lightness greater than 100">
<style>
- .ref { background-color: lch(100 150 20); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: lch(100 150 20); height: 100px}
/* l = 150 should clamp back to 100 */
- .test { background-color: lch(150 150 20); width: 100px; height: 100px}
+ .test { background-color: lch(150 150 20); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/lch-l-over-100-2.html b/tests/wpt/tests/css/css-color/lch-l-over-100-2.html
index 7752d0dc0eb..68789b9c859 100644
--- a/tests/wpt/tests/css/css-color/lch-l-over-100-2.html
+++ b/tests/wpt/tests/css/css-color/lch-l-over-100-2.html
@@ -5,13 +5,16 @@
<link rel="match" href="lch-l-over-100-ref.html">
<meta name="assert" content="lch() with lightness graeter than 100%">
<style>
- .ref { background-color: lch(100% 150 20); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: lch(100% 150 20); height: 100px}
/* l = 150% should clamp back to 100% */
- .test { background-color: lch(150% 150 20); width: 100px; height: 100px}
+ .test { background-color: lch(150% 150 20); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/lch-l-over-100-ref.html b/tests/wpt/tests/css/css-color/lch-l-over-100-ref.html
index 67766274e59..291772e166f 100644
--- a/tests/wpt/tests/css/css-color/lch-l-over-100-ref.html
+++ b/tests/wpt/tests/css/css-color/lch-l-over-100-ref.html
@@ -2,11 +2,10 @@
<meta charset="utf-8">
<title>CSS Color 4: Specifying LCH with lightness over 100</title>
<style>
- .ref { background-color: lch(100 150 20); width: 100px; height: 200px}
+ .ref { background-color: lch(100 150 20); border: 1px solid black; width: 200px; height: 200px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
+ <p>Test passes if you see a square border with a single color inside.</p>
<div class="ref"></div>
- <div class="test"></div>
</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-almost-0-ref.html b/tests/wpt/tests/css/css-color/oklab-l-almost-0-ref.html
new file mode 100644
index 00000000000..244321ea69d
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklab-l-almost-0-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+ .ref { background-color: oklab(0 0.15 0.15); border: 1px solid black; width: 200px; height: 200px; }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="ref"></div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-almost-0.html b/tests/wpt/tests/css/css-color/oklab-l-almost-0.html
new file mode 100644
index 00000000000..e8cc1b9042d
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklab-l-almost-0.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: OKLab and OKLCH</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch">
+<link rel="match" href="oklab-l-almost-0-ref.html">
+<meta name="assert" content="oklab() with lightness very close to 0 should render the same as 0">
+<style>
+ .square { border: 1px solid black; width: 200px; height: 200px; }
+ .test { background-color: red; height: 100px; }
+ /* Non-zero a/b is used to show if the result is black or not, but the
+ * test passes as long as it's the same color. */
+ .ref { background-color: oklab(0 0.15 0.15); height: 100px; }
+ .test { background-color: oklab(0.0001% 0.15 0.15); }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-almost-1-ref.html b/tests/wpt/tests/css/css-color/oklab-l-almost-1-ref.html
new file mode 100644
index 00000000000..72cdf354470
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklab-l-almost-1-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+ .ref { background-color: oklab(1 0.15 0.15); border: 1px solid black; width: 200px; height: 200px; }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="ref"></div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-almost-1.html b/tests/wpt/tests/css/css-color/oklab-l-almost-1.html
new file mode 100644
index 00000000000..352e7b58aa6
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklab-l-almost-1.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: OKLab and OKLCH</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch">
+<link rel="match" href="oklab-l-almost-1-ref.html">
+<meta name="assert" content="oklab() with lightness very close to 1 should render the same as 1">
+<style>
+ .square { border: 1px solid black; width: 200px; height: 200px; }
+ .test { background-color: red; height: 100px; }
+ /* Non-zero a/b is used to show if the result is white or not, but the
+ * test passes as long as it's the same color. */
+ .ref { background-color: oklab(1 0.15 0.15); height: 100px; }
+ .test { background-color: oklab(99.9999% 0.15 0.15); }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-over-1-1.html b/tests/wpt/tests/css/css-color/oklab-l-over-1-1.html
index 612fe32acb1..a16fe7886f8 100644
--- a/tests/wpt/tests/css/css-color/oklab-l-over-1-1.html
+++ b/tests/wpt/tests/css/css-color/oklab-l-over-1-1.html
@@ -5,13 +5,16 @@
<link rel="match" href="oklab-l-over-1-ref.html">
<meta name="assert" content="oklab() with lightness greater than 1">
<style>
- .ref { background-color: oklab(1 0.5 0.2); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: oklab(1 0.5 0.2); height: 100px}
/* l = 1.5 should clamp back to 1 */
- .test { background-color: oklab(1.5 0.5 0.2); width: 100px; height: 100px}
+ .test { background-color: oklab(1.5 0.5 0.2); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-over-1-2.html b/tests/wpt/tests/css/css-color/oklab-l-over-1-2.html
index 11948f014bf..6300cb8af3b 100644
--- a/tests/wpt/tests/css/css-color/oklab-l-over-1-2.html
+++ b/tests/wpt/tests/css/css-color/oklab-l-over-1-2.html
@@ -5,13 +5,16 @@
<link rel="match" href="oklab-l-over-1-ref.html">
<meta name="assert" content="oklab() with lightness greater than 100%">
<style>
- .ref { background-color: oklab(100% 0.5 0.2); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: oklab(100% 0.5 0.2); height: 100px}
/* l = 150 should clamp back to 100 */
- .test { background-color: oklab(150% 0.5 0.2); width: 100px; height: 100px}
+ .test { background-color: oklab(150% 0.5 0.2); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/oklab-l-over-1-ref.html b/tests/wpt/tests/css/css-color/oklab-l-over-1-ref.html
index eb380dcb750..f050bbc6434 100644
--- a/tests/wpt/tests/css/css-color/oklab-l-over-1-ref.html
+++ b/tests/wpt/tests/css/css-color/oklab-l-over-1-ref.html
@@ -2,10 +2,10 @@
<meta charset="utf-8">
<title>CSS Color 4: Verify lightness in Lab is always clamped to a value between 0 to 100</title>
<style>
- .ref { background-color: oklab(1 0.5 0.2); width: 100px; height: 200px}
+ .ref { background-color: oklab(1 0.5 0.2); border: 1px solid black; width: 200px; height: 200px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
+ <p>Test passes if you see a square border with a single color inside.</p>
<div class="ref"></div>
</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-almost-0-ref.html b/tests/wpt/tests/css/css-color/oklch-l-almost-0-ref.html
new file mode 100644
index 00000000000..e019136f96f
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklch-l-almost-0-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+ .ref { background-color: oklch(0 0.2 45); border: 1px solid black; width: 200px; height: 200px; }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="ref"></div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-almost-0.html b/tests/wpt/tests/css/css-color/oklch-l-almost-0.html
new file mode 100644
index 00000000000..c171befe642
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklch-l-almost-0.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: OKLab and OKLCH</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch">
+<link rel="match" href="oklch-l-almost-0-ref.html">
+<meta name="assert" content="oklch() with lightness very close to 0 should render the same as 0">
+<style>
+ .square { border: 1px solid black; width: 200px; height: 200px; }
+ .test { background-color: red; height: 100px; }
+ /* Non-zero chroma is used to show if the result is black or not, but the
+ * test passes as long as it's the same color. */
+ .ref { background-color: oklch(0 0.2 45); height: 100px; }
+ .test { background-color: oklch(0.0001% 0.2 45); }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-almost-1-ref.html b/tests/wpt/tests/css/css-color/oklch-l-almost-1-ref.html
new file mode 100644
index 00000000000..e1f29eaa185
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklch-l-almost-1-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+ .ref { background-color: oklch(1 0.2 45); border: 1px solid black; width: 200px; height: 200px; }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="ref"></div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-almost-1.html b/tests/wpt/tests/css/css-color/oklch-l-almost-1.html
new file mode 100644
index 00000000000..c98cea292f9
--- /dev/null
+++ b/tests/wpt/tests/css/css-color/oklch-l-almost-1.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: OKLab and OKLCH</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#specifying-oklab-oklch">
+<link rel="match" href="oklch-l-almost-1-ref.html">
+<meta name="assert" content="oklch() with lightness very close to 1 should render the same as 1">
+<style>
+ .square { border: 1px solid black; width: 200px; height: 200px; }
+ .test { background-color: red; height: 100px; }
+ /* Non-zero chroma is used to show if the result is white or not, but the
+ * test passes as long as it's the same color. */
+ .ref { background-color: oklch(1 0.2 45); height: 100px; }
+ .test { background-color: oklch(99.9999% 0.2 45); }
+</style>
+<body>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-over-1-1.html b/tests/wpt/tests/css/css-color/oklch-l-over-1-1.html
index 4eb3cda8462..c734723541d 100644
--- a/tests/wpt/tests/css/css-color/oklch-l-over-1-1.html
+++ b/tests/wpt/tests/css/css-color/oklch-l-over-1-1.html
@@ -5,13 +5,16 @@
<link rel="match" href="oklch-l-over-1-ref.html">
<meta name="assert" content="oklch() with lightness greater than 1">
<style>
- .ref { background-color: oklch(1 0.5 50); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: oklch(1 0.5 50); height: 100px}
/* l = 1.5 should clamp back to 1 */
- .test { background-color: oklch(1.5 0.5 50); width: 100px; height: 100px}
+ .test { background-color: oklch(1.5 0.5 50); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-over-1-2.html b/tests/wpt/tests/css/css-color/oklch-l-over-1-2.html
index de8b1a6cdd0..59eac2b3677 100644
--- a/tests/wpt/tests/css/css-color/oklch-l-over-1-2.html
+++ b/tests/wpt/tests/css/css-color/oklch-l-over-1-2.html
@@ -5,13 +5,16 @@
<link rel="match" href="oklch-l-over-1-ref.html">
<meta name="assert" content="oklch() with lightness greater than 100%">
<style>
- .ref { background-color: oklch(100% 0.5 50); width: 100px; height: 100px}
+ .square { border: 1px solid black; width: 200px; height: 200px}
+ .ref { background-color: oklch(100% 0.5 50); height: 100px}
/* l = 150% should clamp back to 100% */
- .test { background-color: oklch(150% 0.5 50); width: 100px; height: 100px}
+ .test { background-color: oklch(150% 0.5 50); height: 100px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
- <div class="ref"></div>
- <div class="test"></div>
+ <p>Test passes if you see a square border with a single color inside.</p>
+ <div class="square">
+ <div class="ref"></div>
+ <div class="test"></div>
+ </div>
</body>
diff --git a/tests/wpt/tests/css/css-color/oklch-l-over-1-ref.html b/tests/wpt/tests/css/css-color/oklch-l-over-1-ref.html
index 2c7815c5f0e..ae1b5e00e57 100644
--- a/tests/wpt/tests/css/css-color/oklch-l-over-1-ref.html
+++ b/tests/wpt/tests/css/css-color/oklch-l-over-1-ref.html
@@ -2,10 +2,10 @@
<meta charset="utf-8">
<title>CSS Color 4: Verify lightness in Oklch is always clamped to a value between 0 to 1</title>
<style>
- .ref { background-color: oklch(1 0.5 50); width: 100px; height: 200px}
+ .ref { background-color: oklch(1 0.5 50); border: 1px solid black; width: 200px; height: 200px}
</style>
<body>
- <p>Test passes if you see a single color.</p>
+ <p>Test passes if you see a square border with a single color inside.</p>
<div class="ref"></div>
</body>
diff --git a/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html b/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html
index b6e628e78a5..95c8eee226b 100644
--- a/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html
+++ b/tests/wpt/tests/css/css-color/parsing/color-computed-relative-color.html
@@ -104,6 +104,7 @@
fuzzy_test_computed_color(`rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)`, `color(srgb 0.4 0.2 0.0392)`);
fuzzy_test_computed_color(`rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))`, `color(srgb 0.2 0.4 0.6 / 0.8)`);
fuzzy_test_computed_color(`rgb(from rgb(100 110 120 / 0.8) calc(r + 1) calc(g + 1) calc(b + 1) / calc(alpha + 0.01))`, `color(srgb 0.396 0.435 0.474 / 0.81)`); // rgb(101 111 121)
+ fuzzy_test_computed_color(`rgb(from rebeccapurple calc((r / 255) * 100%) calc((g / 255) * 100%) calc((b / 255) * 100%) / calc(alpha * 100%))`, `color(srgb 0.4 0.2 0.6)`);
// Testing with 'none'. Missing components are resolved to zero during color space conversion.
// https://drafts.csswg.org/css-color-4/#missing
@@ -176,6 +177,7 @@
fuzzy_test_computed_color(`hsl(from rebeccapurple calc(h) calc(s) calc(l))`, `color(srgb 0.4 0.2 0.6)`);
fuzzy_test_computed_color(`hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))`, `color(srgb 0.2 0.4 0.6 / 0.8)`);
fuzzy_test_computed_color(`hsl(from hsl(20 30 40 / 0.8) calc(h + 1) calc(s + 1) calc(l + 1) / calc(alpha + 0.01))`, `color(srgb 0.54 0.37 0.28 / 0.81)`); // hsl(21 31 41)
+ fuzzy_test_computed_color(`hsl(from rebeccapurple calc((h / 360) * 360deg) calc((s / 100) * 100%) calc((l / 100) * 100%) / calc(alpha * 100%))`, `color(srgb 0.4 0.2 0.6)`);
// Testing with 'none'. Missing components are resolved to zero during color space conversion.
// https://drafts.csswg.org/css-color-4/#missing
@@ -250,6 +252,7 @@
fuzzy_test_computed_color(`hwb(from rebeccapurple calc(h) calc(w) calc(b))`, `color(srgb 0.4 0.2 0.6)`);
fuzzy_test_computed_color(`hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))`, `color(srgb 0.2 0.4 0.6 / 0.8)`);
fuzzy_test_computed_color(`hwb(from hwb(20 30 40 / 0.8) calc(h + 1) calc(w + 1) calc(b + 1) / calc(alpha + 0.01))`, `color(srgb 0.59 0.41 0.31 / 0.81)`); // hwb(21 31 41)
+ fuzzy_test_computed_color(`hwb(from rebeccapurple calc((h / 360) * 360deg) calc((w / 100) * 100%) calc((b / 100) * 100%) / calc(alpha * 100%))`, `color(srgb 0.4 0.2 0.6)`);
// Testing with 'none'. Missing components are resolved to zero during color space conversion.
// https://drafts.csswg.org/css-color-4/#missing
@@ -320,6 +323,7 @@
fuzzy_test_computed_color(`lab(from lab(25 20 50) calc(l) calc(a) calc(b))`, `lab(25 20 50)`);
fuzzy_test_computed_color(`lab(from lab(25 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))`, `lab(25 20 50 / 0.4)`);
fuzzy_test_computed_color(`lab(from lab(50 5 10 / 0.8) calc(l + 1) calc(a + 1) calc(b + 1) / calc(alpha + 0.01))`, `lab(51 6 11 / 0.81)`);
+ fuzzy_test_computed_color(`lab(from lab(25 20 50) calc((l / 100) * 100%) calc((a / 125) * 100%) calc((b / 125) * 100%) / calc(alpha * 100%))`, `lab(25 20 50)`);
// Testing with 'none'.
fuzzy_test_computed_color(`lab(from lab(25 20 50) none none none)`, `lab(none none none)`);
@@ -387,6 +391,7 @@
fuzzy_test_computed_color(`oklab(from oklab(0.25 0.2 0.5) calc(l) calc(a) calc(b))`, `oklab(0.25 0.2 0.5)`);
fuzzy_test_computed_color(`oklab(from oklab(0.25 0.2 0.5 / 40%) calc(l) calc(a) calc(b) / calc(alpha))`, `oklab(0.25 0.2 0.5 / 0.4)`);
fuzzy_test_computed_color(`oklab(from oklab(0.5 .05 0.1 / 0.8) calc(l + 0.01) calc(a + 0.01) calc(b + 0.01) / calc(alpha + 0.01))`, `oklab(0.51 .06 0.11 / 0.81)`);
+ fuzzy_test_computed_color(`oklab(from oklab(0.25 0.2 0.5) calc(l * 100%) calc((a / 0.4) * 100%) calc((b / 0.4) * 100%) / calc(alpha * 100%))`, `oklab(0.25 0.2 0.5)`);
// Testing with 'none'.
fuzzy_test_computed_color(`oklab(from oklab(0.25 0.2 0.5) none none none)`, `oklab(none none none)`);
@@ -462,6 +467,7 @@
fuzzy_test_computed_color(`lch(from lch(0.7 45 30) calc(l) calc(c) calc(h))`, `lch(0.7 45 30)`);
fuzzy_test_computed_color(`lch(from lch(0.7 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `lch(0.7 45 30 / 0.4)`);
fuzzy_test_computed_color(`lch(from lch(50 5 10 / 0.8) calc(l + 1) calc(c + 1) calc(h + 1) / calc(alpha + 0.01))`, `lch(51 6 11 / 0.81)`);
+ fuzzy_test_computed_color(`lch(from lch(0.7 45 30) calc((l / 100) * 100%) calc((c / 150) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))`, `lch(0.7 45 30)`);
// Testing with 'none'.
fuzzy_test_computed_color(`lch(from lch(0.7 45 30) none none none)`, `lch(none none none)`);
@@ -538,6 +544,7 @@
fuzzy_test_computed_color(`oklch(from oklch(0.7 0.45 30) calc(l) calc(c) calc(h))`, `oklch(0.7 0.45 30)`);
fuzzy_test_computed_color(`oklch(from oklch(0.7 0.45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))`, `oklch(0.7 0.45 30 / 0.4)`);
fuzzy_test_computed_color(`oklch(from oklch(0.5 .05 0.1 / 0.8) calc(l + 0.01) calc(c + 0.01) calc(h + 0.01) / calc(alpha + 0.01))`, `oklch(0.51 .06 0.11 / 0.81)`);
+ fuzzy_test_computed_color(`oklch(from oklch(0.7 0.45 30) calc(l * 100%) calc((c / 0.4) * 100%) calc((h / 360) * 360deg) / calc(alpha * 100%))`, `oklch(0.7 0.45 30)`);
// Testing with 'none'.
fuzzy_test_computed_color(`oklch(from oklch(0.7 0.45 30) none none none)`, `oklch(none none none)`);
@@ -628,6 +635,7 @@
fuzzy_test_computed_color(`color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} calc(r) calc(g) calc(b))`, `color(${colorSpace} 0.7 0.5 0.3)`);
fuzzy_test_computed_color(`color(from color(${colorSpace} 0.7 0.5 0.3 / 40%) ${colorSpace} calc(r) calc(g) calc(b) / calc(alpha))`, `color(${colorSpace} 0.7 0.5 0.3 / 0.4)`);
fuzzy_test_computed_color(`color(from color(${colorSpace} 0.7 0.5 0.3 / 0.8) ${colorSpace} calc(r + 0.01) calc(g + 0.01) calc(b + 0.01) / calc(alpha + 0.01))`, `color(${colorSpace} 0.71 0.51 0.31 / 0.81)`);
+ fuzzy_test_computed_color(`color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} calc(r * 100%) calc(g * 100%) calc(b * 100%) / calc(alpha * 100%))`, `color(${colorSpace} 0.7 0.5 0.3)`);
// Testing with 'none'.
fuzzy_test_computed_color(`color(from color(${colorSpace} 0.7 0.5 0.3) ${colorSpace} none none none)`, `color(${colorSpace} none none none)`);
@@ -692,6 +700,7 @@
fuzzy_test_computed_color(`color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} calc(x) calc(y) calc(z))`, `color(${resultColorSpace} 7 -20.5 100)`);
fuzzy_test_computed_color(`color(from color(${colorSpace} 7 -20.5 100 / 40%) ${colorSpace} calc(x) calc(y) calc(z) / calc(alpha))`, `color(${resultColorSpace} 7 -20.5 100 / 0.4)`);
fuzzy_test_computed_color(`color(from color(${colorSpace} 7 -20.5 100 / 0.8) ${colorSpace} calc(x + 1) calc(y + 1) calc(z + 1) / calc(alpha + 0.01))`, `color(${resultColorSpace} 8 -19.5 101 / 0.81)`);
+ fuzzy_test_computed_color(`color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} calc(x * 100%) calc(y * 100%) calc(z * 100%) / calc(alpha * 100%))`, `color(${resultColorSpace} 7 -20.5 100)`);
// Testing with 'none'.
fuzzy_test_computed_color(`color(from color(${colorSpace} 7 -20.5 100) ${colorSpace} none none none)`, `color(${resultColorSpace} none none none)`);
@@ -708,7 +717,7 @@
fuzzy_test_computed_color(`color(from color(${colorSpace} 7 -20.5 100 / none) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 7 -20.5 100 / 0)`);
// color-mix
- fuzzy_test_computed_color(`color(from color-mix(in xyz, color(${colorSpace} 0.7 0.5 0.3), color(${colorSpace} 0.7 0.5 0.3)) ${colorSpace} r g b / alpha)`, `color(${resultColorSpace} 0.7 0.5 0.3)`);
+ fuzzy_test_computed_color(`color(from color-mix(in xyz, color(${colorSpace} 0.7 0.5 0.3), color(${colorSpace} 0.7 0.5 0.3)) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 0.7 0.5 0.3)`);
}
// Test origin colors with different color spaces, going both to and from srgb.
diff --git a/tests/wpt/tests/css/css-color/parsing/color-valid-relative-color.html b/tests/wpt/tests/css/css-color/parsing/color-valid-relative-color.html
index 652c0c8fc45..5f83f0f0746 100644
--- a/tests/wpt/tests/css/css-color/parsing/color-valid-relative-color.html
+++ b/tests/wpt/tests/css/css-color/parsing/color-valid-relative-color.html
@@ -739,7 +739,7 @@
fuzzy_test_valid_color(`color(from currentColor ${colorSpace} x y z)`, `color(from currentColor ${colorSpace} x y z)`);
// color-mix
- fuzzy_test_valid_color(`color(from color-mix(in xyz, color(${colorSpace} 0.7 0.5 0.3), color(${colorSpace} 0.7 0.5 0.3)) ${colorSpace} r g b / alpha)`, `color(${resultColorSpace} 0.7 0.5 0.3)`);
+ fuzzy_test_valid_color(`color(from color-mix(in xyz, color(${colorSpace} 0.7 0.5 0.3), color(${colorSpace} 0.7 0.5 0.3)) ${colorSpace} x y z / alpha)`, `color(${resultColorSpace} 0.7 0.5 0.3)`);
}
// Spec Examples: https://www.w3.org/TR/css-color-5/#relative-colors
diff --git a/tests/wpt/tests/css/css-contain/contain-layout-ink-overflow-019.html b/tests/wpt/tests/css/css-contain/contain-layout-ink-overflow-019.html
index d4909aa70f5..5cda6cd5beb 100644
--- a/tests/wpt/tests/css/css-contain/contain-layout-ink-overflow-019.html
+++ b/tests/wpt/tests/css/css-contain/contain-layout-ink-overflow-019.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<meta charset="UTF-8">
+ <meta name="fuzzy" content="1;0-50">
<title>CSS Test: 'contain: layout' on element that overflows and its parent has 'overflow: scroll'</title>
diff --git a/tests/wpt/tests/css/css-contain/contain-layout-overflow-001.html b/tests/wpt/tests/css/css-contain/contain-layout-overflow-001.html
index 5bf984e2bf1..05c66fa1e98 100644
--- a/tests/wpt/tests/css/css-contain/contain-layout-overflow-001.html
+++ b/tests/wpt/tests/css/css-contain/contain-layout-overflow-001.html
@@ -3,6 +3,7 @@
<html>
<head>
<meta charset="utf-8">
+ <meta name="fuzzy" content="1;0-50">
<title>CSS Test: 'contain: layout' should force all overflow to be ink overflow.</title>
<link rel="author" title="Morgan Rae Reschenberg" href="mailto:mreschenberg@berkeley.edu">
<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-layout">
diff --git a/tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print-ref.tentative.html b/tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print-ref.tentative.html
new file mode 100644
index 00000000000..78464712c5c
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print-ref.tentative.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<div style="height:40vh">
+ Test passes if there is two purple boxes on both page 1 and page 2 in print mode. (Ctrl+P, with "print backgrounds" enabled)
+</div>
+<div style="display:grid; grid-template-columns:1fr 1fr;">
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+</div>
+<div style="display:grid; grid-template-columns:1fr 1fr; break-before:page;">
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print.tentative.html b/tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print.tentative.html
new file mode 100644
index 00000000000..01fd97528fc
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-fragmentation-between-rows-001-print.tentative.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com">
+<link rel="help" href="https://www.w3.org/TR/css-grid-1/#pagination">
+<link rel="match" href="./grid-fragmentation-between-rows-001-print-ref.tentative.html">
+<div style="height: 40vh">
+ Test passes if there is two purple boxes on both page 1 and page 2 in print mode. (Ctrl+P, with "print backgrounds" enabled)
+</div>
+<div style="display: grid; grid-template-columns: 1fr 1fr;">
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+ <div style="contain:size; height:40vh;">
+ <div style="height:40vh; width: 20vw; background:purple;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-shorthand-serialization.html b/tests/wpt/tests/css/css-grid/parsing/grid-shorthand-serialization.html
index 7751fd883b2..29bab75f617 100644
--- a/tests/wpt/tests/css/css-grid/parsing/grid-shorthand-serialization.html
+++ b/tests/wpt/tests/css/css-grid/parsing/grid-shorthand-serialization.html
@@ -33,11 +33,12 @@
}
if (declarations) {
- let cssText = div.style.cssText;
+ let cssTextSerialization = div.style.cssText;
declarations.forEach(decl => {
test(function(){
- assert_true(cssText.indexOf(decl) !== -1, `cssText ('${cssText}') must contain '${decl}'`);
- }, `cssText ('${cssText}') must contain '${decl}'`);
+ assert_true(cssTextSerialization.indexOf(decl) !== -1,
+ `cssText serialization ('${cssTextSerialization}') must contain contain '${decl}'`);
+ }, `cssText ('${cssText}') must contain '${decl}' in its serialization`);
});
}
}
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001-ref.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001-ref.html
index 4fc498a27bd..2dfe344ce35 100644
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001-ref.html
+++ b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001-ref.html
@@ -2,7 +2,6 @@
<title>Reference for trimming block-boxes at their first/last formatted lines</title>
<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="match" href="text-box-trim-half-leading-inline-box-001-ref.html">
<style>
.div-parent {
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001.html
index 9ad9ffc3fc6..2cbf1c26dbf 100644
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001.html
+++ b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-block-box-001.html
@@ -2,7 +2,7 @@
<title>Tests block boxes's edges are trimmed at text-over/text-under baselines of their first/last formatted lines</title>
<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="match" href="text-box-trim-half-leading-inline-box-001-ref.html">
+<link rel="match" href="text-box-trim-half-leading-block-box-001-ref.html">
<style>
.div-parent {
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html
deleted file mode 100644
index 54df108fb9c..00000000000
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001-ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<title>Reference for trimming inline boxes</title>
-<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-
-<style>
-div {
- border: 1px solid orange;
- font-size: 20px;
- line-height: 1;
-}
-
-span {
- border: 1px solid blue;
- border-right: 0;
- border-left: 0;
- font-family: Ahem;
- font-size: 20px;
- line-height: 1;
-}
-</style>
-
-<div>
- <span>Test</span>
-</div>
-<div>
- <span>Test<br><br></span>
-</div>
-<div>
- <span><br>Test</span>
-</div>
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001.html
deleted file mode 100644
index 130b68c6eb2..00000000000
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-001.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<title>Tests inline boxes are trimmed at text-over/text-under baselines</title>
-<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="match" href="text-box-trim-half-leading-inline-box-001-ref.html">
-
-<style>
-div {
- border: 1px solid orange;
- font-size: 20px;
- line-height: 1;
-}
-
-span {
- border: 1px solid blue;
- border-right: 0;
- border-left: 0;
- font-family: Ahem;
- font-size: 20px;
- line-height: 3;
-}
-</style>
-
-<div>
- <span style="text-box-trim:both">Test</span>
-</div>
-<div>
- <span style="text-box-trim:start">Test</span>
-</div>
-<div>
- <span style="text-box-trim:end">Test</span>
-</div>
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002-ref.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002-ref.html
deleted file mode 100644
index 0a615e6222c..00000000000
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002-ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<title>Reference for trimming multi-line text in inline boxes</title>
-<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-
-<style>
-div {
- border: 1px solid orange;
- font-size: 20px;
- line-height: 1;
-}
-
-span {
- border: 1px solid blue;
- border-right: 0;
- border-left: 0;
- font-family: Ahem;
- font-size: 20px;
- line-height: 1;
-}
-</style>
-
-<div>
- <span>Testline1<br>TestLine2<br>TestLine3</span>
-</div>
-<div>
- <span>Testline1<br><br>TestLine2<br><br>TestLine3<br><br></span>
-</div>
-<div>
- <span><br>Testline1<br><br>TestLine2<br><br>TestLine3</span>
-</div>
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002.html
deleted file mode 100644
index 631b53697c1..00000000000
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-002.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<title>Tests inline boxes with multi-line text are trimmed at text-over/text-under baselines</title>
-<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="match" href="text-box-trim-half-leading-inline-box-002-ref.html">
-
-<style>
-div {
- border: 1px solid orange;
- font-size: 20px;
- line-height: 1;
-}
-
-span {
- border: 1px solid blue;
- border-right: 0;
- border-left: 0;
- font-family: Ahem;
- font-size: 20px;
- line-height: 3;
-}
-
-</style>
-
-<div>
- <span style="text-box-trim: both">Testline1<br>TestLine2<br>TestLine3</span>
-</div>
-<div>
- <span style="text-box-trim: start">Testline1<br>TestLine2<br>TestLine3</span>
-</div>
-<div>
- <span style="text-box-trim: end">Testline1<br>TestLine2<br>TestLine3</span>
-</div>
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003-ref.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003-ref.html
deleted file mode 100644
index bf0fb3283d3..00000000000
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003-ref.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<title>Reference for trimming inline boxes</title>
-<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-
-<style>
-div {
- border: 1px solid orange;
- font-size: 20px;
- line-height: 1;
- writing-mode:vertical-lr;
-}
-
-span {
- border: 1px solid blue;
- border-top: 0;
- border-bottom: 0;
- font-family: Ahem;
- font-size: 20px;
- line-height: 1;
-}
-</style>
-
-<div>
- <span>Test</span>
-</div>
-<div>
- <span>Test<br><br></span>
-</div>
-<div>
- <span><br>Test</span>
-</div>
diff --git a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003.html b/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003.html
deleted file mode 100644
index 4c7e33663b5..00000000000
--- a/tests/wpt/tests/css/css-inline/text-box-trim/text-box-trim-half-leading-inline-box-003.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<title>Tests inline boxes are trimmed at text-over/text-under baselines</title>
-<link rel="help" href="https://drafts.csswg.org/css-inline-3/#leading-trim">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="match" href="text-box-trim-half-leading-inline-box-003-ref.html">
-
-<style>
-div {
- border: 1px solid orange;
- font-size: 20px;
- line-height: 1;
- writing-mode:vertical-lr;
-}
-
-span {
- border: 1px solid blue;
- border-top: 0;
- border-bottom: 0;
- font-family: Ahem;
- font-size: 20px;
- line-height: 3;
-}
-</style>
-
-<div>
- <span style="text-box-trim:both">Test</span>
-</div>
-<div>
- <span style="text-box-trim:start">Test</span>
-</div>
-<div>
- <span style="text-box-trim:end">Test</span>
-</div>
diff --git a/tests/wpt/tests/css/css-logical/animations/margin-block-interpolation.html b/tests/wpt/tests/css/css-logical/animations/margin-block-interpolation.html
new file mode 100644
index 00000000000..be4b6fdd8e0
--- /dev/null
+++ b/tests/wpt/tests/css/css-logical/animations/margin-block-interpolation.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin-block interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-margin-block">
+<meta name="assert" content="margin-block supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_interpolation({
+ property: 'margin-block',
+ from: '10px',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-logical/animations/margin-inline-interpolation.html b/tests/wpt/tests/css/css-logical/animations/margin-inline-interpolation.html
new file mode 100644
index 00000000000..86408ea6e94
--- /dev/null
+++ b/tests/wpt/tests/css/css-logical/animations/margin-inline-interpolation.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin-inline interpolation</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-margin-inline">
+<meta name="assert" content="margin-inline supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_interpolation({
+ property: 'margin-inline',
+ from: '10px',
+ to: '20px',
+}, [
+ {at: -0.3, expect: '7px'},
+ {at: 0, expect: '10px'},
+ {at: 0.3, expect: '13px'},
+ {at: 0.6, expect: '16px'},
+ {at: 1, expect: '20px'},
+ {at: 1.5, expect: '25px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-nesting/parsing.html b/tests/wpt/tests/css/css-nesting/parsing.html
index f29eff97307..a97716ff9d5 100644
--- a/tests/wpt/tests/css/css-nesting/parsing.html
+++ b/tests/wpt/tests/css/css-nesting/parsing.html
@@ -55,6 +55,7 @@
testNestedSelector(".foo", {expected:"& .foo"});
testNestedSelector(".test > & .bar");
testNestedSelector(".foo, .foo &", {expected:"& .foo, .foo &"});
+ testNestedSelector(".foo, .bar", {expected:"& .foo, & .bar"});
testNestedSelector(":is(.bar, .baz)", {expected:"& :is(.bar, .baz)"});
testNestedSelector("&:is(.bar, .baz)");
testNestedSelector(":is(.bar, &.baz)");
diff --git a/tests/wpt/tests/css/css-nesting/pseudo-where-crash.html b/tests/wpt/tests/css/css-nesting/pseudo-where-crash.html
new file mode 100644
index 00000000000..c069872c60b
--- /dev/null
+++ b/tests/wpt/tests/css/css-nesting/pseudo-where-crash.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<style>
+ .foo {
+ ::before:where(&) {
+ color: red;
+ }
+ }
+</style>
+<div class=foo></div>
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html
index 129eb2c0859..531af61b5d3 100644
--- a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-002.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
+ <meta name="fuzzy" content="1;0-50">
<title>CSS Overflow: test scrollbar-gutter with horizontal left to right content</title>
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
<link rel="author" title="Mozilla" href="http://www.mozilla.org/">
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html
index 9e5dcd299eb..b74aa642ca1 100644
--- a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-lr-002.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
+ <meta name="fuzzy" content="1;0-50">
<title>CSS Overflow: test scrollbar-gutter with vertical left to right content</title>
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
<link rel="author" title="Mozilla" href="http://www.mozilla.org/">
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html
index d68d4e5d3cb..398751845cf 100644
--- a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-vertical-rl-002.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
+ <meta name="fuzzy" content="1;0-50">
<title>CSS Overflow: test scrollbar-gutter with vertical right to left content</title>
<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
<link rel="author" title="Mozilla" href="http://www.mozilla.org/">
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html
index 359ec2fd337..75c2d67259e 100644
--- a/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-in-fixed-container.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="fuzzy" content="1;0-50">
<link rel="match" href="position-sticky-in-fixed-container-ref.html">
<link rel="help" href="https://drafts.csswg.org/css-position-3/#sticky-pos">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1854010">
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001-ref.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001-ref.html
new file mode 100644
index 00000000000..efe584bc885
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<style>
+ .block {
+ position: relative;
+ width: 300px;
+ height: 210px;
+ padding: 10px;
+ padding-top: 0;
+ margin: 10px;
+ float: left;
+ background-color: #ddd;
+ }
+
+ .col {
+ width: 100px;
+ background-color: blue;
+ height: 210px;
+ }
+
+ .abspos {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background-color: cyan;
+ top: 210px;
+ }
+</style>
+<div class="block">
+ <div class="col"></div>
+ <div class="abspos"></div>
+</div>
+<div class="block">
+ <div class="col"></div>
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001.html
new file mode 100644
index 00000000000..6bd4952c28f
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-001.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="help" href="https://drafts.csswg.org/css-position/#sticky-pos">
+<link rel="help" href="https://bugzil.la/1882091">
+<link rel="match" href="position-sticky-padding-001-ref.html">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<style>
+ .flex,
+ .block {
+ position: relative;
+ width: 300px;
+ height: 200px;
+ padding: 10px;
+ margin: 10px;
+ float: left;
+ overflow: auto;
+ scrollbar-width: none;
+ background-color: #ddd;
+ }
+
+ .flex {
+ display: flex;
+ flex-direction: row;
+ align-items: start;
+ justify-content: space-between;
+ }
+
+ .col {
+ width: 100px;
+ background-color: blue;
+ }
+
+ .col-1 {
+ position: sticky;
+ min-height: 300px;
+ top: 0;
+ }
+
+ .col-2 {
+ height: 20px;
+ align-self: start;
+ background-color: purple;
+ }
+ .block .col-2 {
+ float: right; /* Just make it visible */
+ }
+ .abspos {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background-color: cyan;
+ top: 600px;
+ }
+</style>
+<div class="flex">
+ <div class="col col-1"></div>
+ <div class="col col-2"></div>
+ <div class="abspos"></div>
+</div>
+<div class="block">
+ <div class="col col-2"></div>
+ <div class="col col-1"></div>
+ <div class="abspos"></div>
+</div>
+<script>
+onload = function() {
+ for (let e of document.querySelectorAll('.flex,.block')) {
+ e.scrollTop = 100000;
+ }
+};
+</script>
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002-ref.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002-ref.html
new file mode 100644
index 00000000000..cc9d447d1c6
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002-ref.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<style>
+ .block {
+ position: relative;
+ width: 210px;
+ height: 300px;
+ padding: 10px;
+ padding-left: 0;
+ margin: 10px;
+ float: left;
+ background-color: #ddd;
+ }
+
+ .row {
+ height: 100px;
+ width: 210px;
+ background-color: blue;
+ }
+
+ .abspos {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background-color: cyan;
+ top: 0;
+ left: 210px;
+ }
+</style>
+<div class="block">
+ <div class="row"></div>
+ <div class="abspos"></div>
+</div>
+<div class="block">
+ <div class="row"></div>
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002.html b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002.html
new file mode 100644
index 00000000000..972288fd3a8
--- /dev/null
+++ b/tests/wpt/tests/css/css-position/sticky/position-sticky-padding-002.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="help" href="https://drafts.csswg.org/css-position/#sticky-pos">
+<link rel="help" href="https://bugzil.la/1882091">
+<link rel="match" href="position-sticky-padding-002-ref.html">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<style>
+ .flex,
+ .block {
+ position: relative;
+ width: 200px;
+ height: 300px;
+ padding: 10px;
+ margin: 10px;
+ float: left;
+ overflow: auto;
+ scrollbar-width: none;
+ background-color: #ddd;
+ }
+
+ .flex {
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ justify-content: space-between;
+ }
+
+ .row {
+ height: 100px;
+ background-color: blue;
+ }
+
+ .row-1 {
+ position: sticky;
+ min-width: 300px;
+ left: 0;
+ }
+
+ .row-2 {
+ width: 20px;
+ align-self: start;
+ background-color: purple;
+ }
+ .abspos {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background-color: cyan;
+ left: 600px;
+ top: 0;
+ }
+</style>
+<div class="flex">
+ <div class="row row-1"></div>
+ <div class="row row-2"></div>
+ <div class="abspos"></div>
+</div>
+<div class="block">
+ <div class="row row-1"></div>
+ <div class="row row-2"></div>
+ <div class="abspos"></div>
+</div>
+<script>
+onload = function() {
+ for (let e of document.querySelectorAll('.flex,.block')) {
+ e.scrollLeft = 100000;
+ }
+};
+</script>
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js b/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js
index 1a2edab90bb..e29f9bc5b3e 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js
+++ b/tests/wpt/tests/css/css-scroll-snap-2/resources/common.js
@@ -11,24 +11,12 @@ function checkSnapEventSupport(event_type) {
function assertSnapEvent(evt, expected_ids) {
assert_equals(evt.bubbles, false, "snap events don't bubble");
assert_false(evt.cancelable, "snap events are not cancelable.");
- const actual = Array.from(evt.snapTargets, el => el.id).join(",");
- const expected = expected_ids.join(",");
- assert_equals(actual, expected, "snap event supplied expected targets");
+ assert_equals(evt.snapTargetBlock, expected_ids.block,
+ "snap event supplied expected target in block axis");
+ assert_equals(evt.snapTargetInline, expected_ids.inline,
+ "snap event supplied expected target in inline axis");
}
-// This function holds logic intended to be used by tests for scroll snap
-// events.
-// |test_data| should contain:
-// - |scroller|: the snap container being scrolled (or
-// document.scrollingElement)
-// - |scrolling_function|: this function should trigger the desired snap event
-// when executed.
-// - |expected_snap_targets|: a list of element ids which the triggered snap
-// event should supply in SnapEvent.snapTargets.
-// - |expected_scroll_offsets|: the scroll offsets at which the snap container
-// should be after scrolling function has been
-// executed.
-// |event_type|: should be "snapchanged" or "snapchanging".
async function test_snap_event(test, test_data, event_type) {
checkSnapEventSupport(event_type);
await waitForScrollReset(test, test_data.scroller);
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-after-layout-change.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-after-layout-change.tentative.html
index 293400edda2..a3ba05fdf5e 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-after-layout-change.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-after-layout-change.tentative.html
@@ -81,7 +81,7 @@
inner_snap_area.style.height =
`${scroller.clientHeight + inner_snap_area.clientHeight - 10}px`;
const evt = await snapchanged_promise;
- assertSnapEvent(evt, [outer_snap_area.id, inner_snap_area.id]);
+ assertSnapEvent(evt, { block: inner_snap_area, inline: null });
target_snap_position = inner_snap_area.offsetTop +
inner_snap_area.offsetHeight - scroller.clientHeight;
assert_equals(scroller.scrollTop, target_snap_position,
@@ -107,7 +107,7 @@
inner_snap_area.style.height =
`${scroller.clientHeight + inner_snap_area.clientHeight + 10}px`;
const evt = await snapchanged_promise;
- assertSnapEvent(evt, [outer_snap_area.id, inner_snap_area.id]);
+ assertSnapEvent(evt, { block: inner_snap_area, inline: null });
assert_equals(scroller.scrollTop, target_snap_position,
"scroller maintains offset which is now covering within inner area");
}, "snapchanged fires after snap area is snapped to upon layout change " +
@@ -119,11 +119,11 @@
let snapchanged_promise = waitForSnapChangedEvent(scroller, false);
scroller.style.scrollSnapType = "none";
let evt = await snapchanged_promise;
- assertSnapEvent(evt, []);
+ assertSnapEvent(evt, { block: null, inline: null });
snapchanged_promise = waitForSnapChangedEvent(scroller, false);
scroller.style.scrollSnapType = "y mandatory";
evt = await snapchanged_promise;
- assertSnapEvent(evt, [outer_snap_area.id]);
+ assertSnapEvent(evt, { block: outer_snap_area, inline: null });
}, "snapchanged fires when container stops snapping");
promise_test(async(t) => {
@@ -133,12 +133,12 @@
inner_snap_area.style.scrollSnapAlign = "none";
outer_snap_area.style.scrollSnapAlign = "none";
let evt = await snapchanged_promise;
- assertSnapEvent(evt, []);
+ assertSnapEvent(evt, { block: null, inline: null });
snapchanged_promise = waitForSnapChangedEvent(scroller, false);
inner_snap_area.style.scrollSnapAlign = "start";
outer_snap_area.style.scrollSnapAlign = "start";
evt = await snapchanged_promise;
- assertSnapEvent(evt, [outer_snap_area.id]);
+ assertSnapEvent(evt, { block: outer_snap_area, inline: null });
}, "snapchanged fires when snap container no longer has snap areas");
</script>
</body>
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-ensures-dom-order.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-ensures-dom-order.html
deleted file mode 100644
index 10bc73b622c..00000000000
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-ensures-dom-order.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <link rel="help" href="https://drafts.csswg.org/css-scroll-snap-2/#snap-events" />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="/dom/events/scrolling/scroll_support.js"></script>
- <script src="/css/css-scroll-snap-2/resources/common.js"></script>
- <script src="/web-animations/testcommon.js"></script>
- <style>
- #scroller {
- overflow-y: scroll;
- scroll-snap-type: y mandatory;
- width: 500px;
- height: 500px;
- background-color: white;
- position: relative;
- }
- .space_filler {
- display: inline-block;
- width: 40%;
- height: 30%;
- background-color: green;
- }
- .snap_area {
- scroll-snap-align: start;
- background-color: yellow;
- position: absolute;
- width: 40%;
- height: 30%;
- }
-
- #snap_point_1 {
- left: 1px;
- }
- #snap_point_2 {
- left: 80%;
- }
- #snap_point_3 {
- left: 40%;
- scroll-snap-align: start;
- background-color: yellow;
- position: absolute;
- width: 40%;
- height: 30%;
- }
- </style>
-</head>
-<body>
- <div id="scroller">
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div class="space_filler"></div>
- <div id="snap_point_1" class="snap_area"><h1>1</h1></div>
- <div id="snap_point_2" class="snap_area"><h1>2</h1></div>
- </div>
- <script>
- promise_test(async (t) => {
- checkSnapEventSupport("snapchanged");
- await waitForCompositorCommit();
- const snapchanged_promise = waitForSnapChangedEvent(scroller, false);
- const snap_point_3 = document.createElement("div");
- snap_point_3.id = "snap_point_3";
- t.add_cleanup(() => {
- snap_point_3.remove();
- });
- scroller.insertBefore(snap_point_3, snap_point_2);
- const evt_seen = await snapchanged_promise;
- assertSnapEvent(evt_seen,
- [snap_point_1.id, snap_point_3.id, snap_point_2.id]);
- }, "snapchanged lists snapTargets in DOM order.");
-
- promise_test(async (t) => {
- checkSnapEventSupport("snapchanged");
- await waitForCompositorCommit();
- const unreached_func = t.unreached_func("snapchanged shouldn't fire " +
- "since the scroller is snapped to the same elements despite the " +
- "dom order change.");
- t.add_cleanup(() => {
- scroller.removeEventListener("snapchanged", unreached_func);
- })
- scroller.addEventListener("snapchanged", unreached_func);
- scroller.insertBefore(snap_point_2, snap_point_1);
- await waitForCompositorCommit();
- }, "DOM order change doesn't trigger snapchanged if snapped targets " +
- "don't change.");
- </script>
-</body>
-</html>
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html
index 2e33c3c970f..98ec2e5d75c 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html
@@ -69,7 +69,7 @@
scrolling_function: () => {
scroller.scrollTo(snap_point_2.offsetLeft, snap_point_2.offsetTop);
},
- expected_snap_targets: [snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: snap_point_2.offsetLeft,
y: snap_point_2.offsetTop,
@@ -110,7 +110,7 @@
scroller.scrollTo(scroll_left_target, scroll_top_target);
evt = await snapchanged_promise;
- assertSnapEvent(evt, [snap_point_2.id]);
+ assertSnapEvent(evt, { block: snap_point_2, inline: snap_point_2 });
assert_approx_equals(scroller.scrollTop, snap_point_2.offsetTop, 1,
"scroller snaps to the top of snap_point_2");
assert_approx_equals(scroller.scrollLeft, snap_point_2.offsetLeft, 1,
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html
index 6082e090130..9dff856f344 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html
@@ -76,7 +76,7 @@
scrolling_function: () => {
scroller.scrollTo(snap_point_2.offsetLeft, snap_point_2.offsetTop);
},
- expected_snap_targets: [snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: snap_point_2.offsetLeft,
y: snap_point_2.offsetTop,
@@ -115,7 +115,7 @@
scroller.scrollTo(scroll_left_target, scroll_top_target);
evt = await snapchanged_promise;
- assertSnapEvent(evt, [snap_point_2.id]);
+ assertSnapEvent(evt, { block: snap_point_2, inline: snap_point_2 })
assert_approx_equals(scroller.scrollTop, snap_point_2.offsetTop, 1,
"scroller snaps to the top of snap_point_2");
assert_approx_equals(scroller.scrollLeft, snap_point_2.offsetLeft, 1,
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html
index 5405d778bf0..127376caa2f 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative.html
@@ -64,6 +64,8 @@
<div id="snap_point_3" class="snap_point"></div>
<script>
const scroller = document.scrollingElement;
+ const snap_point_2 = document.getElementById("snap_point_2");
+ const snap_point_1 = document.getElementById("snap_point_1");
const offset_to_snap_point_2 = {
x: snap_point_2.offsetLeft,
y: snap_point_2.offsetTop
@@ -82,7 +84,7 @@
scrolling_function: async () => {
await snap_event_touch_scroll_helper(start_pos, end_pos);
},
- expected_snap_targets: [snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
@@ -102,7 +104,7 @@
offset_to_snap_point_2.y,
{ origin: scroller }).send();
},
- expected_snap_targets: [snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
@@ -132,7 +134,7 @@
await snap_event_scrollbar_drag_helper(scroller, scrollbar_width,
drag_amt);
},
- expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_1 },
expected_scroll_offsets: {
x: 0,
y: offset_to_snap_point_2.y,
@@ -150,7 +152,7 @@
window.test_driver.send_keys(document.documentElement,
'\ue015'/*ArrowDown*/);
},
- expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_1 },
expected_scroll_offsets: {
x: 0,
y: offset_to_snap_point_2.y,
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html
index 4f362007225..91194642b55 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative.html
@@ -71,6 +71,8 @@
</div>
<script>
const scroller = document.getElementById("scroller");
+ const snap_point_1 = document.getElementById("snap_point_1");
+ const snap_point_2 = document.getElementById("snap_point_2");
const offset_to_snap_point_2 = {
x: snap_point_2.offsetLeft,
y: snap_point_2.offsetTop
@@ -89,7 +91,7 @@
scrolling_function: async () => {
await snap_event_touch_scroll_helper(start_pos, end_pos);
},
- expected_snap_targets: [snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
@@ -109,7 +111,7 @@
offset_to_snap_point_2.y,
{ origin: scroller }).send();
},
- expected_snap_targets: [snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
@@ -136,7 +138,7 @@
scrollbar_to_scroller_ratio;
await snap_event_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt);
},
- expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_1 },
expected_scroll_offsets: {
x: 0,
y: offset_to_snap_point_2.y,
@@ -154,7 +156,7 @@
scroller.focus();
window.test_driver.send_keys(scroller, '\ue015'/*ArrowDown*/);
},
- expected_snap_targets: [snap_point_1.id, snap_point_2.id],
+ expected_snap_targets: { block: snap_point_2, inline: snap_point_1 },
expected_scroll_offsets: {
x: 0,
y: offset_to_snap_point_2.y,
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-with-proximity-strictness.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-with-proximity-strictness.tentative.html
index cb55054e6f8..96cab337398 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-with-proximity-strictness.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanged/snapchanged-with-proximity-strictness.tentative.html
@@ -61,7 +61,7 @@
// to outside the proximity range and are no longer snapped.
let evt = await snapchanged_promise;
assert_equals(scroller.scrollTop, 250);
- assertSnapEvent(evt, []);
+ assertSnapEvent(evt, { block: null, inline: null });
evt = null;
snapchanged_promise = waitForSnapChangedEvent(scroller);
@@ -73,7 +73,7 @@
assert_equals(scroller.scrollTop, 0);
// snapchanged should fire as we've moved from outside the proximity range
// to inside the proximity range and are once again snapped.
- assertSnapEvent(evt, [target.id]);
+ assertSnapEvent(evt, { block: target, inline: null });
}, "Snapchanged fires when scrolling outside proximity range.");
</script>
</body>
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html
index 5474b7ddce2..0c0bfb623e1 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-after-layout-change.tentative.html
@@ -102,7 +102,7 @@
// assert snapchanging that should have already happened.
await scroll_promise;
- assertSnapEvent(snap_evt, [box2.id]);
+ assertSnapEvent(snap_evt, { block: null, inline: box2 });
evt_promise = waitForSnapEvent(scroller, "snapchanging", false);
// Change layout while pointer is still down.
@@ -111,7 +111,7 @@
box2.style.left = box3_prev_left;
box3.style.left = box2_prev_left;
snap_evt = await evt_promise;
- assertSnapEvent(snap_evt, [box3.id]);
+ assertSnapEvent(snap_evt, { block: null, inline: box3 });
}, "snapchanging fires after layout change");
</script>
</body>
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-root-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-root-scroll.tentative.html
index d031811c17e..5d75715edb7 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-root-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-root-scroll.tentative.html
@@ -66,6 +66,7 @@
<div id="snap_area_3" class="yellow snap box"></div>
<script>
const scroller = document.scrollingElement;
+ const snap_area_2 = document.getElementById("snap_area_2");
promise_test(async (t) => {
await waitForCompositorCommit();
@@ -74,7 +75,7 @@
scrolling_function: async () => {
scroller.scrollTo(0, snap_area_2.offsetTop);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-scroll.tentative.html
index 5a0de1deb32..25cdc44c662 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-programmatic-scroll.tentative.html
@@ -73,6 +73,7 @@
</div>
<script>
const scroller = document.getElementById("scroller");
+ const snap_area_2 = document.getElementById("snap_area_2");
promise_test(async (t) => {
await waitForCompositorCommit();
@@ -81,7 +82,7 @@
scrolling_function: async () => {
scroller.scrollTo(0, snap_area_2.offsetTop);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html
index 29d0239e2d6..e1a1e8aff6c 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html
@@ -74,6 +74,8 @@
<div id="snap_area_3" class="yellow snap box"></div>
<script>
const scroller = document.scrollingElement;
+ const snap_area_2 = document.getElementById("snap_area_2");
+ const snap_area_1 = document.getElementById("snap_area_1");
// Touch scroll test.
promise_test(async (t) => {
@@ -86,7 +88,7 @@
const end_pos = { x: scroller_middle, y: 0 };
await snap_event_touch_scroll_helper(start_pos, end_pos);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -104,7 +106,7 @@
await new test_driver.Actions().scroll(0, 0, 0,
Math.round(snap_area_2.offsetTop / 2) + 1).send();
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -130,7 +132,7 @@
scrollbar_to_scroller_ratio;
await snap_event_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -148,7 +150,7 @@
scroller.focus();
window.test_driver.send_keys(document.documentElement, '\ue015'/*ArrowDown*/);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -183,8 +185,8 @@
.send();
let evts = await evts_promise;
assert_equals(evts.length, 2, "2 snapchanging events are seens");
- assertSnapEvent(evts[0], [snap_area_2.id]);
- assertSnapEvent(evts[1], [snap_area_1.id]);
+ assertSnapEvent(evts[0], { block: snap_area_2, inline: null });
+ assertSnapEvent(evts[1], { block: snap_area_1, inline: null });
}, "snapchanging fires as scroll moves through different snap targets.");
// snapchanging doesn't fire test.
diff --git a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html
index 2c1f9742b62..35ee8a51965 100644
--- a/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html
+++ b/tests/wpt/tests/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html
@@ -63,6 +63,8 @@
</div>
<script>
const scroller = document.getElementById("scroller");
+ const snap_area_2 = document.getElementById("snap_area_2");
+ const snap_area_1 = document.getElementById("snap_area_1");
// Touch scroll test.
promise_test(async (t) => {
@@ -75,7 +77,7 @@
const end_pos = { x: scroller_middle, y: 0 };
await snap_event_touch_scroll_helper(start_pos, end_pos);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -94,7 +96,7 @@
Math.round(snap_area_2.offsetTop / 2) + 1,
{ origin: scroller }).send();
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -121,7 +123,7 @@
scrollbar_to_scroller_ratio;
await snap_event_scrollbar_drag_helper(scroller, scrollbar_width, drag_amt);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -139,7 +141,7 @@
scroller.focus();
window.test_driver.send_keys(scroller, '\ue015'/*ArrowDown*/);
},
- expected_snap_targets: [snap_area_2.id],
+ expected_snap_targets: { block: snap_area_2, inline: null },
expected_scroll_offsets: {
x: 0,
y: snap_area_2.offsetTop
@@ -174,8 +176,8 @@
.send();
let evts = await evts_promise;
assert_equals(evts.length, 2, "2 snapchanging events are seens");
- assertSnapEvent(evts[0], [snap_area_2.id]);
- assertSnapEvent(evts[1], [snap_area_1.id]);
+ assertSnapEvent(evts[0], { block: snap_area_2, inline: null });
+ assertSnapEvent(evts[1], { block: snap_area_1, inline: null });
}, "snapchanging fires as scroll moves through different snap targets.");
// snapchanging doesn't fire test.
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/common-to-both-axes-supercedes-first-in-tree-order.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/common-to-both-axes-supercedes-first-in-tree-order.html
new file mode 100644
index 00000000000..d9989316e40
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/common-to-both-axes-supercedes-first-in-tree-order.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <link rel="help" href="https://drafts.csswg.org/css-scroll-snap" />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="resources/common.js"></script>
+</head>
+
+<body>
+ <style>
+ .placeholder {
+ top: 0px;
+ left: 0px;
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ background-color: black;
+ scroll-snap-align: start;
+ }
+ .space {
+ position: absolute;
+ height: 300vh;
+ width: 300vw;
+ top: 100px;
+ left: 100px;
+ }
+ .scroller {
+ overflow: scroll;
+ scroll-snap-type: both mandatory;
+ width: 550px;
+ height: 550px;
+ border: solid 1px black;
+ position: relative;
+ resize: both;
+ }
+ .box {
+ background-color: green;
+ height: 200px;
+ width: 200px;
+ scroll-snap-align: start;
+ position: absolute;
+ border: solid 1px white;
+ }
+ .row {
+ top: 100px;
+ }
+ .col {
+ left: 100px;
+ }
+ /* Place boxes 0 through 4 on a horizontal row. */
+ #box0 {
+ left: 300px;
+ }
+ #box1 {
+ left: 500px;
+ }
+ #box2 {
+ left: 700px;
+ }
+ #box3 {
+ left: 900px;
+ }
+ #box4 {
+ left: 1100px;
+ }
+ /* Place boxes 5 through 9 in a vertical column. */
+ #box5 {
+ top: 300px;
+ }
+ #box6 {
+ top: 500px;
+ }
+ #box7 {
+ top: 700px;
+ }
+ #box8 {
+ top: 900px;
+ }
+ #box9 {
+ top: 1100px;
+ }
+ </style>
+ <div id="scroller" class="scroller">
+ <!-- This placeholder is a snap target at the top-left of the
+ scroller. It gives the scroller an opportunity to scroll to the
+ snap targets, forcing the UA to run the snap point selection
+ algorithm. Each test case ensures the snap point selection algorithm is
+ invoked by:
+ - first resetting the scroller's scroll position to snap to the
+ placeholder,
+ - then configuring the tree-order and layout of the snap
+ targets as necessary,
+ - then scrolling to the snap areas and,
+ - finally, verifying that the correct snap area was selected.
+ Without the scroll from the placeholder to the snap targets, the UA would
+ be correct to simply make the scroller follow the previously selected snap
+ target (i.e. when there was no snap area aligned in both axes) even after
+ the layout changes made by the test. -->
+ <div class="placeholder"></div>
+ <div id="box0" class="row box">Box 0</div>
+ <div id="box1" class="row box">Box 1</div>
+ <div id="box2" class="row box">Box 2</div>
+ <div id="box3" class="row box">Box 3</div>
+ <div id="box4" class="row box">Box 4</div>
+ <div id="box5" class="col box">Box 5</div>
+ <div id="box6" class="col box">Box 6</div>
+ <div id="box7" class="col box">Box 7</div>
+ <div id="box8" class="col box">Box 8</div>
+ <div id="box9" class="col box">Box 9</div>
+ <div class="space" id="space">
+ </div>
+ <script>
+ window.onload = async () => {
+ const scroller = document.getElementById("scroller");
+ const boxes = document.querySelectorAll(".box");
+ const box = (n) => {
+ return boxes[n];
+ }
+
+ async function test(n) {
+ return promise_test(async (t) => {
+ await waitForScrollReset(t, scroller);
+ await waitForCompositorCommit();
+ const target = document.getElementById(`box${n}`);
+
+ assert_equals(scroller.scrollLeft, 0, "scrollLeft is reset");
+ assert_equals(scroller.scrollTop, 0, "scrollTop is reset");
+
+ // Make target the last in tree-order.
+ scroller.removeChild(target);
+ scroller.appendChild(target);
+
+ const old_style = getComputedStyle(target);
+ const old_top = old_style.top;
+ const old_left = old_style.left;
+
+ // Make target snap-aligned in both axes.
+ t.add_cleanup(async () => {
+ target.style.top = old_top;
+ target.style.left = old_left;
+ });
+ target.style.left = "100px";
+ target.style.top = "100px";
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[box(5), box(6), box(7), box(8), box(9)],
+ /*aligned_elements_y=*/[box(0), box(1), box(2), box(3), box(4)],
+ /*axis=*/"both",
+ /*expected_target_x*/target,
+ /*expected_target_y*/target);
+ }, `box${n} is common to both axes and is the snap target despite ` +
+ `being last in tree order.`);
+ }
+
+ await test(0);
+ await test(1);
+ await test(2);
+ await test(3);
+ await test(4);
+ await test(5);
+ await test(6);
+ await test(7);
+ await test(8);
+ await test(9);
+ }
+ </script>
+</body>
+<html>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html
index 09b81e7c0da..a44c8d7c48a 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html
@@ -33,31 +33,48 @@
width: 100px;
height: 100px;
background-color: green;
- display: inline-block;
- position: relative;
- }
- .grid {
position: absolute;
- width: 350px;
- height: 350px;
}
- .snap:focus {
- background-color: blue;
+ .leftcol {
+ left: 110px;
+ }
+ .midcol {
+ left: 220px;
+ }
+ .rightcol {
+ left: 330px;
+ }
+ .toprow {
+ top: 110px;
+ }
+ .midrow {
+ top: 220px;
+ }
+ .bottomrow {
+ top: 330px;
+ }
+ .placeholder {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 10px;
+ height: 10px;
+ background-color: black;
+ scroll-snap-align: start;
}
</style>
<div class="scroller" id="scroller">
<div class="large-space"><div>
- <div class="grid" id="grid">
- <div id="box1" tabindex="1" class="snap box">Box 1</div>
- <div id="box2" tabindex="1" class="snap box">Box 2</div>
- <div id="box3" tabindex="1" class="snap box">Box 3</div>
- <div id="box4" tabindex="1" class="snap box">Box 4</div>
- <div id="box5" tabindex="1" class="snap box">Box 5</div>
- <div id="box6" tabindex="1" class="snap box">Box 6</div>
- <div id="box7" tabindex="1" class="snap box">Box 7</div>
- <div id="box8" tabindex="1" class="snap box">Box 8</div>
- <div id="box9" tabindex="1" class="snap box">Box 9</div>
- </div>
+ <div class="placeholder"></div>
+ <div id="box1" class="leftcol toprow snap box">Box 1</div>
+ <div id="box2" class="midcol toprow snap box">Box 2</div>
+ <div id="box3" class="rightcol toprow snap box">Box 3</div>
+ <div id="box4" class="leftcol midrow snap box">Box 4</div>
+ <div id="box5" class="midcol midrow snap box">Box 5</div>
+ <div id="box6" class="rightcol midrow snap box">Box 6</div>
+ <div id="box7" class="leftcol bottomrow snap box">Box 7</div>
+ <div id="box8" class="midcol bottomrow snap box">Box 8</div>
+ <div id="box9" class="rightcol bottomrow snap box">Box 9</div>
</div>
<script>
window.onload = () => {
@@ -79,50 +96,60 @@
await waitForCompositorCommit();
await runScrollSnapSelectionVerificationTest(t, scroller,
- /*aligned_elements_x=*/[],
+ /*aligned_elements_x=*/[box(1), box(4), box(7)],
/*aligned_elements_y=*/[box(1), box(2), box(3)],
- /*axis=*/ "y",
- /*expected_target_x=*/null,
+ /*axis=*/ "both",
+ /*expected_target_x=*/box(1),
/*expected_target_y=*/box(1));
await runScrollSnapSelectionVerificationTest(t, scroller,
- /*aligned_elements_x=*/[],
+ /*aligned_elements_x=*/[box(1), box(4), box(7)],
/*aligned_elements_y=*/[box(4), box(5), box(6)],
- /*axis=*/ "y",
- /*expected_target_x=*/null,
+ /*axis=*/"both",
+ /*expected_target_x=*/box(4),
/*expected_target_y=*/box(4));
await runScrollSnapSelectionVerificationTest(t, scroller,
- /*aligned_elements_x=*/[],
+ /*aligned_elements_x=*/[box(1), box(4), box(7)],
/*aligned_elements_y=*/[box(7), box(8), box(9)],
- /*axis=*/"y",
- /*expected_target_x=*/null,
+ /*axis=*/"both",
+ /*expected_target_x=*/box(7),
/*expected_target_y=*/box(7));
await runScrollSnapSelectionVerificationTest(t, scroller,
- /*aligned_elements_x=*/[box(1), box(4), box(7)],
- /*aligned_elements_y=*/[],
- /*axis=*/"x",
- /*expected_target_x=*/box(1));
+ /*aligned_elements_x=*/[box(2), box(5), box(8)],
+ /*aligned_elements_y=*/[box(1), box(2), box(3)],
+ /*axis=*/ "both",
+ /*expected_target_x=*/box(2),
+ /*expected_target_y=*/box(2));
await runScrollSnapSelectionVerificationTest(t, scroller,
/*aligned_elements_x=*/[box(2), box(5), box(8)],
- /*aligned_elements_y=*/[],
- /*axis=*/"x",
- /*expected_target_x=*/box(2));
+ /*aligned_elements_y=*/[box(4), box(5), box(6)],
+ /*axis=*/"both",
+ /*expected_target_x=*/box(5),
+ /*expected_target_y=*/box(5));
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[box(2), box(5), box(8)],
+ /*aligned_elements_y=*/[box(7), box(8), box(9)],
+ /*axis=*/"both",
+ /*expected_target_x=*/box(8),
+ /*expected_target_y=*/box(8));
await runScrollSnapSelectionVerificationTest(t, scroller,
/*aligned_elements_x=*/[box(3), box(6), box(9)],
- /*aligned_elements_y=*/[],
- /*axis=*/"x",
- /*expected_target_x=*/box(3));
+ /*aligned_elements_y=*/[box(1), box(2), box(3)],
+ /*axis=*/ "both",
+ /*expected_target_x=*/box(3),
+ /*expected_target_y=*/box(3));
await runScrollSnapSelectionVerificationTest(t, scroller,
- /*aligned_elements_x=*/[box(2), box(5), box(8)],
+ /*aligned_elements_x=*/[box(3), box(6), box(9)],
/*aligned_elements_y=*/[box(4), box(5), box(6)],
/*axis=*/"both",
- /*expected_target_x=*/box(5),
- /*expected_target_y=*/box(5));
+ /*expected_target_x=*/box(6),
+ /*expected_target_y=*/box(6));
}, "scroller prefers target aligned in both axes.");
promise_test(async (t) => {
@@ -132,13 +159,16 @@
box8.style.top = `${initial_box8_top}px`;
});
+ // Snap to box7's row and column.
+ scroller.scrollTo(box7.offsetLeft, box7.offsetTop);
+
// Move box 8 below box7 and box9.
- box8.style.top = `${2 * box8.offsetTop}px`;
+ box8.style.top = `${box8.offsetTop + 50}px`;
// Snap to box8.
scroller.scrollTop = box8.offsetTop;
- // Test that if box7 and box9 are also shifted to align with box7,
+ // Test that if box7 and box9 are also shifted to align with box8,
// box8 is still treated as the selected snap target despite box7 being
// aligned on both axes.
runLayoutSnapSeletionVerificationTest(t, scroller, [box7, box9],
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-first-in-tree-order.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-first-in-tree-order.html
new file mode 100644
index 00000000000..f4b32e10c72
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-first-in-tree-order.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <link rel="help" href="https://drafts.csswg.org/css-scroll-snap"/>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="resources/common.js"></script>
+ </head>
+<body>
+ <style>
+ .large-space {
+ position: absolute;
+ height: 300vh;
+ width: 300vw;
+ z-index: -1;
+ }
+ .target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ scroll-snap-align: start;
+ }
+ .snapcontainer {
+ border:solid 1px black;
+ overflow: scroll;
+ scroll-snap-type: y mandatory;
+ }
+ .outer {
+ height: 315px;
+ width: 1200px;
+ position: relative;
+ }
+ .inner {
+ height: 115px;
+ width: 120px;
+ }
+ .positioned {
+ position: absolute;
+ top: 150px;
+ }
+ .outer .target1 {
+ left: 0px;
+ }
+ .outer .target2 {
+ left: 110px;
+ }
+ .outer .target3 {
+ left: 220px;
+ }
+ .outer .target4 {
+ left: 330px;
+ }
+ .outer .target5 {
+ left: 440px;
+ }
+ .inner .target1 {
+ left: 550px;
+ }
+ .inner .target2 {
+ left: 660px;
+ }
+ .inner .target3 {
+ left: 770px;
+ }
+ .inner .target4 {
+ left: 880px;
+ }
+ .inner .target5 {
+ left: 990px;
+ }
+ .placeholder {
+ background-color: purple;
+ top: 0px;
+ }
+ .outer > .placeholder {
+ position: absolute;
+ top: 0px;
+ left: 200px;
+ }
+ </style>
+ <!--
+ Placeholder snap areas are used to make it necessary for the scroller to
+ scroll in order to reach its snap targets. This forces the scroller to
+ invoke the snap point selection algorithm. Otherwise (i.e. if no scroll
+ happens) a layout change (inserting and removing children) may not be enough
+ to cause the scroller to select the intended snap targets.
+ -->
+ <div id="outerscroller" class="outer snapcontainer">
+ <div id="outerplaceholder1" class="placeholder target">Outer placeholder
+ </div>
+ <div id="outertarget1" class="positioned target target1">Outer 1</div>
+ <div id="outertarget2" class="positioned target target2">Outer 2</div>
+ <div id="outertarget3" class="positioned target target3">Outer 3</div>
+ <div id="outertarget4" class="positioned target target4">Outer 4</div>
+ <div id="outertarget5" class="positioned target target5">Outer 5</div>
+ <div id="innerscroller" class="inner snapcontainer">
+ <div id="innerplaceholder1" class="placeholder target">Inner Placeholder
+ </div>
+ <div id="innertarget1" class="positioned target target1">Inner 1</div>
+ <div id="innertarget2" class="positioned target target2">Inner 2</div>
+ <div id="innertarget3" class="positioned target target3">Inner 3</div>
+ <div id="innertarget4" class="positioned target target4">Inner 4</div>
+ <div id="innertarget5" class="positioned target target5">Inner 5</div>
+ </div>
+ <div class="large-space"></div>
+ </div>
+ <script>
+ window.onload = async () => {
+ const outerscroller = document.getElementById("outerscroller");
+ const innerscroller = document.getElementById("innerscroller");
+ const outertargets = Array.from(
+ document.querySelectorAll(".outer > .positioned.target"));
+ const innertargets = Array.from(
+ document.querySelectorAll(".inner > .positioned.target"));
+
+ promise_test(async (t) => {
+ for (const target of outertargets) {
+ await waitForScrollReset(t, outerscroller);
+ await waitForCompositorCommit();
+
+ // Make target first in tree order.
+ outerscroller.removeChild(target);
+ outerscroller.prepend(target);
+
+ await runScrollSnapSelectionVerificationTest(t, outerscroller,
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/outertargets,
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_y*/target);
+ }
+
+ // The next for-loop tests outerscroller's selection of
+ // out-of-positioned targets that are children of innerscroller. For
+ // outerscroller to consider them first in tree order relative to its
+ // own children, innerscroller must be the first child of outer
+ // scroller.
+ outerscroller.removeChild(innerscroller);
+ outerscroller.prepend(innerscroller);
+
+ for (const target of innertargets) {
+ await waitForScrollReset(t, outerscroller);
+ await waitForCompositorCommit();
+
+ // Make target first in tree order.
+ innerscroller.removeChild(target);
+ innerscroller.prepend(target);
+
+ await runScrollSnapSelectionVerificationTest(t, outerscroller,
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/innertargets,
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_y*/target);
+ }
+ }, "first in tree-order is selected as snap target.");
+ }
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame-target.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame-target.html
new file mode 100644
index 00000000000..6bc47d15efd
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame-target.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html>
+<body>
+ <style>
+ #space {
+ height: 300vh;
+ width: 300vw;
+ position: absolute;
+ }
+ #scroller {
+ overflow-y: scroll;
+ scroll-snap-type: y mandatory;
+ width: 450px;
+ height: 450px;
+ border: solid 1px black;
+ position: relative;
+ }
+ .box {
+ height: 200px;
+ width: 200px;
+ position: absolute;
+ background-color: green;
+ scroll-snap-align: start;
+ }
+ .box:target {
+ background-color: red;
+ }
+ .toprow { top: 0px; }
+ .midrow { top: 210px; }
+ .bottomrow { top: 420px; }
+ .leftcol { left: 0px; }
+ .midcol { left: 210px; }
+ .rightcol { left: 420px; }
+ </style>
+ <div id="scroller">
+ <div id="space"></div>
+ <div class="leftcol toprow box" id="box1"></div>
+ <div class="midcol toprow box" id="box2"></div>
+ <div class="rightcol toprow box" id="box3"></div>
+ <div class="leftcol midrow box" id="box4"></div>
+ <div class="midcol midrow box" id="box5"></div>
+ <div class="rightcol midrow box" id="box6"></div>
+ <div class="leftcol bottomrow box" id="box7"></div>
+ <div class="midcol bottomrow box" id="box8"></div>
+ <div class="rightcol bottomrow box" id="box9"></div>
+ </div>
+ <script>
+ // This test sets up a 3x3 grid within scroller:
+ // -------------------------
+ // | Box 1 | Box 2 | Box 3 |
+ // ------------------------
+ // | Box 4 | Box 5 | Box 6 |
+ // -------------------------
+ // | Box 7 | Box 8 | Box 9 |
+ // -------------------------
+ // This function just gets the numbers beside |box_number| on each row.
+ // E.g. 4: 4%3 = 1; so the numbers we want are 5 (4+1) and 6 (4+2).
+ function getAlignedNumbers(n) {
+ n = parseInt(n);
+ const mod_3 = n % 3;
+ if (mod_3 == 1) {
+ return [n + 1, n + 2];
+ } else if (mod_3 == 2) {
+ return [n - 1, n + 1];
+ }
+ return [n - 1, n - 2];
+ }
+ function stashResult(key, result) {
+ fetch(`/css/css-scroll-snap/snap-after-relayout` +
+ `/multiple-aligned-targets/stash.py?key=${key}`, {
+ method: "POST",
+ body: result
+ }).then(() => {
+ window.close();
+ });
+ }
+ function assert_equals(v1, v2) {
+ if (v1 != v2) {
+ throw new Error(`Expected equality of v1(${v1}) and v2(${v2}).`);
+ }
+ }
+ async function record() {
+ let key = (new URL(document.location)).searchParams.get("key");
+ try {
+ // Get the id of that targeted element.
+ const target_id = location.hash.substring(1);
+ const box_number = target_id.substring(3);
+
+ // Get the elements aligned with the targeted element.
+ const target = document.getElementById(target_id);
+ if (target == null) {
+ throw new Error("Null hash fragment target.");
+ }
+ let [aligned_number_1, aligned_number_2] =
+ getAlignedNumbers(box_number);
+ const aligned_box_1 = document.getElementById(`box${aligned_number_1}`);
+ const aligned_box_2 = document.getElementById(`box${aligned_number_2}`);
+
+ // Make sure all the boxes are equally aligned.
+ assert_equals(aligned_box_1.offsetTop, target.offsetTop);
+ assert_equals(aligned_box_1.offsetTop, aligned_box_2.offsetTop);
+
+ // Scroll to the aligned boxes if necessary.
+ if (scroller.scrollTop != target.offsetTop) {
+ const scrollend_promise = new Promise((res) => {
+ scroller.addEventListener(res);
+ });
+ scroller.scrollTop = target.offsetTop;
+ await scrollend_promise;
+ }
+
+ // Save target's original top and move it down by 100px;
+ const original_top = getComputedStyle(target).top;
+ target.style.top = `${target.offsetTop + 100}px`;
+
+ // Assert that scroller followed target as it moved down.
+ assert_equals(scroller.scrollTop, target.offsetTop);
+
+ // Cleanup: undo style change.
+ target.style.top = `${original_top}px`;
+
+ // Stash result.
+ stashResult(key, "PASS");
+ } catch (error) {
+ stashResult(key, error.message);
+ }
+ }
+
+ window.onload = () => {
+ window.requestAnimationFrame(function () {
+ window.requestAnimationFrame(record);
+ })
+ }
+ </script>
+</body>
+
+</html>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame.html
new file mode 100644
index 00000000000..6221b0e4b51
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-main-frame.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <title> CSS Scroll Snap Test: snap selection with targeted element</title>
+ <link rel="help" href="https://drafts.csswg.org/css-scroll-snap">
+ <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="/common/utils.js"></script>
+</head>
+
+<body onload="runTest()">
+ <script>
+ async function fetchResult(key) {
+ const url = `/css/css-scroll-snap/snap-after-relayout/` +
+ `multiple-aligned-targets/stash.py?key=${key}`;
+ // We may need multiple requests. Return a promise that will be resolved
+ // when an actual response is received.
+ return new Promise(async (resolve) => {
+ async function fetchResultInternal(url) {
+ const response = await fetch(url);
+ const text = await response.text();
+ if (text) {
+ resolve(text);
+ } else {
+ requestAnimationFrame(fetchResultInternal.bind(this, url));
+ }
+ }
+ fetchResultInternal(url);
+ });
+ }
+
+ function runTest() {
+ function test(n) {
+ return promise_test(async (t) => {
+ let key = token();
+
+ test_driver.bless("Open a URL with a text fragment directive", () => {
+ window.open(`prefer-targeted-element-main-frame-target.html` +
+ `?key=${key}#box${n}`, "_blank", "noopener");
+ });
+
+ assert_equals(await fetchResult(key), "PASS");
+ }, `targeted box${n} is selected snap target.`);
+ }
+
+ test(1);
+ test(2);
+ test(3);
+ test(4);
+ test(5);
+ test(6);
+ test(7);
+ test(8);
+ test(9);
+ }
+ </script>
+</body>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element.html
index 1f7f087180d..ceb9bd2ee06 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element.html
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element.html
@@ -31,7 +31,7 @@
// -------------------------
// within an iframe.
// This function just gets the numbers beside |box_number| on each row.
- // E.g. 4: 4%3 = 1; so the nmubers we want are 5 (4+1) and 6 (4+2).
+ // E.g. 4: 4%3 = 1; so the numbers we want are 5 (4+1) and 6 (4+2).
function getAlignedNumbers(n) {
const mod_3 = n % 3;
if (mod_3 == 1) {
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/resources/common.js b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/resources/common.js
index 2d74baae577..1fd88949b39 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/resources/common.js
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/resources/common.js
@@ -54,7 +54,7 @@ async function scrollToAlignedElements(scroller, elements_x, elements_y) {
// method should ensure that there is at least 100px of room to scroll in the
// desired axis.
// It assumes scroll-snap-align: start alignment.
-function verifySelectedSnapTarget(scroller, expected_snap_target, axis) {
+function verifySelectedSnapTarget(t, scroller, expected_snap_target, axis) {
// Save initial style.
const initial_left = getComputedStyle(expected_snap_target).left;
const initial_top = getComputedStyle(expected_snap_target).top;
@@ -63,19 +63,26 @@ function verifySelectedSnapTarget(scroller, expected_snap_target, axis) {
const initial_scroll_top = scroller.scrollTop;
const target_top = expected_snap_target.offsetTop + 100;
expected_snap_target.style.top = `${target_top}px`;
- assert_equals(scroller.scrollTop, expected_snap_target.offsetTop,
- `scroller followed ${expected_snap_target.id} in y axis after layout change`);
- assert_not_equals(scroller.scrollTop, initial_scroll_top,
- "scroller actually scrolled in y axis");
+ // Wrap these asserts in t.step (which catches exceptions) so that even if
+ // they fail, we'll get to undo the style changes we made, allowing
+ // subsequent tests to run with the expected style/layout.
+ t.step(() => {
+ assert_equals(scroller.scrollTop, expected_snap_target.offsetTop,
+ `scroller followed ${expected_snap_target.id} in y axis after layout change`);
+ assert_not_equals(scroller.scrollTop, initial_scroll_top,
+ "scroller actually scrolled in y axis");
+ });
} else {
// Move the expected snap target along the x axis.
const initial_scroll_left = scroller.scrollLeft;
const target_left = expected_snap_target.offsetLeft + 100;
expected_snap_target.style.left = `${target_left}px`;
- assert_equals(scroller.scrollLeft, expected_snap_target.offsetLeft,
- `scroller followed ${expected_snap_target.id} in x axis after layout change`);
- assert_not_equals(scroller.scrollLeft, initial_scroll_left,
- "scroller actually scrolled in x axis");
+ t.step(() => {
+ assert_equals(scroller.scrollLeft, expected_snap_target.offsetLeft,
+ `scroller followed ${expected_snap_target.id} in x axis after layout change`);
+ assert_not_equals(scroller.scrollLeft, initial_scroll_left,
+ "scroller actually scrolled in x axis");
+ });
}
// Undo style changes.
expected_snap_target.style.top = initial_top;
@@ -94,10 +101,10 @@ async function runScrollSnapSelectionVerificationTest(t, scroller,
aligned_elements_y);
t.step(() => {
if (axis == "y" || axis == "both") {
- verifySelectedSnapTarget(scroller, expected_target_y, axis);
+ verifySelectedSnapTarget(t, scroller, expected_target_y, axis);
}
if (axis == "x" || axis == "both") {
- verifySelectedSnapTarget(scroller, expected_target_x, axis);
+ verifySelectedSnapTarget(t, scroller, expected_target_x, axis);
}
});
// Restore initial scroll offsets.
@@ -133,7 +140,7 @@ async function runLayoutSnapSeletionVerificationTest(t, scroller, elements_to_al
}
shiftLayoutToAlignElements(elements_to_align, expected_target, axis);
- verifySelectedSnapTarget(scroller, expected_target, axis);
+ verifySelectedSnapTarget(t, scroller, expected_target, axis);
// Restore initial scroll offset and position states.
let num_elements = initial_tops.length;
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/stash.py b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/stash.py
new file mode 100644
index 00000000000..a70672ecf00
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/stash.py
@@ -0,0 +1,27 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+This file allows the different windows created by
+css/css-scroll-snap/snap-after-relayout/prefer-targeted-element-main-frame.html
+to store and retrieve data.
+
+prefer-targeted-element-main-frame.html (test file) opens a window to
+prefer-targeted-element-main-frame.html-target.html which writes some data
+which the test file will eventually read. This file handles the requests from
+both windows.
+"""
+
+import time
+
+def main(request, response):
+ key = request.GET.first(b"key")
+
+ if request.method == u"POST":
+ # Received result data from target page
+ request.server.stash.put(key, request.body, u'/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets')
+ return u"ok"
+ else:
+ # Request for result data from test page
+ value = request.server.stash.take(key, u'/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets')
+ return value
diff --git a/tests/wpt/tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-041.html b/tests/wpt/tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-041.html
new file mode 100644
index 00000000000..8fe724308a4
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-041.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://issues.chromium.org/issues/325928327">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width: 0px; height: 100px; display: grid; justify-items: center;">
+ <div style="height: 100%; background: green;">
+ <div style="height: 100%; aspect-ratio: 1;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-syntax/custom-property-rule-ambiguity.html b/tests/wpt/tests/css/css-syntax/custom-property-rule-ambiguity.html
index 50728bc94c2..b1adce7f9eb 100644
--- a/tests/wpt/tests/css/css-syntax/custom-property-rule-ambiguity.html
+++ b/tests/wpt/tests/css/css-syntax/custom-property-rule-ambiguity.html
@@ -50,7 +50,7 @@
assert_equals(x, 'hover { }\n .b { }');
let childRules = div.cssRules;
assert_equals(childRules.length, 1);
- assert_equals(childRules[0].selectorText, '.a');
+ assert_equals(childRules[0].selectorText, '& .a');
}, 'Nested rule that looks like a custom property declaration');
</script>
@@ -79,6 +79,6 @@
// So in other words, there should be no nested '.b.' child rule here.
let childRules = div.cssRules;
assert_equals(childRules.length, 1);
- assert_equals(childRules[0].selectorText, '.a');
+ assert_equals(childRules[0].selectorText, '& .a');
}, 'Nested rule that looks like an invalid custom property declaration');
</script>
diff --git a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-002.html b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-002.html
index 30e37908a22..6ee7d03d9d5 100644
--- a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-002.html
+++ b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-002.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
+<meta name="fuzzy" content="1;0-50">
<title>CSS Text level 3 Test: preserved trailing white space that hang in a textarea</title>
<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
diff --git a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-004.html b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-004.html
index 3d7aad05418..69d74051f7f 100644
--- a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-004.html
+++ b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-004.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
+<meta name="fuzzy" content="1;0-50">
<title>CSS Text level 3 Test: preserved trailing white space that hang in a textarea</title>
<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
diff --git a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-002.html b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-002.html
index 0422506b516..3da84ae5123 100644
--- a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-002.html
+++ b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-002.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
+<meta name="fuzzy" content="1;0-50">
<title>CSS Text level 3 Test: preserved trailing RTL white space that hang in a textarea</title>
<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
diff --git a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-004.html b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-004.html
index 7705d6dfb14..480969efc0d 100644
--- a/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-004.html
+++ b/tests/wpt/tests/css/css-text/white-space/trailing-space-and-text-alignment-rtl-004.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
+<meta name="fuzzy" content="1;0-50">
<title>CSS Text level 3 Test: preserved trailing RTL white space that hang in a textarea</title>
<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/accent-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/accent-color.html
index a02a8493be3..8cd0b986e86 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/accent-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/accent-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('accent-color', [
- { syntax: 'currentcolor' },
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ },
{
syntax: 'auto',
// computes to a <color>, which is not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/background-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/background-color.html
index d0a55d52d4d..f684a40fb62 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/background-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/background-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('background-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/border-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/border-color.html
index a38f7c7d806..3ce4ca94fce 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/border-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/border-color.html
@@ -15,7 +15,11 @@
for (const prefix of ['top', 'left', 'right', 'bottom']) {
runPropertyTests(`border-${prefix}-color`, [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/caret-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/caret-color.html
index b79beacf4be..5ea78a08d38 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/caret-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/caret-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('caret-color', [
- { syntax: 'currentcolor' },
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ },
{
syntax: 'auto',
// computes to a <color>, which is not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/color.html
index 58555ff8052..f56182977c5 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html
index ea27c9eaec6..3d35b856d71 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('column-rule-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/flood-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/flood-color.html
index 99ee9f05adf..bb3ddc9fc9a 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/flood-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/flood-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('flood-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/lighting-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/lighting-color.html
index 5d69f2fa4aa..aec16433723 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/lighting-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/lighting-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('lighting-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/outline-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/outline-color.html
index e779d709fe2..6bfec87a8c7 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/outline-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/outline-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('outline-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
// FIXME: browsers may or may not support 'invert' keyword.
]);
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/stop-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/stop-color.html
index 36b364bd4f3..83dcf0218a0 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/stop-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/stop-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('stop-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html
index f49a5739fdb..b76f82c3ea1 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('text-decoration-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html
index 8f106e6054f..8623d3dfb9b 100644
--- a/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html
+++ b/tests/wpt/tests/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html
@@ -14,7 +14,11 @@
'use strict';
runPropertyTests('text-emphasis-color', [
- { syntax: 'currentcolor' }
+ {
+ syntax: 'currentcolor',
+ // computes to a <color>, which is not supported in level 1
+ computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
+ }
]);
// <color>s are not supported in level 1
diff --git a/tests/wpt/tests/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html b/tests/wpt/tests/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html
new file mode 100644
index 00000000000..aeb98ffa425
--- /dev/null
+++ b/tests/wpt/tests/css/css-ui/parsing/canonical-order-outline-sub-properties-001.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html>
+
+ <meta charset="UTF-8">
+
+ <title>CSS Basic User Interface Test: canonical order of outline sub-properties</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+ <!--
+
+ Issue 7700: [css-ui-4] Align canonical order of outline sub-properties with border
+ https://github.com/w3c/csswg-drafts/issues/7700
+
+ Date created: February 22nd 2023
+
+ Date last modified: March 8th 2023
+
+ -->
+
+ <link rel="help" href="https://www.w3.org/TR/css-ui-4/#outline">
+
+ <meta name="flags" content="">
+ <meta content="This test verifies that the canonical order of outline sub-properties matches the order of border shorthand, which is 'line-width' || 'line-style' || 'color'. All possible orders are checked in this test. Shorthand 'outline' values involving 'outline-style: auto' and 'outline-style: none' are not tested." name="assert">
+
+ <script src="/resources/testharness.js"></script>
+
+ <script src="/resources/testharnessreport.js"></script>
+
+ <style>
+ div#target
+ {
+ outline: black solid medium;
+ }
+ </style>
+
+ <div id="target"></div>
+
+ <script>
+ function startTesting()
+ {
+
+ var targetElement = document.getElementById("target");
+
+ function verifyComputedStyle(property_name, specified_value, expected_value, description)
+ {
+
+ test(function()
+ {
+
+ targetElement.style.setProperty(property_name, specified_value);
+
+ assert_equals(getComputedStyle(targetElement)[property_name], expected_value);
+
+ }, description);
+ }
+
+/*
+
+All possible permutations are:
+
+outline-color
+
+outline-width
+
+outline-style
+
+outline-style outline-width
+
+outline-width outline-style
+
+outline-style outline-color
+
+outline-color outline-style
+
+outline-color outline-width
+
+outline-width outline-color
+
+outline-color outline-style outline-width
+
+outline-color outline-width outline-style
+
+outline-style outline-width outline-color
+
+outline-style outline-color outline-width
+
+outline-width outline-style outline-color
+
+outline-width outline-color outline-style
+
+Nota bene: outline values involving
+
+'outline-style: auto' (see https://www.w3.org/TR/css-ui-4/#typedef-outline-line-style )
+
+and
+
+'outline-style: none'
+
+are not tested.
+
+*/
+
+
+ verifyComputedStyle("outline", "blue", "0px none rgb(0, 0, 255)", "testing outline: blue");
+
+ verifyComputedStyle("outline", "invert", "0px none invert", "testing outline: invert");
+
+ verifyComputedStyle("outline", "4px", "0px none invert", "testing outline: 4px");
+
+ verifyComputedStyle("outline", "solid", "3px solid invert", "testing outline: solid");
+
+ verifyComputedStyle("outline", "solid 5px", "5px solid invert", "testing outline: solid 5px");
+
+ verifyComputedStyle("outline", "6px dashed", "6px dashed invert", "testing outline: 6px dashed");
+
+ verifyComputedStyle("outline", "dotted blue", "3px dotted rgb(0, 0, 255)", "testing outline: dotted blue");
+
+ verifyComputedStyle("outline", "dotted invert", "3px dotted invert", "testing outline: dotted invert");
+
+ verifyComputedStyle("outline", "blue solid", "3px solid rgb(0, 0, 255)", "testing outline: blue solid");
+
+ verifyComputedStyle("outline", "invert solid", "3px solid invert", "testing outline: invert solid");
+
+ verifyComputedStyle("outline", "black 4px", "0px none rgb(0, 0, 0)", "testing outline: black 4px");
+
+ verifyComputedStyle("outline", "invert 4px", "0px none invert", "testing outline: invert 4px");
+
+ verifyComputedStyle("outline", "5px blue", "0px none rgb(0, 0, 255)", "testing outline: 5px blue");
+
+ verifyComputedStyle("outline", "5px invert", "0px none invert", "testing outline: 5px invert");
+
+ verifyComputedStyle("outline", "black solid 6px", "6px solid rgb(0, 0, 0)", "testing outline: black solid 6px");
+
+ verifyComputedStyle("outline", "invert solid 6px", "6px solid invert", "testing outline: invert solid 6px");
+
+ verifyComputedStyle("outline", "blue 4px dotted", "4px dotted rgb(0, 0, 255)", "testing outline: blue 4px dotted");
+
+ verifyComputedStyle("outline", "invert 4px dotted", "4px dotted invert", "testing outline: invert 4px dotted");
+
+ verifyComputedStyle("outline", "dashed 5px black", "5px dashed rgb(0, 0, 0)", "testing outline: dashed 5px black");
+
+ verifyComputedStyle("outline", "dashed 5px invert", "5px dashed invert", "testing outline: dashed 5px invert");
+
+ verifyComputedStyle("outline", "solid blue 6px", "6px solid rgb(0, 0, 255)", "testing outline: solid blue 6px");
+
+ verifyComputedStyle("outline", "solid invert 6px", "6px solid invert", "testing outline: solid invert 6px");
+
+ verifyComputedStyle("outline", "4px dotted black", "4px dotted rgb(0, 0, 0)", "testing outline: 4px dotted black");
+
+ verifyComputedStyle("outline", "4px dotted invert", "4px dotted invert", "testing outline: 4px dotted invert");
+
+ verifyComputedStyle("outline", "5px blue dashed", "5px dashed rgb(0, 0, 255)", "testing outline: 5px blue dashed");
+
+ verifyComputedStyle("outline", "5px invert dashed", "5px dashed invert", "testing outline: 5px invert dashed");
+
+ }
+
+ startTesting();
+
+ </script>
diff --git a/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html b/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html
index 525c38805d6..04c44d0904e 100644
--- a/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html
+++ b/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-height-interpolation.tentative.html
@@ -24,6 +24,20 @@
<script>
test_interpolation({
property: 'height',
+ from: 'calc-size(auto, size)',
+ to: 'calc-size(auto, size * 2)',
+ }, [
+ { at: -0.25, expect: '75px' },
+ { at: 0, expect: '100px' },
+ { at: 0.25, expect: '125px' },
+ { at: 0.5, expect: '150px' },
+ { at: 0.75, expect: '175px' },
+ { at: 1, expect: '200px' },
+ { at: 1.25, expect: '225px' },
+ ]);
+
+ test_interpolation({
+ property: 'height',
from: neutralKeyframe,
to: 'calc-size(auto, size * 2)',
}, [
diff --git a/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html b/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html
index ff72ba6a0d8..b8b24935c37 100644
--- a/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html
+++ b/tests/wpt/tests/css/css-values/calc-size/animation/calc-size-width-interpolation.tentative.html
@@ -27,16 +27,30 @@
<script>
test_interpolation({
property: 'width',
+ from: 'calc-size(auto, size)',
+ to: 'calc-size(auto, size * 2)',
+ }, [
+ { at: -0.25, expect: '150px' },
+ { at: 0, expect: '200px' },
+ { at: 0.25, expect: '250px' },
+ { at: 0.5, expect: '300px' },
+ { at: 0.75, expect: '350px' },
+ { at: 1, expect: '400px' },
+ { at: 1.25, expect: '450px' },
+ ]);
+
+ test_interpolation({
+ property: 'width',
from: neutralKeyframe,
to: 'calc-size(auto, size * 2)',
}, [
{ at: -0.25, expect: '150px' },
{ at: 0, expect: '200px' },
- { at: 0.25, expect: 'calc-size(auto, size * 1.25)' },
- { at: 0.5, expect: 'calc-size(auto, size * 1.5)' },
- { at: 0.75, expect: 'calc-size(auto, size * 1.75)' },
- { at: 1, expect: 'calc-size(auto, size * 2)' },
- { at: 1.25, expect: 'calc-size(auto, size * 2.25)' },
+ { at: 0.25, expect: '250px' },
+ { at: 0.5, expect: '300px' },
+ { at: 0.75, expect: '350px' },
+ { at: 1, expect: '400px' },
+ { at: 1.25, expect: '450px' },
]);
test_interpolation({
diff --git a/tests/wpt/tests/css/css-values/calc-size/calc-size-height.tentative.html b/tests/wpt/tests/css/css-values/calc-size/calc-size-height.tentative.html
index 3c97ceb1587..61e59f83db4 100644
--- a/tests/wpt/tests/css/css-values/calc-size/calc-size-height.tentative.html
+++ b/tests/wpt/tests/css/css-values/calc-size/calc-size-height.tentative.html
@@ -39,6 +39,7 @@ let basic_tests = [
{ value: "calc-size(calc-size(min-content, size), size)", expected: "10px" },
{ value: "calc(12% + calc-size(any, 31%))", expected_auto: "10px", expected_definite: "43px" },
{ value: "calc-size(any, 31% + 12px)", expected_auto: "12px", expected_definite: "43px" },
+ { value: "calc-size(auto, size * 1.5)", expected: "15px" },
];
const container = document.getElementById("container");
const target = document.getElementById("target");
diff --git a/tests/wpt/tests/css/css-values/calc-size/calc-size-parsing.tentative.html b/tests/wpt/tests/css/css-values/calc-size/calc-size-parsing.tentative.html
index bc0048f826e..e51247c8726 100644
--- a/tests/wpt/tests/css/css-values/calc-size/calc-size-parsing.tentative.html
+++ b/tests/wpt/tests/css/css-values/calc-size/calc-size-parsing.tentative.html
@@ -7,6 +7,20 @@
<script>
+test_valid_value("width", "calc-size(auto, size)");
+test_valid_value("min-width", "calc-size(auto, size)");
+test_valid_value("height", "calc-size(auto, size)");
+test_valid_value("min-height", "calc-size(auto, size)");
+test_invalid_value("max-height", "calc-size(auto, size)");
+test_invalid_value("max-width", "calc-size(auto, size)");
+
+test_invalid_value("height", "calc-size(none, size)");
+test_invalid_value("width", "calc-size(none, size)");
+test_invalid_value("min-height", "calc-size(none, size)");
+test_invalid_value("min-width", "calc-size(none, size)");
+test_invalid_value("max-height", "calc-size(none, size)");
+test_invalid_value("max-width", "calc-size(none, size)");
+
test_valid_value("width", "calc-size(fit-content, size)");
test_valid_value("height", "calc-size(min-content, size * 2)");
test_valid_value("max-width", "calc-size(max-content, size / 2)");
diff --git a/tests/wpt/tests/css/css-values/calc-size/calc-size-width.tentative.html b/tests/wpt/tests/css/css-values/calc-size/calc-size-width.tentative.html
index c8000f345f7..96b2719c5d1 100644
--- a/tests/wpt/tests/css/css-values/calc-size/calc-size-width.tentative.html
+++ b/tests/wpt/tests/css/css-values/calc-size/calc-size-width.tentative.html
@@ -43,6 +43,8 @@ document.fonts.ready.then(()=> {
{ value: "calc-size(calc-size(2in, 30px), 15em)", expected: "300px" },
{ value: "calc-size(calc-size(min-content, 30px), 15em)", expected: "300px" },
{ value: "calc-size(calc-size(min-content, size), size)", expected: "400px" },
+ { value: "calc-size(auto, size)", expected: "500px" },
+ { value: "calc-size(auto, size * 0.6 + 23px)", expected: "323px" },
];
const container = document.getElementById("container");
const target = document.getElementById("target");
diff --git a/tests/wpt/tests/css/css-values/round-function.html b/tests/wpt/tests/css/css-values/round-function.html
index 29ec60ea445..338ecaed904 100644
--- a/tests/wpt/tests/css/css-values/round-function.html
+++ b/tests/wpt/tests/css/css-values/round-function.html
@@ -200,6 +200,16 @@ test_math_used("calc(0 - round(to-zero, 13, 10))", "-10", { type: "integer" });
test_math_used("calc(0 - round(to-zero, -13, 10))", "10", { type: "integer" });
test_math_used("calc(0 - round(to-zero, -18, 10))", "10", { type: "integer" });
+// Test omission of <step> argument
+test_math_used("round(1.5)", "2", { type: "integer" });
+test_math_used("round(up, 1.5)", "2", { type: "integer" });
+test_math_used("round(down, 1.5)", "1", { type: "integer" });
+test_math_used("round(to-zero, 1.5)", "1", { type: "integer" });
+test_math_used("round(-1.5)", "-1", { type: "integer" });
+test_math_used("round(up, -1.5)", "-1", { type: "integer" });
+test_math_used("round(down, -1.5)", "-2", { type: "integer" });
+test_math_used("round(to-zero, -1.5)", "-1", { type: "integer" });
+
// Extreme cases:
// 0 step is NaN
diff --git a/tests/wpt/tests/css/css-values/round-mod-rem-invalid.html b/tests/wpt/tests/css/css-values/round-mod-rem-invalid.html
index 01268091908..5e22012743e 100644
--- a/tests/wpt/tests/css/css-values/round-mod-rem-invalid.html
+++ b/tests/wpt/tests/css/css-values/round-mod-rem-invalid.html
@@ -31,7 +31,6 @@ test_invalid_number('round(nearest, 1 2)');
test_invalid_number('round(1, nearest, 12)');
test_invalid_number('round(1, nearest)');
test_invalid_number('round(nearest, 1, nearest)');
-test_invalid_number('round(nearest, 1)');
test_invalid_number('round(1, , 2)');
test_invalid_number('mod()');
test_invalid_number('mod( )');
@@ -97,6 +96,7 @@ test_invalid_number('rem(1, 0Hz)');
test_invalid_number('rem(1, 0dpi)');
test_invalid_number('rem(1, 0fr)');
+test_invalid_length_percentage('round(0px)');
test_invalid_length_percentage('round(0px, 0s)');
test_invalid_length_percentage('round(0px, 0deg)');
test_invalid_length_percentage('round(0px, 0Hz)');
diff --git a/tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-ltr-001-ref.html b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-ltr-001-ref.html
new file mode 100644
index 00000000000..a8cc95cdda1
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-ltr-001-ref.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Viewport units and scrollbars</title>
+<meta charset="UTF-8">
+<link rel="author" title="fantasai" href="http://fantasai.inkedblade.net/contact">
+
+
+<!-- This reference assumes that a <div> scrollbar looks identical to the root scrollbar. -->
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+html {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+body {
+ width: 100%;
+ height: 100%;
+ background: white;
+ overflow: auto;
+}
+div {
+ width: 200%;
+ height: 200%;
+ border-right: solid blue 4px;
+ border-bottom: solid blue 4px;
+}
+</style>
+
+<div></div>
diff --git a/tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-vhw-001.html b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-vhw-001.html
new file mode 100644
index 00000000000..04b959fa49a
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-auto-vhw-001.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Viewport units and scrollbars</title>
+<meta charset="UTF-8">
+<meta name="assert" content="100vw is reduced by scrollbar width when the scrollbars are unconditional">
+<link rel="author" title="fantasai" href="http://fantasai.inkedblade.net/contact">
+<link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">
+
+<link rel="match" href="viewport-units-scrollbars-auto-ltr-001-ref.html">
+
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+ width: 100vw;
+ height: 100vh;
+ box-sizing: border-box;
+}
+html {
+ background: red;
+ overflow: auto;
+ width: 200%;
+ height: 200%;
+}
+body {
+ background: white;
+ border-right: solid blue 4px;
+ border-bottom: solid blue 4px;
+}
+</style>
diff --git a/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-blank-001-ref.html b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-blank-001-ref.html
new file mode 100644
index 00000000000..f0718d0e8d2
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-blank-001-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Viewport units and scrollbars</title>
+<meta charset="UTF-8">
+<link rel="author" title="fantasai" href="http://fantasai.inkedblade.net/contact">
+
+<style>
+html {
+ overflow: scroll;
+}
+body {
+ background: white;
+}
+</style>
diff --git a/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-ltr-001-ref.html b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-ltr-001-ref.html
new file mode 100644
index 00000000000..fe9a454525c
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-ltr-001-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Viewport units and scrollbars</title>
+<meta charset="UTF-8">
+<link rel="author" title="fantasai" href="http://fantasai.inkedblade.net/contact">
+
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100%;
+ box-sizing: border-box;
+}
+html {
+ overflow: scroll;
+}
+body {
+ background: white;
+ border-right: solid green 4px;
+ border-bottom: solid green 4px;
+}
+</style>
diff --git a/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-vhw-001.html b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-vhw-001.html
new file mode 100644
index 00000000000..c44edc2da80
--- /dev/null
+++ b/tests/wpt/tests/css/css-values/viewport-units-scrollbars-scroll-vhw-001.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>CSS Values and Units Test: Viewport units and scrollbars</title>
+<meta charset="UTF-8">
+<meta name="assert" content="100vw is reduced by scrollbar width when the scrollbars are unconditional">
+<link rel="author" title="fantasai" href="http://fantasai.inkedblade.net/contact">
+<link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">
+
+<link rel="match" href="viewport-units-scrollbars-scroll-ltr-001-ref.html">
+
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+ width: 100vw;
+ height: 100vh;
+ box-sizing: border-box;
+}
+html {
+ background: red;
+ overflow: scroll;
+}
+body {
+ background: white;
+ border-right: solid green 4px;
+ border-bottom: solid green 4px;
+}
+</style>
+
diff --git a/tests/wpt/tests/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html b/tests/wpt/tests/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html
new file mode 100644
index 00000000000..40c9a0d0c2e
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/web-animations-api-parse-pseudo-argument.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<title>View transitions with web-animation API: full parsing of argument</title>
+<link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/">
+<link rel="match" href="web-animations-api-ref.html">
+<meta name="fuzzy" content="web-animations-api-ref.html:0-2;0-500">
+<meta name="variant" content="?first-pseudo=::view-transition-group( first)">
+<meta name="variant" content="?first-pseudo=::view-transition-group(first)">
+<meta name="variant" content="?first-pseudo=::view-transition-group( first">
+<meta name="variant" content="?first-pseudo=::view-transition-group( first )">
+<meta name="variant" content="?first-pseudo=::view-transition-group(first )">
+<meta name="variant" content="?first-pseudo=::view-transition-group(first">
+<script src="/common/reftest-wait.js">
+</script>
+<style>
+ #first {
+ background: blue;
+ width: 100px;
+ height: 100px;
+ contain: paint;
+ }
+
+ #second {
+ background: green;
+ width: 100px;
+ height: 100px;
+ contain: paint;
+ }
+
+ /* Unset all animations since the test drives it using WA-API */
+ html::view-transition-group(*),
+ html::view-transition-image-pair(*),
+ html::view-transition-new(*),
+ html::view-transition-old(*) {
+ animation: unset;
+ }
+
+ html::view-transition-group(root) {
+ opacity: 0;
+ }
+</style>
+<div id=first></div>
+<div id=second></div>
+<script>
+ failIfNot(document.startViewTransition, "Missing document.startViewTransition");
+ const firstPseudo = new URL(location.href).searchParams.get("first-pseudo") ?? "::view-transition-group(first)";
+
+ function setAnimation() {
+ document.documentElement.animate({ transform: ['translate(100px)', 'translate(100px)'] }, { duration: 10000, pseudoElement: firstPseudo });
+ document.documentElement.animate({ transform: ['translate(150px)', 'translate(150px)'] }, { duration: 10000, pseudoElement: '::view-transition-group(second)' });
+ requestAnimationFrame(takeScreenshot);
+ }
+
+ async function runTest() {
+ first.style.viewTransitionName = "first";
+ document.startViewTransition(() => {
+ first.style.viewTransitionName = "";
+ second.style.viewTransitionName = "second";
+ requestAnimationFrame(setAnimation);
+ });
+ }
+ onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
+</script>
diff --git a/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri-ref.html b/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri-ref.html
new file mode 100644
index 00000000000..2696593a45a
--- /dev/null
+++ b/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri-ref.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<title>CSS Test Reference</title>
+<style>
+:root { background-color: lime }
+</style>
diff --git a/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html b/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html
new file mode 100644
index 00000000000..22f298a34eb
--- /dev/null
+++ b/tests/wpt/tests/css/cssom/CSSStyleSheet-constructable-insertRule-base-uri.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSSStyleSheet.insertRule() on a constructable stylesheet uses the right base uri, even if replace/Sync() hasn't been called yet</title>
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="help" href="https://drafts.csswg.org/cssom/">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1880718">
+<link rel="match" href="CSSStyleSheet-constructable-insertRule-base-uri-ref.html">
+<script>
+ const sheet = new CSSStyleSheet();
+ sheet.insertRule(`
+ :root {
+ background-image: url("../../images/green.png");
+ }
+ `);
+ document.adoptedStyleSheets.push(sheet);
+</script>
diff --git a/tests/wpt/tests/css/cssom/cssstyledeclaration-csstext-setter.window.js b/tests/wpt/tests/css/cssom/cssstyledeclaration-csstext-setter.window.js
new file mode 100644
index 00000000000..4474358ed0f
--- /dev/null
+++ b/tests/wpt/tests/css/cssom/cssstyledeclaration-csstext-setter.window.js
@@ -0,0 +1,64 @@
+// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext
+
+[
+ document.body,
+ document.createElement("cool-beans")
+].forEach(element => {
+ test(t => {
+ t.add_cleanup(() => element.removeAttribute("style"));
+
+ element.style.background = "red";
+ assert_equals(element.getAttribute("style"), "background: red;");
+
+ element.style.cssText = "background:red";
+ assert_equals(element.getAttribute("style"), "background: red;");
+ }, `cssText setter should set style attribute even when there are no style changes (${element.localName})`);
+
+ test(t => {
+ t.add_cleanup(() => element.removeAttribute("style"));
+
+ element.setAttribute("style", "background: red");
+ assert_equals(element.getAttribute("style"), "background: red");
+
+ element.style.cssText = "background:red";
+ assert_equals(element.getAttribute("style"), "background: red;");
+ }, `cssText setter should set style attribute even when there are no style changes, part 2 (${element.localName})`);
+
+ test(t => {
+ t.add_cleanup(() => element.removeAttribute("style"));
+
+ element.setAttribute("style", "background: red");
+ assert_equals(element.getAttribute("style"), "background: red");
+
+ element.style.cssText = "background:red "; // trailing space
+ assert_equals(element.getAttribute("style"), "background: red;");
+ }, `cssText setter should set style attribute even when there are no style changes, part 3 (${element.localName})`);
+
+ test(t => {
+ t.add_cleanup(() => element.removeAttribute("style"));
+
+ element.setAttribute("style", "background: red");
+ assert_equals(element.getAttribute("style"), "background: red");
+
+ element.style.cssText = "background:red;";
+ assert_equals(element.getAttribute("style"), "background: red;");
+ }, `cssText setter should set style attribute even when there are no style changes, part 4 (${element.localName})`);
+});
+
+test(t => {
+ const style = document.createElement("style");
+ t.add_cleanup(() => {
+ document.body.removeAttribute("style");
+ style.remove();
+ });
+ style.textContent = `[style="background: red;"] { background:white !important; }`;
+ document.body.appendChild(style);
+
+ document.body.setAttribute("style", "background:red");
+ assert_true(document.body.matches("[style=\"background:red\"]"));
+ assert_equals(getComputedStyle(document.body).backgroundColor, "rgb(255, 0, 0)");
+
+ document.body.style.cssText = "background:red";
+ assert_equals(getComputedStyle(document.body).backgroundColor, "rgb(255, 255, 255)");
+ assert_true(document.body.matches("[style=\"background: red;\"]"));
+}, `cssText setter and selector invalidation`);
diff --git a/tests/wpt/tests/css/cssom/getComputedStyle-pseudo-with-argument.html b/tests/wpt/tests/css/cssom/getComputedStyle-pseudo-with-argument.html
index 452f2bb2c63..bc23ad180bb 100644
--- a/tests/wpt/tests/css/cssom/getComputedStyle-pseudo-with-argument.html
+++ b/tests/wpt/tests/css/cssom/getComputedStyle-pseudo-with-argument.html
@@ -32,7 +32,15 @@
"::highlight($)",
"::highlight (name)",
"::highlight(name)a",
+ ":highlight(name)",
"::view-transition-group(*)",
+ "::view-transition-image-pair(*)",
+ "::view-transition-old(*)",
+ "::view-transition-new(*)",
+ ":view-transition-group(name)",
+ ":view-transition-image-pair(name)",
+ ":view-transition-old(name)",
+ ":view-transition-new(name)",
].forEach(nonParsablePseudoIdentifier => {
test(() => {
const li = document.querySelector('li');
diff --git a/tests/wpt/tests/css/selectors/link-sharing-crash.html b/tests/wpt/tests/css/selectors/link-sharing-crash.html
new file mode 100644
index 00000000000..3bcce92d49d
--- /dev/null
+++ b/tests/wpt/tests/css/selectors/link-sharing-crash.html
@@ -0,0 +1,11 @@
+<link rel="help" href="https://bugzil.la/1883796">
+<script>
+window.addEventListener("load", () => {
+ let a = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
+ document.documentElement.appendChild(a)
+ document.documentElement.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "a"))
+ document.documentElement.scrollTo(-1132, 16)
+ document.documentElement.animate({"webkitTextStrokeWidth": ["197792984.89ex", "thin"]}, 2814)
+ a.setAttribute("href", "x")
+})
+</script>
diff --git a/tests/wpt/tests/css/selectors/pseudo-where-crash.html b/tests/wpt/tests/css/selectors/pseudo-where-crash.html
new file mode 100644
index 00000000000..ad683ac8b9e
--- /dev/null
+++ b/tests/wpt/tests/css/selectors/pseudo-where-crash.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<style>
+::before:where(.foo) {
+ color: red;
+}
+</style>
+<div class=foo></div>
diff --git a/tests/wpt/tests/document-picture-in-picture/hide-return-to-opener-button-manual.https.html b/tests/wpt/tests/document-picture-in-picture/hide-return-to-opener-button-manual.https.html
new file mode 100644
index 00000000000..17cd6657dda
--- /dev/null
+++ b/tests/wpt/tests/document-picture-in-picture/hide-return-to-opener-button-manual.https.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Test that using documentPictureInPicture's disallowReturnToOpener
+ parameter hides the return to opener button</title>
+<body>
+ <p>
+ This tests that a document picture-in-picture window opened with the `disallowReturnToOpener`
+ parameter set to `true` does not display a button to return to the opener.
+ <ol>
+ <li>Click on the "Open document picture-in-picture window" button below.</li>
+ <li>Check that it does not display that button.</li>
+ </ol>
+ </p>
+ <input type="button" id="btnOpenPip" value="Open document picture-in-picture window" />
+<script>
+const btnOpenPip = document.getElementById('btnOpenPip');
+btnOpenPip.addEventListener('click', async () => {
+ const pipWindow = await documentPictureInPicture.requestWindow({ disallowReturnToOpener: true });
+ pipWindow.document.body.innerText = 'This document picture-in-picture window should not display a button to return to the opener';
+});
+</script>
+</body>
diff --git a/tests/wpt/tests/dom/events/scrolling/scroll_support.js b/tests/wpt/tests/dom/events/scrolling/scroll_support.js
index a0aefe636ab..e536b7d7488 100644
--- a/tests/wpt/tests/dom/events/scrolling/scroll_support.js
+++ b/tests/wpt/tests/dom/events/scrolling/scroll_support.js
@@ -33,8 +33,7 @@ async function waitForScrollReset(test, scroller, x = 0, y = 0) {
} else {
const eventTarget =
scroller == document.scrollingElement ? document : scroller;
- scroller.scrollTop = y;
- scroller.scrollLeft = x;
+ scroller.scrollTo(x, y);
waitForScrollendEventNoTimeout(eventTarget).then(resolve);
}
});
diff --git a/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html
index 71081b49fec..39c43933236 100644
--- a/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html
+++ b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html
@@ -12,26 +12,29 @@ test(() => {
const s2 = document.createElement("script");
// This script, which is ultimately a *child* of the
- // already-connected-but-empty `s1` script, runs first. This is because when
- // the DocumentFragment `df` containing this script (`s2`) is appended to
- // `s1`, we do not immediately execute `s1`, because of this condition: [1].
- // It specifies that when a "node or document fragment is inserted into the
- // script", we only run the "prepare the script algorithm" for that script
- // "after any script elements inserted at that time".
+ // already-connected-but-empty `s1` script, runs second, after `s1` runs. See
+ // the example in
+ // http://html.spec.whatwg.org/C/#script-processing-model:children-changed-steps
+ // for more information.
//
- // So upon insertion of `s2`, its insertion conditions are met and it is
- // prepared and run first. During its execution, it mutates `s1`, adding more
- // text to it. This condition still does not trigger the immediate execution
- // of `s1`, because `s2`'s insertion is not complete yet.
+ // HISTORICAL CONTEXT: There used to be a condition in the HTML standard that
+ // said an "outer" script must be "prepared" when a node gets inserted into
+ // the script. BUT it also stipulated that if the insertion consists of any
+ // "inner" (nested, essentially) script elements, then this "outer" script
+ // must prepare/execute after any of those "inner" newly-inserted scripts
+ // themselves get prepared.
//
- // Once `s2` is finished being inserted, the condition to prepare and execute
- // `s1` is met, and it is processed accordingly, which includes the execution
- // of the text that `s2` added to `s1`.
- //
- // [1]: https://html.spec.whatwg.org/C#script-processing-model:prepare-the-script-element-4
+ // This changed in https://github.com/whatwg/html/pull/10188.
s2.textContent = `
happened.push("s2");
+
+ // This text never executes in the outer script, because by the time this
+ // gets appended, the outer script has "already started" [1], so it does not
+ // get re-prepared/executed a second time.
+ //
+ // [1]: https://html.spec.whatwg.org/C#already-started
s1.appendChild(new Text("happened.push('s1ran');"));
+
happened.push("s2ran");
`;
@@ -41,8 +44,8 @@ test(() => {
assert_array_equals(happened, []);
s1.appendChild(df);
- assert_array_equals(happened, ["s2", "s2ran", "s1", "s1ran"]);
-}, "An outer script does not execute until its inner `<script>` children are " +
- "finished being inserted into it. The outer script's execution considers " +
- "any script text that inner scripts added to the outer one.");
+ assert_array_equals(happened, ["s1", "s2", "s2ran"]);
+}, "An outer script whose preparation/execution gets triggered by the " +
+ "insertion of a 'nested'/'inner' script, executes *before* the inner " +
+ "script executes");
</script>
diff --git a/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-with-mutation-observer-takeRecords.html b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-with-mutation-observer-takeRecords.html
new file mode 100644
index 00000000000..33598e64082
--- /dev/null
+++ b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-with-mutation-observer-takeRecords.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Node.appendChild: inserted script should be able to take own mutation record</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<body>
+<main></main>
+<script>
+
+test(() => {
+ window.mutationObserver = new MutationObserver(() => {});
+ window.mutationObserver.observe(document.querySelector("main"), {childList: true});
+ const script = document.createElement("script");
+ script.textContent = `
+ window.mutationRecords = window.mutationObserver.takeRecords();
+ `;
+ document.querySelector("main").appendChild(script);
+ assert_equals(window.mutationRecords.length, 1);
+ assert_array_equals(window.mutationRecords[0].addedNodes, [script]);
+}, "An inserted script should be able to observe its own mutation record with takeRecords");
+</script>
diff --git a/tests/wpt/tests/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js b/tests/wpt/tests/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js
new file mode 100644
index 00000000000..ed5bfbaa601
--- /dev/null
+++ b/tests/wpt/tests/dom/nodes/insertion-removing-steps/script-does-not-run-on-child-removal.window.js
@@ -0,0 +1,33 @@
+// See:
+// - https://github.com/whatwg/dom/issues/808
+// - https://github.com/whatwg/dom/pull/1261
+// - https://github.com/whatwg/html/pull/10188
+// - https://source.chromium.org/chromium/chromium/src/+/604e798ec6ee30f44d57a5c4a44ce3dab3a871ed
+// - https://github.com/whatwg/dom/pull/732#pullrequestreview-328249015
+// - https://github.com/whatwg/html/pull/4354#issuecomment-476038918
+test(() => {
+ window.script_did_run = false;
+
+ const script = document.createElement('script');
+ // This prevents execution on insertion.
+ script.type = '0';
+ script.textContent = `script_did_run = true;`;
+ document.body.append(script);
+ assert_false(script_did_run,
+ 'Appending script with invalid type does not trigger execution');
+
+ const div = document.createElement('div');
+ script.append(div);
+ assert_false(script_did_run,
+ 'Appending a child to an invalid-type script does not trigger execution');
+
+ // This enables, but does not trigger, execution.
+ script.type = '';
+ assert_false(script_did_run,
+ 'Unsetting script type does not trigger execution');
+
+ div.remove();
+ assert_false(script_did_run,
+ 'Removing child from valid script that has not already run, does not ' +
+ 'trigger execution');
+}, "Script execution is never triggered on child removals");
diff --git a/tests/wpt/tests/dom/observable/tentative/observable-from.any.js b/tests/wpt/tests/dom/observable/tentative/observable-from.any.js
new file mode 100644
index 00000000000..80408ddced7
--- /dev/null
+++ b/tests/wpt/tests/dom/observable/tentative/observable-from.any.js
@@ -0,0 +1,354 @@
+// Because we test that the global error handler is called at various times.
+setup({allow_uncaught_exception: true});
+
+test(() => {
+ assert_equals(typeof Observable.from, "function",
+ "Observable.from() is a function");
+}, "from(): Observable.from() is a function");
+
+test(() => {
+ assert_throws_js(TypeError, () => Observable.from(10),
+ "Number cannot convert to an Observable");
+ assert_throws_js(TypeError, () => Observable.from(true),
+ "Boolean cannot convert to an Observable");
+ assert_throws_js(TypeError, () => Observable.from("String"),
+ "String cannot convert to an Observable");
+ assert_throws_js(TypeError, () => Observable.from({a: 10}),
+ "Object cannot convert to an Observable");
+ assert_throws_js(TypeError, () => Observable.from(Symbol.iterator),
+ "Bare Symbol.iterator cannot convert to an Observable");
+ assert_throws_js(TypeError, () => Observable.from(Promise),
+ "Promise constructor cannot convert to an Observable");
+}, "from(): Failed conversions");
+
+test(() => {
+ const target = new EventTarget();
+ const observable = target.on('custom');
+ const from_observable = Observable.from(observable);
+ assert_equals(observable, from_observable);
+}, "from(): Given an observable, it returns that exact observable");
+
+test(() => {
+ let completeCalled = false;
+ const results = [];
+ const array = [1, 2, 3, 'a', new Date(), 15, [12]];
+ const observable = Observable.from(array);
+ observable.subscribe({
+ next: v => results.push(v),
+ error: e => assert_unreached('error is not called'),
+ complete: () => completeCalled = true
+ });
+
+ assert_array_equals(results, array);
+ assert_true(completeCalled);
+}, "from(): Given an array");
+
+test(() => {
+ const iterable = {
+ [Symbol.iterator]() {
+ let n = 0;
+ return {
+ next() {
+ n++;
+ if (n <= 3) {
+ return { value: n, done: false };
+ }
+ return { value: undefined, done: true };
+ },
+ };
+ },
+ };
+
+ const observable = Observable.from(iterable);
+
+ assert_true(observable instanceof Observable, "Observable.from() returns an Observable");
+
+ const results = [];
+
+ observable.subscribe({
+ next: (value) => results.push(value),
+ error: () => assert_unreached("should not error"),
+ complete: () => results.push("complete"),
+ });
+
+ assert_array_equals(results, [1, 2, 3, "complete"],
+ "Subscription pushes iterable values out to Observable");
+
+ // A second subscription should restart iteration.
+ observable.subscribe({
+ next: (value) => results.push(value),
+ error: () => assert_unreached("should not error"),
+ complete: () => results.push("complete2"),
+ });
+
+ assert_array_equals(results, [1, 2, 3, "complete", 1, 2, 3, "complete2"],
+ "Subscribing again causes another fresh iteration on an un-exhausted iterable");
+}, "from(): Iterable converts to Observable");
+
+// The result of the @@iterator method of the converted object is called:
+// 1. Once on conversion (to test that the value is an iterable).
+// 2. Once on subscription, to re-pull the iterator implementation from the
+// raw JS object that the Observable owns once synchronous iteration is
+// about to begin.
+test(() => {
+ let numTimesSymbolIteratorCalled = 0;
+ let numTimesNextCalled = 0;
+
+ const iterable = {
+ [Symbol.iterator]() {
+ numTimesSymbolIteratorCalled++;
+ return {
+ next() {
+ numTimesNextCalled++;
+ return {value: undefined, done: true};
+ }
+ };
+ }
+ };
+
+ const observable = Observable.from(iterable);
+
+ assert_equals(numTimesSymbolIteratorCalled, 1,
+ "Observable.from(iterable) invokes the @@iterator method getter once");
+ assert_equals(numTimesNextCalled, 0,
+ "Iterator next() is not called until subscription");
+
+ // Override iterable's `[Symbol.iterator]` protocol with an error-throwing
+ // function. We assert that on subscription, this method (the new `@@iterator`
+ // implementation), is called because only the raw JS object gets stored in
+ // the Observable that results in conversion. This raw value must get
+ // re-converted to an iterable once iteration is about to start.
+ const customError = new Error('@@iterator override error');
+ iterable[Symbol.iterator] = () => {
+ throw customError;
+ };
+
+ let thrownError = null;
+ observable.subscribe({
+ error: e => thrownError = e,
+ });
+
+ assert_equals(thrownError, customError,
+ "Error thrown from next() is passed to the error() handler");
+
+ assert_equals(numTimesSymbolIteratorCalled, 1,
+ "Subscription re-invokes @@iterator method, which now is a different " +
+ "method that does *not* increment our assertion value");
+ assert_equals(numTimesNextCalled, 0, "Iterator next() is never called");
+}, "from(): [Symbol.iterator] side-effects (one observable)");
+
+// Similar to the above test, but with more Observables!
+test(() => {
+ let numTimesSymbolIteratorCalled = 0;
+ let numTimesNextCalled = 0;
+
+ const iterable = {
+ [Symbol.iterator]() {
+ numTimesSymbolIteratorCalled++;
+ return {
+ next() {
+ numTimesNextCalled++;
+ return {value: undefined, done: true};
+ }
+ };
+ }
+ };
+
+ const obs1 = Observable.from(iterable);
+ const obs2 = Observable.from(iterable);
+ const obs3 = Observable.from(iterable);
+ const obs4 = Observable.from(obs3);
+
+ assert_equals(numTimesSymbolIteratorCalled, 3, "Observable.from(iterable) invokes the iterator method getter once");
+ assert_equals(numTimesNextCalled, 0, "Iterator next() is not called until subscription");
+
+ iterable[Symbol.iterator] = () => {
+ throw new Error('Symbol.iterator override error');
+ };
+
+ let errorCount = 0;
+
+ const observer = {error: e => errorCount++};
+ obs1.subscribe(observer);
+ obs2.subscribe(observer);
+ obs3.subscribe(observer);
+ obs4.subscribe(observer);
+ assert_equals(errorCount, 4,
+ "Error-throwing `@@iterator` implementation is called once per " +
+ "subscription");
+
+ assert_equals(numTimesSymbolIteratorCalled, 3,
+ "Subscription re-invokes the iterator method getter once");
+ assert_equals(numTimesNextCalled, 0, "Iterator next() is never called");
+}, "from(): [Symbol.iterator] side-effects (many observables)");
+
+test(() => {
+ const customError = new Error('@@iterator next() error');
+ const iterable = {
+ [Symbol.iterator]() {
+ return {
+ next() {
+ throw customError;
+ }
+ };
+ }
+ };
+
+ let thrownError = null;
+ Observable.from(iterable).subscribe({
+ error: e => thrownError = e,
+ });
+
+ assert_equals(thrownError, customError,
+ "Error thrown from next() is passed to the error() handler");
+}, "from(): [Symbol.iterator] next() throws error");
+
+promise_test(async () => {
+ const promise = Promise.resolve('value');
+ const observable = Observable.from(promise);
+
+ assert_true(observable instanceof Observable, "Converts to Observable");
+
+ const results = [];
+
+ observable.subscribe({
+ next: (value) => results.push(value),
+ error: () => assert_unreached("error() is not called"),
+ complete: () => results.push("complete()"),
+ });
+
+ assert_array_equals(results, [], "Observable does not emit synchronously");
+
+ await promise;
+
+ assert_array_equals(results, ["value", "complete()"], "Observable emits and completes after Promise resolves");
+}, "from(): Converts Promise to Observable");
+
+promise_test(async t => {
+ let unhandledRejectionHandlerCalled = false;
+ const unhandledRejectionHandler = () => {
+ unhandledRejectionHandlerCalled = true;
+ };
+
+ self.addEventListener("unhandledrejection", unhandledRejectionHandler);
+ t.add_cleanup(() => self.removeEventListener("unhandledrejection", unhandledRejectionHandler));
+
+ const promise = Promise.reject("reason");
+ const observable = Observable.from(promise);
+
+ assert_true(observable instanceof Observable, "Converts to Observable");
+
+ const results = [];
+
+ observable.subscribe({
+ next: (value) => assert_unreached("next() not called"),
+ error: (error) => results.push(error),
+ complete: () => assert_unreached("complete() not called"),
+ });
+
+ assert_array_equals(results, [], "Observable does not emit synchronously");
+
+ let catchBlockEntered = false;
+ try {
+ await promise;
+ } catch {
+ catchBlockEntered = true;
+ }
+
+ assert_true(catchBlockEntered, "Catch block entered");
+ assert_false(unhandledRejectionHandlerCalled, "No unhandledrejection event");
+ assert_array_equals(results, ["reason"],
+ "Observable emits error() after Promise rejects");
+}, "from(): Converts rejected Promise to Observable. No " +
+ "`unhandledrejection` event when error is handled by subscription");
+
+promise_test(async t => {
+ let unhandledRejectionHandlerCalled = false;
+ const unhandledRejectionHandler = () => {
+ unhandledRejectionHandlerCalled = true;
+ };
+
+ self.addEventListener("unhandledrejection", unhandledRejectionHandler);
+ t.add_cleanup(() => self.removeEventListener("unhandledrejection", unhandledRejectionHandler));
+
+ let errorReported = null;
+ self.addEventListener("error", e => errorReported = e, { once: true });
+
+ let catchBlockEntered = false;
+ try {
+ const promise = Promise.reject("custom reason");
+ const observable = Observable.from(promise);
+
+ observable.subscribe();
+ await promise;
+ } catch {
+ catchBlockEntered = true;
+ }
+
+ assert_true(catchBlockEntered, "Catch block entered");
+ assert_false(unhandledRejectionHandlerCalled,
+ "No unhandledrejection event, because error got reported to global");
+ assert_not_equals(errorReported, null, "Error was reported to the global");
+
+ assert_true(errorReported.message.includes("custom reason"),
+ "Error message matches");
+ assert_equals(errorReported.lineno, 0, "Error lineno is 0");
+ assert_equals(errorReported.colno, 0, "Error lineno is 0");
+ assert_equals(errorReported.error, "custom reason",
+ "Error object is equivalent");
+}, "from(): Rejections not handled by subscription are reported to the " +
+ "global, and still not sent as an unhandledrejection event");
+
+test(() => {
+ const results = [];
+ const observable = new Observable(subscriber => {
+ subscriber.next('from Observable');
+ subscriber.complete();
+ });
+
+ observable[Symbol.iterator] = () => {
+ results.push('Symbol.iterator() called');
+ return {
+ next() {
+ return {value: 'from @@iterator', done: true};
+ }
+ };
+ };
+
+ Observable.from(observable).subscribe({
+ next: v => results.push(v),
+ complete: () => results.push("complete"),
+ });
+
+ assert_array_equals(results, ["from Observable", "complete"]);
+}, "from(): Observable that implements @@iterator protocol gets converted " +
+ "as an Observable, not iterator");
+
+test(() => {
+ const results = [];
+ const promise = new Promise(resolve => {
+ resolve('from Promise');
+ });
+
+ promise[Symbol.iterator] = () => {
+ let done = false;
+ return {
+ next() {
+ if (!done) {
+ done = true;
+ return {value: 'from @@iterator', done: false};
+ } else {
+ return {value: undefined, done: true};
+ }
+ }
+ };
+ };
+
+ Observable.from(promise).subscribe({
+ next: v => results.push(v),
+ complete: () => results.push("complete"),
+ });
+
+ assert_array_equals(results, ["from @@iterator", "complete"]);
+}, "from(): Promise that implements @@iterator protocol gets converted as " +
+ "an iterable, not Promise");
diff --git a/tests/wpt/tests/dom/ranges/Range-in-shadow-after-the-shadow-removed.html b/tests/wpt/tests/dom/ranges/Range-in-shadow-after-the-shadow-removed.html
new file mode 100644
index 00000000000..54ea8aabeab
--- /dev/null
+++ b/tests/wpt/tests/dom/ranges/Range-in-shadow-after-the-shadow-removed.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="variant" content="?mode=closed">
+<meta name="variant" content="?mode=open">
+<title>Range in shadow after removing the shadow</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+addEventListener("load", () => {
+ const mode = (new URLSearchParams(document.location.search)).get("mode");
+ test(() => {
+ const host = document.createElement("div");
+ host.id = "host";
+ const root = host.attachShadow({mode});
+ root.innerHTML = '<div id="in-shadow">ABC</div>';
+ document.body.appendChild(host);
+ const range = document.createRange();
+ range.setStart(root.firstChild, 1);
+ host.remove();
+ assert_equals(range.startContainer, root.firstChild, "startContainer should not be changed");
+ assert_equals(range.startOffset, 1, "startOffset should not be changed");
+ }, "Range in shadow should stay in the shadow after the host is removed");
+
+ test(() => {
+ const wrapper = document.createElement("div");
+ wrapper.id = "wrapper";
+ const host = document.createElement("div");
+ host.id = "host";
+ const root = host.attachShadow({mode});
+ root.innerHTML = '<div id="in-shadow">ABC</div>';
+ wrapper.appendChild(host);
+ document.body.appendChild(wrapper);
+ const range = document.createRange();
+ range.setStart(root.firstChild, 1);
+ wrapper.remove();
+ assert_equals(range.startContainer, root.firstChild, "startContainer should not be changed");
+ assert_equals(range.startOffset, 1, "startOffset should not be changed");
+ }, "Range in shadow should stay in the shadow after the host parent is removed");
+}, {once: true});
+</script>
+</head>
+<body></body>
+</html>
diff --git a/tests/wpt/tests/fenced-frame/content-shared-storage-get.https.html b/tests/wpt/tests/fenced-frame/content-shared-storage-get.https.html
new file mode 100644
index 00000000000..8afa8de5416
--- /dev/null
+++ b/tests/wpt/tests/fenced-frame/content-shared-storage-get.https.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<title>Test sharedStorage.get() in a fenced frame with network revocation.</title>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/utils.js"></script>
+
+<body>
+<script>
+
+promise_setup(async () => {
+ // Set sharedStorage value for HTTPS_ORIGIN
+ await sharedStorage.set('test', 'apple');
+
+ // Set sharedStorage value for HTTPS_REMOTE_ORIGIN.
+ let init_iframe = await attachIFrameContext(
+ {origin: get_host_info().HTTPS_REMOTE_ORIGIN});
+ await init_iframe.execute(async () => {
+ await sharedStorage.set('test', 'banana');
+ });
+});
+
+promise_test(async (t) => {
+ const fencedframe = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN});
+
+ await fencedframe.execute(async () => {
+ await window.fence.disableUntrustedNetwork();
+ let get_result = await sharedStorage.get('test');
+ assert_equals(get_result, 'apple');
+ });
+}, 'Test sharedStorage.get() succeeds in a fenced frame with network revocation.');
+
+promise_test(async (t) => {
+ const fencedframe = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN});
+
+ await fencedframe.execute(async () => {
+ try {
+ await sharedStorage.get('test');
+ assert_unreached('Calling get() without revoking network should throw.');
+ } catch (e) {
+ assert_equals(e.name, 'OperationError');
+ assert_equals(e.message, 'sharedStorage.get() is not allowed in a ' +
+ 'fenced frame until network access for it and all descendent frames ' +
+ 'has been revoked with window.fence.disableUntrustedNetwork()');
+ }
+ });
+}, 'Test that sharedStorage.get() in a fenced frame rejects when network is not revoked.');
+
+promise_test(async (t) => {
+ const fencedframe = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_REMOTE_ORIGIN});
+
+ await fencedframe.execute(async () => {
+ await window.fence.disableUntrustedNetwork();
+ let get_result = await sharedStorage.get('test');
+ assert_equals(get_result, 'banana');
+ });
+}, 'Test that sharedStorage.get() can only fetch keys for its own origin when network is revoked.');
+
+promise_test(async (t) => {
+ // First, try get() in a top-level document.
+ try {
+ await sharedStorage.get('test');
+ assert_unreached('Call to get() in top-level document should throw.');
+ } catch (e) {
+ assert_equals(e.name, 'OperationError');
+ assert_equals(e.message, 'Cannot call get() outside of a fenced frame.')
+ }
+
+ const samesite_iframe = await attachIFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN});
+
+ // Then, try get() in an iframe.
+ await samesite_iframe.execute(async () => {
+ try {
+ await sharedStorage.get('test');
+ assert_unreached('Call to get() outside a fenced frame should throw.');
+ } catch (e) {
+ assert_equals(e.name, 'OperationError');
+ assert_equals(e.message, 'Cannot call get() outside of a fenced frame.')
+ }
+ });
+}, 'Test that sharedStorage.get() rejects outside of a fenced frame.');
+
+promise_test(async (t) => {
+ const fencedframe = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN});
+
+ let get_result = await fencedframe.execute(async () => {
+ const nested_frame = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN});
+
+ // Note that the parent fenced frame has not disabled network at this point.
+ return nested_frame.execute(async () => {
+ await window.fence.disableUntrustedNetwork();
+ return sharedStorage.get('test');
+ });
+ });
+
+ assert_equals(get_result, 'apple');
+}, 'Test that sharedStorage.get() succeeds in a nested fenced frame with network disabled, ' +
+ 'even if the parent fenced frame has not disabled network yet.');
+
+promise_test(async (t) => {
+ const fencedframe = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN});
+
+ await fencedframe.execute(async () => {
+ const nested_frame = await attachFencedFrameContext(
+ {origin: get_host_info().HTTPS_ORIGIN})
+
+ // Note that we do *not* await, because we need to operate in the top frame
+ // while the nested frame still hasn't disabled network access.
+ // TODO(crbug.com/324440086): disableUntrustedNetwork() should not resolve
+ // until all child frames also disable untrusted network. However, that
+ // behavior is yet to be implemented. We should add a timeout check here
+ // once the async behavior of disableUntrustedNetwork() is correct.
+ let disable_network_promise = window.fence.disableUntrustedNetwork();
+
+ try {
+ await sharedStorage.get('test');
+ assert_unreached('sharedStorage.get() is not allowed in a fenced frame ' +
+ 'until network access for it and all descendent frames has been ' +
+ 'revoked with window.fence.disableUntrustedNetwork()');
+ } catch (e) {
+ assert_equals(e.name, 'OperationError');
+ assert_equals(e.message, 'sharedStorage.get() is not allowed in a ' +
+ 'fenced frame until network access for it and all descendent frames ' +
+ 'has been revoked with window.fence.disableUntrustedNetwork()');
+ }
+ });
+}, 'sharedStorage.get() fails in a top-level fenced frame with network disabled, ' +
+ 'because a nested fenced frame has not disabled network yet.');
+
+</script>
+</body>
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html
index 44479cf0deb..4b68c32378f 100644
--- a/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html
@@ -6,8 +6,9 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
<script>
-const expectedUrl = "http://{{hosts[][www]}}:{{ports[http][0]}}/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html?new";
+const expectedUrl = get_host_info().HTTPS_REMOTE_ORIGIN + "/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-cross-origin.sub.html?new";
const params = new URLSearchParams(location.search);
// The page the popup navigates to.
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html
new file mode 100644
index 00000000000..8ecf920b510
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-push-with-cross-origin-redirect.sub.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<title>pageswap navigationactivation for push navigations with a same-origin final url with cross-origin redirects</title>
+<link rel="help" href="https://html.spec.whatwg.org/">
+<link rel="author" href="mailto:khushalsagar@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script>
+const params = new URLSearchParams(location.search);
+// The page the popup navigates to.
+const is_new_page = params.has('new');
+// The initial page in the popup.
+const is_popup_page = params.has('popup');
+// The test page itself.
+const is_test_page = !is_popup_page && !is_new_page;
+
+const channel = new BroadcastChannel("testchannel");
+
+if (is_test_page) {
+ const expectedUrl = location.href + "?new";
+ const expectedEvents = ["pageswap", "pagehide", "pagereveal", "activation"];
+
+ promise_test(async t => {
+ let popup;
+ onload = () => {
+ window.events = [];
+ popup = window.open("?popup");
+ };
+
+ await new Promise(resolve => {
+ channel.addEventListener(
+ "message", t.step_func(async (e) => {
+ if (e.data === "nav") {
+ assert_array_equals(window.events, expectedEvents, 'incorrect event order');
+ popup.close();
+ resolve();
+ }
+ }));
+ });
+ }, `pageswap on navigation with same-origin redirect`);
+} else if (is_popup_page) {
+ onload = () => {
+ requestAnimationFrame(() => requestAnimationFrame(() => {
+ let newUrl = get_host_info().HTTPS_REMOTE_ORIGIN + "/common/redirect.py?location=" + location.href.split('?')[0] + "?new";
+ location.href = newUrl
+ }));
+
+ onpageswap = (e) => {
+ window.opener.events.push("pageswap");
+ if (e.viewTransition != null)
+ window.opener.events.push("transition");
+ if (e.activation != null)
+ window.opener.events.push("activation");
+ };
+
+ onpagehide = () => {
+ window.opener.events.push("pagehide");
+ };
+ };
+} else {
+ assert_true(is_new_page);
+ onpageshow = () => {
+ window.opener.events.push("pagereveal");
+ if (navigation.activation.from != null)
+ window.opener.events.push("activation");
+ channel.postMessage("nav");
+ }
+}
+</script>
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html
new file mode 100644
index 00000000000..c6ced62057f
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-replace-with-cross-origin-redirect.sub.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<title>pageswap navigationactivation for replace navigations with a same-origin final url with cross-origin redirects</title>
+<link rel="help" href="https://html.spec.whatwg.org/">
+<link rel="author" href="mailto:khushalsagar@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script>
+const params = new URLSearchParams(location.search);
+// The page the popup navigates to.
+const is_new_page = params.has('new');
+// The initial page in the popup.
+const is_popup_page = params.has('popup');
+// The test page itself.
+const is_test_page = !is_popup_page && !is_new_page;
+
+const channel = new BroadcastChannel("testchannel");
+
+if (is_test_page) {
+ const expectedUrl = location.href + "?new";
+ const expectedEvents = ["pageswap", "pagehide", "pagereveal", "activation"];
+
+ promise_test(async t => {
+ let popup;
+ onload = () => {
+ window.events = [];
+ popup = window.open("?popup");
+ };
+
+ await new Promise(resolve => {
+ channel.addEventListener(
+ "message", t.step_func(async (e) => {
+ if (e.data === "nav") {
+ assert_array_equals(window.events, expectedEvents, 'incorrect event order');
+ popup.close();
+ resolve();
+ }
+ }));
+ });
+ }, `pageswap on navigation with same-origin redirect`);
+} else if (is_popup_page) {
+ onload = () => {
+ requestAnimationFrame(() => requestAnimationFrame(() => {
+ let newUrl = get_host_info().HTTPS_REMOTE_ORIGIN + "/common/redirect.py?location=" + location.href.split('?')[0] + "?new";
+ location.replace(newUrl);
+ }));
+
+ onpageswap = (e) => {
+ window.opener.events.push("pageswap");
+ if (e.viewTransition != null)
+ window.opener.events.push("transition");
+ if (e.activation != null)
+ window.opener.events.push("activation");
+ };
+
+ onpagehide = () => {
+ window.opener.events.push("pagehide");
+ };
+ };
+} else {
+ assert_true(is_new_page);
+ onpageshow = () => {
+ window.opener.events.push("pagereveal");
+ if (navigation.activation.from != null)
+ window.opener.events.push("activation");
+ channel.postMessage("nav");
+ }
+}
+</script>
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html
new file mode 100644
index 00000000000..55438307212
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-traverse-navigation-cross-origin-redirect-no-bfcache.https.sub.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<title>pageswap navigationactivation for traverse navigation when original navigation has cross-origin redirect</title>
+<link rel="help" href="https://html.spec.whatwg.org/">
+<link rel="author" href="mailto:khushalsagar@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/common.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/html/browsers/browsing-the-web/back-forward-cache/resources/disable_bfcache.js"></script>
+<style></style>
+<script>
+const channel = new BroadcastChannel("testchannel");
+
+const params = new URLSearchParams(location.search);
+const is_initial_page_first_navigation = params.has('popup') && navigation.entries().length == 1;
+const is_new_page = params.has('new');
+const is_test_page = !params.has('popup') && !params.has('new');
+
+// The test page which opens a popup for the navigation sequence.
+if (is_test_page) {
+ const expectedUrl = location.href.split('?')[0] + "?popup";
+ const expectedEvents = ["pageswap", expectedUrl, "traverse","from", "pagehide"];
+
+ promise_test(async t => {
+ let popup;
+ onload = () => {
+ window.events = [];
+ popup = window.open("?popup");
+ };
+
+ await new Promise(resolve => {
+ channel.addEventListener(
+ "message", t.step_func(async (e) => {
+ if (e.data === "nav") {
+ assert_array_equals(window.events, expectedEvents, 'incorrect event order');
+ popup.close();
+ resolve();
+ }
+ }));
+ });
+ }, `pageswap on traverse navigation from script`);
+} else if (is_initial_page_first_navigation) {
+ // The popup page which the user navigates back to.
+ onload = async () => {
+ await disableBFCache();
+ requestAnimationFrame(() => requestAnimationFrame(() => {
+ let newUrl = get_host_info().HTTPS_REMOTE_ORIGIN + "/common/redirect.py?location=" + location.href.split('?')[0] + "?new";
+ location.href = newUrl
+ }));
+ };
+
+ onpageshow = (e) => {
+ assert_false(e.persisted, 'the test should run without BFCache');
+ }
+} else if (is_new_page) {
+ onload = () => {
+ requestAnimationFrame(() => requestAnimationFrame(() => {
+ navigation.back();
+ }));
+ };
+
+ onpageswap = (e) => {
+ window.opener.events.push("pageswap");
+ if (e.viewTransition != null)
+ window.opener.events.push("transition");
+ window.opener.events.push(e.activation.entry.url);
+ window.opener.events.push(e.activation.navigationType);
+ if (e.activation.from == navigation.currentEntry)
+ window.opener.events.push("from");
+ };
+
+ onpagehide = () => {
+ window.opener.events.push("pagehide");
+ channel.postMessage("nav");
+ };
+}
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html b/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html
deleted file mode 100644
index a76c49d2d47..00000000000
--- a/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: 2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
-<body class="show_output">
-
-<h1>2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https</h1>
-<p class="desc">getTextureFormat() returns RGBA16F for a float16 context</p>
-
-
-<p class="output">Actual output:</p>
-<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-
-<ul id="d"></ul>
-<script>
-var t = async_test("getTextureFormat() returns RGBA16F for a float16 context");
-_addTest(function(canvas, ctx) {
-
- _assertSame(ctx.getTextureFormat(), "rgba16float", "ctx.getTextureFormat()", "\"rgba16float\"");
-
-}, {colorSpace: "display-p3", pixelFormat: "float16"});
-</script>
-
diff --git a/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html b/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html
deleted file mode 100644
index ef576133742..00000000000
--- a/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: 2d.webgpuaccess.getTextureFormat.rgba8.tentative.https</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
-<body class="show_output">
-
-<h1>2d.webgpuaccess.getTextureFormat.rgba8.tentative.https</h1>
-<p class="desc">getTextureFormat() returns RGBA8 or BGRA8 for a typical context</p>
-
-
-<p class="output">Actual output:</p>
-<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-
-<ul id="d"></ul>
-<script>
-var t = async_test("getTextureFormat() returns RGBA8 or BGRA8 for a typical context");
-_addTest(function(canvas, ctx) {
-
- assert_regexp_match(ctx.getTextureFormat(), /^rgba8unorm|bgra8unorm$/);
-
-});
-</script>
-
diff --git a/tests/wpt/tests/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html b/tests/wpt/tests/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html
new file mode 100644
index 00000000000..1baf7847dea
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas-worker-font-load-crash.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html class="test-wait reftest-wait">
+<script>
+ let url = URL.createObjectURL(new Blob([`
+ let font = new FontFace('Ahem', 'url(/fonts/Ahem.ttf)');
+ self.fonts.add(font);
+ let canvas = new OffscreenCanvas(100, 100);
+ let ctx = canvas.getContext('2d');
+ ctx.font = "10px Ahem";
+ ctx.fillText('Hello', 0, 10);
+ postMessage('done');
+ `], { type: "application/javascript" }));
+ var worker = new Worker(url);
+ worker.onmessage = function() {
+ worker.terminate();
+ URL.revokeObjectURL(url);
+ document.documentElement.className = "";
+ };
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html
deleted file mode 100644
index cd478e666fd..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
-<h1>2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https</h1>
-<p class="desc">getTextureFormat() returns RGBA16F for a float16 context</p>
-
-
-<script>
-var t = async_test("getTextureFormat() returns RGBA16F for a float16 context");
-var t_pass = t.done.bind(t);
-var t_fail = t.step_func(function(reason) {
- throw reason;
-});
-t.step(function() {
-
- var canvas = new OffscreenCanvas(100, 50);
- var ctx = canvas.getContext('2d', {colorSpace: "display-p3", pixelFormat: "float16"});
-
- _assertSame(ctx.getTextureFormat(), "rgba16float", "ctx.getTextureFormat()", "\"rgba16float\"");
- t.done();
-
-});
-</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js
deleted file mode 100644
index f24b8aa8504..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https
-// Description:getTextureFormat() returns RGBA16F for a float16 context
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("getTextureFormat() returns RGBA16F for a float16 context");
-var t_pass = t.done.bind(t);
-var t_fail = t.step_func(function(reason) {
- throw reason;
-});
-t.step(function() {
-
- var canvas = new OffscreenCanvas(100, 50);
- var ctx = canvas.getContext('2d', {colorSpace: "display-p3", pixelFormat: "float16"});
-
- _assertSame(ctx.getTextureFormat(), "rgba16float", "ctx.getTextureFormat()", "\"rgba16float\"");
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html
deleted file mode 100644
index d77a2984087..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.webgpuaccess.getTextureFormat.rgba8.tentative.https</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
-<h1>2d.webgpuaccess.getTextureFormat.rgba8.tentative.https</h1>
-<p class="desc">getTextureFormat() returns RGBA8 or BGRA8 for a typical context</p>
-
-
-<script>
-var t = async_test("getTextureFormat() returns RGBA8 or BGRA8 for a typical context");
-var t_pass = t.done.bind(t);
-var t_fail = t.step_func(function(reason) {
- throw reason;
-});
-t.step(function() {
-
- var canvas = new OffscreenCanvas(100, 50);
- var ctx = canvas.getContext('2d');
-
- assert_regexp_match(ctx.getTextureFormat(), /^rgba8unorm|bgra8unorm$/);
- t.done();
-
-});
-</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js
deleted file mode 100644
index 4d4137e2d3c..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.webgpuaccess.getTextureFormat.rgba8.tentative.https
-// Description:getTextureFormat() returns RGBA8 or BGRA8 for a typical context
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("getTextureFormat() returns RGBA8 or BGRA8 for a typical context");
-var t_pass = t.done.bind(t);
-var t_fail = t.step_func(function(reason) {
- throw reason;
-});
-t.step(function() {
-
- var canvas = new OffscreenCanvas(100, 50);
- var ctx = canvas.getContext('2d');
-
- assert_regexp_match(ctx.getTextureFormat(), /^rgba8unorm|bgra8unorm$/);
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml b/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml
index 79b5fb61f28..1e0caff5b98 100644
--- a/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml
+++ b/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml
@@ -24,4 +24,3 @@
2d.video: "video"
2d.canvas.host: "canvas-host"
2d.canvas.context: "canvas-context"
-2d.webgpuaccess: "webgpu-access"
diff --git a/tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml b/tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml
index 3f59fd8eead..6e4b3f42b2b 100644
--- a/tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml
+++ b/tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml
@@ -20,4 +20,3 @@
2d.voidreturn: "conformance-requirements"
2d.canvas.host: "canvas-host"
2d.canvas.context: "canvas-context"
-2d.webgpuaccess: "webgpu-access"
diff --git a/tests/wpt/tests/html/canvas/tools/name2dir.yaml b/tests/wpt/tests/html/canvas/tools/name2dir.yaml
index b0e541289f5..ae69c153780 100644
--- a/tests/wpt/tests/html/canvas/tools/name2dir.yaml
+++ b/tests/wpt/tests/html/canvas/tools/name2dir.yaml
@@ -23,4 +23,3 @@
2d.video: "video"
2d.canvas.host: "canvas-host"
2d.canvas.context: "canvas-context"
-2d.webgpuaccess: "webgpu-access"
diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/webgpu-access.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/webgpu-access.yaml
deleted file mode 100644
index fcf38d1f3d0..00000000000
--- a/tests/wpt/tests/html/canvas/tools/yaml-new/webgpu-access.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-- name: 2d.webgpuaccess.getTextureFormat.rgba8.tentative.https
- desc: getTextureFormat() returns RGBA8 or BGRA8 for a typical context
- code: |
- @assert ctx.getTextureFormat() =~ /^rgba8unorm|bgra8unorm$/;
-
-- name: 2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https
- desc: getTextureFormat() returns RGBA16F for a float16 context
- attributes: '{colorSpace: "display-p3", pixelFormat: "float16"}'
- code: |
- @assert ctx.getTextureFormat() === "rgba16float";
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html b/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html
new file mode 100644
index 00000000000..61610c2fd6c
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles-no-h1-in-section.tentative.html
@@ -0,0 +1,147 @@
+<!doctype html>
+<title>default styles for h1..h6, hgroup, article, aside, nav, section (no h1 in section UA styles)</title>
+<meta name="viewport" content="width=device-width">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/rendering/support/test-ua-stylesheet.js"></script>
+<link rel="help" href="https://github.com/whatwg/html/issues/7867">
+<style>
+/* Specify this bogus namespace, so the rules in this stylesheet only apply to the `fakeClone`d elements in #refs, not the HTML elements in #tests. */
+@namespace url(urn:not-html);
+
+article, aside, h1, h2, h3, h4, h5, h6, hgroup, nav, section {
+ display: block;
+}
+
+h1 { margin-block: 0.67em; font-size: 2.00em; font-weight: bold; }
+h2 { margin-block: 0.83em; font-size: 1.50em; font-weight: bold; }
+h3 { margin-block: 1.00em; font-size: 1.17em; font-weight: bold; }
+h4 { margin-block: 1.33em; font-size: 1.00em; font-weight: bold; }
+h5 { margin-block: 1.67em; font-size: 0.83em; font-weight: bold; }
+h6 { margin-block: 2.33em; font-size: 0.67em; font-weight: bold; }
+
+</style>
+
+<div id="log"></div>
+
+<div id="tests">
+ <h1></h1>
+ <h2></h2>
+ <h3></h3>
+ <h4></h4>
+ <h5></h5>
+ <h6></h6>
+ <hgroup></hgroup>
+ <article></article>
+ <aside></aside>
+ <nav></nav>
+ <section></section>
+ <article data-skip>
+ <h1></h1>
+ <article data-skip>
+ <h1></h1>
+ <article data-skip>
+ <h1></h1>
+ <article data-skip>
+ <h1></h1>
+ <article data-skip>
+ <h1></h1>
+ <hgroup data-skip>
+ <h1></h1>
+ <h2></h2>
+ <h3></h3>
+ <h4></h4>
+ <h5></h5>
+ </hgroup>
+ </article>
+ </article>
+ </article>
+ </article>
+ </article>
+ <aside data-skip>
+ <h1></h1>
+ <aside data-skip>
+ <h1></h1>
+ <aside data-skip>
+ <h1></h1>
+ <aside data-skip>
+ <h1></h1>
+ <aside data-skip>
+ <h1></h1>
+ <hgroup data-skip>
+ <h1></h1>
+ <h2></h2>
+ <h3></h3>
+ <h4></h4>
+ <h5></h5>
+ </hgroup>
+ </aside>
+ </aside>
+ </aside>
+ </aside>
+ </aside>
+ <nav data-skip>
+ <h1></h1>
+ <nav data-skip>
+ <h1></h1>
+ <nav data-skip>
+ <h1></h1>
+ <nav data-skip>
+ <h1></h1>
+ <nav data-skip>
+ <h1></h1>
+ <hgroup data-skip>
+ <h1></h1>
+ <h2></h2>
+ <h3></h3>
+ <h4></h4>
+ <h5></h5>
+ </hgroup>
+ </nav>
+ </nav>
+ </nav>
+ </nav>
+ </nav>
+ <section data-skip>
+ <h1></h1>
+ <section data-skip>
+ <h1></h1>
+ <section data-skip>
+ <h1></h1>
+ <section data-skip>
+ <h1></h1>
+ <section data-skip>
+ <h1></h1>
+ <hgroup data-skip>
+ <h1></h1>
+ <h2></h2>
+ <h3></h3>
+ <h4></h4>
+ <h5></h5>
+ </hgroup>
+ </section>
+ </section>
+ </section>
+ </section>
+ </section>
+</div>
+
+<div id="refs"></div>
+
+<script>
+ const props = [
+ 'display',
+ 'margin-top',
+ 'margin-right',
+ 'margin-bottom',
+ 'margin-left',
+ 'padding-top',
+ 'padding-right',
+ 'padding-bottom',
+ 'padding-left',
+ 'font-size',
+ 'font-weight',
+ ];
+ runUAStyleTests(props);
+
+</script>
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles.html b/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles.html
index 63e6a83e883..be531adfcf5 100644
--- a/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles.html
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/sections-and-headings/headings-styles.html
@@ -12,18 +12,18 @@ article, aside, h1, h2, h3, h4, h5, h6, hgroup, nav, section {
display: block;
}
-h1 { margin-block-start: 0.67em; margin-block-end: 0.67em; font-size: 2.00em; font-weight: bold; }
-h2 { margin-block-start: 0.83em; margin-block-end: 0.83em; font-size: 1.50em; font-weight: bold; }
-h3 { margin-block-start: 1.00em; margin-block-end: 1.00em; font-size: 1.17em; font-weight: bold; }
-h4 { margin-block-start: 1.33em; margin-block-end: 1.33em; font-size: 1.00em; font-weight: bold; }
-h5 { margin-block-start: 1.67em; margin-block-end: 1.67em; font-size: 0.83em; font-weight: bold; }
-h6 { margin-block-start: 2.33em; margin-block-end: 2.33em; font-size: 0.67em; font-weight: bold; }
+h1 { margin-block: 0.67em; font-size: 2.00em; font-weight: bold; }
+h2 { margin-block: 0.83em; font-size: 1.50em; font-weight: bold; }
+h3 { margin-block: 1.00em; font-size: 1.17em; font-weight: bold; }
+h4 { margin-block: 1.33em; font-size: 1.00em; font-weight: bold; }
+h5 { margin-block: 1.67em; font-size: 0.83em; font-weight: bold; }
+h6 { margin-block: 2.33em; font-size: 0.67em; font-weight: bold; }
-:is(article, aside, nav, section) h1 { margin-block-start: 0.83em; margin-block-end: 0.83em; font-size: 1.50em; }
-:is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block-start: 1.00em; margin-block-end: 1.00em; font-size: 1.17em; }
-:is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block-start: 1.33em; margin-block-end: 1.33em; font-size: 1.00em; }
-:is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block-start: 1.67em; margin-block-end: 1.67em; font-size: 0.83em; }
-:is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block-start: 2.33em; margin-block-end: 2.33em; font-size: 0.67em; }
+:is(article, aside, nav, section) h1 { margin-block: 0.83em; font-size: 1.50em; }
+:is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block: 1.00em; font-size: 1.17em; }
+:is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block: 1.33em; font-size: 1.00em; }
+:is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block: 1.67em; font-size: 0.83em; }
+:is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) :is(article, aside, nav, section) h1 { margin-block: 2.33em; font-size: 0.67em; }
</style>
diff --git a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html
index 83813f90209..089b0d9300b 100644
--- a/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html
+++ b/tests/wpt/tests/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html
@@ -1,5 +1,6 @@
<!DOCTYPE HTML>
<title>fieldset overflow</title>
+<meta name="fuzzy" content="1;0-50">
<link rel=match href=fieldset-overflow-ref.html>
<style>
fieldset, legend {
diff --git a/tests/wpt/tests/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime-move-within-document.html b/tests/wpt/tests/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime-move-within-document.html
new file mode 100644
index 00000000000..22b579d7209
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/media-elements/offsets-into-the-media-resource/currentTime-move-within-document.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<title>playback should not reset when moving within a document</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/media.js"></script>
+<div id="log"></div>
+<video autoplay muted hidden></video>
+<div id="elsewhere"></div>
+<script>
+async_test(t => {
+ const v = document.querySelector('video');
+ v.src = getVideoURI('/media/movie_300');
+ v.currentTime = 0;
+ v.onplaying = t.step_func(() => {
+ v.currentTime = 10;
+ t.step_timeout(() => {
+ assert_greater_than_equal(v.currentTime, 10);
+ document.getElementById('elsewhere').appendChild(v);
+ assert_false(v.paused, 'paused after moving');
+ assert_greater_than_equal(v.currentTime, 10);
+ t.step_timeout(() => {
+ assert_greater_than_equal(v.currentTime, 10);
+ t.done();
+ }, 0);
+ }, 0);
+
+ });
+ v.play();
+ v.onpause = t.step_func(function() { assert_unreached(); });
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.sub.js
index e38334f4148..bec8f6a64af 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.sub.js
@@ -5,7 +5,7 @@
// // META: script=/resources/testdriver.js
// // META: script=/resources/testdriver-vendor.js
// // META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// // META: script=./resources/sandbox-top-navigation-helper.js
+// // META: script=./resources/sandbox-top-navigation-helper.sub.js
// Helper file that provides various functions to test top-level navigation
// with various frame and sandbox flag configurations.
@@ -27,8 +27,7 @@ async function createNestedIframe(parent, origin, frame_sandbox, header_sandbox)
origin: origin,
scripts: [
'/resources/testdriver.js',
- '/resources/testdriver-driver.js',
- '/resources/testdriver-vendor.js'
+ '/resources/testdriver-vendor.js',
],
headers: headers,
}, iframe_attributes);
@@ -39,8 +38,7 @@ async function navigateFrameTo(frame, origin) {
origin: origin,
scripts: [
'/resources/testdriver.js',
- '/resources/testdriver-driver.js',
- '/resources/testdriver-vendor.js'
+ '/resources/testdriver-vendor.js',
],
});
}
@@ -49,7 +47,8 @@ async function attemptTopNavigation(iframe, should_succeed) {
let did_succeed;
try {
await iframe.executeScript(() => {
- window.top.location.href = "https://google.com";
+ window.top.location.href =
+ 'http://{{hosts[alt][www2]}}:{{ports[http][0]}}';
});
did_succeed = true;
} catch (e) {
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js
index fa71972222b..95d53e1fe32 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js
@@ -5,7 +5,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// META: script=./resources/sandbox-top-navigation-helper.js
+// META: script=./resources/sandbox-top-navigation-helper.sub.js
'use strict';
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js
index 53faa99a408..1d5ea93830a 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child.tentative.sub.window.js
@@ -5,7 +5,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// META: script=./resources/sandbox-top-navigation-helper.js
+// META: script=./resources/sandbox-top-navigation-helper.sub.js
'use strict';
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js
index fcd53e0780e..26db4eeaca5 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js
@@ -6,7 +6,7 @@
// META: script=/resources/testdriver-actions.js
// META: script=/resources/testdriver-vendor.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// META: script=./resources/sandbox-top-navigation-helper.js
+// META: script=./resources/sandbox-top-navigation-helper.sub.js
'use strict';
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js
index a5cda9b0b98..2ea0ba606e4 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-escalate-privileges.tentative.sub.window.js
@@ -5,7 +5,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// META: script=./resources/sandbox-top-navigation-helper.js
+// META: script=./resources/sandbox-top-navigation-helper.sub.js
'use strict';
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js
index a07148f8029..326c1dd54a5 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js
@@ -5,7 +5,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// META: script=./resources/sandbox-top-navigation-helper.js
+// META: script=./resources/sandbox-top-navigation-helper.sub.js
'use strict';
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js
index 9e0ea57a99e..5079c8ad144 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js
@@ -6,7 +6,7 @@
// META: script=/resources/testdriver-actions.js
// META: script=/resources/testdriver-vendor.js
// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
-// META: script=./resources/sandbox-top-navigation-helper.js
+// META: script=./resources/sandbox-top-navigation-helper.sub.js
'use strict';
diff --git a/tests/wpt/tests/html/semantics/permission-element/bounded-css-properties.html b/tests/wpt/tests/html/semantics/permission-element/bounded-css-properties.html
new file mode 100644
index 00000000000..98c3d70e98b
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/permission-element/bounded-css-properties.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<!--The permission element should have some limits for specific properties:
+ * font-weight is adjusted to be at least 200.
+ * font-style should only have "normal" or "italic" values.
+-->
+<style>
+ #id1 {
+ font-weight: 100;
+ font-style: oblique 30deg;
+ }
+ #id2 {
+ font-weight: 300;
+ font-style: italic;
+ }
+</style>
+
+
+<permission id="id1" type="geolocation">
+<permission id="id2" type="camera">
+
+<script>
+ test(function(){
+ var el_outside_bounds = document.getElementById("id1");
+ assert_equals(getComputedStyle(el_outside_bounds).fontWeight, "200", "font-weight");
+ assert_equals(getComputedStyle(el_outside_bounds).fontStyle, "normal", "font-style");
+ }, "Properties with out-of-bounds values should be corrected");
+
+ test(function(){
+ var el_inside_bounds = document.getElementById("id2");
+ assert_equals(getComputedStyle(el_inside_bounds).fontWeight, "300", "font-weight");
+ assert_equals(getComputedStyle(el_inside_bounds).fontStyle, "italic", "font-style");
+ }, "Properties with values in bounds should not be modified");
+</script>
+</body> \ No newline at end of file
diff --git a/tests/wpt/tests/html/semantics/permission-element/negative-offset-and-margin.html b/tests/wpt/tests/html/semantics/permission-element/negative-offset-and-margin.html
index 860e637e0a9..97290bb4df3 100644
--- a/tests/wpt/tests/html/semantics/permission-element/negative-offset-and-margin.html
+++ b/tests/wpt/tests/html/semantics/permission-element/negative-offset-and-margin.html
@@ -20,11 +20,21 @@
margin-bottom: 50px;
margin-right: 50px;
}
+
+ /* These various expressions all result in a negative value when calculated */
+ #id3 {
+ outline-offset: min(-50px, 50px);
+ margin-top: min(10%, -50px);
+ margin-left: clamp(-100px, 1vw, -50px);
+ margin-bottom: 1% - 10000px;
+ margin-right: max(min(-1em, 10em), -5%);
+ }
</style>
<permission id="id1" type="geolocation">
-<permission id="id2" type="geolocation">
+<permission id="id2" type="camera">
+<permission id="id3" type="microphone">
<script>
test(function(){
@@ -44,5 +54,14 @@
assert_equals(getComputedStyle(el_with_positives).marginTop, "50px", "margin-top");
assert_equals(getComputedStyle(el_with_positives).marginBottom, "50px", "margin-bottom");
}, "Positive margins/offset are unaffected");
+
+ test(function(){
+ var el_with_negative_expr = document.getElementById("id3");
+ assert_equals(getComputedStyle(el_with_negative_expr).outlineOffset, "0px", "outline-offset");
+ assert_equals(getComputedStyle(el_with_negative_expr).marginLeft, "0px", "margin-left");
+ assert_equals(getComputedStyle(el_with_negative_expr).marginRight, "0px", "margin-right");
+ assert_equals(getComputedStyle(el_with_negative_expr).marginTop, "0px", "margin-top");
+ assert_equals(getComputedStyle(el_with_negative_expr).marginBottom, "0px", "margin-bottom");
+ }, "Expressions margins/offset should always return at least 0px");
</script>
</body> \ No newline at end of file
diff --git a/tests/wpt/tests/html/semantics/popovers/popover-anchor-display.tentative.html b/tests/wpt/tests/html/semantics/popovers/popover-anchor-display.tentative.html
index d50dd6c857b..bddc44006df 100644
--- a/tests/wpt/tests/html/semantics/popovers/popover-anchor-display.tentative.html
+++ b/tests/wpt/tests/html/semantics/popovers/popover-anchor-display.tentative.html
@@ -94,7 +94,7 @@ showDefaultopenPopoversOnLoad();
top: anchor(top);
}
#popover5 {
- anchor-default: --anchor1; /* shouldn't be used */
+ position-anchor: --anchor1; /* shouldn't be used */
left: anchor(implicit right);
top: anchor(implicit top);
}
@@ -102,7 +102,7 @@ showDefaultopenPopoversOnLoad();
anchor-name: --anchor6;
}
#popover6 {
- anchor-default: --anchor6;
+ position-anchor: --anchor6;
left: anchor(right); /* shouldn't use the implicit anchor */
top: anchor(top);
}
diff --git a/tests/wpt/tests/html/semantics/popovers/popover-anchor-scroll-display.tentative.html b/tests/wpt/tests/html/semantics/popovers/popover-anchor-scroll-display.tentative.html
index 7ed6cf1adf8..2c6b0bafb94 100644
--- a/tests/wpt/tests/html/semantics/popovers/popover-anchor-scroll-display.tentative.html
+++ b/tests/wpt/tests/html/semantics/popovers/popover-anchor-scroll-display.tentative.html
@@ -56,7 +56,7 @@
anchor-name: --anchor2;
}
#popover2 {
- anchor-default: --anchor2;
+ position-anchor: --anchor2;
left: anchor(right);
top: anchor(top);
}
diff --git a/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
index 10b3dd22497..3fbe3eaa62b 100644
--- a/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
+++ b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator_user_agent.https.html
@@ -20,14 +20,14 @@
assert_equals(typeof uaData.mobile, "boolean", "mobile should be a boolean");
const highEntropyData = await uaData.getHighEntropyValues([
- "platformVersion", "architecture", "model", "uaFullVersion", "fullVersionList", "formFactor"]);
+ "platformVersion", "architecture", "model", "uaFullVersion", "fullVersionList", "formFactors"]);
assert_equals(typeof highEntropyData["platform"], "string", "Platform brand should be a string");
assert_equals(typeof highEntropyData["platformVersion"], "string", "Platform version should be a string");
assert_equals(typeof highEntropyData["architecture"], "string", "Architecture should be a string");
assert_equals(typeof highEntropyData["model"], "string", "Model should be a string");
assert_equals(typeof highEntropyData["uaFullVersion"], "string", "UAFullVersion should be a string");
- for (formFactor of highEntropyData['formFactor']) {
- assert_equals(typeof formFactor, "string", "Each FormFactor should be a string");
+ for (formFactor of highEntropyData['formFactors']) {
+ assert_equals(typeof formFactor, "string", "Each FormFactors value should be a string");
}
for (brandVersionPair of highEntropyData['fullVersionList']) {
assert_equals(typeof brandVersionPair.brand, "string", "brand should be a string");
@@ -40,7 +40,7 @@
assert_false("architecture" in highEntropyData2, "Architecture should be an empty string");
assert_false("model" in highEntropyData2, "Model should be an empty string");
assert_false("uaFullVersion" in highEntropyData2, "UAFullVersion should be an empty string");
- assert_false("formFactor" in highEntropyData2, "FormFactor should be an empty string");
+ assert_false("formFactors" in highEntropyData2, "FormFactors should be an empty array");
assert_false("fullVersionList" in highEntropyData2, "fullVersionList should not be present");
let finalPromise = uaData.getHighEntropyValues([]).then(() => {
assert_true(didMicrotaskRun, "getHighEntropyValues queued on a task");
diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/minimize_restore_popup.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/minimize_restore_popup.html.ini
new file mode 100644
index 00000000000..6075b58d09c
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/minimize_restore_popup.html.ini
@@ -0,0 +1,2 @@
+[minimize_restore_popup.html]
+ disabled: https://github.com/web-platform-tests/wpt/issues/45137
diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/test_win_open_with_interaction.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/test_win_open_with_interaction.html.ini
deleted file mode 100644
index b1e77bd8e59..00000000000
--- a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/test_win_open_with_interaction.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[test_win_open_with_interaction.html]
- expected: [OK, TIMEOUT]
-
- [Tests pointer move/click in a window opened with `window.open.`]
- expected: [FAIL, TIMEOUT, PASS]
diff --git a/tests/wpt/tests/infrastructure/testdriver/minimize_restore_popup.html b/tests/wpt/tests/infrastructure/testdriver/minimize_restore_popup.html
new file mode 100644
index 00000000000..99245083b59
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/testdriver/minimize_restore_popup.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>TestDriver minimize/restore method in popup</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<script>
+const params = new URLSearchParams(location.search);
+const is_popup_page = params.has('popup');
+const channel = new BroadcastChannel("testchannel");
+
+if (is_popup_page) {
+ onload = async () => {
+ window.opener.events.push(document.visibilityState);
+ let rect = await test_driver.minimize_window();
+ window.opener.events.push(document.visibilityState);
+ await test_driver.set_window_rect(rect);
+ window.opener.events.push(document.visibilityState);
+ channel.postMessage("done");
+ };
+} else {
+ promise_test(async t => {
+ let popup;
+ onload = () => {
+ window.events = [];
+ popup = window.open("?popup");
+ };
+
+ await new Promise(resolve => {
+ channel.addEventListener(
+ "message", t.step_func(async (e) => {
+ if (e.data === "done") {
+ const expectedEvents = ["visible", "hidden", "visible"];
+ assert_array_equals(window.events, expectedEvents, 'incorrect event order');
+ popup.close();
+ resolve();
+ }
+ }));
+ });
+ }, `minimize and restore on popup`);
+}
+</script>
diff --git a/tests/wpt/tests/interfaces/css-view-transitions-2.idl b/tests/wpt/tests/interfaces/css-view-transitions-2.idl
index 89e57e251b1..d1e4eeb11e5 100644
--- a/tests/wpt/tests/interfaces/css-view-transitions-2.idl
+++ b/tests/wpt/tests/interfaces/css-view-transitions-2.idl
@@ -23,3 +23,7 @@ interface CSSViewTransitionRule : CSSRule {
attribute ViewTransitionNavigation navigation;
attribute DOMTokenList typeList;
};
+
+partial interface ViewTransition {
+ readonly attribute DOMTokenList typeList;
+};
diff --git a/tests/wpt/tests/interfaces/document-picture-in-picture.idl b/tests/wpt/tests/interfaces/document-picture-in-picture.idl
index f54f437a936..888855b38f2 100644
--- a/tests/wpt/tests/interfaces/document-picture-in-picture.idl
+++ b/tests/wpt/tests/interfaces/document-picture-in-picture.idl
@@ -20,6 +20,7 @@ interface DocumentPictureInPicture : EventTarget {
dictionary DocumentPictureInPictureOptions {
[EnforceRange] unsigned long long width = 0;
[EnforceRange] unsigned long long height = 0;
+ boolean allowReturnToOpener = true;
};
[Exposed=Window, SecureContext]
diff --git a/tests/wpt/tests/interfaces/html.idl b/tests/wpt/tests/interfaces/html.idl
index 7211231980f..d2caf12b5bf 100644
--- a/tests/wpt/tests/interfaces/html.idl
+++ b/tests/wpt/tests/interfaces/html.idl
@@ -123,6 +123,7 @@ interface HTMLElement : Element {
readonly attribute DOMString accessKeyLabel;
[CEReactions] attribute boolean draggable;
[CEReactions] attribute boolean spellcheck;
+ [CEReactions] attribute DOMString writingSuggestions;
[CEReactions] attribute DOMString autocapitalize;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText;
diff --git a/tests/wpt/tests/interfaces/long-animation-frames.idl b/tests/wpt/tests/interfaces/long-animation-frames.idl
new file mode 100644
index 00000000000..79a42ca8f0a
--- /dev/null
+++ b/tests/wpt/tests/interfaces/long-animation-frames.idl
@@ -0,0 +1,54 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Long Animation Frames API (https://w3c.github.io/long-animation-frames/)
+
+[Exposed=Window]
+interface PerformanceLongAnimationFrameTiming : PerformanceEntry {
+ /* Overloading PerformanceEntry */
+ readonly attribute DOMHighResTimeStamp startTime;
+ readonly attribute DOMHighResTimeStamp duration;
+ readonly attribute DOMString name;
+ readonly attribute DOMString entryType;
+
+ readonly attribute DOMHighResTimeStamp renderStart;
+ readonly attribute DOMHighResTimeStamp styleAndLayoutStart;
+ readonly attribute DOMHighResTimeStamp blockingDuration;
+ readonly attribute DOMHighResTimeStamp firstUIEventTimestamp;
+ [SameObject] readonly attribute FrozenArray<PerformanceScriptTiming> scripts;
+ [Default] object toJSON();
+};
+
+enum ScriptInvokerType {
+ "classic-script",
+ "module-script",
+ "event-listener",
+ "user-callback",
+ "resolve-promise",
+ "reject-promise"
+};
+
+enum ScriptWindowAttribution {
+ "self", "descendant", "ancestor", "same-page", "other"
+};
+
+[Exposed=Window]
+interface PerformanceScriptTiming : PerformanceEntry {
+ /* Overloading PerformanceEntry */
+ readonly attribute DOMHighResTimeStamp startTime;
+ readonly attribute DOMHighResTimeStamp duration;
+ readonly attribute DOMString name;
+ readonly attribute DOMString entryType;
+
+ readonly attribute ScriptInvokerType invokerType;
+ readonly attribute DOMString invoker;
+ readonly attribute DOMHighResTimeStamp executionStart;
+ readonly attribute DOMString sourceURL;
+ readonly attribute DOMString sourceFunctionName;
+ readonly attribute long long sourceCharPosition;
+ readonly attribute DOMHighResTimeStamp pauseDuration;
+ readonly attribute DOMHighResTimeStamp forcedStyleAndLayoutDuration;
+ readonly attribute Window? window;
+ readonly attribute ScriptWindowAttribution windowAttribution;
+ [Default] object toJSON();
+};
diff --git a/tests/wpt/tests/interfaces/longtasks.idl b/tests/wpt/tests/interfaces/longtasks.idl
index e5b6ece16a1..3717469fd09 100644
--- a/tests/wpt/tests/interfaces/longtasks.idl
+++ b/tests/wpt/tests/interfaces/longtasks.idl
@@ -29,53 +29,3 @@ interface TaskAttributionTiming : PerformanceEntry {
readonly attribute DOMString containerName;
[Default] object toJSON();
};
-
-[Exposed=Window]
-interface PerformanceLongAnimationFrameTiming : PerformanceEntry {
- /* Overloading PerformanceEntry */
- readonly attribute DOMHighResTimeStamp startTime;
- readonly attribute DOMHighResTimeStamp duration;
- readonly attribute DOMString name;
- readonly attribute DOMString entryType;
-
- readonly attribute DOMHighResTimeStamp renderStart;
- readonly attribute DOMHighResTimeStamp styleAndLayoutStart;
- readonly attribute DOMHighResTimeStamp blockingDuration;
- readonly attribute DOMHighResTimeStamp firstUIEventTimestamp;
- [SameObject] readonly attribute FrozenArray<PerformanceScriptTiming> scripts;
- [Default] object toJSON();
-};
-
-enum ScriptInvokerType {
- "classic-script",
- "module-script",
- "event-listener",
- "user-callback",
- "resolve-promise",
- "reject-promise"
-};
-
-enum ScriptWindowAttribution {
- "self", "descendant", "ancestor", "same-page", "other"
-};
-
-[Exposed=Window]
-interface PerformanceScriptTiming : PerformanceEntry {
- /* Overloading PerformanceEntry */
- readonly attribute DOMHighResTimeStamp startTime;
- readonly attribute DOMHighResTimeStamp duration;
- readonly attribute DOMString name;
- readonly attribute DOMString entryType;
-
- readonly attribute ScriptInvokerType invokerType;
- readonly attribute DOMString invoker;
- readonly attribute DOMHighResTimeStamp executionStart;
- readonly attribute DOMString sourceURL;
- readonly attribute DOMString sourceFunctionName;
- readonly attribute long long sourceCharPosition;
- readonly attribute DOMHighResTimeStamp pauseDuration;
- readonly attribute DOMHighResTimeStamp forcedStyleAndLayoutDuration;
- readonly attribute Window? window;
- readonly attribute ScriptWindowAttribution windowAttribution;
- [Default] object toJSON();
-};
diff --git a/tests/wpt/tests/interfaces/mediacapture-streams.idl b/tests/wpt/tests/interfaces/mediacapture-streams.idl
index 373f0c328d9..f2ca21389e9 100644
--- a/tests/wpt/tests/interfaces/mediacapture-streams.idl
+++ b/tests/wpt/tests/interfaces/mediacapture-streams.idl
@@ -189,16 +189,6 @@ dictionary MediaStreamConstraints {
(boolean or MediaTrackConstraints) audio = false;
};
-partial interface Navigator {
- [SecureContext] undefined getUserMedia(MediaStreamConstraints constraints,
- NavigatorUserMediaSuccessCallback successCallback,
- NavigatorUserMediaErrorCallback errorCallback);
-};
-
-callback NavigatorUserMediaSuccessCallback = undefined (MediaStream stream);
-
-callback NavigatorUserMediaErrorCallback = undefined (DOMException error);
-
dictionary DoubleRange {
double max;
double min;
diff --git a/tests/wpt/tests/interfaces/navigation-timing.idl b/tests/wpt/tests/interfaces/navigation-timing.idl
index 355950160e3..b381b486e19 100644
--- a/tests/wpt/tests/interfaces/navigation-timing.idl
+++ b/tests/wpt/tests/interfaces/navigation-timing.idl
@@ -16,6 +16,7 @@ interface PerformanceNavigationTiming : PerformanceResourceTiming {
readonly attribute NavigationTimingType type;
readonly attribute unsigned short redirectCount;
readonly attribute DOMHighResTimeStamp criticalCHRestart;
+ readonly attribute NotRestoredReasons? notRestoredReasons;
[Default] object toJSON();
};
diff --git a/tests/wpt/tests/interfaces/permissions.idl b/tests/wpt/tests/interfaces/permissions.idl
index fbcb674e561..62c2e3ad76f 100644
--- a/tests/wpt/tests/interfaces/permissions.idl
+++ b/tests/wpt/tests/interfaces/permissions.idl
@@ -36,6 +36,6 @@ enum PermissionState {
};
dictionary PermissionSetParameters {
- required PermissionDescriptor descriptor;
+ required object descriptor;
required PermissionState state;
};
diff --git a/tests/wpt/tests/interfaces/turtledove.idl b/tests/wpt/tests/interfaces/turtledove.idl
index 8a2d7bb594f..87aec6e6bca 100644
--- a/tests/wpt/tests/interfaces/turtledove.idl
+++ b/tests/wpt/tests/interfaces/turtledove.idl
@@ -32,6 +32,7 @@ dictionary GenerateBidInterestGroup {
USVString trustedBiddingSignalsURL;
sequence<USVString> trustedBiddingSignalsKeys;
DOMString trustedBiddingSignalsSlotSizeMode = "none";
+ long maxTrustedBiddingSignalsURLLength;
any userBiddingSignals;
sequence<AuctionAd> ads;
sequence<AuctionAd> adComponents;
@@ -68,12 +69,14 @@ dictionary AuctionAdConfig {
required USVString seller;
required USVString decisionLogicURL;
USVString trustedScoringSignalsURL;
+ long maxTrustedScoringSignalsURLLength;
sequence<USVString> interestGroupBuyers;
Promise<any> auctionSignals;
record<DOMString, DOMString> requestedSize;
sequence<record<DOMString, DOMString>> allSlotsRequestedSizes;
Promise<any> sellerSignals;
Promise<DOMString> directFromSellerSignalsHeaderAdSlot;
+ Promise<record<USVString, USVString>> deprecatedRenderURLReplacements;
unsigned long long sellerTimeout;
unsigned short sellerExperimentGroupId;
USVString sellerCurrency;
diff --git a/tests/wpt/tests/interfaces/ua-client-hints.idl b/tests/wpt/tests/interfaces/ua-client-hints.idl
index 6a40e1bdc4b..5d44b0dd80a 100644
--- a/tests/wpt/tests/interfaces/ua-client-hints.idl
+++ b/tests/wpt/tests/interfaces/ua-client-hints.idl
@@ -12,7 +12,7 @@ dictionary UADataValues {
DOMString architecture;
DOMString bitness;
sequence<NavigatorUABrandVersion> brands;
- sequence<DOMString> formFactor;
+ sequence<DOMString> formFactors;
sequence<NavigatorUABrandVersion> fullVersionList;
DOMString model;
boolean mobile;
diff --git a/tests/wpt/tests/interfaces/web-animations-2.idl b/tests/wpt/tests/interfaces/web-animations-2.idl
index f9f68a0d49a..4c3af535149 100644
--- a/tests/wpt/tests/interfaces/web-animations-2.idl
+++ b/tests/wpt/tests/interfaces/web-animations-2.idl
@@ -14,6 +14,7 @@ partial interface AnimationTimeline {
partial interface Animation {
attribute CSSNumberish? startTime;
attribute CSSNumberish? currentTime;
+ readonly attribute double? progress;
};
[Exposed=Window]
diff --git a/tests/wpt/tests/interfaces/webcodecs.idl b/tests/wpt/tests/interfaces/webcodecs.idl
index 48d89d0b477..aa823aa52df 100644
--- a/tests/wpt/tests/interfaces/webcodecs.idl
+++ b/tests/wpt/tests/interfaces/webcodecs.idl
@@ -390,21 +390,37 @@ dictionary PlaneLayout {
enum VideoPixelFormat {
// 4:2:0 Y, U, V
"I420",
+ "I420P10",
+ "I420P12",
// 4:2:0 Y, U, V, A
"I420A",
+ "I420AP10",
+ "I420AP12",
// 4:2:2 Y, U, V
"I422",
+ "I422P10",
+ "I422P12",
+ // 4:2:2 Y, U, V, A
+ "I422A",
+ "I422AP10",
+ "I422AP12",
// 4:4:4 Y, U, V
"I444",
+ "I444P10",
+ "I444P12",
+ // 4:4:4 Y, U, V, A
+ "I444A",
+ "I444AP10",
+ "I444AP12",
// 4:2:0 Y, UV
"NV12",
- // 32bpp RGBA
+ // 4:4:4 RGBA
"RGBA",
- // 32bpp RGBX (opaque)
+ // 4:4:4 RGBX (opaque)
"RGBX",
- // 32bpp BGRA
+ // 4:4:4 BGRA
"BGRA",
- // 32bpp BGRX (opaque)
+ // 4:4:4 BGRX (opaque)
"BGRX",
};
diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl
index 50ee64b185a..0b8ea7cb344 100644
--- a/tests/wpt/tests/interfaces/webnn.idl
+++ b/tests/wpt/tests/interfaces/webnn.idl
@@ -69,7 +69,7 @@ dictionary MLOperandDescriptor {
// The dimensions field is empty for scalar operands,
// and non-empty for tensor operands.
- sequence<unsigned long> dimensions = [];
+ sequence<[EnforceRange] unsigned long> dimensions = [];
};
[SecureContext, Exposed=(Window, DedicatedWorker)]
@@ -102,7 +102,7 @@ interface MLGraphBuilder {
};
dictionary MLArgMinMaxOptions {
- sequence<unsigned long> axes;
+ sequence<[EnforceRange] unsigned long> axes;
boolean keepDimensions = false;
boolean selectLastIndex = false;
};
@@ -115,7 +115,7 @@ partial interface MLGraphBuilder {
dictionary MLBatchNormalizationOptions {
MLOperand scale;
MLOperand bias;
- unsigned long axis = 1;
+ [EnforceRange] unsigned long axis = 1;
float epsilon = 1e-5;
MLActivation activation;
};
@@ -140,7 +140,7 @@ partial interface MLGraphBuilder {
};
partial interface MLGraphBuilder {
- MLOperand concat(sequence<MLOperand> inputs, unsigned long axis);
+ MLOperand concat(sequence<MLOperand> inputs, [EnforceRange] unsigned long axis);
};
enum MLConv2dFilterOperandLayout {
@@ -151,10 +151,10 @@ enum MLConv2dFilterOperandLayout {
};
dictionary MLConv2dOptions {
- sequence<unsigned long> padding;
- sequence<unsigned long> strides;
- sequence<unsigned long> dilations;
- unsigned long groups = 1;
+ sequence<[EnforceRange] unsigned long> padding;
+ sequence<[EnforceRange] unsigned long> strides;
+ sequence<[EnforceRange] unsigned long> dilations;
+ [EnforceRange] unsigned long groups = 1;
MLInputOperandLayout inputLayout = "nchw";
MLConv2dFilterOperandLayout filterLayout = "oihw";
MLOperand bias;
@@ -172,12 +172,12 @@ enum MLConvTranspose2dFilterOperandLayout {
};
dictionary MLConvTranspose2dOptions {
- sequence<unsigned long> padding;
- sequence<unsigned long> strides;
- sequence<unsigned long> dilations;
- sequence<unsigned long> outputPadding;
- sequence<unsigned long> outputSizes;
- unsigned long groups = 1;
+ sequence<[EnforceRange] unsigned long> padding;
+ sequence<[EnforceRange] unsigned long> strides;
+ sequence<[EnforceRange] unsigned long> dilations;
+ sequence<[EnforceRange] unsigned long> outputPadding;
+ sequence<[EnforceRange] unsigned long> outputSizes;
+ [EnforceRange] unsigned long groups = 1;
MLInputOperandLayout inputLayout = "nchw";
MLConvTranspose2dFilterOperandLayout filterLayout = "iohw";
MLOperand bias;
@@ -234,11 +234,11 @@ partial interface MLGraphBuilder {
};
partial interface MLGraphBuilder {
- MLOperand expand(MLOperand input, sequence<unsigned long> newShape);
+ MLOperand expand(MLOperand input, sequence<[EnforceRange] unsigned long> newShape);
};
dictionary MLGatherOptions {
- unsigned long axis = 0;
+ [EnforceRange] unsigned long axis = 0;
};
partial interface MLGraphBuilder {
@@ -280,8 +280,11 @@ dictionary MLGruOptions {
};
partial interface MLGraphBuilder {
- sequence<MLOperand> gru(MLOperand input, MLOperand weight, MLOperand recurrentWeight,
- unsigned long steps, unsigned long hiddenSize,
+ sequence<MLOperand> gru(MLOperand input,
+ MLOperand weight,
+ MLOperand recurrentWeight,
+ [EnforceRange] unsigned long steps,
+ [EnforceRange] unsigned long hiddenSize,
optional MLGruOptions options = {});
};
@@ -294,8 +297,11 @@ dictionary MLGruCellOptions {
};
partial interface MLGraphBuilder {
- MLOperand gruCell(MLOperand input, MLOperand weight, MLOperand recurrentWeight,
- MLOperand hiddenState, unsigned long hiddenSize,
+ MLOperand gruCell(MLOperand input,
+ MLOperand weight,
+ MLOperand recurrentWeight,
+ MLOperand hiddenState,
+ [EnforceRange] unsigned long hiddenSize,
optional MLGruCellOptions options = {});
};
@@ -329,7 +335,7 @@ partial interface MLGraphBuilder {
dictionary MLLayerNormalizationOptions {
MLOperand scale;
MLOperand bias;
- sequence<unsigned long> axes;
+ sequence<[EnforceRange] unsigned long> axes;
float epsilon = 1e-5;
};
@@ -374,8 +380,11 @@ dictionary MLLstmOptions {
};
partial interface MLGraphBuilder {
- sequence<MLOperand> lstm(MLOperand input, MLOperand weight, MLOperand recurrentWeight,
- unsigned long steps, unsigned long hiddenSize,
+ sequence<MLOperand> lstm(MLOperand input,
+ MLOperand weight,
+ MLOperand recurrentWeight,
+ [EnforceRange] unsigned long steps,
+ [EnforceRange] unsigned long hiddenSize,
optional MLLstmOptions options = {});
};
@@ -388,8 +397,12 @@ dictionary MLLstmCellOptions {
};
partial interface MLGraphBuilder {
- sequence<MLOperand> lstmCell(MLOperand input, MLOperand weight, MLOperand recurrentWeight,
- MLOperand hiddenState, MLOperand cellState, unsigned long hiddenSize,
+ sequence<MLOperand> lstmCell(MLOperand input,
+ MLOperand weight,
+ MLOperand recurrentWeight,
+ MLOperand hiddenState,
+ MLOperand cellState,
+ [EnforceRange] unsigned long hiddenSize,
optional MLLstmCellOptions options = {});
};
@@ -411,8 +424,8 @@ dictionary MLPadOptions {
partial interface MLGraphBuilder {
MLOperand pad(MLOperand input,
- sequence<unsigned long> beginningPadding,
- sequence<unsigned long> endingPadding,
+ sequence<[EnforceRange] unsigned long> beginningPadding,
+ sequence<[EnforceRange] unsigned long> endingPadding,
optional MLPadOptions options = {});
};
@@ -422,13 +435,13 @@ enum MLRoundingType {
};
dictionary MLPool2dOptions {
- sequence<unsigned long> windowDimensions;
- sequence<unsigned long> padding;
- sequence<unsigned long> strides;
- sequence<unsigned long> dilations;
+ sequence<[EnforceRange] unsigned long> windowDimensions;
+ sequence<[EnforceRange] unsigned long> padding;
+ sequence<[EnforceRange] unsigned long> strides;
+ sequence<[EnforceRange] unsigned long> dilations;
MLInputOperandLayout layout = "nchw";
MLRoundingType roundingType = "floor";
- sequence<unsigned long> outputSizes;
+ sequence<[EnforceRange] unsigned long> outputSizes;
};
partial interface MLGraphBuilder {
@@ -442,7 +455,7 @@ partial interface MLGraphBuilder {
};
dictionary MLReduceOptions {
- sequence<unsigned long> axes;
+ sequence<[EnforceRange] unsigned long> axes;
boolean keepDimensions = false;
};
@@ -472,8 +485,8 @@ enum MLInterpolationMode {
dictionary MLResample2dOptions {
MLInterpolationMode mode = "nearest-neighbor";
sequence<float> scales;
- sequence<unsigned long> sizes;
- sequence<unsigned long> axes;
+ sequence<[EnforceRange] unsigned long> sizes;
+ sequence<[EnforceRange] unsigned long> axes;
};
partial interface MLGraphBuilder {
@@ -481,7 +494,7 @@ partial interface MLGraphBuilder {
};
partial interface MLGraphBuilder {
- MLOperand reshape(MLOperand input, sequence<unsigned long> newShape);
+ MLOperand reshape(MLOperand input, sequence<[EnforceRange] unsigned long> newShape);
};
partial interface MLGraphBuilder {
@@ -490,7 +503,9 @@ partial interface MLGraphBuilder {
};
partial interface MLGraphBuilder {
- MLOperand slice(MLOperand input, sequence<unsigned long> starts, sequence<unsigned long> sizes);
+ MLOperand slice(MLOperand input,
+ sequence<[EnforceRange] unsigned long> starts,
+ sequence<[EnforceRange] unsigned long> sizes);
};
partial interface MLGraphBuilder {
@@ -513,12 +528,12 @@ partial interface MLGraphBuilder {
};
dictionary MLSplitOptions {
- unsigned long axis = 0;
+ [EnforceRange] unsigned long axis = 0;
};
partial interface MLGraphBuilder {
sequence<MLOperand> split(MLOperand input,
- (unsigned long or sequence<unsigned long>) splits,
+ ([EnforceRange] unsigned long or sequence<[EnforceRange] unsigned long>) splits,
optional MLSplitOptions options = {});
};
@@ -528,7 +543,7 @@ partial interface MLGraphBuilder {
};
dictionary MLTransposeOptions {
- sequence<unsigned long> permutation;
+ sequence<[EnforceRange] unsigned long> permutation;
};
partial interface MLGraphBuilder {
@@ -537,7 +552,7 @@ partial interface MLGraphBuilder {
dictionary MLTriangularOptions {
boolean upper = true;
- long diagonal = 0;
+ [EnforceRange] long diagonal = 0;
};
partial interface MLGraphBuilder {
diff --git a/tests/wpt/tests/lint.ignore b/tests/wpt/tests/lint.ignore
index ebe734d0083..0258a1117aa 100644
--- a/tests/wpt/tests/lint.ignore
+++ b/tests/wpt/tests/lint.ignore
@@ -580,6 +580,7 @@ MISSING-LINK: css/cssom-view/scrollTop-display-change.html
# TODO https://github.com/web-platform-tests/wpt/issues/5770
MISSING-LINK: css/css-highlight-api/idlharness.window.js
MISSING-LINK: css/css-highlight-api/historical.window.js
+MISSING-LINK: css/cssom/cssstyledeclaration-csstext-setter.window.js
MISSING-LINK: css/geometry/*.worker.js
MISSING-LINK: css/geometry/*.any.js
MISSING-LINK: css/filter-effects/*.any.js
@@ -745,5 +746,6 @@ HTML INVALID SYNTAX: domparsing/DOMParser-parseFromString-xml-parsererror.html
HTML INVALID SYNTAX: domparsing/XMLSerializer-serializeToString.html
HTML INVALID SYNTAX: html/canvas/element/manual/unclosed-canvas-4.htm
HTML INVALID SYNTAX: html/syntax/parsing/unclosed-svg-script.html
+HTML INVALID SYNTAX: mathml/crashtests/mozilla/411603-1.html
HTML INVALID SYNTAX: quirks/percentage-height-calculation.html
HTML INVALID SYNTAX: trusted-types/TrustedTypePolicyFactory-getAttributeType-namespace.html
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1140268-1.html b/tests/wpt/tests/mathml/crashtests/mozilla/1140268-1.html
new file mode 100644
index 00000000000..5e5510ba7fd
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1140268-1.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8>
+<script>
+function boom()
+{
+ var e = document.getElementsByTagName("mo")[0];
+ e.setAttribute("style", "position: absolute; top: 0px;");
+ document.documentElement.offsetHeight;
+ e.setAttribute("style", "position: absolute; top: 100px;");
+}
+</script>
+</head>
+<body onload="boom();">
+<math><mo>boom!</mo></math>
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1397439-1.html b/tests/wpt/tests/mathml/crashtests/mozilla/1397439-1.html
new file mode 100644
index 00000000000..b617f8e0ed8
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1397439-1.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<math>
+<mstyle scriptlevel=101>
+<mstyle scriptlevel=-204>
+</math>
+
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1403465.html b/tests/wpt/tests/mathml/crashtests/mozilla/1403465.html
new file mode 100644
index 00000000000..924392757b3
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1403465.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<body>
+ <math class="hidden">
+ <mi>x</mi>
+ <mo>=</mo>
+ </math>
+<script>
+window.onload = function() {
+ let s = document.createElement("style");
+ s.textContent = `
+ body {
+ line-height: 1.42857143;
+ }
+
+ .hidden {
+ display: none;
+ }
+ `;
+ document.body.appendChild(s);
+};
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1435015.html b/tests/wpt/tests/mathml/crashtests/mozilla/1435015.html
new file mode 100644
index 00000000000..329aaca22f8
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1435015.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<style>
+ div { display: contents; }
+</style>
+<math></math>
+<script>
+ let div = document.createElementNS('http://www.w3.org/1998/Math/MathML', 'div');
+ document.querySelector('math').appendChild(div);
+</script>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1555757-1.html b/tests/wpt/tests/mathml/crashtests/mozilla/1555757-1.html
new file mode 100644
index 00000000000..04f2b27a602
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1555757-1.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <style>
+ .class_1 {
+ transition-delay: 2129ms;
+ contain: strict;
+ }
+ </style>
+</head>
+<math>
+ <mover>
+ <ms></ms>
+ <mtable class="class_1"></mtable>
+ </mover>
+</math>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1555757-2.html b/tests/wpt/tests/mathml/crashtests/mozilla/1555757-2.html
new file mode 100644
index 00000000000..eff048784a1
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1555757-2.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ #testElem {
+ border: 1px solid black;
+ background: yellow;
+ contain: layout size;
+ width: 300px;
+ }
+ </style>
+ <script>
+ function go() {
+ /* trigger an incremental reflow.
+ * Note: elem.style is undefined for MathML elements, so we have
+ * to use setAttribute().
+ */
+ testElem.setAttribute("style", "width:150px");
+ }
+ </script>
+</head>
+<body onload="go()">
+ <math>
+ <mtable id="testElem">Change my size</mtable>
+ </math>
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1701975-1.html b/tests/wpt/tests/mathml/crashtests/mozilla/1701975-1.html
new file mode 100644
index 00000000000..c7d54ca996f
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1701975-1.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ #id_0 {
+ font-size: 10000% ! important
+ }
+
+ * {
+ border-top-style: groove;
+ }
+ </style>
+
+</head>
+<math>
+ <semantics style='border-inline: 1000000em outset !important'>
+ <mmultiscripts id='id_0'></mmultiscripts>
+ </semantics>
+</math>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/243159-2.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/243159-2.xhtml
new file mode 100644
index 00000000000..ff0326816d8
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/243159-2.xhtml
@@ -0,0 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:mathml="http://www.w3.org/1998/Math/MathML">
+ <body onload="run()">
+ <mathml:math id="test" style="display: block">
+ </mathml:math>
+<script>
+ function run() {
+ var t1 = document.createElementNS("http://www.w3.org/1998/Math/MathML",
+ "mtable");
+ var t2 = document.createElementNS("http://www.w3.org/1998/Math/MathML",
+ "mtable");
+ var r1 = document.createElementNS("http://www.w3.org/1998/Math/MathML",
+ "mtr");
+ var r2 = document.createElementNS("http://www.w3.org/1998/Math/MathML",
+ "mtr");
+ var test =
+ document.getElementsByTagNameNS("http://www.w3.org/1998/Math/MathML", "math")[0];
+ t1.appendChild(r1);
+ test.appendChild(t1);
+ test.appendChild(t2);
+ t2.appendChild(r2);
+ }
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/306902-1.xml b/tests/wpt/tests/mathml/crashtests/mozilla/306902-1.xml
new file mode 100644
index 00000000000..24e8c068a0d
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/306902-1.xml
@@ -0,0 +1,14 @@
+<?xml version='1.0'?>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<body>
+
+<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><msup>
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+</msup></math>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/347506-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/347506-1.xhtml
new file mode 100644
index 00000000000..4119389a56d
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/347506-1.xhtml
@@ -0,0 +1,23 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<body>
+
+<div><math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+
+ <mtable>
+ <mtr>
+ <mtd><mi>x</mi></mtd>
+ <mtd rowspan="4" columnspan="4"><mi>y</mi></mtd>
+ </mtr>
+ <mtr>
+ <mtd rowspan="0" columnspan="0"><mi>z</mi></mtd>
+ <mtd><mi>w</mi></mtd>
+ </mtr>
+ </mtable>
+
+
+</math></div>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/355993-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/355993-1.xhtml
new file mode 100644
index 00000000000..cbbddf013aa
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/355993-1.xhtml
@@ -0,0 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<style>
+body, body * { position: fixed; }
+</style>
+</head>
+
+<body>
+
+
+<div>
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+
+ <mtable>
+ <mtr>
+ <mtd>
+ <mn>1</mn>
+ </mtd>
+ </mtr>
+ </mtable>
+ </math>
+</div>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/364686-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/364686-1.xhtml
new file mode 100644
index 00000000000..add9238d8fa
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/364686-1.xhtml
@@ -0,0 +1,11 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:math="http://www.w3.org/1998/Math/MathML">
+
+<body>
+
+<math:merror>
+ <img/>
+</math:merror>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/368461-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/368461-1.xhtml
new file mode 100644
index 00000000000..d5baccf523e
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/368461-1.xhtml
@@ -0,0 +1,11 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+
+<head>
+</head>
+
+<body>
+
+<p><math:msubsup><span>Foo bar baz<td></td></span></math:msubsup></p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/370884-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/370884-1.xhtml
new file mode 100644
index 00000000000..3959d4b1781
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/370884-1.xhtml
@@ -0,0 +1,14 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<head>
+</head>
+
+<body>
+
+<math:mroot>
+ <div>
+ <div style="position: fixed;">Y</div>
+ </div>
+</math:mroot>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/382208-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/382208-1.xhtml
new file mode 100644
index 00000000000..88d2728bfe6
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/382208-1.xhtml
@@ -0,0 +1,7 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<body>
+
+<div><math:mfrac><math:mmultiscripts/><math:mi/></math:mfrac></div>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/382396-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/382396-1.xhtml
new file mode 100644
index 00000000000..89af7ea18dd
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/382396-1.xhtml
@@ -0,0 +1,7 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<body>
+
+<p style="text-indent: 0%">a<math:ms/></p>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/384649-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/384649-1.xhtml
new file mode 100644
index 00000000000..e2ba50cdeec
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/384649-1.xhtml
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<style>
+
+/* use attribute selector instead of the .class shorthand to work around bug 379178 */
+
+*[class="fixed"] { position: fixed; }
+
+math, mtable, mtr { position: inherit; }
+
+</style>
+</head>
+
+<body>
+
+<div class="fixed">
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+ <mtable>
+ <mtr class="fixed">
+ <mtd><mi>x</mi></mtd>
+ </mtr>
+ <mtr>
+ <mtd><mi>y</mi></mtd>
+ </mtr>
+ </mtable>
+ </math>
+</div>
+
+</body>
+
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/385265-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/385265-1.xhtml
new file mode 100644
index 00000000000..7994653ffa7
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/385265-1.xhtml
@@ -0,0 +1,13 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<body>
+
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+ <mtable>
+ <mtr>
+ <mtd><mi>x</mi></mtd>
+ </mtr>
+ </mtable>
+</math>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/385289-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/385289-1.xhtml
new file mode 100644
index 00000000000..8f0e871aaf4
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/385289-1.xhtml
@@ -0,0 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script>
+function boom()
+{
+ var mss = document.getElementById("mss");
+
+ var j = document.createTextNode("j");
+ var comb = document.createTextNode("\u0302");
+
+ mss.appendChild(j);
+ mss.appendChild(comb);
+}
+</script>
+</head>
+
+<body onload="boom()">
+
+<div>
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+ <msub id="mss">
+ <mi>v</mi>
+ <mn>1</mn>
+ </msub>
+ </math>
+</div>
+
+</body>
+
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/394150-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/394150-1.xhtml
new file mode 100644
index 00000000000..ee54a8dd3b7
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/394150-1.xhtml
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<head>
+<script>
+
+function boom()
+{
+ var ms = document.createElementNS("http://www.w3.org/1998/Math/MathML", "ms");
+ var textNode = document.getElementById("emptyset").firstChild;
+ var mrow = document.getElementById("mrow");
+
+ ms.appendChild(textNode); // *move* the text node from one place to another!
+ mrow.appendChild(ms);
+}
+
+</script>
+</head>
+
+<body onload="boom();">
+
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+<merror><emptyset id="emptyset">
+ <mrow id="mrow"></mrow></emptyset></merror>
+</math>
+
+</body>
+
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/395450-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/395450-1.xhtml
new file mode 100644
index 00000000000..79510267bac
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/395450-1.xhtml
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+
+<head>
+<style>
+
+/*
+ This testcase uses [class~="foo"] instead of .foo to work around bug 276267
+ (see bug 379178 comment 78)
+*/
+
+[class~="abs"] { position: absolute; }
+[class~="marg"] { margin: 1em; }
+[class="noheight"] { height: 0; }
+
+</style>
+</head>
+
+<body>
+
+<math:mrow class="noheight">
+ <span class="abs">
+ <math:mroot class="abs marg" />
+ <span class="abs" />
+ </span>
+</math:mrow>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/399676-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/399676-1.xhtml
new file mode 100644
index 00000000000..82b547e5eaf
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/399676-1.xhtml
@@ -0,0 +1,7 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<head>
+</head>
+<body>
+<math:mtd><span style="float: right;" /></math:mtd>
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/400445-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/400445-1.xhtml
new file mode 100644
index 00000000000..9cb71dbbd6e
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/400445-1.xhtml
@@ -0,0 +1,22 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<head>
+<script>
+
+function boom()
+{
+ var mtd1 = document.getElementById("mtd1");
+ var mtd2 = document.getElementById("mtd2");
+ var newSpan = document.createElementNS("http://www.w3.org/1999/xhtml", "span");
+
+ mtd1.appendChild(newSpan);
+ mtd1.removeAttribute("columnspan");
+ mtd2.setAttribute("columnspan", 0);
+}
+
+</script>
+</head>
+
+<body onload="boom();">
+<math:mtd id="mtd1" columnspan="5" /><math:mtd id="mtd2" />
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/400904-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/400904-1.xhtml
new file mode 100644
index 00000000000..a00f42fd020
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/400904-1.xhtml
@@ -0,0 +1,20 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<head>
+<script type="text/javascript">
+
+function boom()
+{
+ var MATHML_NS = "http://www.w3.org/1998/Math/MathML";
+ var mtd = document.getElementById("mtd");
+ var n = document.createElementNS(MATHML_NS, 'mrow');
+ mtd.appendChild(n);
+ mtd.setAttribute('rowspan', 7);
+}
+
+</script>
+</head>
+
+<body onload="boom();">
+<math:mtd id="mtd"></math:mtd><math:mtr><math:mrow></math:mrow></math:mtr>
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/410728-1.xml b/tests/wpt/tests/mathml/crashtests/mozilla/410728-1.xml
new file mode 100644
index 00000000000..deaeb8fc553
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/410728-1.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
+ "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd"
+[
+ <!ENTITY mathml "http://www.w3.org/1998/Math/MathML">
+]>
+<math display="block" xmlns="&mathml;">
+ <mi>f &#x0332;</mi>
+ <mi>-</mi>
+ <mo>+</mo>
+ <mo> -</mo>
+ <mo>&#x0332;</mo>
+</math>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/411603-1.html b/tests/wpt/tests/mathml/crashtests/mozilla/411603-1.html
new file mode 100644
index 00000000000..596565fbc38
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/411603-1.html
@@ -0,0 +1,7 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:math="http://www.w3.org/1998/Math/MathML">
+<head>
+</head>
+<body onload="document.getElementById('ms').setAttribute('scriptminsize', '9em');">
+<math:mstyle id="ms" /><span />
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/413274-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/413274-1.xhtml
new file mode 100644
index 00000000000..19d8fab0fde
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/413274-1.xhtml
@@ -0,0 +1,18 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+</head>
+<body>
+
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mstyle scriptsizemultiplier="8205" scriptlevel="15">
+ <mroot>
+ <mrow/>
+ <mrow>
+ <span xmlns="http://www.w3.org/1999/xhtml"/>
+ </mrow>
+ </mroot>
+ </mstyle>
+</math>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/418007-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/418007-1.xhtml
new file mode 100644
index 00000000000..f07a693444e
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/418007-1.xhtml
@@ -0,0 +1,24 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head></head>
+<body>
+
+<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <ms fontsize="8179em">
+ <span xmlns="http://www.w3.org/1999/xhtml">
+ <span>
+ <td>
+ <mfrac xmlns="http://www.w3.org/1998/Math/MathML">
+ <mfrac>
+ <mrow/>
+ <mrow/>
+ </mfrac>
+ <mrow/>
+ </mfrac>
+ </td>
+ </span>
+ </span>
+ </ms>
+</math>
+
+</body>
+</html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/467914-1.html b/tests/wpt/tests/mathml/crashtests/mozilla/467914-1.html
new file mode 100644
index 00000000000..4f518f09df3
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/467914-1.html
@@ -0,0 +1,3 @@
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mathml="http://www.w3.org/1998/Math/MathML">
+<mathml:munder style="transform: translate(50px);clip-path: url(#h);"/>
+</window>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/547843-1.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/547843-1.xhtml
new file mode 100644
index 00000000000..0ad086d90c3
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/547843-1.xhtml
@@ -0,0 +1 @@
+<html xmlns="http://www.w3.org/1999/xhtml"><body><math xmlns="http://www.w3.org/1998/Math/MathML" style="display: table;"/><div style="position: fixed;"></div></body></html>
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/700031.xhtml b/tests/wpt/tests/mathml/crashtests/mozilla/700031.xhtml
new file mode 100644
index 00000000000..70f924279ef
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/700031.xhtml
@@ -0,0 +1,9 @@
+<html xmlns="http://www.w3.org/1999/xhtml"><body>
+
+<div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div>
+
+<math xmlns="http://www.w3.org/1998/Math/MathML"><mover>abcdef</mover></math>
+
+</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
+
+</body></html>
diff --git a/tests/wpt/tests/pointerevents/compat/pointerevent_touch_target_after_pointerdown_target_removed.tentative.html b/tests/wpt/tests/pointerevents/compat/pointerevent_touch_target_after_pointerdown_target_removed.tentative.html
new file mode 100644
index 00000000000..124133d25cc
--- /dev/null
+++ b/tests/wpt/tests/pointerevents/compat/pointerevent_touch_target_after_pointerdown_target_removed.tentative.html
@@ -0,0 +1,281 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Compatibility mapping with touch events after removing pointerdown target</title>
+<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>
+div {
+ min-height: 32px;
+}
+</style>
+<script>
+"use strict";
+
+addEventListener("load", () => {
+ const checkEvents = [
+ "touchstart",
+ "touchmove",
+ "touchend",
+ "touchcancel",
+ "pointerdown",
+ "pointermove",
+ "pointerup",
+ "click",
+ ];
+ let events = [];
+ function log(event) {
+ events.push({type: event.type, target: event.target});
+ }
+ for (const type of checkEvents) {
+ addEventListener(type, log, {capture: true});
+ }
+ function stringifyEvent(event) {
+ return `{ type: ${event.type}, target: ${format_value(event.target)} }`;
+ }
+ function stringifyEvents(events) {
+ if (!events.length) {
+ return "[]";
+ }
+ let result = "";
+ for (const event of events) {
+ if (result === "") {
+ result = "[ ";
+ } else {
+ result += ", ";
+ }
+ result += stringifyEvent(event);
+ }
+ result += " ]";
+ return result;
+ }
+ function ignoreEvents(events, ignoringEvents) {
+ let ret = [];
+ for (const event of events) {
+ if (!ignoringEvents.includes(event.type)) {
+ ret.push(event);
+ }
+ }
+ return ret;
+ }
+
+ /**
+ * The event target of touch events should be dispatched at dispatching the
+ * preceding `pointerdown`. Then, even after the `pointerdown` target is
+ * removed from the DOM tree, following touch events should be fired on it.
+ * However, following pointer events should be fired at the event targets
+ * under the pointer.
+ */
+
+ for (const removerType of ["pointerdown", "touchstart"]) {
+ promise_test(
+ async t => {
+ const pointerDownTarget = document.createElement("div");
+ pointerDownTarget.id = "pointerDownTarget";
+ const pointerDownTargetParent = document.createElement("div");
+ pointerDownTargetParent.id = "pointerDownTargetParent";
+ pointerDownTargetParent.appendChild(pointerDownTarget);
+ document.body.appendChild(pointerDownTargetParent);
+ const pointerDownTargetRect = pointerDownTarget.getBoundingClientRect();
+
+ events = [];
+ pointerDownTarget.addEventListener(removerType, () => {
+ pointerDownTarget.remove();
+ // Keep listening to the events on the removed target node.
+ for (const type of ["touchstart", "touchmove", "touchend"]) {
+ pointerDownTarget.addEventListener(type, log, {capture: true});
+ }
+ }, {once: true});
+ await new test_driver.Actions()
+ .addPointer("touchPointer", "touch")
+ .setPointer("touchPointer")
+ .pointerMove(pointerDownTargetRect.left + 10, pointerDownTargetRect.top + 10)
+ .pointerDown()
+ .pointerMove(pointerDownTargetRect.left + 12, pointerDownTargetRect.top + 12)
+ .pointerUp()
+ .send();
+
+ const expectedEvents = [
+ { type: "pointerdown", target: pointerDownTarget },
+ { type: "touchstart", target: pointerDownTarget },
+ { type: "pointermove", target: pointerDownTargetParent },
+ { type: "touchmove", target: pointerDownTarget },
+ { type: "pointerup", target: pointerDownTargetParent },
+ { type: "touchend", target: pointerDownTarget },
+ { type: "click", target: pointerDownTargetParent },
+ ];
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["click", "touchmove"])),
+ stringifyEvents(ignoreEvents(expectedEvents, ["click", "touchmove"]))
+ )
+ },
+ `${
+ t.name
+ }, touch events should be fired on the touchstart target even though an orphan and pointer events should be fired on the parent`
+ );
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["touchmove"])),
+ stringifyEvents(ignoreEvents(expectedEvents, ["touchmove"]))
+ )
+ },
+ `${t.name}, click event should be fired on the pointerdown target parent`
+ );
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["click"])),
+ stringifyEvents(ignoreEvents(expectedEvents, ["click"]))
+ )
+ },
+ `${t.name}, touchmove event should be fired on the pointerdown target`
+ );
+ document.body.innerHTML = "";
+ },
+ `After a ${removerType} listener removes its target`
+ );
+
+ promise_test(
+ async t => {
+ const pointerDownTarget = document.createElement("div");
+ pointerDownTarget.id = "pointerDownTarget";
+ const pointerDownTargetParent = document.createElement("div");
+ pointerDownTargetParent.id = "pointerDownTargetParent";
+ pointerDownTargetParent.appendChild(pointerDownTarget);
+ document.body.appendChild(pointerDownTargetParent);
+ const pointerDownTargetRect = pointerDownTarget.getBoundingClientRect();
+
+ events = [];
+ pointerDownTarget.addEventListener(removerType, () => {
+ pointerDownTarget.remove();
+ pointerDownTargetParent.appendChild(pointerDownTarget);
+ }, {once: true});
+ await new test_driver.Actions()
+ .addPointer("touchPointer", "touch")
+ .setPointer("touchPointer")
+ .pointerMove(pointerDownTargetRect.left + 10, pointerDownTargetRect.top + 10)
+ .pointerDown()
+ .pointerMove(pointerDownTargetRect.left + 12, pointerDownTargetRect.top + 12)
+ .pointerUp()
+ .send();
+
+ const expectedEvents = [
+ { type: "pointerdown", target: pointerDownTarget },
+ { type: "touchstart", target: pointerDownTarget },
+ { type: "pointermove", target: pointerDownTarget },
+ { type: "touchmove", target: pointerDownTarget },
+ { type: "pointerup", target: pointerDownTarget },
+ { type: "touchend", target: pointerDownTarget },
+ { type: "click", target: pointerDownTarget },
+ ];
+
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["click", "touchmove"])),
+ stringifyEvents(ignoreEvents(events, ["click", "touchmove"])),
+ )
+ },
+ `${t.name}, touch events and pointer events should be fired on the pointerdown target`
+ );
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["touchmove"])),
+ stringifyEvents(ignoreEvents(events, ["touchmove"])),
+ )
+ },
+ `${t.name}, click event should be fired on the pointerdown target`
+ );
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["click"])),
+ stringifyEvents(ignoreEvents(events, ["click"])),
+ )
+ },
+ `${t.name}, touchmove event should be fired on the pointerdown target`
+ );
+ document.body.innerHTML = "";
+ },
+ `After a ${removerType} listener removes but appends the target to same position again`
+ );
+
+ promise_test(
+ async t => {
+ const pointerDownTarget = document.createElement("div");
+ pointerDownTarget.id = "pointerDownTarget";
+ const pointerDownTargetParent = document.createElement("div");
+ pointerDownTargetParent.id = "pointerDownTargetParent";
+ pointerDownTargetParent.appendChild(pointerDownTarget);
+ document.body.appendChild(pointerDownTargetParent);
+ const pointerDownTargetRect = pointerDownTarget.getBoundingClientRect();
+
+ events = [];
+ pointerDownTarget.addEventListener(removerType, () => {
+ pointerDownTarget.remove();
+ document.body.appendChild(pointerDownTarget);
+ }, {once: true});
+ await new test_driver.Actions()
+ .addPointer("touchPointer", "touch")
+ .setPointer("touchPointer")
+ .pointerMove(pointerDownTargetRect.left + 10, pointerDownTargetRect.top + 10)
+ .pointerDown()
+ .pointerMove(pointerDownTargetRect.left + 12, pointerDownTargetRect.top + 12)
+ .pointerUp()
+ .send();
+
+ const expectedEvents = [
+ { type: "pointerdown", target: pointerDownTarget },
+ { type: "touchstart", target: pointerDownTarget },
+ { type: "pointermove", target: pointerDownTargetParent },
+ { type: "touchmove", target: pointerDownTarget },
+ { type: "pointerup", target: pointerDownTargetParent },
+ { type: "touchend", target: pointerDownTarget },
+ { type: "click", target: pointerDownTargetParent },
+ ];
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["click", "touchmove"])),
+ stringifyEvents(ignoreEvents(expectedEvents, ["click", "touchmove"]))
+ )
+ },
+ `${
+ t.name
+ }, touch events should be fired on the pointerdown target, but pointer events should be fired on the pointerdown target parent`
+ );
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["touchmove"])),
+ stringifyEvents(ignoreEvents(expectedEvents, ["touchmove"]))
+ )
+ },
+ `${t.name}, click event should be fired on the pointerdown target parent`
+ );
+ test(
+ () => {
+ assert_equals(
+ stringifyEvents(ignoreEvents(events, ["click"])),
+ stringifyEvents(ignoreEvents(expectedEvents, ["click"]))
+ )
+ },
+ `${t.name}, touchmove event should be fired on the pointerdown target parent`
+ );
+ document.body.innerHTML = "";
+ },
+ `After a ${removerType} listener moves the target to different position`
+ );
+ }
+}, {once: true});
+</script>
+<body></body>
+</html>
diff --git a/tests/wpt/tests/pointerevents/pointerevent_mouse_capture_change_hover.html b/tests/wpt/tests/pointerevents/pointerevent_mouse_capture_change_hover.html
index ef824dafd96..eb460009387 100644
--- a/tests/wpt/tests/pointerevents/pointerevent_mouse_capture_change_hover.html
+++ b/tests/wpt/tests/pointerevents/pointerevent_mouse_capture_change_hover.html
@@ -61,8 +61,8 @@ function releaseCapture(event) {
function run() {
promise_test (async() => {
- // Move to (0, 0) to reset hovering.
- await new test_driver.Actions().pointerMove(0, 0).send();
+ // Move to (1, 1) to reset hovering.
+ await new test_driver.Actions().pointerMove(1, 1).send();
receivedEventList = [];
// pointerdown at green -> set capture to green -> green receive the following moves.
@@ -93,8 +93,8 @@ function run() {
}, "Mouse down and capture to green.");
promise_test (async() => {
- // Move to (0, 0) to reset hovering.
- await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0).send();
+ // Move to (1, 1) to reset hovering.
+ await new test_driver.Actions().addPointer("mouse").pointerMove(1, 1).send();
receivedEventList = [];
// pointerdown at green -> set capture to blue -> blue receive the following moves.
@@ -129,8 +129,8 @@ function run() {
}, "Mouse down at green and capture to blue.");
promise_test (async() => {
- // Move to (0, 0) to reset hovering.
- await new test_driver.Actions().addPointer("mouse").pointerMove(0, 0).send();
+ // Move to (1, 1) to reset hovering.
+ await new test_driver.Actions().addPointer("mouse").pointerMove(1, 1).send();
receivedEventList = [];
// pointerdown at green -> set capture to green -> green receive first move -> release capture -> blue receive the next move
diff --git a/tests/wpt/tests/selection/crashtests/selection-modify-line-boundary-around-shadow.html b/tests/wpt/tests/selection/crashtests/selection-modify-line-boundary-around-shadow.html
new file mode 100644
index 00000000000..bfca0402a70
--- /dev/null
+++ b/tests/wpt/tests/selection/crashtests/selection-modify-line-boundary-around-shadow.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<script>
+document.addEventListener("DOMContentLoaded", () => {
+ const shadowRoot = b.attachShadow({mode: "closed"});
+ shadowRoot.textContent = "A";
+ getSelection().collapse(shadowRoot.firstChild, 1);
+
+ function moveCaretAndReplaceBodyWithAddress() {
+ getSelection().modify("move", "forward", "lineboundary");
+ document.documentElement.replaceChild(a, document.body);
+ }
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(moveCaretAndReplaceBodyWithAddress);
+ requestAnimationFrame(moveCaretAndReplaceBodyWithAddress);
+ requestAnimationFrame(
+ () => document.documentElement.removeAttribute("class")
+ );
+ });
+}, {once: true});
+</script>
+</head>
+<body>
+<address id="a"></address>
+<div id="b"></div>
+</body>
+</html>
diff --git a/tests/wpt/tests/selection/selection-range-after-editinghost-removed.html b/tests/wpt/tests/selection/selection-range-after-editinghost-removed.html
new file mode 100644
index 00000000000..921903062ac
--- /dev/null
+++ b/tests/wpt/tests/selection/selection-range-after-editinghost-removed.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Selection range in an editing host after the host is removed</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+addEventListener("load", () => {
+ const container = document.querySelector("div");
+ test(() => {
+ const editingHost = document.createElement("div");
+ editingHost.contentEditable = true;
+ editingHost.innerHTML = "ABC<br>";
+ container.appendChild(editingHost);
+ editingHost.focus();
+ getSelection().collapse(editingHost, 0);
+ editingHost.remove();
+ assert_equals(getSelection().focusNode, container, "focusNode should be the container");
+ assert_equals(getSelection().focusOffset, 0, "focusOffset should be 0");
+ }, "Selection range in an editing host should be collapsed where the host was after it's removed");
+
+ test(() => {
+ const wrapper = document.createElement("div");
+ wrapper.id = "wrapper";
+ const editingHost = document.createElement("div");
+ editingHost.contentEditable = true;
+ editingHost.innerHTML = "ABC<br>";
+ wrapper.appendChild(editingHost);
+ container.appendChild(wrapper);
+ editingHost.focus();
+ getSelection().collapse(editingHost, 0);
+ wrapper.remove();
+ assert_equals(getSelection().focusNode, container, "focusNode should be the container");
+ assert_equals(getSelection().focusOffset, 0, "focusOffset should be 0");
+ }, "Selection range in an editing host should be collapsed where the host was after its parent is removed");
+
+ test(() => {
+ const editingHost = document.createElement("div");
+ editingHost.contentEditable = true;
+ editingHost.innerHTML = "ABC<br>";
+ container.appendChild(editingHost);
+ editingHost.focus();
+ getSelection().collapse(editingHost, 0);
+ editingHost.replaceWith(editingHost);
+ assert_equals(getSelection().focusNode, container, "focusNode should be the container");
+ assert_equals(getSelection().focusOffset, 0, "focusOffset should be 0");
+ editingHost.remove();
+ }, "Selection range in an editing host should be collapsed where the host was after it's replaced with itself (.replaceWith)");
+
+ test(() => {
+ const editingHost = document.createElement("div");
+ editingHost.contentEditable = true;
+ editingHost.innerHTML = "ABC<br>";
+ container.appendChild(editingHost);
+ editingHost.focus();
+ getSelection().collapse(editingHost, 0);
+ container.replaceChild(editingHost, editingHost);
+ assert_equals(getSelection().focusNode, container, "focusNode should be the container");
+ assert_equals(getSelection().focusOffset, 0, "focusOffset should be 0");
+ editingHost.remove();
+ }, "Selection range in an editing host should be collapsed where the host was after it's replaced with itself (.replaceChild)");
+}, {once: true});
+</script>
+</head>
+<body><div id="container"></div></body>
+</html>
diff --git a/tests/wpt/tests/selection/selection-range-after-textcontrol-removed.html b/tests/wpt/tests/selection/selection-range-after-textcontrol-removed.html
new file mode 100644
index 00000000000..e618f10f1d8
--- /dev/null
+++ b/tests/wpt/tests/selection/selection-range-after-textcontrol-removed.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="variant" content="?textControl=text">
+<meta name="variant" content="?textControl=password">
+<meta name="variant" content="?textControl=number">
+<meta name="variant" content="?textControl=textarea">
+<title>Selection range after text control is removed</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+/**
+ * Browsers may use internal Selection and/or Range to implement the selection
+ * in text controls. They should not be appear outside the host text control
+ * after the host is removed.
+ */
+addEventListener("load", () => {
+ const textControlType = (new URLSearchParams(document.location.search)).get("mode");
+ function createTextControlElement() {
+ const textControl =
+ document.createElement(textControlType == "textarea" ? "textarea" : "input");
+ if (textControlType != "textarea") {
+ textControl.type = textControlType;
+ }
+ return textControl;
+ }
+
+ test(() => {
+ const textControl = createTextControlElement();
+ document.body.appendChild(textControl);
+ textControl.select();
+ getSelection().removeAllRanges();
+ textControl.remove();
+ assert_equals(getSelection().rangeCount, 0);
+ }, "Removing the text control should not add selection range");
+
+ test(() => {
+ const wrapper = document.createElement("div");
+ wrapper.id = "wrapper";
+ const textControl = createTextControlElement();
+ wrapper.appendChild(textControl);
+ document.body.appendChild(wrapper);
+ textControl.select();
+ getSelection().removeAllRanges();
+ wrapper.remove();
+ assert_equals(getSelection().rangeCount, 0);
+ }, "Removing the text control parent should not add selection range");
+}, {once: true});
+</script>
+</head>
+<body></body>
+</html>
diff --git a/tests/wpt/tests/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html b/tests/wpt/tests/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html
new file mode 100644
index 00000000000..e9f63715a2f
--- /dev/null
+++ b/tests/wpt/tests/selection/selection-range-in-shadow-after-the-shadow-removed.tentative.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="variant" content="?mode=closed">
+<meta name="variant" content="?mode=open">
+<title>Selection range in shadow after removing the shadow</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+addEventListener("load", () => {
+ const mode = (new URLSearchParams(document.location.search)).get("mode");
+ const container = document.querySelector("div");
+ test(() => {
+ const host = document.createElement("div");
+ host.id = "host";
+ const root = host.attachShadow({mode});
+ root.innerHTML = '<div id="in-shadow">ABC</div>';
+ container.appendChild(host);
+ getSelection().collapse(root.firstChild.firstChild, 2);
+ const range = getSelection().getRangeAt(0);
+ host.remove();
+ // The range should be kept in the shadow because it's referred by JS as
+ // a range.
+ assert_equals(range.startContainer, root.firstChild.firstChild, "startContainer should not be changed");
+ assert_equals(range.startOffset, 2, "startOffset should not be changed");
+ // It may be reasonable to just remove the range in removed shadow.
+ // This matches with move-selection-range-into-different-root.tentative.html
+ assert_equals(getSelection().rangeCount, 0, "Selection should not have the range in removed shadow");
+ }, "Selection range in shadow should not be as a selection range after the host is removed");
+
+ test(() => {
+ const wrapper = document.createElement("div");
+ wrapper.id = "wrapper";
+ const host = document.createElement("div");
+ host.id = "host";
+ const root = host.attachShadow({mode});
+ root.innerHTML = '<div id="in-shadow">ABC</div>';
+ wrapper.appendChild(host);
+ container.appendChild(wrapper);
+ getSelection().collapse(root.firstChild.firstChild, 2);
+ const range = getSelection().getRangeAt(0);
+ wrapper.remove();
+ // The range should be kept in the shadow because it's referred by JS as
+ // a range.
+ assert_equals(range.startContainer, root.firstChild.firstChild, "startContainer should not be changed");
+ assert_equals(range.startOffset, 2, "startOffset should not be changed");
+ // It may be reasonable to just remove the range in removed shadow.
+ // This matches with move-selection-range-into-different-root.tentative.html
+ assert_equals(getSelection().rangeCount, 0, "Selection should not have the range in removed shadow");
+ }, "Selection range in shadow should not be as a selection range after the host parent is removed");
+
+ test(() => {
+ const host = document.createElement("div");
+ host.id = "host";
+ const root = host.attachShadow({mode});
+ root.innerHTML = '<div id="in-shadow">ABC</div>';
+ container.appendChild(host);
+ getSelection().collapse(root.firstChild.firstChild, 2);
+ const range = getSelection().getRangeAt(0);
+ host.replaceWith(host);
+ // The range should be kept in the shadow because it's referred by JS as
+ // a range.
+ assert_equals(range.startContainer, root.firstChild.firstChild, "startContainer should not be changed");
+ assert_equals(range.startOffset, 2, "startOffset should not be changed");
+ // It may be reasonable to just remove the range in removed shadow.
+ // This matches with move-selection-range-into-different-root.tentative.html
+ assert_equals(getSelection().rangeCount, 0, "Selection should not have the range in removed shadow");
+ host.remove();
+ }, "Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceWith)");
+
+ test(() => {
+ const host = document.createElement("div");
+ host.id = "host";
+ const root = host.attachShadow({mode});
+ root.innerHTML = '<div id="in-shadow">ABC</div>';
+ container.appendChild(host);
+ getSelection().collapse(root.firstChild.firstChild, 2);
+ const range = getSelection().getRangeAt(0);
+ container.replaceChild(host, host);
+ // The range should be kept in the shadow because it's referred by JS as
+ // a range.
+ assert_equals(range.startContainer, root.firstChild.firstChild, "startContainer should not be changed");
+ assert_equals(range.startOffset, 2, "startOffset should not be changed");
+ // It may be reasonable to just remove the range in removed shadow.
+ // This matches with move-selection-range-into-different-root.tentative.html
+ assert_equals(getSelection().rangeCount, 0, "Selection should not have the range in removed shadow");
+ host.remove();
+ }, "Selection range in shadow should not be as a selection range after the host is replaced with itself (.replaceChild");
+}, {once: true});
+</script>
+</head>
+<body><div id="container"></div></body>
+</html>
diff --git a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js
index 5a1c53671b9..c3aef4272f2 100644
--- a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js
+++ b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js
@@ -52,6 +52,12 @@ const routerRules = {
};
return {condition: addOrCondition({}, 0), source: 'network'};
})(),
+ 'condition-invalid-router-size': [...Array(512)].map((val, i) => {
+ return {
+ condition: {urlPattern: `/foo-${i}`},
+ source: 'network'
+ };
+ }),
'condition-request-destination-script-network':
[{condition: {requestDestination: 'script'}, source: 'network'}],
'condition-or-source-network': [{
diff --git a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-invalid-rules.https.html b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-invalid-rules.https.html
index 86a50215f2e..9ef7cfdc9f3 100644
--- a/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-invalid-rules.https.html
+++ b/tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-invalid-rules.https.html
@@ -17,6 +17,8 @@ const ROUTER_RULE_KEY_INVALID_REQUEST_METHOD =
'condition-invalid-request-method';
const ROUTER_RULE_KEY_INVALID_OR_CONDITION_DEPTH =
'condition-invalid-or-condition-depth';
+const ROUTER_RULE_KEY_INVALID_ROUTER_SIZE =
+ 'condition-invalid-router-size';
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_REQUEST_METHOD);
@@ -32,5 +34,12 @@ promise_test(async t => {
assert_equals(errors.length, 1);
}, 'addRoutes should raise if or condition exceeds the depth limit');
+promise_test(async t => {
+ const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_ROUTER_SIZE);
+ t.add_cleanup(() => {reset_info_in_worker(worker)});
+ const {errors} = await get_info_from_worker(worker);
+ assert_equals(errors.length, 1);
+}, 'addRoutes should raise if the number of router rules exceeds the length limit');
+
</script>
</body>
diff --git a/tests/wpt/tests/svg/import/animate-elem-30-t-manual.svg b/tests/wpt/tests/svg/import/animate-elem-30-t-manual.svg
index d27f9a1d6da..bfc4cb48612 100644
--- a/tests/wpt/tests/svg/import/animate-elem-30-t-manual.svg
+++ b/tests/wpt/tests/svg/import/animate-elem-30-t-manual.svg
@@ -95,7 +95,7 @@
<defs>
<rect id="rectID" x="10" y="60" width="60" height="20" fill="blue" stroke="black" stroke-width="2">
- <animateColor attributeName="fill" from="white" to="rgb(16, 93, 140)" begin="0" dur="3" fill="freeze"/>
+ <animate attributeName="fill" from="white" to="rgb(16, 93, 140)" begin="0" dur="3" fill="freeze"/>
<animate attributeName="height" from="20" to="40" begin="0" dur="3" fill="freeze"/>
</rect>
</defs>
diff --git a/tests/wpt/tests/svg/import/animate-elem-85-t-manual.svg b/tests/wpt/tests/svg/import/animate-elem-85-t-manual.svg
index 6c09ffb3b59..c5ded325cd8 100644
--- a/tests/wpt/tests/svg/import/animate-elem-85-t-manual.svg
+++ b/tests/wpt/tests/svg/import/animate-elem-85-t-manual.svg
@@ -15,7 +15,7 @@
version="$Revision: 1.8 $" testname="$RCSfile: animate-elem-85-t.svg,v $">
<d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/animate.html#Animation">
<p>
- The first subtest tests animateColor with 'to' and 'from' values including
+ The first subtest tests animate with 'to' and 'from' values including
currentColor. The second subtest checks that the value of currentColor is the
current animated value of the color property, by animating the color property
at the same time as animating fill with a 'from' or 'to' value of currentColor.
@@ -50,29 +50,29 @@
<g id="subtest_1">
<rect fill="#f00" x="30" y="50" height="100" width="90">
<!-- basic test from two numeric hex values -->
- <animateColor attributeName="fill" from="#000000" to="#008000" begin="0s" dur="5s" fill="freeze"/>
+ <animate attributeName="fill" from="#000000" to="#008000" begin="0s" dur="5s" fill="freeze"/>
</rect>
<rect fill="#f00" x="140" y="50" height="100" width="90">
<!-- same, check color keywords accepted in animations -->
- <animateColor attributeName="fill" from="#000000" to="green" begin="0s" dur="5s" fill="freeze"/>
+ <animate attributeName="fill" from="#000000" to="green" begin="0s" dur="5s" fill="freeze"/>
</rect>
<rect color="green" fill="#f00" x="250" y="50" height="100" width="90">
<!-- same, static value of currentColor in 'to' -->
- <animateColor attributeName="fill" from="#000000" to="currentColor" begin="0s" dur="5s" fill="freeze"/>
+ <animate attributeName="fill" from="#000000" to="currentColor" begin="0s" dur="5s" fill="freeze"/>
</rect>
<rect color="black" fill="#f00" x="360" y="50" height="100" width="90">
<!-- same, static value of currentColor in 'from' -->
- <animateColor attributeName="fill" to="#008000" from="currentColor" begin="0s" dur="5s" fill="freeze"/>
+ <animate attributeName="fill" to="#008000" from="currentColor" begin="0s" dur="5s" fill="freeze"/>
</rect>
</g>
<g id="subtest_2">
<rect color="black" fill="blue" x="100" y="180" height="60" width="280">
- <animateColor attributeName="color" to="cyan" from="blue" begin="5s" dur="5s" fill="freeze"/>
- <animateColor attributeName="fill" from="#008000" to="currentColor" begin="5s" dur="5s" fill="freeze"/>
+ <animate attributeName="color" to="cyan" from="blue" begin="5s" dur="5s" fill="freeze"/>
+ <animate attributeName="fill" from="#008000" to="currentColor" begin="5s" dur="5s" fill="freeze"/>
</rect>
<rect color="black" fill="blue" x="100" y="245" height="60" width="280">
- <animateColor attributeName="fill" from="#008000" to="currentColor" begin="5s" dur="5s" fill="freeze"/>
- <animateColor attributeName="color" to="cyan" from="blue" begin="5s" dur="5s" fill="freeze"/>
+ <animate attributeName="fill" from="#008000" to="currentColor" begin="5s" dur="5s" fill="freeze"/>
+ <animate attributeName="color" to="cyan" from="blue" begin="5s" dur="5s" fill="freeze"/>
</rect>
<!--
color fill
diff --git a/tests/wpt/tests/svg/import/animate-pservers-grad-01-b-manual.svg b/tests/wpt/tests/svg/import/animate-pservers-grad-01-b-manual.svg
index 98456fb0736..15672bac5fc 100644
--- a/tests/wpt/tests/svg/import/animate-pservers-grad-01-b-manual.svg
+++ b/tests/wpt/tests/svg/import/animate-pservers-grad-01-b-manual.svg
@@ -47,8 +47,8 @@
<g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
<defs>
<g id="g0" stop-color="yellow" stop-opacity="0" color="yellow">
- <animateColor id="a1" attributeName="stop-color" from="red" to="green" dur="5" fill="freeze"/>
- <animateColor id="a2" attributeName="color" from="yellow" to="green" dur="5" fill="freeze"/>
+ <animate id="a1" attributeName="stop-color" from="red" to="green" dur="5" fill="freeze"/>
+ <animate id="a2" attributeName="color" from="yellow" to="green" dur="5" fill="freeze"/>
<animate id="a3" attributeName="stop-opacity" from="0.5" to="1" dur="5" fill="freeze"/>
<linearGradient id="MyGradient1" stop-color="inherit">
@@ -73,7 +73,7 @@
</g>
</defs>
<g id="g1" stop-color="blue">
- <animateColor id="a4" attributeName="stop-color" from="blue" to="red" dur="5" fill="freeze"/>
+ <animate id="a4" attributeName="stop-color" from="blue" to="red" dur="5" fill="freeze"/>
<rect id="r1" fill="url(#MyGradient1)" width="100" height="100" x="50" y="50"/>
</g>
<g id="g2" stop-opacity="1">
@@ -81,12 +81,12 @@
<rect id="r2" fill="url(#MyGradient2)" width="100" height="100" x="200" y="50"/>
</g>
<g id="g3" stop-opacity="1" stop-color="blue">
- <animateColor id="a6" attributeName="stop-color" from="blue" to="red" dur="5" fill="freeze"/>
+ <animate id="a6" attributeName="stop-color" from="blue" to="red" dur="5" fill="freeze"/>
<animate id="a7" attributeName="stop-opacity" from="1" to="0" dur="5" fill="freeze"/>
<rect id="r3" fill="url(#MyGradient3)" width="100" height="100" x="50" y="200"/>
</g>
<g id="g4" color="blue">
- <animateColor id="a7" attributeName="color" from="blue" to="red" dur="5" fill="freeze"/>
+ <animate id="a7" attributeName="color" from="blue" to="red" dur="5" fill="freeze"/>
<rect id="r4" fill="url(#MyGradient4)" width="100" height="100" x="200" y="200"/>
</g>
</g>
diff --git a/tests/wpt/tests/tools/ci/tc/tasks/test.yml b/tests/wpt/tests/tools/ci/tc/tasks/test.yml
index d62312737c8..c172e6b7314 100644
--- a/tests/wpt/tests/tools/ci/tc/tasks/test.yml
+++ b/tests/wpt/tests/tools/ci/tc/tasks/test.yml
@@ -232,7 +232,7 @@ tasks:
browser: servo
channel: nightly
use:
- - trigger-weekly
+ - trigger-daily
- trigger-push
- vars:
browser: firefox_android
diff --git a/tests/wpt/tests/tools/ci/tc/tests/test_valid.py b/tests/wpt/tests/tools/ci/tc/tests/test_valid.py
index 6960a2cc47e..62bb09a1c3c 100644
--- a/tests/wpt/tests/tools/ci/tc/tests/test_valid.py
+++ b/tests/wpt/tests/tools/ci/tc/tests/test_valid.py
@@ -295,6 +295,22 @@ def test_verify_payload():
'wpt-webkitgtk_minibrowser-nightly-testharness-14',
'wpt-webkitgtk_minibrowser-nightly-testharness-15',
'wpt-webkitgtk_minibrowser-nightly-testharness-16',
+ 'wpt-servo-nightly-testharness-1',
+ 'wpt-servo-nightly-testharness-2',
+ 'wpt-servo-nightly-testharness-3',
+ 'wpt-servo-nightly-testharness-4',
+ 'wpt-servo-nightly-testharness-5',
+ 'wpt-servo-nightly-testharness-6',
+ 'wpt-servo-nightly-testharness-7',
+ 'wpt-servo-nightly-testharness-8',
+ 'wpt-servo-nightly-testharness-9',
+ 'wpt-servo-nightly-testharness-10',
+ 'wpt-servo-nightly-testharness-11',
+ 'wpt-servo-nightly-testharness-12',
+ 'wpt-servo-nightly-testharness-13',
+ 'wpt-servo-nightly-testharness-14',
+ 'wpt-servo-nightly-testharness-15',
+ 'wpt-servo-nightly-testharness-16',
'wpt-firefox_android-nightly-testharness-1',
'wpt-firefox_android-nightly-testharness-2',
'wpt-firefox_android-nightly-testharness-3',
@@ -343,6 +359,12 @@ def test_verify_payload():
'wpt-webkitgtk_minibrowser-nightly-reftest-4',
'wpt-webkitgtk_minibrowser-nightly-reftest-5',
'wpt-webkitgtk_minibrowser-nightly-reftest-6',
+ 'wpt-servo-nightly-reftest-1',
+ 'wpt-servo-nightly-reftest-2',
+ 'wpt-servo-nightly-reftest-3',
+ 'wpt-servo-nightly-reftest-4',
+ 'wpt-servo-nightly-reftest-5',
+ 'wpt-servo-nightly-reftest-6',
'wpt-firefox_android-nightly-reftest-1',
'wpt-firefox_android-nightly-reftest-2',
'wpt-firefox_android-nightly-reftest-3',
@@ -357,12 +379,15 @@ def test_verify_payload():
'wpt-chrome-stable-wdspec-2',
'wpt-webkitgtk_minibrowser-nightly-wdspec-1',
'wpt-webkitgtk_minibrowser-nightly-wdspec-2',
+ 'wpt-servo-nightly-wdspec-1',
+ 'wpt-servo-nightly-wdspec-2',
'wpt-firefox_android-nightly-wdspec-1',
'wpt-firefox_android-nightly-wdspec-2',
'wpt-firefox-stable-crashtest-1',
'wpt-chromium-nightly-crashtest-1',
'wpt-chrome-stable-crashtest-1',
'wpt-webkitgtk_minibrowser-nightly-crashtest-1',
+ 'wpt-servo-nightly-crashtest-1',
'wpt-firefox_android-nightly-crashtest-1',
'wpt-firefox-stable-print-reftest-1',
'wpt-chromium-nightly-print-reftest-1',
diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py
index cdb5e11816d..f2d2fad858c 100644
--- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py
+++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/browsing_context.py
@@ -3,7 +3,7 @@ from enum import Enum
from typing import Any, Dict, List, Mapping, MutableMapping, Optional, Union
from ._module import BidiModule, command
-from .script import OwnershipModel, SerializationOptions
+from .script import SerializationOptions
from ..undefined import UNDEFINED, Undefined
@@ -140,17 +140,11 @@ class BrowsingContext(BidiModule):
context: str,
locator: Mapping[str, Any],
max_node_count: Optional[int] = None,
- ownership: Optional[OwnershipModel] = None,
- sandbox: Optional[str] = None,
serialization_options: Optional[SerializationOptions] = None,
start_nodes: Optional[List[Mapping[str, Any]]] = None) -> Mapping[str, Any]:
params: MutableMapping[str, Any] = {"context": context, "locator": locator}
if max_node_count is not None:
params["maxNodeCount"] = max_node_count
- if ownership is not None:
- params["ownership"] = ownership
- if sandbox is not None:
- params["sandbox"] = sandbox
if serialization_options is not None:
params["serializationOptions"] = serialization_options
if start_nodes is not None:
diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py
index 737426a5d54..01855766d8c 100644
--- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py
+++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/script.py
@@ -3,6 +3,7 @@ from typing import Any, Dict, List, Mapping, MutableMapping, Optional, Union
from ..error import UnknownErrorException
from ._module import BidiModule, command
+from ..undefined import UNDEFINED, Undefined
class ScriptEvaluateResultException(Exception):
@@ -78,15 +79,15 @@ Target = Union[RealmTarget, ContextTarget]
class SerializationOptions(Dict[str, Any]):
def __init__(
self,
- max_dom_depth: Optional[int] = None,
- max_object_depth: Optional[int] = None,
- include_shadow_tree: Optional[str] = None
+ max_dom_depth: Union[Optional[int], Undefined] = UNDEFINED,
+ max_object_depth: Union[Optional[int], Undefined] = UNDEFINED,
+ include_shadow_tree: Union[Optional[str], Undefined] = UNDEFINED
):
- if max_dom_depth is not None:
+ if max_dom_depth is not UNDEFINED:
self["maxDomDepth"] = max_dom_depth
- if max_object_depth is not None:
+ if max_object_depth is not UNDEFINED:
self["maxObjectDepth"] = max_object_depth
- if include_shadow_tree is not None:
+ if include_shadow_tree is not UNDEFINED and include_shadow_tree is not None:
self["includeShadowTree"] = include_shadow_tree
diff --git a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/session.py b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/session.py
index fe1c0385105..725aab1bec7 100644
--- a/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/session.py
+++ b/tests/wpt/tests/tools/webdriver/webdriver/bidi/modules/session.py
@@ -40,9 +40,9 @@ class Session(BidiModule):
@command
def unsubscribe(self,
- events: Optional[List[str]] = None,
+ events: List[str],
contexts: Optional[List[str]] = None) -> Mapping[str, Any]:
- params: MutableMapping[str, Any] = {"events": events if events is not None else []}
+ params: MutableMapping[str, Any] = {"events": events}
if contexts is not None:
params["contexts"] = contexts
return params
diff --git a/tests/wpt/tests/tools/wpt/android.py b/tests/wpt/tests/tools/wpt/android.py
index 15a4c413d5b..f25350db078 100644
--- a/tests/wpt/tests/tools/wpt/android.py
+++ b/tests/wpt/tests/tools/wpt/android.py
@@ -325,7 +325,16 @@ def start(logger, dest=None, reinstall=False, prompt=True, device_serial=None):
emulator.start()
timer = threading.Timer(300, cancel_start(threading.get_ident()))
timer.start()
- emulator.wait_for_start()
+ for i in range(10):
+ logger.info(f"Wait for emulator to start attempt {i + 1}/10")
+ try:
+ emulator.wait_for_start()
+ except Exception:
+ import traceback
+ logger.warning(f"""emulator.wait_for_start() failed:
+{traceback.format_exc()}""")
+ else:
+ break
timer.cancel()
return emulator
diff --git a/tests/wpt/tests/trusted-types/idlharness.tentative.window.js.html b/tests/wpt/tests/trusted-types/idlharness.window.js
index 07847fdb39e..07847fdb39e 100644
--- a/tests/wpt/tests/trusted-types/idlharness.tentative.window.js.html
+++ b/tests/wpt/tests/trusted-types/idlharness.window.js
diff --git a/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html b/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html
index f50ffaad347..b5c32f26d8d 100644
--- a/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html
+++ b/tests/wpt/tests/web-animations/responsive/toggle-animated-iframe-visibility.html
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait">
<meta name="assert" content="This should resume the animation after unhiding the iframe.">
+<meta name="fuzzy" content="1;0-50">
<title>CSS Test (Animations): Unhiding iframe visibility should restart animation. </title>
<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=616270">
<link rel="match" href="toggle-animated-iframe-visibility-ref.html">
diff --git a/tests/wpt/tests/webcodecs/audio-decoder.https.any.js b/tests/wpt/tests/webcodecs/audio-decoder.https.any.js
index 79ba22157ab..666d3a159f1 100644
--- a/tests/wpt/tests/webcodecs/audio-decoder.https.any.js
+++ b/tests/wpt/tests/webcodecs/audio-decoder.https.any.js
@@ -1,6 +1,10 @@
// META: global=window,dedicatedworker
// META: script=/webcodecs/utils.js
+
+const detachedArrayBuffer = new ArrayBuffer(4);
+var b = detachedArrayBuffer.transferToFixedLength();
+
const invalidConfigs = [
{
comment: 'Missing codec',
@@ -47,6 +51,15 @@ const invalidConfigs = [
numberOfChannels: 0,
},
},
+ {
+ comment: 'Valid configuration except detached description',
+ config: {
+ codec: 'opus',
+ sampleRate: 8000,
+ numberOfChannels: 1,
+ description: detachedArrayBuffer
+ },
+ },
];
invalidConfigs.forEach(entry => {
diff --git a/tests/wpt/tests/webcodecs/video-decoder.https.any.js b/tests/wpt/tests/webcodecs/video-decoder.https.any.js
index 77a610bd4ea..5b3193b8c37 100644
--- a/tests/wpt/tests/webcodecs/video-decoder.https.any.js
+++ b/tests/wpt/tests/webcodecs/video-decoder.https.any.js
@@ -1,5 +1,9 @@
// META: global=window,dedicatedworker
// META: script=/webcodecs/utils.js
+//
+
+const detachedArrayBuffer = new ArrayBuffer(4);
+var b = detachedArrayBuffer.transferToFixedLength();
const invalidConfigs = [
{
@@ -10,6 +14,10 @@ const invalidConfigs = [
comment: 'Empty codec',
config: {codec: ''},
},
+ {
+ comment: 'Valid codec, detached description',
+ config: {codec: 'vp8', description: detachedArrayBuffer},
+ },
]; // invalidConfigs
invalidConfigs.forEach(entry => {
diff --git a/tests/wpt/tests/webcodecs/video-encoder-config.https.any.js b/tests/wpt/tests/webcodecs/video-encoder-config.https.any.js
index 5011bfdd0a8..8d554e4f4db 100644
--- a/tests/wpt/tests/webcodecs/video-encoder-config.https.any.js
+++ b/tests/wpt/tests/webcodecs/video-encoder-config.https.any.js
@@ -90,6 +90,14 @@ const validButUnsupportedConfigs = [
},
},
{
+ comment: 'VP8 codec string not accepted by Web Codecs',
+ config: {
+ codec: 'vp08.00.10.08',
+ width: 640,
+ height: 480,
+ },
+ },
+ {
comment: 'Codec with bad casing',
config: {
codec: 'vP8',
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
index dbacac8cf89..51b3c64b42d 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
@@ -53,6 +53,13 @@ def assert_browsing_context(
assert info["userContext"] == user_context
+async def assert_document_status(bidi_session, context, visible, focused):
+ state = "visible" if visible else "hidden"
+
+ assert await get_visibility_state(bidi_session, context) == state
+ assert await get_document_focus(bidi_session, context) is focused
+
+
def assert_navigation_info(event, expected_navigation_info):
recursive_compare(
{
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/__init__.py
index 5d0b52a5ac4..86f9ace3ee2 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/__init__.py
@@ -3,7 +3,7 @@ from typing import Any, Mapping
from webdriver.bidi.modules.script import ContextTarget
-async def is_selector_focused(bidi_session, context: Mapping[str, Any], selector: str) -> bool:
+async def is_element_focused(bidi_session, context: Mapping[str, Any], selector: str) -> bool:
result = await bidi_session.script.call_function(
function_declaration="""(selector) => {
return document.querySelector(selector) === document.activeElement;
@@ -13,4 +13,5 @@ async def is_selector_focused(bidi_session, context: Mapping[str, Any], selector
],
target=ContextTarget(context["context"]),
await_promise=False)
+
return result["value"]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/activate.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/activate.py
index 0abbbbac38e..f6e5b9d27a8 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/activate.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/activate/activate.py
@@ -1,95 +1,62 @@
import pytest
from webdriver.bidi.modules.script import ContextTarget
-from . import is_selector_focused
-from .. import get_document_focus, get_visibility_state
+from . import is_element_focused
+from .. import assert_document_status
pytestmark = pytest.mark.asyncio
-async def test_activate(bidi_session, new_tab, top_context):
- assert await get_document_focus(bidi_session, top_context) is False
-
- await bidi_session.browsing_context.activate(context=top_context["context"])
-
- assert await get_visibility_state(bidi_session, top_context) == 'visible'
- assert await get_document_focus(bidi_session, top_context) is True
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+async def test_switch_between_contexts(bidi_session, top_context, type_hint):
+ is_window = type_hint == "window"
+ new_context = await bidi_session.browsing_context.create(type_hint=type_hint)
-async def test_deactivates_other_contexts(bidi_session, new_tab, top_context):
await bidi_session.browsing_context.activate(context=top_context["context"])
+ await assert_document_status(bidi_session, top_context, visible=True, focused=True)
+ await assert_document_status(bidi_session, new_context, visible=is_window, focused=False)
- assert await get_visibility_state(bidi_session, top_context) == 'visible'
- assert await get_document_focus(bidi_session, top_context) is True
+ await bidi_session.browsing_context.activate(context=new_context["context"])
+ await assert_document_status(bidi_session, top_context, visible=is_window, focused=False)
+ await assert_document_status(bidi_session, new_context, visible=True, focused=True)
- assert await get_document_focus(bidi_session, new_tab) is False
-
- await bidi_session.browsing_context.activate(context=new_tab["context"])
- assert await get_document_focus(bidi_session, top_context) is False
-
- assert await get_visibility_state(bidi_session, new_tab) == 'visible'
- assert await get_document_focus(bidi_session, new_tab) is True
-
-
-async def test_keeps_focused_area(bidi_session, inline, new_tab, top_context):
- await bidi_session.browsing_context.activate(context=new_tab["context"])
- assert await get_visibility_state(bidi_session, new_tab) == 'visible'
- assert await get_document_focus(bidi_session, new_tab) is True
-
- await bidi_session.browsing_context.navigate(context=new_tab["context"],
- url=inline("<textarea autofocus></textarea><input>"),
- wait="complete")
+async def test_keeps_element_focused(bidi_session, inline, new_tab, top_context):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=inline("<textarea autofocus></textarea><input>"),
+ wait="complete")
await bidi_session.script.evaluate(
expression="""document.querySelector("input").focus()""",
target=ContextTarget(new_tab["context"]),
await_promise=False)
- assert await is_selector_focused(bidi_session, new_tab, "input")
+ assert await is_element_focused(bidi_session, new_tab, "input")
await bidi_session.browsing_context.activate(context=top_context["context"])
- assert await get_document_focus(bidi_session, new_tab) is False
- assert await is_selector_focused(bidi_session, new_tab, "input")
+ assert await is_element_focused(bidi_session, new_tab, "input")
await bidi_session.browsing_context.activate(context=new_tab["context"])
- assert await get_visibility_state(bidi_session, new_tab) == 'visible'
- assert await get_document_focus(bidi_session, new_tab) is True
- assert await is_selector_focused(bidi_session, new_tab, "input")
+ assert await is_element_focused(bidi_session, new_tab, "input")
-async def test_double_activation(bidi_session, inline, new_tab):
- await bidi_session.browsing_context.activate(context=new_tab["context"])
- assert await get_visibility_state(bidi_session, new_tab) == 'visible'
- assert await get_document_focus(bidi_session, new_tab) is True
+async def test_multiple_activation(bidi_session, inline, new_tab):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=inline(
+ "<input><script>document.querySelector('input').focus();</script>"),
+ wait="complete")
- await bidi_session.browsing_context.navigate(context=new_tab["context"],
- url=inline("<input><script>document.querySelector('input').focus();</script>"),
- wait="complete")
- assert await is_selector_focused(bidi_session, new_tab, "input")
+ await assert_document_status(bidi_session, new_tab, visible=True, focused=True)
+ assert await is_element_focused(bidi_session, new_tab, "input")
await bidi_session.browsing_context.activate(context=new_tab["context"])
- assert await get_visibility_state(bidi_session, new_tab) == 'visible'
- assert await get_document_focus(bidi_session, new_tab) is True
- assert await is_selector_focused(bidi_session, new_tab, "input")
+ await assert_document_status(bidi_session, new_tab, visible=True, focused=True)
+ assert await is_element_focused(bidi_session, new_tab, "input")
# Activate again.
await bidi_session.browsing_context.activate(context=new_tab["context"])
- assert await get_visibility_state(bidi_session, new_tab) == 'visible'
- assert await get_document_focus(bidi_session, new_tab) is True
- assert await is_selector_focused(bidi_session, new_tab, "input")
-
-
-async def test_activate_window(bidi_session):
- new_window_1 = await bidi_session.browsing_context.create(type_hint="window")
- new_window_2 = await bidi_session.browsing_context.create(type_hint="window")
-
- assert await get_visibility_state(bidi_session, new_window_2) == 'visible'
- assert await get_document_focus(bidi_session, new_window_2) is True
-
- assert await get_document_focus(bidi_session, new_window_1) is False
-
- await bidi_session.browsing_context.activate(context=new_window_1["context"])
-
- assert await get_visibility_state(bidi_session, new_window_1) == 'visible'
- assert await get_document_focus(bidi_session, new_window_1) is True
+ await assert_document_status(bidi_session, new_tab, visible=True, focused=True)
+ assert await is_element_focused(bidi_session, new_tab, "input")
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
index d77209842c1..35692a96845 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
@@ -92,6 +92,37 @@ async def test_evaluate_window_open_with_url(bidi_session, subscribe_events, wai
)
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+async def test_event_emitted_before_create_returns(
+ bidi_session, subscribe_events, type_hint
+):
+ events = []
+
+ async def on_event(method, data):
+ events.append(data)
+
+ remove_listener = bidi_session.add_event_listener(CONTEXT_CREATED_EVENT, on_event)
+
+ await subscribe_events([CONTEXT_CREATED_EVENT])
+ context = await bidi_session.browsing_context.create(type_hint=type_hint)
+
+ # If the browsingContext.contextCreated event was emitted after the
+ # browsingContext.create command resolved, the array would most likely be
+ # empty at this point.
+ assert len(events) == 1
+
+ assert_browsing_context(
+ events[0],
+ context["context"],
+ children=None,
+ url="about:blank",
+ parent=None,
+ user_context="default",
+ )
+
+ remove_listener()
+
+
async def test_navigate_creates_iframes(bidi_session, subscribe_events, top_context, test_page_multiple_frames):
events = []
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/create/type.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/create/type.py
index 55ce7b44282..cc6d7e51ab6 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/create/type.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/create/type.py
@@ -1,19 +1,27 @@
import pytest
-from .. import assert_browsing_context
from webdriver.bidi.modules.script import ContextTarget
+from .. import assert_browsing_context, assert_document_status
+
pytestmark = pytest.mark.asyncio
-@pytest.mark.parametrize("value", ["tab", "window"])
-async def test_type(bidi_session, value):
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+async def test_type(bidi_session, top_context, type_hint):
+ is_window = type_hint == "window"
+
contexts = await bidi_session.browsing_context.get_tree(max_depth=0)
assert len(contexts) == 1
- new_context = await bidi_session.browsing_context.create(type_hint=value)
+ await assert_document_status(bidi_session, top_context, visible=True, focused=True)
+
+ new_context = await bidi_session.browsing_context.create(type_hint=type_hint)
assert contexts[0]["context"] != new_context["context"]
+ await assert_document_status(bidi_session, new_context, visible=True, focused=True)
+ await assert_document_status(bidi_session, top_context, visible=is_window, focused=False)
+
# Check there is an additional browsing context
contexts = await bidi_session.browsing_context.get_tree(max_depth=0)
assert len(contexts) == 2
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py
index ff00de91ed0..ecd3173e878 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/invalid.py
@@ -93,41 +93,6 @@ async def test_params_max_node_count_invalid_value(bidi_session, inline, top_con
)
-@pytest.mark.parametrize("value", [False, 42, {}, []])
-async def test_params_ownership_invalid_type(bidi_session, inline, top_context, value):
- await navigate_to_page(bidi_session, inline, top_context)
-
- with pytest.raises(error.InvalidArgumentException):
- await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div" },
- ownership=value
- )
-
-
-async def test_params_ownership_invalid_value(bidi_session, inline, top_context):
- await navigate_to_page(bidi_session, inline, top_context)
-
- with pytest.raises(error.InvalidArgumentException):
- await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div" },
- ownership="foo"
- )
-
-
-@pytest.mark.parametrize("value", [False, 42, {}, []])
-async def test_params_sandbox_invalid_type(bidi_session, inline, top_context, value):
- await navigate_to_page(bidi_session, inline, top_context)
-
- with pytest.raises(error.InvalidArgumentException):
- await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div" },
- sandbox=value
- )
-
-
@pytest.mark.parametrize("value", [False, 42, "foo", []])
async def test_params_serialization_options_invalid_type(bidi_session, inline, top_context, value):
await navigate_to_page(bidi_session, inline, top_context)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py
deleted file mode 100644
index b1830c740a9..00000000000
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/ownership.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import pytest
-
-from ... import assert_handle
-
-
-@pytest.mark.parametrize("ownership,has_handle", [
- ("root", True),
- ("none", False)
-])
-@pytest.mark.asyncio
-async def test_root_ownership_of_located_nodes(bidi_session, inline, top_context, ownership, has_handle):
- url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""")
- await bidi_session.browsing_context.navigate(
- context=top_context["context"], url=url, wait="complete"
- )
-
- result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- ownership=ownership
- )
-
- assert len(result["nodes"]) == 1
- result_node = result["nodes"][0]
-
- assert_handle(result_node, has_handle)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py
deleted file mode 100644
index efa431bf190..00000000000
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/locate_nodes/sandbox.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import pytest
-
-from webdriver.bidi.modules.script import ContextTarget,OwnershipModel
-
-
-@pytest.mark.asyncio
-async def test_locate_nodes_in_sandbox(bidi_session, inline, top_context):
- url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""")
- await bidi_session.browsing_context.navigate(
- context=top_context["context"], url=url, wait="complete"
- )
-
- result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- sandbox="sandbox"
- )
-
- assert len(result["nodes"]) == 1
- node_id = result["nodes"][0]["sharedId"]
-
- # Since the node was found in the sandbox, it should be available
- # to scripts running in the sandbox.
- result_in_sandbox = await bidi_session.script.call_function(
- function_declaration="function(){ return arguments[0]; }",
- target=ContextTarget(top_context["context"], "sandbox"),
- await_promise=True,
- arguments=[
- {
- "sharedId": node_id
- }
- ]
- )
- assert result_in_sandbox["type"] == "node"
- assert result_in_sandbox["sharedId"] == node_id
-
-
-@pytest.mark.asyncio
-async def test_locate_same_node_in_different_sandboxes_returns_same_id(bidi_session, inline, top_context):
- url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""")
- await bidi_session.browsing_context.navigate(
- context=top_context["context"], url=url, wait="complete"
- )
-
- first_result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- sandbox="first_sandbox"
- )
-
- assert len(first_result["nodes"]) == 1
-
- second_result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- sandbox="second_sandbox"
- )
- assert len(second_result["nodes"]) == 1
- assert first_result["nodes"][0]["sharedId"] == second_result["nodes"][0]["sharedId"]
-
-
-@pytest.mark.asyncio
-async def test_locate_same_node_in_default_sandbox_returns_same_id_as_sandbox(bidi_session, inline, top_context):
- url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""")
- await bidi_session.browsing_context.navigate(
- context=top_context["context"], url=url, wait="complete"
- )
-
- result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" }
- )
-
- assert len(result["nodes"]) == 1
- node_id = result["nodes"][0]["sharedId"]
-
- result_in_sandbox = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- sandbox="sandbox"
- )
- assert len(result_in_sandbox["nodes"]) == 1
- assert result_in_sandbox["nodes"][0]["sharedId"] == node_id
-
-
-@pytest.mark.asyncio
-async def test_locate_same_node_in_different_sandboxes_with_root_ownership_returns_different_handles(bidi_session, inline, top_context):
- url = inline("""<div data-class="one">foobarBARbaz</div><div data-class="two">foobarBARbaz</div>""")
- await bidi_session.browsing_context.navigate(
- context=top_context["context"], url=url, wait="complete"
- )
-
- first_result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- ownership=OwnershipModel.ROOT.value,
- sandbox="first_sandbox"
- )
-
- assert len(first_result["nodes"]) == 1
-
- second_result = await bidi_session.browsing_context.locate_nodes(
- context=top_context["context"],
- locator={ "type": "css", "value": "div[data-class='one']" },
- ownership=OwnershipModel.ROOT.value,
- sandbox="second_sandbox"
- )
-
- assert len(second_result["nodes"]) == 1
- assert first_result["nodes"][0]["sharedId"] == second_result["nodes"][0]["sharedId"]
- assert first_result["nodes"][0]["handle"] != second_result["nodes"][0]["handle"]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/set_files/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/conftest.py
new file mode 100644
index 00000000000..f114ca701e5
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/conftest.py
@@ -0,0 +1,33 @@
+import os
+import pytest
+
+
+@pytest.fixture
+def create_files(tmpdir_factory):
+ def create_files(paths):
+ """Create files in a temporary folder.
+
+ Note: the fixture doesn't work with absolute paths, since all the files
+ should be created inside the temporary folder.
+
+ :param paths: list of file names which should be used for creating files
+ :return: list of final paths for created files
+ """
+
+ filelist = []
+ tmpdir = tmpdir_factory.mktemp("wdspec-")
+
+ for path in paths:
+ # Make path separators system compatible.
+ path = os.path.join(*path.split("/"))
+ dir_path = os.path.join(tmpdir, os.path.dirname(path))
+ if not os.path.exists(dir_path):
+ os.makedirs(dir_path)
+
+ full_path = os.path.join(tmpdir, path)
+ open(full_path, 'w').close()
+ filelist.append(full_path)
+
+ return filelist
+
+ return create_files
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/set_files/context.py b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/context.py
new file mode 100644
index 00000000000..f9a39f2bfbc
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/context.py
@@ -0,0 +1,80 @@
+import pytest
+
+from .. import get_events
+
+pytestmark = pytest.mark.asyncio
+
+
+async def test_set_files_сontext(
+ bidi_session, top_context, new_tab, load_static_test_page, get_element, create_files
+):
+ await load_static_test_page(page="files.html")
+ await load_static_test_page(page="files.html", context=new_tab)
+
+ element = await get_element("#input", context=new_tab)
+
+ await bidi_session.input.set_files(
+ context=new_tab["context"],
+ element=element,
+ files=create_files(["noop.txt"]),
+ )
+
+ events_in_new_tab = await get_events(bidi_session, new_tab["context"])
+ assert events_in_new_tab == [
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "input",
+ },
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "change",
+ },
+ ]
+
+ # Make sure that events are not sent in the other context.
+ events_in_top_context = await get_events(bidi_session, top_context["context"])
+ assert events_in_top_context == []
+
+
+@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"])
+async def test_set_files_in_iframe(
+ bidi_session, new_tab, get_element, inline, url, create_files, domain
+):
+ iframe_url = url("/webdriver/tests/support/html/files.html")
+ page_url = inline(f"<iframe src='{iframe_url}'></iframe>", domain=domain)
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=page_url,
+ wait="complete",
+ )
+
+ contexts = await bidi_session.browsing_context.get_tree(root=new_tab["context"])
+ iframe_context = contexts[0]["children"][0]
+
+ element = await get_element("#input", context=iframe_context)
+
+ await bidi_session.input.set_files(
+ context=iframe_context["context"],
+ element=element,
+ files=create_files(["noop.txt"]),
+ )
+
+ events_in_new_tab = await get_events(bidi_session, iframe_context["context"])
+ assert events_in_new_tab == [
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "input",
+ },
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "change",
+ },
+ ]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/set_files/set_files.py b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/files.py
index 642bd3e5423..7a31f3e14a4 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/input/set_files/set_files.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/files.py
@@ -10,6 +10,7 @@ async def test_set_files(
top_context,
load_static_test_page,
get_element,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -18,7 +19,7 @@ async def test_set_files(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt"],
+ files=create_files(["path/to/noop.txt"]),
)
events = await get_events(bidi_session, top_context["context"])
@@ -68,6 +69,7 @@ async def test_set_files_multiple(
top_context,
load_static_test_page,
get_element,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -76,7 +78,7 @@ async def test_set_files_multiple(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt", "path/to/noop-2.txt"],
+ files=create_files(["path/to/noop.txt", "path/to/noop-2.txt"]),
)
events = await get_events(bidi_session, top_context["context"])
@@ -103,6 +105,7 @@ async def test_set_files_something_then_empty(
top_context,
load_static_test_page,
get_element,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -111,7 +114,7 @@ async def test_set_files_something_then_empty(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt"],
+ files=create_files(["path/to/noop.txt"]),
)
await bidi_session.input.set_files(
@@ -150,6 +153,7 @@ async def test_set_files_twice(
top_context,
load_static_test_page,
get_element,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -158,13 +162,13 @@ async def test_set_files_twice(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt"],
+ files=create_files(["path/to/noop.txt"]),
)
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop-2.txt"],
+ files=create_files(["path/to/noop-2.txt"]),
)
events = await get_events(bidi_session, top_context["context"])
@@ -196,11 +200,66 @@ async def test_set_files_twice(
]
+async def test_set_files_twice_intersected(
+ bidi_session,
+ top_context,
+ load_static_test_page,
+ get_element,
+ create_files
+):
+ await load_static_test_page(page="files.html")
+
+ element = await get_element("#input-multiple")
+
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=element,
+ files=create_files(["noop.txt"]),
+ )
+
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=element,
+ files=create_files(["noop.txt", "noop-2.txt"]),
+ )
+
+ events = await get_events(bidi_session, top_context["context"])
+ assert events == [
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "input",
+ },
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "change",
+ },
+ {
+ "files": [
+ "noop.txt",
+ "noop-2.txt",
+ ],
+ "type": "input",
+ },
+ {
+ "files": [
+ "noop.txt",
+ "noop-2.txt",
+ ],
+ "type": "change",
+ },
+ ]
+
+
async def test_set_files_twice_same(
bidi_session,
top_context,
load_static_test_page,
get_element,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -209,13 +268,13 @@ async def test_set_files_twice_same(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt"],
+ files=create_files(["path/to/noop.txt"]),
)
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt"],
+ files=create_files(["path/to/noop.txt"]),
)
events = await get_events(bidi_session, top_context["context"])
@@ -239,3 +298,55 @@ async def test_set_files_twice_same(
"type": "cancel",
},
]
+
+
+async def test_set_files_twice_same_in_different_folders(
+ bidi_session,
+ top_context,
+ load_static_test_page,
+ get_element,
+ create_files
+):
+ await load_static_test_page(page="files.html")
+
+ element = await get_element("#input")
+
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=element,
+ files=create_files(["path/to/noop.txt"]),
+ )
+
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=element,
+ files=create_files(["different/to/noop.txt"]),
+ )
+
+ events = await get_events(bidi_session, top_context["context"])
+ assert events == [
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "input",
+ },
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "change",
+ },
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "input",
+ },
+ {
+ "files": [
+ "noop.txt",
+ ],
+ "type": "change",
+ },
+ ]
diff --git a/tests/wpt/tests/webdriver/tests/bidi/input/set_files/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/invalid.py
index f0efeaa69c5..6527f462c9b 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/input/set_files/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/input/set_files/invalid.py
@@ -4,8 +4,10 @@ from webdriver.bidi.error import (
InvalidArgumentException,
NoSuchElementException,
NoSuchFrameException,
+ NoSuchNodeException,
UnableToSetFileInputException,
)
+from webdriver.bidi.modules.script import ContextTarget
pytestmark = pytest.mark.asyncio
@@ -61,42 +63,92 @@ async def test_params_files_invalid_type(
)
-@pytest.mark.parametrize(
- "files",
- [
- ["path/to/noop.txt"],
- [],
- ],
-)
-async def test_params_element_invalid_value(
+@pytest.mark.parametrize("value", [None, True, 42, {}, []])
+async def test_params_files_file_invalid_type(
+ top_context, bidi_session, load_static_test_page, get_element, value
+):
+ await load_static_test_page(page="files.html")
+ element = await get_element("#input")
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=element,
+ files=[value],
+ )
+
+
+async def test_params_element_invalid_shared_reference_value(
bidi_session,
top_context,
load_static_test_page,
- files,
+ create_files,
):
await load_static_test_page(page="files.html")
- with pytest.raises(NoSuchElementException):
+ with pytest.raises(NoSuchNodeException):
await bidi_session.input.set_files(
context=top_context["context"],
element={"sharedId": "invalid"},
- files=files,
+ files=create_files(["path/to/noop.txt"]),
)
@pytest.mark.parametrize(
- "files",
+ "expression",
[
- ["path/to/noop.txt"],
- [],
+ "document.querySelector('input#button').attributes[0]",
+ "document.querySelector('#with-text-node').childNodes[0]",
+ """document.createProcessingInstruction("xml-stylesheet", "href='foo.css'")""",
+ "document.querySelector('#with-comment').childNodes[0]",
+ "document",
+ "document.doctype",
+ "document.createDocumentFragment()",
+ "document.querySelector('#custom-element').shadowRoot",
],
+ ids=[
+ "attribute",
+ "text node",
+ "processing instruction",
+ "comment",
+ "document",
+ "doctype",
+ "document fragment",
+ "shadow root",
+ ]
)
+async def test_params_element_invalid_element(
+ bidi_session,
+ top_context,
+ get_test_page,
+ create_files,
+ expression
+):
+ await bidi_session.browsing_context.navigate(
+ context=top_context["context"],
+ url=get_test_page(),
+ wait="complete",
+ )
+
+ node = await bidi_session.script.evaluate(
+ expression=expression,
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ )
+
+ with pytest.raises(NoSuchElementException):
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=node,
+ files=create_files(["path/to/noop.txt"]),
+ )
+
+
async def test_params_element_disabled(
bidi_session,
top_context,
load_static_test_page,
get_element,
- files,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -106,23 +158,48 @@ async def test_params_element_disabled(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=files,
+ files=create_files(["path/to/noop.txt"]),
)
@pytest.mark.parametrize(
- "files",
+ "html",
[
- ["path/to/noop.txt"],
- [],
+ "<div id='test'>foo</div>",
+ "<a id='test' href='#'>foo</a>",
+ "<span id='test' href='#'>foo</span>",
],
)
+async def test_params_element_non_input(
+ bidi_session,
+ top_context,
+ inline,
+ get_element,
+ create_files,
+ html,
+):
+ await bidi_session.browsing_context.navigate(
+ context=top_context["context"],
+ url=inline(html),
+ wait="complete",
+ )
+
+ element = await get_element("#test")
+
+ with pytest.raises(UnableToSetFileInputException):
+ await bidi_session.input.set_files(
+ context=top_context["context"],
+ element=element,
+ files=create_files(["path/to/noop.txt"]),
+ )
+
+
async def test_params_element_non_file_input(
bidi_session,
top_context,
load_static_test_page,
get_element,
- files,
+ create_files,
):
await load_static_test_page(page="files.html")
@@ -132,7 +209,7 @@ async def test_params_element_non_file_input(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=files,
+ files=create_files(["path/to/noop.txt"]),
)
@@ -141,6 +218,7 @@ async def test_params_element_not_multiple(
top_context,
load_static_test_page,
get_element,
+ create_files
):
await load_static_test_page(page="files.html")
@@ -150,5 +228,5 @@ async def test_params_element_not_multiple(
await bidi_session.input.set_files(
context=top_context["context"],
element=element,
- files=["path/to/noop.txt", "path/to/noop-2.txt"],
+ files=create_files(["path/to/noop.txt", "path/to/noop-2.txt"]),
)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/request.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/request.py
index 579f1da2882..ae9c94d955e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/request.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/request.py
@@ -1,17 +1,13 @@
import pytest
-from webdriver.bidi.modules.network import AuthCredentials
-
-from tests.support.sync import AsyncPoll
-
-from .. import AUTH_REQUIRED_EVENT, RESPONSE_COMPLETED_EVENT, RESPONSE_STARTED_EVENT
+from .. import AUTH_REQUIRED_EVENT, RESPONSE_COMPLETED_EVENT
pytestmark = pytest.mark.asyncio
@pytest.mark.parametrize("navigate", [False, True], ids=["fetch", "navigate"])
async def test_continue_auth_required(
- setup_blocked_request, subscribe_events, wait_for_event, bidi_session, navigate
+ setup_blocked_request, subscribe_events, wait_for_event, bidi_session, navigate, wait_for_future_safe
):
# Setup unique username / password because browsers cache credentials.
username = f"test_continue_auth_required_{navigate}"
@@ -30,12 +26,12 @@ async def test_continue_auth_required(
# network.authRequired should be emitted.
on_auth_required = wait_for_event(AUTH_REQUIRED_EVENT)
await bidi_session.network.continue_response(request=request)
- await on_auth_required
+ await wait_for_future_safe(on_auth_required)
@pytest.mark.parametrize("navigate", [False, True], ids=["fetch", "navigate"])
async def test_continue_response_started(
- setup_blocked_request, subscribe_events, wait_for_event, bidi_session, navigate
+ setup_blocked_request, subscribe_events, wait_for_event, bidi_session, navigate, wait_for_future_safe
):
request = await setup_blocked_request("responseStarted", navigate=navigate)
@@ -52,6 +48,6 @@ async def test_continue_response_started(
await bidi_session.network.continue_response(request=request)
- await on_response_completed
+ await wait_for_future_safe(on_response_completed)
if navigate:
- await on_load
+ await wait_for_future_safe(on_load)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/serialization_options.py b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/serialization_options.py
index 4084ec48209..68c8cf9c1cb 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/script/call_function/serialization_options.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/script/call_function/serialization_options.py
@@ -1,5 +1,6 @@
import pytest
from webdriver.bidi.modules.script import ContextTarget, SerializationOptions
+from webdriver.bidi.undefined import UNDEFINED
from ... import any_string, recursive_compare
@@ -10,7 +11,7 @@ pytestmark = pytest.mark.asyncio
"include_shadow_tree, shadow_root_mode, contains_children, expected",
[
(
- None,
+ UNDEFINED,
"open",
False,
{
@@ -20,7 +21,7 @@ pytestmark = pytest.mark.asyncio
},
),
(
- None,
+ UNDEFINED,
"closed",
False,
{
@@ -189,7 +190,7 @@ async def test_include_shadow_tree_for_custom_element(
"include_shadow_tree, contains_children, expected",
[
(
- None,
+ UNDEFINED,
False,
{
"type": "node",
@@ -438,7 +439,8 @@ async def test_max_dom_depth(
function_declaration="""() => document.querySelector("div#with-children")""",
target=ContextTarget(top_context["context"]),
await_promise=True,
- serialization_options=SerializationOptions(max_dom_depth=max_dom_depth),
+ serialization_options=SerializationOptions(
+ max_dom_depth=max_dom_depth),
)
recursive_compare(expected, result)
@@ -446,21 +448,17 @@ async def test_max_dom_depth(
async def test_max_dom_depth_null(
bidi_session,
- send_blocking_command,
top_context,
get_test_page,
):
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=get_test_page(), wait="complete"
)
- result = await send_blocking_command(
- "script.callFunction",
- {
- "functionDeclaration": """() => document.querySelector("div#with-children")""",
- "target": ContextTarget(top_context["context"]),
- "awaitPromise": True,
- "serializationOptions": {"maxDomDepth": None},
- },
+ result = await bidi_session.script.call_function(
+ function_declaration="""() => document.querySelector("div#with-children")""",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ serialization_options=SerializationOptions(max_dom_depth=None),
)
recursive_compare(
@@ -518,7 +516,7 @@ async def test_max_dom_depth_null(
"shadowRoot": None,
},
},
- result["result"],
+ result,
)
@@ -526,7 +524,7 @@ async def test_max_dom_depth_null(
"max_object_depth, expected",
[
(
- None,
+ UNDEFINED,
{
"type": "array",
"value": [
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/new/connect.py b/tests/wpt/tests/webdriver/tests/bidi/session/new/connect.py
index d5872cd3ba5..523899c3364 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/session/new/connect.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/new/connect.py
@@ -16,17 +16,16 @@ async def test_websocket_url_connect(session):
# test bidi_session send
@pytest.mark.asyncio
-async def test_bidi_session_send(bidi_session, send_blocking_command):
- await send_blocking_command("session.status", {})
+async def test_bidi_session_send(bidi_session):
+ await bidi_session.session.status()
# bidi session following a bidi session with a different capabilities
# to test session recreation
@pytest.mark.asyncio
@pytest.mark.capabilities({"acceptInsecureCerts": True})
-async def test_bidi_session_with_different_capability(bidi_session,
- send_blocking_command):
- await send_blocking_command("session.status", {})
+async def test_bidi_session_with_different_capability(bidi_session):
+ await bidi_session.session.status()
# classic session following a bidi session to test session
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/status/status.py b/tests/wpt/tests/webdriver/tests/bidi/session/status/status.py
index 13d131bfec5..f62ad4c5620 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/session/status/status.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/status/status.py
@@ -4,7 +4,7 @@ import pytest
# Check that session.status can be used. The actual values for the "ready" and
# "message" properties are implementation specific.
@pytest.mark.asyncio
-async def test_bidi_session_status(send_blocking_command):
- response = await send_blocking_command("session.status", {})
+async def test_bidi_session_status(bidi_session):
+ response = await bidi_session.session.status()
assert isinstance(response["ready"], bool)
assert isinstance(response["message"], str)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/subscribe/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/session/subscribe/invalid.py
index 056f6827281..e553a2e501e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/session/subscribe/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/subscribe/invalid.py
@@ -15,39 +15,38 @@ async def test_params_empty(send_blocking_command):
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [None, True, "foo", 42, {}])
-async def test_params_events_invalid_type(send_blocking_command, value):
+async def test_params_events_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command("session.subscribe", {"events": value})
+ await bidi_session.session.subscribe(events=value)
@pytest.mark.asyncio
async def test_params_events_empty(bidi_session):
- response = await bidi_session.session.subscribe(events=[])
- assert response == {}
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.session.subscribe(events=[])
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [None, True, 42, [], {}])
-async def test_params_events_value_invalid_type(send_blocking_command, value):
+async def test_params_events_value_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command("session.subscribe", {"events": [value]})
+ await bidi_session.session.subscribe(events=[value])
@pytest.mark.asyncio
@pytest.mark.parametrize("value", ["", "foo", "foo.bar", "log.invalidEvent"])
-async def test_params_events_value_invalid_event_name(send_blocking_command, value):
+async def test_params_events_value_invalid_event_name(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command("session.subscribe", {"events": [value]})
+ await bidi_session.session.subscribe(events=[value])
@pytest.mark.asyncio
async def test_params_events_value_valid_and_invalid_event_names(
- bidi_session, send_blocking_command, top_context
+ bidi_session, top_context
):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.subscribe", {"events": ["log.entryAdded", "some.invalidEvent"]}
- )
+ await bidi_session.session.subscribe(events=[
+ "log.entryAdded", "some.invalidEvent"])
# Make sure that we didn't subscribe to log.entryAdded because of the error
@@ -57,7 +56,8 @@ async def test_params_events_value_valid_and_invalid_event_names(
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
+ remove_listener = bidi_session.add_event_listener(
+ "log.entryAdded", on_event)
await create_console_api_message(bidi_session, top_context, "text1")
@@ -70,57 +70,37 @@ async def test_params_events_value_valid_and_invalid_event_names(
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [True, "foo", 42, {}])
-async def test_params_contexts_invalid_type(send_blocking_command, value):
+async def test_params_contexts_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.subscribe",
- {
- "events": [],
- "contexts": value,
- }
- )
+ await bidi_session.session.subscribe(events=["log.entryAdded"], contexts=value)
@pytest.mark.asyncio
async def test_params_contexts_empty(bidi_session):
- response = await bidi_session.session.subscribe(events=[], contexts=[])
- assert response == {}
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.session.subscribe(events=["log.entryAdded"], contexts=[])
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [None, True, 42, [], {}])
-async def test_params_contexts_value_invalid_type(send_blocking_command, value):
+async def test_params_contexts_value_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.subscribe",
- {
- "events": [],
- "contexts": [value],
- }
- )
+ await bidi_session.session.subscribe(events=["log.entryAdded"], contexts=[value])
@pytest.mark.asyncio
-async def test_params_contexts_value_invalid_value(send_blocking_command):
+async def test_params_contexts_value_invalid_value(bidi_session):
with pytest.raises(NoSuchFrameException):
- await send_blocking_command(
- "session.subscribe",
- {
- "events": [],
- "contexts": ["foo"],
- }
- )
+ await bidi_session.session.subscribe(events=["log.entryAdded"], contexts=["foo"])
@pytest.mark.asyncio
async def test_params_contexts_valid_and_invalid_value(
- bidi_session, send_blocking_command, top_context
+ bidi_session, top_context
):
with pytest.raises(NoSuchFrameException):
- await send_blocking_command(
- "session.subscribe",
- {"events": ["log.entryAdded"], "contexts": [top_context["context"], "foo"]},
- )
+ await bidi_session.session.subscribe(events=["log.entryAdded"], contexts=[
+ top_context["context"], "foo"])
# Make sure that we didn't subscribe to log.entryAdded because of error
@@ -130,7 +110,8 @@ async def test_params_contexts_valid_and_invalid_value(
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
+ remove_listener = bidi_session.add_event_listener(
+ "log.entryAdded", on_event)
await create_console_api_message(bidi_session, top_context, "text1")
@@ -142,16 +123,10 @@ async def test_params_contexts_valid_and_invalid_value(
@pytest.mark.asyncio
-async def test_subscribe_to_closed_tab(bidi_session, send_blocking_command):
+async def test_subscribe_to_closed_tab(bidi_session):
new_tab = await bidi_session.browsing_context.create(type_hint="tab")
await bidi_session.browsing_context.close(context=new_tab["context"])
# Try to subscribe to the closed context
with pytest.raises(NoSuchFrameException):
- await send_blocking_command(
- "session.subscribe",
- {
- "events": ["log.entryAdded"],
- "contexts": [new_tab["context"]]
- },
- )
+ await bidi_session.session.subscribe(events=["log.entryAdded"], contexts=[new_tab["context"]])
diff --git a/tests/wpt/tests/webdriver/tests/bidi/session/unsubscribe/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/session/unsubscribe/invalid.py
index 9039f27e47c..c286bc09ee0 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/session/unsubscribe/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/session/unsubscribe/invalid.py
@@ -6,50 +6,49 @@ from ... import create_console_api_message
@pytest.mark.asyncio
-async def test_params_empty(bidi_session, send_blocking_command):
+async def test_params_empty(send_blocking_command):
with pytest.raises(InvalidArgumentException):
await send_blocking_command("session.unsubscribe", {})
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [None, True, "foo", 42, {}])
-async def test_params_events_invalid_type(bidi_session, send_blocking_command, value):
+async def test_params_events_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command("session.unsubscribe", {"events": value})
+ await bidi_session.session.unsubscribe(events=value)
@pytest.mark.asyncio
async def test_params_events_empty(bidi_session):
- response = await bidi_session.session.unsubscribe(events=[])
- assert response == {}
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.session.unsubscribe(events=[])
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [None, True, 42, [], {}])
-async def test_params_events_value_invalid_type(send_blocking_command, value):
+async def test_params_events_value_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command("session.unsubscribe", {"events": [value]})
+ await bidi_session.session.unsubscribe(events=[value])
@pytest.mark.asyncio
@pytest.mark.parametrize("value", ["", "foo", "foo.bar"])
-async def test_params_events_value_invalid_event_name(send_blocking_command, value):
+async def test_params_events_value_invalid_event_name(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command("session.unsubscribe", {"events": [value]})
+ await bidi_session.session.unsubscribe(events=[value])
@pytest.mark.asyncio
async def test_params_events_value_valid_and_invalid_event_name(
- bidi_session, subscribe_events, send_blocking_command, wait_for_event, wait_for_future_safe, top_context
+ bidi_session, subscribe_events, wait_for_event, wait_for_future_safe, top_context
):
# Subscribe to a valid event
await subscribe_events(events=["log.entryAdded"])
# Try to unsubscribe from the valid and an invalid event
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe", {"events": ["log.entryAdded", "some.invalidEvent"]}
- )
+ await bidi_session.session.unsubscribe(events=[
+ "log.entryAdded", "some.invalidEvent"])
# Make sure that we didn't unsubscribe from log.entryAdded because of the error
# and events are still coming
@@ -60,7 +59,8 @@ async def test_params_events_value_valid_and_invalid_event_name(
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
+ remove_listener = bidi_session.add_event_listener(
+ "log.entryAdded", on_event)
on_entry_added = wait_for_event("log.entryAdded")
await create_console_api_message(bidi_session, top_context, "text1")
@@ -73,7 +73,7 @@ async def test_params_events_value_valid_and_invalid_event_name(
@pytest.mark.asyncio
async def test_unsubscribe_from_one_event_and_then_from_module(
- bidi_session, subscribe_events, send_blocking_command
+ bidi_session, subscribe_events
):
await subscribe_events(events=["browsingContext"])
@@ -82,9 +82,7 @@ async def test_unsubscribe_from_one_event_and_then_from_module(
# Try to unsubscribe from all events
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe", {"events": ["browsingContext"]}
- )
+ await bidi_session.session.unsubscribe(events=["browsingContext"])
# Unsubscribe from the rest of the events
await bidi_session.session.unsubscribe(events=["browsingContext.contextCreated"])
@@ -93,61 +91,40 @@ async def test_unsubscribe_from_one_event_and_then_from_module(
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [True, "foo", 42, {}])
-async def test_params_contexts_invalid_type(bidi_session, send_blocking_command, value):
+async def test_params_contexts_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe",
- {
- "events": [],
- "contexts": value,
- }
- )
+ await bidi_session.session.unsubscribe(events=["browsingContext.load"], contexts=value)
@pytest.mark.asyncio
async def test_params_contexts_empty(bidi_session):
- response = await bidi_session.session.unsubscribe(events=[], contexts=[])
- assert response == {}
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.session.unsubscribe(events=["browsingContext.load"], contexts=[])
@pytest.mark.asyncio
@pytest.mark.parametrize("value", [None, True, 42, [], {}])
-async def test_params_contexts_value_invalid_type(send_blocking_command, value):
+async def test_params_contexts_value_invalid_type(bidi_session, value):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe",
- {
- "events": [],
- "contexts": [value],
- }
- )
+ await bidi_session.session.unsubscribe(events=["browsingContext.load"], contexts=[value])
@pytest.mark.asyncio
-async def test_params_contexts_value_invalid_value(send_blocking_command):
+async def test_params_contexts_value_invalid_value(bidi_session):
with pytest.raises(NoSuchFrameException):
- await send_blocking_command(
- "session.unsubscribe",
- {
- "events": [],
- "contexts": ["foo"],
- },
- )
+ await bidi_session.session.unsubscribe(events=["browsingContext.load"], contexts=["foo"])
@pytest.mark.asyncio
async def test_params_contexts_value_valid_and_invalid_value(
- bidi_session, subscribe_events, send_blocking_command, wait_for_event, wait_for_future_safe, top_context
+ bidi_session, subscribe_events, wait_for_event, wait_for_future_safe, top_context
):
# Subscribe to a valid context
await subscribe_events(events=["log.entryAdded"], contexts=[top_context["context"]])
# Try to unsubscribe from the valid and an invalid context
with pytest.raises(NoSuchFrameException):
- await send_blocking_command(
- "session.unsubscribe",
- {"events": ["log.entryAdded"], "contexts": [top_context["context"], "foo"]},
- )
+ await bidi_session.session.unsubscribe(events=["log.entryAdded"], contexts=[top_context["context"], "foo"])
# Make sure that we didn't unsubscribe from the valid context because of the error
# and events are still coming
@@ -158,7 +135,8 @@ async def test_params_contexts_value_valid_and_invalid_value(
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener("log.entryAdded", on_event)
+ remove_listener = bidi_session.add_event_listener(
+ "log.entryAdded", on_event)
on_entry_added = wait_for_event("log.entryAdded")
await create_console_api_message(bidi_session, top_context, "text1")
@@ -171,7 +149,7 @@ async def test_params_contexts_value_valid_and_invalid_value(
@pytest.mark.asyncio
async def test_unsubscribe_from_closed_tab(
- bidi_session, subscribe_events, send_blocking_command
+ bidi_session, subscribe_events
):
new_tab = await bidi_session.browsing_context.create(type_hint="tab")
# Subscribe to a new context
@@ -181,55 +159,42 @@ async def test_unsubscribe_from_closed_tab(
# Try to unsubscribe from the closed context
with pytest.raises(NoSuchFrameException):
- await send_blocking_command(
- "session.unsubscribe",
- {"events": ["log.entryAdded"], "contexts": [new_tab["context"]]},
- )
+ await bidi_session.session.unsubscribe(events=["log.entryAdded"], contexts=[new_tab["context"]])
@pytest.mark.asyncio
-async def test_params_unsubscribe_globally_without_subscription(send_blocking_command):
+async def test_params_unsubscribe_globally_without_subscription(bidi_session):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe", {"events": ["log.entryAdded"]}
- )
+ await bidi_session.session.unsubscribe(events=["log.entryAdded"])
@pytest.mark.asyncio
async def test_params_unsubscribe_globally_with_individual_subscription(
- subscribe_events, send_blocking_command, top_context
+ subscribe_events, bidi_session, top_context
):
# Subscribe to one context
await subscribe_events(events=["log.entryAdded"], contexts=[top_context["context"]])
# Try to unsubscribe globally
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe", {"events": ["log.entryAdded"]}
- )
+ await bidi_session.session.unsubscribe(events=["log.entryAdded"])
@pytest.mark.asyncio
async def test_params_unsubscribe_from_one_context_without_subscription(
- send_blocking_command, top_context
+ bidi_session, top_context
):
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe",
- {"events": ["log.entryAdded"], "contexts": [top_context["context"]]},
- )
+ await bidi_session.session.unsubscribe(events=["log.entryAdded"], contexts=[top_context["context"]])
@pytest.mark.asyncio
async def test_params_unsubscribe_from_one_context_with_global_subscription(
- subscribe_events, send_blocking_command, top_context
+ subscribe_events, bidi_session, top_context
):
# Subscribe to all contexts
await subscribe_events(events=["log.entryAdded"])
# Try to unsubscribe from one context
with pytest.raises(InvalidArgumentException):
- await send_blocking_command(
- "session.unsubscribe",
- {"events": ["log.entryAdded"], "contexts": [top_context["context"]]},
- )
+ await bidi_session.session.unsubscribe(events=["log.entryAdded"], contexts=[top_context["context"]])
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py
index 1af0cfb759c..632e7ffa26c 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py
@@ -134,6 +134,45 @@ async def test_partition_context(
assert len(cookies["cookies"]) == 0
+async def test_partition_context_with_different_domain(
+ bidi_session, set_cookie, new_tab, test_page, domain_value
+):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"], url=test_page, wait="complete"
+ )
+
+ # Set cookie on a different domain.
+ cookie_domain = domain_value(domain="alt")
+ cookie_name = "foo"
+ cookie_value = "bar"
+ partition = BrowsingContextPartitionDescriptor(new_tab["context"])
+ await set_cookie(
+ cookie=create_cookie(
+ domain=cookie_domain,
+ name=cookie_name,
+ value=NetworkStringValue(cookie_value),
+ ),
+ partition=partition,
+ )
+
+ result = await bidi_session.storage.get_cookies(
+ partition=BrowsingContextPartitionDescriptor(new_tab["context"])
+ )
+
+ assert result["cookies"] == [
+ {
+ "domain": cookie_domain,
+ "httpOnly": False,
+ "name": cookie_name,
+ "path": "/",
+ "sameSite": "none",
+ "secure": True,
+ "size": 6,
+ "value": {"type": "string", "value": cookie_value},
+ }
+ ]
+
+
@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"])
async def test_partition_context_iframe(
bidi_session, new_tab, inline, domain_value, domain, set_cookie
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/partition.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/partition.py
index 9283ee07329..bb171c61411 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/partition.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/partition.py
@@ -1,5 +1,10 @@
import pytest
-from webdriver.bidi.modules.storage import BrowsingContextPartitionDescriptor, StorageKeyPartitionDescriptor
+from webdriver.bidi.modules.network import NetworkStringValue
+from webdriver.bidi.modules.script import ContextTarget
+from webdriver.bidi.modules.storage import (
+ BrowsingContextPartitionDescriptor,
+ StorageKeyPartitionDescriptor,
+)
from .. import assert_cookie_is_set, create_cookie
from ... import recursive_compare
@@ -31,13 +36,33 @@ def assert_set_cookie_result(set_cookie_result, partition):
async def test_partition_context(bidi_session, set_cookie, top_context, test_page, domain_value):
await bidi_session.browsing_context.navigate(context=top_context["context"], url=test_page, wait="complete")
+ cookie_name = "foo"
+ cookie_value = "bar"
partition = BrowsingContextPartitionDescriptor(top_context["context"])
set_cookie_result = await set_cookie(
- cookie=create_cookie(domain=domain_value()),
- partition=partition)
+ cookie=create_cookie(
+ domain=domain_value(),
+ name=cookie_name,
+ value=NetworkStringValue(cookie_value),
+ ),
+ partition=partition,
+ )
assert_set_cookie_result(set_cookie_result, partition)
- await assert_cookie_is_set(bidi_session, domain=domain_value())
+ await assert_cookie_is_set(
+ bidi_session,
+ domain=domain_value(),
+ name=cookie_name,
+ value=NetworkStringValue(cookie_value)
+ )
+
+ result = await bidi_session.script.evaluate(
+ expression="document.cookie",
+ target=ContextTarget(top_context["context"]),
+ await_promise=True,
+ )
+
+ assert result == {"type": "string", "value": f"{cookie_name}={cookie_value}"}
async def test_partition_context_frame(bidi_session, set_cookie, top_context, test_page, domain_value, inline):
diff --git a/tests/wpt/tests/webdriver/tests/classic/new_window/new_tab.py b/tests/wpt/tests/webdriver/tests/classic/new_window/new_tab.py
index f6cacf3c358..53810e7fb62 100644
--- a/tests/wpt/tests/webdriver/tests/classic/new_window/new_tab.py
+++ b/tests/wpt/tests/webdriver/tests/classic/new_window/new_tab.py
@@ -1,4 +1,5 @@
from tests.support.asserts import assert_success
+from tests.support.sync import Poll
from . import opener, window_name
@@ -63,7 +64,7 @@ def test_sets_no_opener(session):
assert opener(session) is None
-def test_focus_content(session, inline):
+def test_initial_selection_for_contenteditable(session, inline):
response = new_window(session, type_hint="tab")
value = assert_success(response)
assert value["type"] == "tab"
@@ -71,19 +72,26 @@ def test_focus_content(session, inline):
session.window_handle = value["handle"]
session.url = inline("""
- <span contenteditable="true"> abc </span>
+ <div contenteditable>abc</div>
<script>
- const selection = getSelection();
- window.onload = async() => {
- const initial = document.querySelector("span");
- initial.focus();
+ const initial = document.querySelector("div");
+
+ document.onselectionchange = () => {
+ const selection = document.getSelection();
initial.setAttribute(
"_focused",
selection.anchorNode == initial.firstChild
);
- }
+ };
+
+ initial.focus();
</script>
""")
- elem = session.find.css("span", all=False)
- assert elem.attribute("_focused") == "true"
+ elem = session.find.css("div", all=False)
+
+ wait = Poll(
+ session,
+ timeout=5,
+ message="Initial selection for contenteditable not set")
+ wait.until(lambda _: elem.attribute("_focused") == "true")
diff --git a/tests/wpt/tests/webdriver/tests/classic/new_window/new_window.py b/tests/wpt/tests/webdriver/tests/classic/new_window/new_window.py
index d47dacdc083..cc10d2fb867 100644
--- a/tests/wpt/tests/webdriver/tests/classic/new_window/new_window.py
+++ b/tests/wpt/tests/webdriver/tests/classic/new_window/new_window.py
@@ -1,4 +1,5 @@
from tests.support.asserts import assert_success
+from tests.support.sync import Poll
from . import opener, window_name
@@ -65,26 +66,33 @@ def test_sets_no_opener(session):
assert opener(session) is None
-def test_focus_content(session, inline):
+def test_initial_selection_for_contenteditable(session, inline):
response = new_window(session, type_hint="window")
value = assert_success(response)
session.window_handle = value["handle"]
session.url = inline("""
- <span contenteditable="true"> abc </span>
+ <div contenteditable>abc</div>
<script>
- const selection = getSelection();
- window.onload = async() => {
- const initial = document.querySelector("span");
- initial.focus();
+ const initial = document.querySelector("div");
+
+ document.onselectionchange = () => {
+ const selection = document.getSelection();
initial.setAttribute(
"_focused",
selection.anchorNode == initial.firstChild
);
- }
+ };
+
+ initial.focus();
</script>
""")
- elem = session.find.css("span", all=False)
- assert elem.attribute("_focused") == "true"
+ elem = session.find.css("div", all=False)
+
+ wait = Poll(
+ session,
+ timeout=5,
+ message="Initial selection for contenteditable not set")
+ wait.until(lambda _: elem.attribute("_focused") == "true")
diff --git a/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py b/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py
index 9566e6ebd19..7f3e4f9a9a7 100644
--- a/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py
+++ b/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py
@@ -198,7 +198,7 @@ def add_and_remove_iframe(bidi_session):
document.documentElement.lastElementChild.append(iframe);
return new Promise(resolve => iframe.onload = () => resolve(id));
}""",
- target={"context": context["context"]},
+ target=ContextTarget(context["context"]),
await_promise=True)
iframe_dom_id = resp["value"]
@@ -210,7 +210,7 @@ def add_and_remove_iframe(bidi_session):
await bidi_session.script.evaluate(
expression=f"document.getElementById('{iframe_dom_id}').remove()",
- target={"context": context["context"]},
+ target=ContextTarget(context["context"]),
await_promise=False)
return frame_id
diff --git a/tests/wpt/tests/webdriver/tests/support/html/files.html b/tests/wpt/tests/webdriver/tests/support/html/files.html
index 3a710f0989e..be247918446 100644
--- a/tests/wpt/tests/webdriver/tests/support/html/files.html
+++ b/tests/wpt/tests/webdriver/tests/support/html/files.html
@@ -6,26 +6,23 @@
<input id="input-disabled" disabled type="file" />
<input id="text-input" type="text" />
<script>
- var allEvents = {events: []};
- const input = document.getElementById('input');
- input.addEventListener('input', (event) => {
- allEvents.events.push({
- type: event.type,
- files: [...event.target.files].map((file) => file.name),
- });
- });
- input.addEventListener('change', (event) => {
+ const allEvents = {events: []};
+ const onEvent = (event) => {
allEvents.events.push({
type: event.type,
files: [...event.target.files].map((file) => file.name),
});
- });
- input.addEventListener('cancel', (event) => {
- allEvents.events.push({
- type: event.type,
- files: [...event.target.files].map((file) => file.name),
- });
- });
+ };
+
+ const input = document.getElementById('input');
+ input.addEventListener('input', onEvent);
+ input.addEventListener('change', onEvent);
+ input.addEventListener('cancel', onEvent);
+
+ const multipleInput = document.getElementById('input-multiple');
+ multipleInput.addEventListener('input', onEvent);
+ multipleInput.addEventListener('change', onEvent);
+ multipleInput.addEventListener('cancel', onEvent);
</script>
</body>
</html>
diff --git a/tests/wpt/tests/webnn/conformance_tests/gpu/resample2d.https.any.js b/tests/wpt/tests/webnn/conformance_tests/gpu/resample2d.https.any.js
new file mode 100644
index 00000000000..dd8e441946e
--- /dev/null
+++ b/tests/wpt/tests/webnn/conformance_tests/gpu/resample2d.https.any.js
@@ -0,0 +1,10 @@
+// META: title=test WebNN API resample2d operation
+// META: global=window,dedicatedworker
+// META: script=../../resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-resample2d-method
+
+testWebNNOperation('resample2d', buildOperationWithSingleInput, 'gpu'); \ No newline at end of file
diff --git a/tests/wpt/tests/webnn/conformance_tests/resample2d.https.any.js b/tests/wpt/tests/webnn/conformance_tests/resample2d.https.any.js
new file mode 100644
index 00000000000..0b5b3e00320
--- /dev/null
+++ b/tests/wpt/tests/webnn/conformance_tests/resample2d.https.any.js
@@ -0,0 +1,10 @@
+// META: title=test WebNN API resample2d operation
+// META: global=window,dedicatedworker
+// META: script=../resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-resample2d-method
+
+testWebNNOperation('resample2d', buildOperationWithSingleInput); \ No newline at end of file
diff --git a/tests/wpt/tests/webnn/resources/test_data/resample2d.json b/tests/wpt/tests/webnn/resources/test_data/resample2d.json
new file mode 100644
index 00000000000..605d1b55c01
--- /dev/null
+++ b/tests/wpt/tests/webnn/resources/test_data/resample2d.json
@@ -0,0 +1,527 @@
+{
+ "tests": [
+ {
+ "name": "resample2d float32 4D tensor default options",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 4, 6], // nchw
+ "data": [
+ 3.8600528355143604,
+ 45.18463077286585,
+ 87.67153742917091,
+ 98.78210347338205,
+ 66.3741434682883,
+ 3.4115834948988955,
+ 86.14930500548006,
+ 95.98133720121507,
+ 76.87126314100948,
+ 16.52591355131756,
+ 65.98782867250333,
+ 25.470921564461158,
+ 22.56010547750855,
+ 92.08479613461083,
+ 85.80876634651386,
+ 92.6316602716033,
+ 29.91620870840146,
+ 75.40461275485572,
+ 62.063754512670435,
+ 1.7712158798243394,
+ 99.47231285272224,
+ 11.440550135595085,
+ 25.39634271166711,
+ 67.02175102425608
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 3.8600528240203857,
+ 45.18463134765625,
+ 87.67153930664062,
+ 98.7821044921875,
+ 66.3741455078125,
+ 3.411583423614502,
+ 86.14930725097656,
+ 95.98133850097656,
+ 76.87126159667969,
+ 16.52591323852539,
+ 65.98783111572266,
+ 25.470922470092773,
+ 22.56010627746582,
+ 92.08479309082031,
+ 85.80876922607422,
+ 92.63166046142578,
+ 29.916208267211914,
+ 75.40460968017578,
+ 62.06375503540039,
+ 1.7712159156799316,
+ 99.4723129272461,
+ 11.440549850463867,
+ 25.396343231201172,
+ 67.0217514038086
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.scales",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "scales": [2.0, 2.0]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.sizes",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "sizes": [4, 6]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.sizes ignored options.scales",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "scales": [0.5, 0.5],
+ "sizes": [4, 6]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.axes=[1, 2]",
+ "inputs": {
+ "input": {
+ "shape": [1, 2, 3, 1], // nhwc
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "sizes": [4, 6],
+ "axes": [1, 2]
+ },
+ "expected": {
+ "shape": [1, 4, 6, 1],
+ "data": [
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor explicit options.axes=[2, 3]",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3], // nchw
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "sizes": [4, 6],
+ "axes": [2, 3]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor explicit options.mode='nearest-neighbor'",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "mode": "nearest-neighbor",
+ "sizes": [4, 6]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 59.92947006225586,
+ 59.92947006225586,
+ 41.98918914794922,
+ 41.98918914794922,
+ 66.39534759521484,
+ 66.39534759521484,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281,
+ 90.7006607055664,
+ 90.7006607055664,
+ 86.95105743408203,
+ 86.95105743408203,
+ 79.10005187988281,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.scales options.mode='linear'",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "mode": "linear",
+ "scales": [2.0, 2.0]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 55.444400787353516,
+ 46.47425842285156,
+ 48.090728759765625,
+ 60.29380798339844,
+ 66.39534759521484,
+ 67.62226867675781,
+ 64.02411651611328,
+ 56.82780838012695,
+ 57.31512451171875,
+ 65.48605346679688,
+ 69.57152557373047,
+ 83.00786590576172,
+ 81.18354797363281,
+ 77.534912109375,
+ 75.76390838623047,
+ 75.87055206298828,
+ 75.92387390136719,
+ 90.7006607055664,
+ 89.76325988769531,
+ 87.88845825195312,
+ 84.9883041381836,
+ 81.06280517578125,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.sizes options.mode='linear'",
+ "inputs": {
+ "input": {
+ "shape": [1, 1, 2, 3],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "mode": "linear",
+ "sizes": [4, 6]
+ },
+ "expected": {
+ "shape": [1, 1, 4, 6],
+ "data": [
+ 59.92947006225586,
+ 55.444400787353516,
+ 46.47425842285156,
+ 48.090728759765625,
+ 60.29380798339844,
+ 66.39534759521484,
+ 67.62226867675781,
+ 64.02411651611328,
+ 56.82780838012695,
+ 57.31512451171875,
+ 65.48605346679688,
+ 69.57152557373047,
+ 83.00786590576172,
+ 81.18354797363281,
+ 77.534912109375,
+ 75.76390838623047,
+ 75.87055206298828,
+ 75.92387390136719,
+ 90.7006607055664,
+ 89.76325988769531,
+ 87.88845825195312,
+ 84.9883041381836,
+ 81.06280517578125,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "resample2d(upsample) float32 4D tensor options.axes=[1, 2] options.mode='linear'",
+ "inputs": {
+ "input": {
+ "shape": [1, 2, 3, 1],
+ "data": [
+ 59.92947164849423,
+ 41.989187594696546,
+ 66.39534663077877,
+ 90.70066412516924,
+ 86.95106056135486,
+ 79.10004839481242
+ ],
+ "type": "float32"
+ }
+ },
+ "options": {
+ "mode": "linear",
+ "sizes": [4, 6],
+ "axes": [1, 2]
+ },
+ "expected": {
+ "shape": [1, 4, 6, 1],
+ "data": [
+ 59.92947006225586,
+ 55.444400787353516,
+ 46.47425842285156,
+ 48.090728759765625,
+ 60.29380798339844,
+ 66.39534759521484,
+ 67.62226867675781,
+ 64.02411651611328,
+ 56.82780838012695,
+ 57.31512451171875,
+ 65.48605346679688,
+ 69.57152557373047,
+ 83.00786590576172,
+ 81.18354797363281,
+ 77.534912109375,
+ 75.76390838623047,
+ 75.87055206298828,
+ 75.92387390136719,
+ 90.7006607055664,
+ 89.76325988769531,
+ 87.88845825195312,
+ 84.9883041381836,
+ 81.06280517578125,
+ 79.10005187988281
+ ],
+ "type": "float32"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js
index 0e404dbcd07..375c71174a8 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -282,6 +282,32 @@ const getReductionPrecisionTolerance = (resources, operationName) => {
return tolerance;
};
+/**
+ * Get ULP tolerance of resample2d operations.
+ * @param {Object} resources - Resources used for building a graph
+ * @param {String} operationName - An operation name
+ * @returns {Number} A tolerance number
+ */
+const getResample2dPrecisionTolerance = (resources, operationName) => {
+ const options = {...resources.options};
+ let tolerance;
+ if (options.mode && options.mode === 'linear') {
+ // interpolation mode is linear
+ const precisionType = resources.expected.type;
+ if (precisionType === 'float32') {
+ tolerance = 84;
+ } else if (precisionType === 'float16') {
+ tolerance = 10;
+ } else {
+ tolerance = 1;
+ }
+ } else {
+ // interpolation mode is nearest-neighbor
+ tolerance = 0;
+ }
+ return tolerance;
+};
+
// Refer to precision metrics on https://github.com/webmachinelearning/webnn/issues/265#issuecomment-1256242643
const PrecisionMetrics = {
argMax: {ULP: {int64: 0}},
@@ -356,6 +382,7 @@ const PrecisionMetrics = {
reduceSumSquare: {ULP: {float32: getReductionPrecisionTolerance, float16: getReductionPrecisionTolerance}},
// End Reduction operations
relu: {ULP: {float32: 0, float16: 0}},
+ resample2d: {ULP: {float32: getResample2dPrecisionTolerance, float16: getResample2dPrecisionTolerance}},
reshape: {ULP: {float32: 0, float16: 0}},
sigmoid: {ULP: {float32: 32+2, float16: 3}}, // float32 (leaving a few ULP for roundoff)
slice: {ULP: {float32: 0, float16: 0}},
diff --git a/tests/wpt/tests/webnn/validation_tests/constant.https.any.js b/tests/wpt/tests/webnn/validation_tests/constant.https.any.js
new file mode 100644
index 00000000000..bf84454b8ac
--- /dev/null
+++ b/tests/wpt/tests/webnn/validation_tests/constant.https.any.js
@@ -0,0 +1,142 @@
+// META: title=validation tests for WebNN API constant interface
+// META: global=window,dedicatedworker
+// META: script=../resources/utils_validation.js
+// META: timeout=long
+
+'use strict';
+
+const tests = [
+ // Tests for constant(descriptor, bufferView)
+ {
+ name:
+ '[constant] Test building a 0-D scalar constant without presenting dimensions',
+ descriptor: {dataType: 'float32'},
+ bufferView: {type: Float32Array, byteLength: 1 * 4},
+ output: {dataType: 'float32', dimensions: []}
+ },
+ {
+ name:
+ '[constant] Test building a 0-D scalar constant with empty dimensions',
+ descriptor: {dataType: 'float32', dimensions: []},
+ bufferView: {type: Float32Array, byteLength: 1 * 4},
+ output: {dataType: 'float32', dimensions: []}
+ },
+ {
+ name: '[constant] Test building a constant with float32 data type',
+ descriptor: {dataType: 'float32', dimensions: [2, 3]},
+ bufferView: {type: Float32Array, byteLength: 6 * 4},
+ output: {dataType: 'float32', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for float32 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'float32', dimensions: [2, 3]},
+ bufferView: {
+ type: Float32Array,
+ byteLength: 6 * 4 - 4 // The bufferView's byte length is less than the
+ // one by given dimensions
+ }
+ },
+ // TODO (crbug.com/329702838): Test building a constant with float16 data type
+ {
+ name: '[constant] Test building a constant with int32 data type',
+ descriptor: {dataType: 'int32', dimensions: [2, 3]},
+ bufferView: {type: Int32Array, byteLength: 6 * 4},
+ output: {dataType: 'int32', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for int32 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'int32', dimensions: [2, 3]},
+ bufferView: {
+ type: Int32Array,
+ byteLength: 6 * 4 + 4 // The bufferView's byte length is greater than the
+ // one by given dimensions
+ }
+ },
+ {
+ name: '[constant] Test building a constant with uint32 data type',
+ descriptor: {dataType: 'uint32', dimensions: [2, 3]},
+ bufferView: {type: Uint32Array, byteLength: 6 * 4},
+ output: {dataType: 'uint32', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for uint32 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'uint32', dimensions: [2, 3]},
+ bufferView: {type: Uint32Array, byteLength: 6 * 4 + 4}
+ },
+ {
+ name: '[constant] Test building a constant with int64 data type',
+ descriptor: {dataType: 'int64', dimensions: [2, 3]},
+ bufferView: {type: BigInt64Array, byteLength: 6 * 8},
+ output: {dataType: 'int64', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for int64 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'int64', dimensions: [2, 3]},
+ bufferView: {type: BigInt64Array, byteLength: 6 * 8 + 8}
+ },
+ {
+ name: '[constant] Test building a constant with uint64 data type',
+ descriptor: {dataType: 'uint64', dimensions: [2, 3]},
+ bufferView: {type: BigUint64Array, byteLength: 6 * 8},
+ output: {dataType: 'uint64', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for uint64 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'uint64', dimensions: [2, 3]},
+ bufferView: {type: BigUint64Array, byteLength: 6 * 8 + 8}
+ },
+ {
+ name: '[constant] Test building a constant with int8 data type',
+ descriptor: {dataType: 'int8', dimensions: [2, 3]},
+ bufferView: {type: Int8Array, byteLength: 6 * 1},
+ output: {dataType: 'int8', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for int8 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'int8', dimensions: [2, 3]},
+ bufferView: {type: Int8Array, byteLength: 6 * 4 - 4}
+ },
+ {
+ name: '[constant] Test building a constant with uint8 data type',
+ descriptor: {dataType: 'uint8', dimensions: [2, 3]},
+ bufferView: {type: Uint8Array, byteLength: 6 * 1},
+ output: {dataType: 'uint8', dimensions: [2, 3]}
+ },
+ {
+ name:
+ '[constant] Throw if byte length of bufferView for uint8 doesn\'t match the given dimensions',
+ descriptor: {dataType: 'uint8', dimensions: [2, 3]},
+ bufferView: {type: Uint8Array, byteLength: 6 * 4 - 4}
+ },
+ {
+ name: '[constant] Throw if a dimension is 0',
+ descriptor: {dataType: 'float32', dimensions: [2, 0]},
+ bufferView: {type: Float32Array, byteLength: 2 * 4}
+ },
+ {
+ name:
+ '[constant] Throw if bufferView type doesn\'t match the operand data type',
+ descriptor: {dataType: 'float32', dimensions: [2, 3]},
+ bufferView: {type: Int32Array, byteLength: 6 * 4}
+ }
+];
+
+tests.forEach(
+ test => promise_test(async t => {
+ const buffer = new ArrayBuffer(test.bufferView.byteLength);
+ const bufferView = new test.bufferView.type(buffer);
+ if (test.output) {
+ const constantOperand = builder.constant(test.descriptor, bufferView);
+ assert_equals(constantOperand.dataType(), test.output.dataType);
+ assert_array_equals(constantOperand.shape(), test.output.dimensions);
+ } else {
+ assert_throws_js(
+ TypeError, () => builder.constant(test.descriptor, bufferView));
+ }
+ }, test.name));
diff --git a/tests/wpt/tests/webnn/validation_tests/gather.https.any.js b/tests/wpt/tests/webnn/validation_tests/gather.https.any.js
new file mode 100644
index 00000000000..67ac7d7be39
--- /dev/null
+++ b/tests/wpt/tests/webnn/validation_tests/gather.https.any.js
@@ -0,0 +1,62 @@
+// META: title=validation tests for WebNN API gather operation
+// META: global=window,dedicatedworker
+// META: script=../resources/utils_validation.js
+// META: timeout=long
+
+'use strict';
+
+const tests = [
+ {
+ name: '[gather] Test gather with default options and 0-D indices',
+ input: {dataType: 'int32', dimensions: [3]},
+ indices: {dataType: 'uint64', dimensions: []},
+ output: {dataType: 'int32', dimensions: []}
+ },
+ {
+ name: '[gather] Test gather with axis = 2',
+ input: {dataType: 'float32', dimensions: [1, 2, 3, 4]},
+ indices: {dataType: 'int64', dimensions: [5, 6]},
+ axis: 2,
+ output: {dataType: 'float32', dimensions: [1, 2, 5, 6, 4]}
+ },
+ {
+ name: '[gather] TypeError is expected if the input is a scalar',
+ input: {dataType: 'float16', dimensions: []},
+ indices: {dataType: 'int64', dimensions: [1]}
+ },
+ {
+ name: '[gather] TypeError is expected if the axis is greater than the rank of input',
+ input: {dataType: 'float16', dimensions: [1, 2, 3]},
+ indices: {dataType: 'int32', dimensions: [5, 6]},
+ axis: 4
+ },
+ {
+ name: '[gather] TypeError is expected if the data type of indices is invalid',
+ input: {dataType: 'float16', dimensions: [1, 2, 3, 4]},
+ indices: {dataType: 'float32', dimensions: [5, 6]}
+ }
+];
+
+tests.forEach(
+ test => promise_test(async t => {
+ const input = builder.input(
+ 'input',
+ {dataType: test.input.dataType, dimensions: test.input.dimensions});
+ const indices = builder.input(
+ 'indices',
+ {dataType: test.indices.dataType, dimensions: test.indices.dimensions});
+
+ const options = {};
+ if (test.axis) {
+ options.axis = test.axis;
+ }
+
+ if (test.output) {
+ const output = builder.gather(input, indices, options);
+ assert_equals(output.dataType(), test.output.dataType);
+ assert_array_equals(output.shape(), test.output.dimensions);
+ } else {
+ assert_throws_js(
+ TypeError, () => builder.gather(input, indices, options));
+ }
+ }, test.name));
diff --git a/tests/wpt/tests/webnn/validation_tests/input.https.any.js b/tests/wpt/tests/webnn/validation_tests/input.https.any.js
new file mode 100644
index 00000000000..cbdb7aeb7c3
--- /dev/null
+++ b/tests/wpt/tests/webnn/validation_tests/input.https.any.js
@@ -0,0 +1,69 @@
+// META: title=validation tests for WebNN API input interface
+// META: global=window,dedicatedworker
+// META: script=../resources/utils_validation.js
+// META: timeout=long
+
+'use strict';
+
+// Tests for input(name, descriptor)
+const tests = [
+ {
+ testName:
+ '[input] Test building a 0-D scalar input without presenting dimensions',
+ name: 'input',
+ descriptor: {dataType: 'float32'},
+ output: {dataType: 'float32', dimensions: []},
+ },
+ {
+ testName: '[input] Test building a 0-D scalar input with empty dimensions',
+ name: 'input',
+ descriptor: {dataType: 'float32', dimensions: []},
+ output: {dataType: 'float32', dimensions: []},
+ },
+ {
+ testName: '[input] Test building a 1-D input with int64 data type',
+ name: 'input',
+ descriptor: {dataType: 'int64', dimensions: [3]},
+ output: {dataType: 'int64', dimensions: [3]},
+ },
+ {
+ testName: '[input] Test building a 2-D input without errors',
+ name: 'input',
+ descriptor: {dataType: 'float32', dimensions: [3, 4]},
+ output: {dataType: 'float32', dimensions: [3, 4]},
+ },
+ {
+ testName: '[input] Throw if the name is empty',
+ name: '',
+ descriptor: {dataType: 'float32', dimensions: [3, 4]}
+ },
+ {
+ testName: '[input] Throw if a dimension size is 0',
+ name: 'input',
+ descriptor: {dataType: 'float32', dimensions: [3, 0]}
+ },
+ {
+ testName: '[input] Throw if the number of elements is too large',
+ name: 'input',
+ descriptor: {
+ dataType: 'float32',
+ dimensions: [
+ // Refer to
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length
+ 2 ** 33 + 1
+ ]
+ }
+ }
+];
+
+tests.forEach(
+ test => promise_test(async t => {
+ if (test.output) {
+ const inputOperand = builder.input(test.name, test.descriptor);
+ assert_equals(inputOperand.dataType(), test.output.dataType);
+ assert_array_equals(inputOperand.shape(), test.output.dimensions);
+ } else {
+ assert_throws_js(
+ TypeError, () => builder.input(test.name, test.descriptor));
+ }
+ }, test.testName));
diff --git a/tests/wpt/tests/webrtc-encoded-transform/set-metadata.https.html b/tests/wpt/tests/webrtc-encoded-transform/set-metadata.https.html
deleted file mode 100644
index c4699598cf9..00000000000
--- a/tests/wpt/tests/webrtc-encoded-transform/set-metadata.https.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=/resources/testdriver.js></script>
-<script src=/resources/testdriver-vendor.js></script>
-<script src='../mediacapture-streams/permission-helper.js'></script>
-<script src="../webrtc/RTCPeerConnection-helper.js"></script>
-<script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script>
-<script src='./helper.js'></script>
-<script>
-"use strict";
-
-promise_test(async t => {
- const senderReader = await setupLoopbackWithCodecAndGetReader(t, 'VP8');
- const result = await senderReader.read();
- const metadata = result.value.getMetadata();
- // TODO(https://crbug.com/webrtc/14709): When RTCEncodedVideoFrame has a
- // constructor, create a new frame from scratch instead of cloning it to
- // ensure that none of the metadata was carried over via structuredClone().
- // This would allow us to be confident that setMetadata() is doing all the
- // work.
- //
- // At that point, we can refactor the structuredClone() implementation to be
- // the same as constructor() + set data + setMetadata() to ensure that
- // structuredClone() cannot do things that are not already exposed in
- // JavaScript (no secret steps!).
- const clone = structuredClone(result.value);
- clone.setMetadata(metadata);
- const cloneMetadata = clone.getMetadata();
- // Encoding related metadata.
- assert_equals(cloneMetadata.frameId, metadata.frameId, 'frameId');
- assert_array_equals(cloneMetadata.dependencies, metadata.dependencies,
- 'dependencies');
- assert_equals(cloneMetadata.width, metadata.width, 'width');
- assert_equals(cloneMetadata.height, metadata.height, 'height');
- assert_equals(cloneMetadata.spatialIndex, metadata.spatialIndex,
- 'spatialIndex');
- assert_equals(cloneMetadata.temporalIndex, metadata.temporalIndex,
- 'temporalIndex');
- // RTP related metadata.
- // TODO(https://crbug.com/webrtc/14709): This information also needs to be
- // settable but isn't - the assertions only pass because structuredClone()
- // copies them for us. It would be great if different layers didn't consider
- // different subset of the struct as "the metadata". Can we consolidate into a
- // single webrtc struct for all metadata?
- assert_equals(cloneMetadata.synchronizationSource,
- metadata.synchronizationSource, 'synchronizationSource');
- assert_array_equals(cloneMetadata.contributingSources,
- metadata.contributingSources, 'contributingSources');
- assert_equals(cloneMetadata.payloadType, metadata.payloadType, 'payloadType');
-}, "[VP8] setMetadata() carries over codec-specific properties");
-
-</script>
diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html
new file mode 100644
index 00000000000..1e420e6f725
--- /dev/null
+++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedAudioFrame-metadata.https.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>RTCEncodedAudioFrame can be cloned and distributed</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src='../../mediacapture-streams/permission-helper.js'></script>
+<script src="../../webrtc/RTCPeerConnection-helper.js"></script>
+<script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script>
+
+<script>
+"use strict";
+promise_test(async t => {
+ const caller1 = new RTCPeerConnection();
+ t.add_cleanup(() => caller1.close());
+ const callee1 = new RTCPeerConnection({encodedInsertableStreams:true});
+ t.add_cleanup(() => callee1.close());
+ await setMediaPermission("granted", ["microphone"]);
+ const inputStream = await navigator.mediaDevices.getUserMedia({audio:true});
+ const inputTrack = inputStream.getAudioTracks()[0];
+ t.add_cleanup(() => inputTrack.stop());
+ caller1.addTrack(inputTrack)
+ exchangeIceCandidates(caller1, callee1);
+
+ const caller2 = new RTCPeerConnection({encodedInsertableStreams:true});
+ t.add_cleanup(() => caller2.close());
+ const sender2 = caller2.addTransceiver("audio").sender;
+ const writer2 = sender2.createEncodedStreams().writable.getWriter();
+ sender2.replaceTrack(new MediaStreamTrackGenerator({ kind: 'audio' }));
+
+ const framesReceivedCorrectly = new Promise((resolve, reject) => {
+ callee1.ontrack = async e => {
+ const receiverStreams = e.receiver.createEncodedStreams();
+ const receiverReader = receiverStreams.readable.getReader();
+ const result = await receiverReader.read();
+ const original = result.value;
+ let newFrame = new RTCEncodedAudioFrame(original);
+ assert_equals(original.getMetadata().rtpTimestamp, newFrame.getMetadata().rtpTimestamp);
+ assert_equals(original.getMetadata().absCaptureTime, newFrame.getMetadata().absCaptureTime);
+ assert_array_equals(Array.from(original.data), Array.from(newFrame.data));
+ await writer2.write(newFrame);
+ resolve();
+ }
+ });
+
+ await exchangeOfferAnswer(caller1, callee1);
+
+ return framesReceivedCorrectly;
+}, "Constructing audio frame before sending works");
+
+promise_test(async t => {
+ const caller1 = new RTCPeerConnection();
+
+ t.add_cleanup(() => caller1.close());
+ const callee1 = new RTCPeerConnection({encodedInsertableStreams:true});
+ t.add_cleanup(() => callee1.close());
+ await setMediaPermission("granted", ["microphone"]);
+ const inputStream = await navigator.mediaDevices.getUserMedia({audio:true});
+ const inputTrack = inputStream.getAudioTracks()[0];
+ t.add_cleanup(() => inputTrack.stop());
+ caller1.addTrack(inputTrack)
+ exchangeIceCandidates(caller1, callee1);
+
+ const caller2 = new RTCPeerConnection({encodedInsertableStreams:true});
+ t.add_cleanup(() => caller2.close());
+ const sender2 = caller2.addTransceiver("audio").sender;
+ const writer2 = sender2.createEncodedStreams().writable.getWriter();
+ sender2.replaceTrack(new MediaStreamTrackGenerator({ kind: 'audio' }));
+
+ const framesReceivedCorrectly = new Promise((resolve, reject) => {
+ callee1.ontrack = async e => {
+ const receiverStreams = e.receiver.createEncodedStreams();
+ const receiverReader = receiverStreams.readable.getReader();
+ const result = await receiverReader.read();
+ const original = result.value;
+ let newMetadata = original.getMetadata();
+ newMetadata.rtpTimestamp = newMetadata.rtpTimestamp + 1;
+ let newFrame = new RTCEncodedAudioFrame(original, newMetadata);
+ assert_not_equals(original.getMetadata().rtpTimestamp, newFrame.getMetadata().rtpTimestamp);
+ assert_equals(newMetadata.rtpTimestamp, newFrame.getMetadata().rtpTimestamp);
+ assert_equals(original.getMetadata().absCaptureTime, newFrame.getMetadata().absCaptureTime);
+ assert_array_equals(Array.from(original.data), Array.from(newFrame.data));
+ await writer2.write(newFrame);
+ resolve();
+ }
+ });
+
+ await exchangeOfferAnswer(caller1, callee1);
+
+ return framesReceivedCorrectly;
+}, "Constructing audio frame with metadata argument before sending works");
+
+promise_test(async t => {
+ const caller1 = new RTCPeerConnection();
+ t.add_cleanup(() => caller1.close());
+ const callee1 = new RTCPeerConnection({encodedInsertableStreams:true});
+ t.add_cleanup(() => callee1.close());
+ await setMediaPermission("granted", ["microphone"]);
+ const inputStream = await navigator.mediaDevices.getUserMedia({audio:true});
+ const inputTrack = inputStream.getAudioTracks()[0];
+ t.add_cleanup(() => inputTrack.stop());
+ caller1.addTrack(inputTrack)
+ exchangeIceCandidates(caller1, callee1);
+
+ const caller2 = new RTCPeerConnection({encodedInsertableStreams:true});
+ t.add_cleanup(() => caller2.close());
+ const sender2 = caller2.addTransceiver("audio").sender;
+ const writer2 = sender2.createEncodedStreams().writable.getWriter();
+ sender2.replaceTrack(new MediaStreamTrackGenerator({ kind: 'audio' }));
+
+ const framesReceivedCorrectly = new Promise((resolve, reject) => {
+ callee1.ontrack = async e => {
+ const receiverStreams = e.receiver.createEncodedStreams();
+ const receiverReader = receiverStreams.readable.getReader();
+ const result = await receiverReader.read();
+ const original = result.value;
+ let newMetadata = original.getMetadata();
+ newMetadata.synchronizationSource = newMetadata.synchronizationSource + 1;
+ assert_throws_dom("InvalidModificationError", () => new RTCEncodedAudioFrame(original, newMetadata));
+ resolve();
+ }
+ });
+
+ await exchangeOfferAnswer(caller1, callee1);
+
+ return framesReceivedCorrectly;
+}, "Constructing audio frame with bad metadata argument before sending does not work");
+</script>
diff --git a/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-metadata.https.html b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-metadata.https.html
new file mode 100644
index 00000000000..a2c684c1f15
--- /dev/null
+++ b/tests/wpt/tests/webrtc-encoded-transform/tentative/RTCEncodedVideoFrame-metadata.https.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src='../../mediacapture-streams/permission-helper.js'></script>
+<script src="../../webrtc/RTCPeerConnection-helper.js"></script>
+<script src="../../service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script src='./../helper.js'></script>
+<script>
+"use strict";
+
+promise_test(async t => {
+ const senderReader = await setupLoopbackWithCodecAndGetReader(t, 'VP8');
+ const result = await senderReader.read();
+ const metadata = result.value.getMetadata();
+ // TODO(https://crbug.com/webrtc/14709): When RTCEncodedVideoFrame has a
+ // constructor, create a new frame from scratch instead of cloning it to
+ // ensure that none of the metadata was carried over via structuredClone().
+ // This would allow us to be confident that setMetadata() is doing all the
+ // work.
+ //
+ // At that point, we can refactor the structuredClone() implementation to be
+ // the same as constructor() + set data + setMetadata() to ensure that
+ // structuredClone() cannot do things that are not already exposed in
+ // JavaScript (no secret steps!).
+ const clone = structuredClone(result.value);
+ clone.setMetadata(metadata);
+ const cloneMetadata = clone.getMetadata();
+ // Encoding-related metadata.
+ assert_equals(cloneMetadata.frameId, metadata.frameId, 'frameId');
+ assert_array_equals(cloneMetadata.dependencies, metadata.dependencies,
+ 'dependencies');
+ assert_equals(cloneMetadata.width, metadata.width, 'width');
+ assert_equals(cloneMetadata.height, metadata.height, 'height');
+ assert_equals(cloneMetadata.spatialIndex, metadata.spatialIndex,
+ 'spatialIndex');
+ assert_equals(cloneMetadata.temporalIndex, metadata.temporalIndex,
+ 'temporalIndex');
+ // RTP-related metadata.
+ // TODO(https://crbug.com/webrtc/14709): This information also needs to be
+ // settable but isn't - the assertions only pass because structuredClone()
+ // copies them for us. It would be great if different layers didn't consider
+ // different subset of the struct as "the metadata". Can we consolidate into a
+ // single webrtc struct for all metadata?
+ assert_equals(cloneMetadata.synchronizationSource,
+ metadata.synchronizationSource, 'synchronizationSource');
+ assert_array_equals(cloneMetadata.contributingSources,
+ metadata.contributingSources, 'contributingSources');
+ assert_equals(cloneMetadata.payloadType, metadata.payloadType, 'payloadType');
+}, "[VP8] setMetadata() carries over codec-specific properties");
+
+promise_test(async t => {
+ const senderReader = await setupLoopbackWithCodecAndGetReader(t, 'VP8');
+ const result = await senderReader.read();
+ const metadata = result.value.getMetadata();
+ const newFrame = new RTCEncodedVideoFrame(result.value);
+ const newMetadata = newFrame.getMetadata();
+
+ // Encoding-related metadata.
+ assert_equals(newMetadata.frameId, metadata.frameId, 'frameId');
+ assert_array_equals(newMetadata.dependencies, metadata.dependencies,
+ 'dependencies');
+ assert_equals(newMetadata.width, metadata.width, 'width');
+ assert_equals(newMetadata.height, metadata.height, 'height');
+ assert_equals(newMetadata.spatialIndex, metadata.spatialIndex,
+ 'spatialIndex');
+ assert_equals(newMetadata.temporalIndex, metadata.temporalIndex,
+ 'temporalIndex');
+
+ // RTP-related metadata.
+ assert_equals(newMetadata.synchronizationSource,
+ metadata.synchronizationSource, 'synchronizationSource');
+ assert_array_equals(newMetadata.contributingSources,
+ metadata.contributingSources, 'contributingSources');
+ assert_equals(newMetadata.payloadType, metadata.payloadType, 'payloadType');
+ assert_equals(newMetadata.rtpTimestamp, metadata.rtpTimestamp, 'rtpTimestamp');
+}, "[VP8] constructor carries over codec-specific properties");
+
+promise_test(async t => {
+ const senderReader = await setupLoopbackWithCodecAndGetReader(t, 'VP8');
+ const result = await senderReader.read();
+ const metadata = result.value.getMetadata();
+ metadata.rtpTimestamp = 100;
+ const newFrame = new RTCEncodedVideoFrame(result.value, metadata);
+ const newMetadata = newFrame.getMetadata();
+
+ // Encoding-related metadata.
+ assert_equals(newMetadata.frameId, metadata.frameId, 'frameId');
+ assert_array_equals(newMetadata.dependencies, metadata.dependencies,
+ 'dependencies');
+ assert_equals(newMetadata.width, metadata.width, 'width');
+ assert_equals(newMetadata.height, metadata.height, 'height');
+ assert_equals(newMetadata.spatialIndex, metadata.spatialIndex,
+ 'spatialIndex');
+ assert_equals(newMetadata.temporalIndex, metadata.temporalIndex,
+ 'temporalIndex');
+
+ // RTP-related metadata.
+ assert_equals(newMetadata.synchronizationSource,
+ metadata.synchronizationSource, 'synchronizationSource');
+ assert_array_equals(newMetadata.contributingSources,
+ metadata.contributingSources, 'contributingSources');
+ assert_equals(newMetadata.payloadType, metadata.payloadType, 'payloadType');
+ assert_equals(newMetadata.rtpTimestamp, metadata.rtpTimestamp, 'rtpTimestamp');
+ assert_not_equals(newMetadata.rtpTimestamp, result.value.getMetadata().rtpTimestamp, 'rtpTimestamp');
+}, "[VP8] constructor with metadata carries over codec-specific properties");
+
+promise_test(async t => {
+ const senderReader = await setupLoopbackWithCodecAndGetReader(t, 'VP8');
+ const result = await senderReader.read();
+ const metadata = result.value.getMetadata();
+ // Change the metadata by setting a new RTPTimestamp.
+ metadata.rtpTimestamp = 100;
+ const newFrame = new RTCEncodedVideoFrame(result.value);
+ const newMetadata = newFrame.getMetadata();
+
+ // Encoding-related metadata.
+ assert_equals(newMetadata.frameId, metadata.frameId, 'frameId');
+ assert_array_equals(newMetadata.dependencies, metadata.dependencies,
+ 'dependencies');
+ assert_equals(newMetadata.width, metadata.width, 'width');
+ assert_equals(newMetadata.height, metadata.height, 'height');
+ assert_equals(newMetadata.spatialIndex, metadata.spatialIndex,
+ 'spatialIndex');
+ assert_equals(newMetadata.temporalIndex, metadata.temporalIndex,
+ 'temporalIndex');
+
+ // RTP-related metadata.
+ assert_equals(newMetadata.synchronizationSource,
+ metadata.synchronizationSource, 'synchronizationSource');
+ assert_array_equals(newMetadata.contributingSources,
+ metadata.contributingSources, 'contributingSources');
+ assert_equals(newMetadata.payloadType, metadata.payloadType, 'payloadType');
+
+ // RTPTimestamp don't match because the constructor did not use the metadata for construction.
+ assert_not_equals(newMetadata.rtpTimestamp, metadata.rtpTimestamp, 'rtpTimestamp');
+ assert_equals(newMetadata.rtpTimestamp, result.value.getMetadata().rtpTimestamp, 'rtpTimestamp');
+}, "[VP8] constructor without metadata does not carry over modified metadata ");
+</script>
diff --git a/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-audio-jitterBufferTarget-stats.https.html b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-audio-jitterBufferTarget-stats.https.html
new file mode 100644
index 00000000000..d728ec5a9c9
--- /dev/null
+++ b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-audio-jitterBufferTarget-stats.https.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>Tests RTCRtpReceiver-jitterBufferTarget verified with stats</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/RTCPeerConnection-helper.js"></script>
+<script src="/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats-helper.js"></script>
+<body>
+<script>
+'use strict'
+
+promise_test(async t => {
+ await applyJitterBufferTarget(t, "audio", 300);
+}, `measure raising and lowering audio jitterBufferTarget`);
+
+</script>
+</body>
diff --git a/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats-helper.js b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats-helper.js
new file mode 100644
index 00000000000..31d80926d33
--- /dev/null
+++ b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats-helper.js
@@ -0,0 +1,70 @@
+async function measureDelayFromStats(t, receiver, cycles, targetDelay, tolerance) {
+ let oldInboundStats;
+
+ for (let i = 0; i < cycles; i++) {
+ const statsReport = await receiver.getStats();
+ const inboundStats = [...statsReport.values()].find(({type}) => type == "inbound-rtp");
+
+ if (inboundStats) {
+ if (oldInboundStats) {
+ const emittedCount = inboundStats.jitterBufferEmittedCount - oldInboundStats.jitterBufferEmittedCount;
+
+ if (emittedCount) {
+ const delay = 1000 * (inboundStats.jitterBufferDelay - oldInboundStats.jitterBufferDelay) / emittedCount;
+
+ if (Math.abs(delay - targetDelay) < tolerance) {
+ return true;
+ }
+ }
+ }
+ oldInboundStats = inboundStats;
+ }
+ await new Promise(r => t.step_timeout(r, 1000));
+ }
+
+ return false;
+}
+
+async function applyJitterBufferTarget(t, kind, target) {
+ const caller = new RTCPeerConnection();
+ t.add_cleanup(() => caller.close());
+ const callee = new RTCPeerConnection();
+ t.add_cleanup(() => callee.close());
+
+ const stream = await getNoiseStream({[kind]:true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ caller.addTransceiver(stream.getTracks()[0], {streams: [stream]});
+
+ exchangeIceCandidates(caller, callee);
+ await exchangeOffer(caller, callee);
+ await exchangeAnswer(caller, callee);
+
+ const receiver = callee.getReceivers()[0];
+
+ // Workaround for Chromium to pull audio from jitter buffer.
+ if (kind === "audio") {
+ const audio = document.createElement("audio");
+
+ audio.srcObject = new MediaStream([receiver.track]);
+ audio.play();
+ }
+ assert_equals(receiver.jitterBufferTarget, null,
+ `jitterBufferTarget supported for ${kind}`);
+
+ let result = await measureDelayFromStats(t, receiver, 5, 0, 100);
+ assert_true(result, 'jitter buffer is not stabilised');
+
+ receiver.jitterBufferTarget = target;
+ assert_equals(receiver.jitterBufferTarget, target,
+ `jitterBufferTarget increase target for ${kind}`);
+
+ result = await measureDelayFromStats(t, receiver, 10, target, 20);
+ assert_true(result, 'jitterBuffer does not reach target');
+
+ receiver.jitterBufferTarget = 0;
+ assert_equals(receiver.jitterBufferTarget, 0,
+ `jitterBufferTarget decrease target for ${kind}`);
+
+ result = await measureDelayFromStats(t, receiver, 10, 0, 100);
+ assert_true(result, 'jitter buffer delay is not back to normal');
+}
diff --git a/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats.html b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats.html
deleted file mode 100644
index 33f71800bd8..00000000000
--- a/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<meta name="timeout" content="long">
-<title>Tests RTCRtpReceiver-jitterBufferTarget verified with stats</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/webrtc/RTCPeerConnection-helper.js"></script>
-<body>
-<script>
-'use strict'
-
-function async_promise_test(func, name, properties) {
- async_test(t => {
- Promise.resolve(func(t))
- .catch(t.step_func(e => { throw e; }))
- .then(() => t.done());
- }, name, properties);
-}
-
-async_promise_test(t => applyJitterBufferTarget(t, "video", 4000),
- "measure raising and lowering video jitterBufferTarget");
-async_promise_test(t => applyJitterBufferTarget(t, "audio", 4000),
- "measure raising and lowering audio jitterBufferTarget");
-
-async function applyJitterBufferTarget(t, kind, target) {
- const caller = new RTCPeerConnection();
- t.add_cleanup(() => caller.close());
- const callee = new RTCPeerConnection();
- t.add_cleanup(() => callee.close());
-
- const stream = await getNoiseStream({[kind]:true});
- t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
- caller.addTransceiver(stream.getTracks()[0], {streams: [stream]});
- caller.addTransceiver(stream.getTracks()[0], {streams: [stream]});
-
- exchangeIceCandidates(caller, callee);
- await exchangeOffer(caller, callee);
- const [unconstrainedReceiver, constrainedReceiver] = callee.getReceivers();
- const haveRtp = Promise.all([
- new Promise(r => constrainedReceiver.track.onunmute = r),
- new Promise(r => unconstrainedReceiver.track.onunmute = r)
- ]);
- await exchangeAnswer(caller, callee);
- const chromeTimeout = new Promise(r => t.step_timeout(r, 1000)); // crbug.com/1295295
- await Promise.race([haveRtp, chromeTimeout]);
-
- // Allow some data to be processed to let the jitter buffer to stabilize a bit before measuring
- await new Promise(r => t.step_timeout(r, 5000));
-
- t.step(() => assert_equals(constrainedReceiver.jitterBufferTarget, null,
- `jitterBufferTarget supported for ${kind}`));
-
- constrainedReceiver.jitterBufferTarget = target;
- t.step(() => assert_equals(constrainedReceiver.jitterBufferTarget, target,
- `jitterBufferTarget increase target for ${kind}`));
-
- const [increased, base] = await Promise.all([
- measureDelayFromStats(t, constrainedReceiver, 20),
- measureDelayFromStats(t, unconstrainedReceiver, 20)
- ]);
-
- t.step(() => assert_greater_than(increased , base,
- `${kind} increased delay ${increased} ` +
- ` greater than base delay ${base}`));
-
- constrainedReceiver.jitterBufferTarget = 0;
-
- // Allow the jitter buffer to stabilize a bit before measuring
- await new Promise(r => t.step_timeout(r, 5000));
- t.step(() => assert_equals(constrainedReceiver.jitterBufferTarget, 0,
- `jitterBufferTarget decrease target for ${kind}`));
-
- const decreased = await measureDelayFromStats(t, constrainedReceiver, 20);
-
- t.step(() => assert_less_than(decreased, increased,
- `${kind} decreasedDelay ${decreased} ` +
- `less than increased delay ${increased}`));
-}
-
-async function measureDelayFromStats(t, receiver, cycles) {
-
- let statsReport = await receiver.getStats();
- const oldInboundStats = [...statsReport.values()].find(({type}) => type == "inbound-rtp");
-
- await new Promise(r => t.step_timeout(r, 1000 * cycles));
-
- statsReport = await receiver.getStats();
- const inboundStats = [...statsReport.values()].find(({type}) => type == "inbound-rtp");
-
- const delay = ((inboundStats.jitterBufferDelay - oldInboundStats.jitterBufferDelay) /
- (inboundStats.jitterBufferEmittedCount - oldInboundStats.jitterBufferEmittedCount) * 1000);
-
- return delay;
-}
-</script>
-</body>
diff --git a/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-video-jitterBufferTarget-stats.html b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-video-jitterBufferTarget-stats.html
new file mode 100644
index 00000000000..022dbe70c50
--- /dev/null
+++ b/tests/wpt/tests/webrtc-extensions/RTCRtpReceiver-video-jitterBufferTarget-stats.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>Tests RTCRtpReceiver-jitterBufferTarget verified with stats</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/webrtc/RTCPeerConnection-helper.js"></script>
+<script src="/webrtc-extensions/RTCRtpReceiver-jitterBufferTarget-stats-helper.js"></script>
+<body>
+<script>
+'use strict'
+
+promise_test(async t => {
+ await applyJitterBufferTarget(t, "video", 1000);
+}, `measure raising and lowering video jitterBufferTarget`);
+
+</script>
+</body>
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-createOffer.html b/tests/wpt/tests/webrtc/RTCPeerConnection-createOffer.html
index 704fa3c6467..7287980a5b4 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-createOffer.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-createOffer.html
@@ -53,7 +53,7 @@
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_similar(pc.localDescription, offer);
- assert_session_desc_similar(pc.pendingLocalDescription, offer);
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-description-attributes-timing.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-description-attributes-timing.https.html
index 2d2565c3e1e..bb23d2a39a1 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-description-attributes-timing.https.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-description-attributes-timing.https.html
@@ -19,6 +19,7 @@ promise_test(async t => {
await promise;
assert_not_equals(pc.pendingLocalDescription, null,
'pendingLocalDescription is not null after await');
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
}, "pendingLocalDescription is surfaced at the right time");
promise_test(async t => {
@@ -34,6 +35,7 @@ promise_test(async t => {
await promise;
assert_not_equals(pc.pendingRemoteDescription, null,
'pendingRemoteDescription is not null after await');
+ assert_equals(pc.pendingRemoteDescription, pc.remoteDescription);
}, "pendingRemoteDescription is surfaced at the right time");
promise_test(async t => {
@@ -55,6 +57,7 @@ promise_test(async t => {
await promise;
assert_not_equals(pc2.currentLocalDescription, null,
'currentLocalDescription is not null after await');
+ assert_equals(pc2.currentLocalDescription, pc2.localDescription);
}, "currentLocalDescription is surfaced at the right time");
promise_test(async t => {
@@ -76,6 +79,7 @@ promise_test(async t => {
await promise;
assert_not_equals(pc1.currentRemoteDescription, null,
'currentRemoteDescription is not null after await');
+ assert_equals(pc1.currentRemoteDescription, pc1.remoteDescription);
}, "currentRemoteDescription is surfaced at the right time");
</script>
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html
index 4c207890960..1d80eb8295c 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html
@@ -75,8 +75,8 @@
assert_session_desc_similar(pc.localDescription, answer);
assert_session_desc_similar(pc.remoteDescription, offer);
- assert_session_desc_similar(pc.currentLocalDescription, answer);
- assert_session_desc_similar(pc.currentRemoteDescription, offer);
+ assert_equals(pc.currentLocalDescription, pc.localDescription);
+ assert_equals(pc.currentRemoteDescription, pc.remoteDescription);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
@@ -107,8 +107,8 @@
assert_session_desc_similar(pc.localDescription, answer);
assert_session_desc_similar(pc.remoteDescription, offer);
- assert_session_desc_similar(pc.currentLocalDescription, answer);
- assert_session_desc_similar(pc.currentRemoteDescription, offer);
+ assert_equals(pc.currentLocalDescription, pc.localDescription);
+ assert_equals(pc.currentRemoteDescription, pc.remoteDescription);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
@@ -204,7 +204,7 @@
assert_equals(pc2.pendingLocalDescription, null, "pendingLocalDescription should never be set due to sLD(answer)");
assert_not_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should not be set synchronously after a call to sLD");
assert_equals(pc2.pendingRemoteDescription.type, "offer");
- assert_equals(pc2.remoteDescription.sdp, pc2.pendingRemoteDescription.sdp);
+ assert_equals(pc2.remoteDescription, pc2.pendingRemoteDescription);
assert_equals(pc2.currentLocalDescription, null, "currentLocalDescription should not be set synchronously after a call to sLD");
assert_equals(pc2.currentRemoteDescription, null, "currentRemoteDescription should not be set synchronously after a call to sLD");
@@ -219,10 +219,10 @@
assert_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should be updated before the signalingstatechange event");
assert_not_equals(pc2.currentLocalDescription, null, "currentLocalDescription should be updated before the signalingstatechange event");
assert_equals(pc2.currentLocalDescription.type, "answer");
- assert_equals(pc2.currentLocalDescription.sdp, pc2.localDescription.sdp);
+ assert_equals(pc2.currentLocalDescription, pc2.localDescription);
assert_not_equals(pc2.currentRemoteDescription, null, "currentRemoteDescription should be updated before the signalingstatechange event");
assert_equals(pc2.currentRemoteDescription.type, "offer");
- assert_equals(pc2.currentRemoteDescription.sdp, pc2.remoteDescription.sdp);
+ assert_equals(pc2.currentRemoteDescription, pc2.remoteDescription);
await sldPromise;
}, "setLocalDescription(answer) should update internal state with a queued task, in the right order");
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html
index 88f1de5ed89..2be83a01ce4 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html
@@ -68,7 +68,7 @@
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_similar(pc.localDescription, offer);
- assert_session_desc_similar(pc.pendingLocalDescription, offer);
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);
@@ -90,7 +90,7 @@
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_similar(pc.localDescription, offer);
- assert_session_desc_similar(pc.pendingLocalDescription, offer);
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
assert_equals(pc.currentLocalDescription, null);
}));
}, 'setLocalDescription with type offer and null sdp should use lastOffer generated from createOffer');
@@ -219,7 +219,7 @@
assert_equals(pc.pendingRemoteDescription, null, "pendingRemoteDescription should never be set due to sLD");
assert_not_equals(pc.pendingLocalDescription, null, "pendingLocalDescription should be updated before the signalingstatechange event");
assert_equals(pc.pendingLocalDescription.type, "offer");
- assert_equals(pc.pendingLocalDescription.sdp, pc.localDescription.sdp);
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
assert_equals(pc.currentLocalDescription, null, "currentLocalDescription should never be updated due to sLD(offer)");
assert_equals(pc.currentRemoteDescription, null, "currentRemoteDescription should never be updated due to sLD(offer)");
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html
index 5a7a76319a0..23d1e09a9db 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-parameterless.https.html
@@ -27,6 +27,7 @@ promise_test(async t => {
await offerer.setLocalDescription();
assert_not_equals(offerer.pendingLocalDescription, null);
+ assert_equals(offerer.pendingLocalDescription, offerer.pendingLocalDescription);
}, "Parameterless SLD() in 'stable' sets pendingLocalDescription");
promise_test(async t => {
@@ -63,6 +64,7 @@ promise_test(async t => {
await answerer.setRemoteDescription(await offerer.createOffer());
await answerer.setLocalDescription();
assert_not_equals(answerer.currentLocalDescription, null);
+ assert_equals(answerer.currentLocalDescription, answerer.currentLocalDescription);
}, "Parameterless SLD() in 'have-remote-offer' sets currentLocalDescription");
promise_test(async t => {
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html
index 787edc92e7a..08d0393cb76 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html
@@ -11,7 +11,6 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
- // assert_session_desc_similar
// generateAudioReceiveOnlyOffer
/*
@@ -68,7 +67,8 @@
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_not_equals(pc.localDescription, null);
- assert_not_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.localDescription, pc.localDescription);
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
assert_equals(pc.currentLocalDescription, null);
return pc.setLocalDescription({ type: 'rollback' });
@@ -148,7 +148,7 @@
assert_not_equals(pc.pendingLocalDescription, null, "pendingLocalDescription should not be set synchronously after a call to sLD");
assert_equals(pc.pendingLocalDescription.type, "offer");
- assert_equals(pc.pendingLocalDescription.sdp, pc.localDescription.sdp);
+ assert_equals(pc.pendingLocalDescription, pc.localDescription);
assert_equals(pc.pendingRemoteDescription, null, "pendingRemoteDescription should never be set due to sLD(offer)");
const stablePromise = new Promise(resolve => {
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
index 9da03fe7a15..d95ecafc336 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
@@ -212,7 +212,7 @@
assert_equals(raceValue, "have-remote-offer", "signalingstatechange event should fire before sRD resolves");
assert_not_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should be updated before the signalingstatechange event");
assert_equals(pc2.pendingRemoteDescription.type, "offer");
- assert_equals(pc2.pendingRemoteDescription.sdp, pc2.remoteDescription.sdp);
+ assert_equals(pc2.pendingRemoteDescription, pc2.remoteDescription);
assert_equals(pc2.currentRemoteDescription, null, "currentRemoteDescription should not be set after a call to sRD(offer)");
await srdPromise;
@@ -236,7 +236,7 @@
assert_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should not be set synchronously after a call to sRD");
assert_not_equals(pc2.pendingLocalDescription, null, "pendingLocalDescription should not be set synchronously after a call to sRD");
assert_equals(pc2.pendingLocalDescription.type, "offer");
- assert_equals(pc2.pendingLocalDescription.sdp, pc2.localDescription.sdp);
+ assert_equals(pc2.pendingLocalDescription, pc2.localDescription);
// First, we should go through stable (the implicit rollback part)
const stablePromise = new Promise(resolve => {
@@ -260,7 +260,8 @@
assert_equals(raceValue, "have-remote-offer", "signalingstatechange event should fire before sRD resolves");
assert_not_equals(pc2.pendingRemoteDescription, null, "pendingRemoteDescription should be updated before the signalingstatechange event");
assert_equals(pc2.pendingRemoteDescription.type, "offer");
- assert_equals(pc2.pendingRemoteDescription.sdp, pc2.remoteDescription.sdp);
+ assert_equals(pc2.pendingRemoteDescription, pc2.remoteDescription);
+ assert_equals(pc2.pendingRemoteDescription, pc2.pendingRemoteDescription);
assert_equals(pc2.pendingLocalDescription, null, "pendingLocalDescription should be updated before the signalingstatechange event");
await srdPromise;
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html
index 0e6213d7083..a72fa667382 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html
@@ -69,7 +69,7 @@
.then(() => {
assert_equals(pc.signalingState, 'have-remote-offer');
assert_not_equals(pc.remoteDescription, null);
- assert_not_equals(pc.pendingRemoteDescription, null);
+ assert_equals(pc.pendingRemoteDescription, pc.remoteDescription);
assert_equals(pc.currentRemoteDescription, null);
return pc.setRemoteDescription({type: 'rollback'});
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription.html b/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription.html
index c170f766bd3..e2bec7dd917 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-setRemoteDescription.html
@@ -136,7 +136,7 @@
await pc2.setLocalDescription(answer);
await pc.setRemoteDescription(answer);
await exchangeOffer(pc2, pc);
- assert_equals(pc.remoteDescription.sdp, pc.pendingRemoteDescription.sdp);
+ assert_equals(pc.remoteDescription, pc.pendingRemoteDescription);
assert_session_desc_similar(pc.remoteDescription, offer);
assert_session_desc_similar(pc.currentRemoteDescription, answer);
}, 'Switching role from offerer to answerer after going back to stable state should succeed');
diff --git a/tests/wpt/tests/workers/WorkerNavigator_userAgentData.https.html b/tests/wpt/tests/workers/WorkerNavigator_userAgentData.https.html
index 8c22d8f8672..a46c530cefe 100644
--- a/tests/wpt/tests/workers/WorkerNavigator_userAgentData.https.html
+++ b/tests/wpt/tests/workers/WorkerNavigator_userAgentData.https.html
@@ -21,7 +21,7 @@
assert_equals(e.data.platform, navigator.userAgentData.platform);
const highEntropyValues = await navigator.userAgentData.getHighEntropyValues([
"architecture", "bitness", "fullVersionList", "model",
- "platformVersion", "uaFullVersion", "wow64", "formFactor",
+ "platformVersion", "uaFullVersion", "wow64", "formFactors",
]);
assert_equals(e.data.fullVersionList.length,
@@ -39,7 +39,7 @@
assert_equals(e.data.platformVersion, highEntropyValues.platformVersion);
assert_equals(e.data.uaFullVersion, highEntropyValues.uaFullVersion);
assert_equals(e.data.wow64, highEntropyValues.wow64);
- assert_equals(e.data.formFactor.join(','), highEntropyValues.formFactor.join(','));
+ assert_equals(e.data.formFactors.join(','), highEntropyValues.formFactors.join(','));
assert_equals(e.data.NavigatorUADataExposed, true);
// Architecture should be one of two permitted values.
diff --git a/tests/wpt/tests/workers/support/WorkerNavigator.js b/tests/wpt/tests/workers/support/WorkerNavigator.js
index 76834e16c7a..4258384ac44 100644
--- a/tests/wpt/tests/workers/support/WorkerNavigator.js
+++ b/tests/wpt/tests/workers/support/WorkerNavigator.js
@@ -11,7 +11,7 @@
obj.platform = navigator.userAgentData.platform;
const highEntropyValues = await navigator.userAgentData.getHighEntropyValues([
"architecture", "bitness", "fullVersionList", "model",
- "platformVersion", "uaFullVersion", "wow64", "formFactor",
+ "platformVersion", "uaFullVersion", "wow64", "formFactors",
]);
obj.architecture = highEntropyValues.architecture;
obj.bitness = highEntropyValues.bitness;
@@ -20,7 +20,7 @@
obj.platformVersion = highEntropyValues.platformVersion;
obj.uaFullVersion = highEntropyValues.uaFullVersion;
obj.wow64 = highEntropyValues.wow64;
- obj.formFactor = highEntropyValues.formFactor;
+ obj.formFactors = highEntropyValues.formFactors;
obj.NavigatorUADataExposed = (typeof self.NavigatorUAData != "undefined");
}
postMessage(obj);