aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorServo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com>2024-03-10 00:11:24 -0500
committerGitHub <noreply@github.com>2024-03-10 05:11:24 +0000
commit60e4c1adb4e1ab069ced892c28c027e3e454675c (patch)
tree43719fcf1856b35b8975a30e0d0e07c1e7166703
parent9dff1fecfc3c172cda62b269a08e6ac517a9b3a4 (diff)
downloadservo-60e4c1adb4e1ab069ced892c28c027e3e454675c.tar.gz
servo-60e4c1adb4e1ab069ced892c28c027e3e454675c.zip
Update web-platform-tests to revision b'd9a5cc25fc5f520bde022cee67e9e6a6f0b588f9' (#31599)
-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-animations/animation-offscreen-to-onscreen.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-animations/empty-pseudo-class-with-animation.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/system-color-consistency.html.ini168
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-pseudo/selection-background-color-001.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-text/parsing/webkit-text-stroke-computed.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-text/white-space/text-wrap-balance-003.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini144
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini144
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-values/calc-size/calc-size-height.tentative.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/fetch/api/basic/request-upload.h2.any.js.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/fetch/api/body/formdata.any.js.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini (renamed from tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini)0
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/history_reload_referrer.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini3
-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/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini3
-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.ini45
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-001.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-001.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-003.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-003.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-006.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-006.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-008.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-008.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-011.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-011.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-012.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-012.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-024.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-024.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-027.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-027.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-033.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-033.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-034.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-034.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-035.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-035.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-037.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-037.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-038.html.ini3
-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/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html.ini (renamed from tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html.ini)3
-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.ini1
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html.ini (renamed from tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini (renamed from tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini)5
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini13
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini10
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini7
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/invokers/interestelement-interface.tentative.html.ini21
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/invokers/invokeelement-interface.tentative.html.ini9
-rw-r--r--tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini12
-rw-r--r--tests/wpt/meta-legacy-layout/webmessaging/without-ports/018.html.ini (renamed from tests/wpt/meta-legacy-layout/webmessaging/with-ports/018.html.ini)0
-rw-r--r--tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini1
-rw-r--r--tests/wpt/meta/MANIFEST.json5278
-rw-r--r--tests/wpt/meta/css/compositing/mix-blend-mode/mix-blend-mode-animation.html.ini2
-rw-r--r--tests/wpt/meta/css/css-animations/animation-offscreen-to-onscreen.html.ini2
-rw-r--r--tests/wpt/meta/css/css-animations/empty-pseudo-class-with-animation.html.ini3
-rw-r--r--tests/wpt/meta/css/css-color/system-color-consistency.html.ini168
-rw-r--r--tests/wpt/meta/css/css-pseudo/selection-background-color-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-text/parsing/webkit-text-stroke-computed.html.ini9
-rw-r--r--tests/wpt/meta/css/css-text/white-space/text-wrap-balance-003.html.ini2
-rw-r--r--tests/wpt/meta/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini144
-rw-r--r--tests/wpt/meta/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini144
-rw-r--r--tests/wpt/meta/css/css-transitions/render-blocking/no-transition-from-ua-to-blocking-stylesheet.html.ini2
-rw-r--r--tests/wpt/meta/css/css-values/calc-size/calc-size-height.tentative.html.ini9
-rw-r--r--tests/wpt/meta/css/cssom-view/negativeMargins.html.ini3
-rw-r--r--tests/wpt/meta/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini3
-rw-r--r--tests/wpt/meta/fetch/api/basic/request-upload.h2.any.js.ini6
-rw-r--r--tests/wpt/meta/fetch/api/body/formdata.any.js.ini6
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/history/the-history-interface/history_reload_referrer.html.ini18
-rw-r--r--tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini3
-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/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini1
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini3
-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.ini45
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-001.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-001.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-003.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-003.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-006.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-006.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-008.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-008.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-011.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-011.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-012.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-012.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-024.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-024.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-027.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-027.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-033.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-033.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-034.html.ini (renamed from tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-034.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-035.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-035.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-037.html.ini (renamed from tests/wpt/meta/html/dom/render-blocking/element-render-blocking-037.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/dom/render-blocking/element-render-blocking-038.html.ini3
-rw-r--r--tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini1
-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/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini6
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html.ini (renamed from tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html.ini)6
-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-1.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini1
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html.ini (renamed from tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html.ini)2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini6
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini9
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini3
-rw-r--r--tests/wpt/meta/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini9
-rw-r--r--tests/wpt/meta/html/semantics/invokers/interestelement-interface.tentative.html.ini21
-rw-r--r--tests/wpt/meta/html/semantics/invokers/invokeelement-interface.tentative.html.ini9
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini18
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini18
-rw-r--r--tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini12
-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/webmessaging/with-ports/017.html.ini4
-rw-r--r--tests/wpt/tests/IndexedDB/idbindex_count.any.js108
-rw-r--r--tests/wpt/tests/IndexedDB/idbindex_count.htm37
-rw-r--r--tests/wpt/tests/IndexedDB/idbindex_count2.htm37
-rw-r--r--tests/wpt/tests/IndexedDB/idbindex_count3.htm28
-rw-r--r--tests/wpt/tests/IndexedDB/idbindex_count4.htm37
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add.any.js412
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add10.any.js24
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add11.any.js24
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add12.any.js24
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add13.any.js24
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add14.any.js27
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add15.any.js26
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add16.any.js21
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add2.any.js31
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add3.any.js34
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add4.any.js35
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add5.any.js29
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add6.any.js42
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add7.any.js42
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add8.any.js42
-rw-r--r--tests/wpt/tests/IndexedDB/idbobjectstore_add9.any.js22
-rw-r--r--tests/wpt/tests/accessibility/crashtests/svg-mouse-listener.html19
-rw-r--r--tests/wpt/tests/accessibility/svg-mouse-listener.html34
-rw-r--r--tests/wpt/tests/accname/name/comp_name_from_content.html10
-rw-r--r--tests/wpt/tests/appmanifest/display-override-member/display-override-member-media-feature-tabbed-manual.tentative.html36
-rw-r--r--tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest11
-rw-r--r--tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest.headers1
-rw-r--r--tests/wpt/tests/attribution-reporting/header-parsing-error-debug-report.sub.https.html33
-rw-r--r--tests/wpt/tests/close-watcher/closewatcher-dialog-popover.html98
-rw-r--r--tests/wpt/tests/close-watcher/esc-key.html77
-rw-r--r--tests/wpt/tests/close-watcher/esc-key/README.md4
-rw-r--r--tests/wpt/tests/close-watcher/esc-key/keydown.html21
-rw-r--r--tests/wpt/tests/close-watcher/esc-key/keypress.html21
-rw-r--r--tests/wpt/tests/close-watcher/esc-key/keyup.html21
-rw-r--r--tests/wpt/tests/close-watcher/esc-key/not-user-activation.html19
-rw-r--r--tests/wpt/tests/close-watcher/esc-key/synthetic-keyboard-event.html28
-rw-r--r--tests/wpt/tests/close-watcher/resources/helpers.js14
-rw-r--r--tests/wpt/tests/close-watcher/user-activation-CloseWatcher.html75
-rw-r--r--tests/wpt/tests/close-watcher/user-activation-multiple-plus-free.html32
-rw-r--r--tests/wpt/tests/close-watcher/user-activation-shared.html201
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/n-activate-preventDefault.html31
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/n-activate.html27
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/n-closerequest-n.html30
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/n-destroy-n.html31
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/n.html25
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nn-activate-CloseWatcher.html30
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nn-activate-dialog.html40
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nn.html26
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover.html35
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nnn-popovers.html37
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nnn.html27
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/ny-activate-preventDefault.html37
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/ny.html30
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nyn-popovers.html (renamed from tests/wpt/tests/close-watcher/popover-closewatcher-multiple-plus-free.html)4
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nyn.html30
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nynn-destroy.html33
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nynn.html31
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nyyn.html36
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/nyyyn.html40
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/y.html25
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yn-activate.html32
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yn.html30
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/ynn.html31
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yy.html30
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yyn.html35
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover.html46
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover.html49
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yyy-popovers.html (renamed from tests/wpt/tests/close-watcher/popover-closewatcher.html)18
-rw-r--r--tests/wpt/tests/close-watcher/user-activation/yyy.html35
-rw-r--r--tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-opener.html18
-rw-r--r--tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-verify.html2
-rw-r--r--tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup.html2
-rw-r--r--tests/wpt/tests/cookies/third-party-cookies/third-party-cookie-heuristics.tentative.https.html2
-rw-r--r--tests/wpt/tests/credential-management/digital-identity.https.html123
-rw-r--r--tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-basics.tentative.https.html34
-rw-r--r--tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-priority.tentative.https.html (renamed from tests/wpt/tests/credential-management/fedcm-button-mode-basics.https.html)41
-rw-r--r--tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html84
-rw-r--r--tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html49
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json10
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py21
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py50
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-default-001.html15
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-default-002.html15
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-getComputedStyle-003.html21
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-chained-fallback.tentative.html16
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-001.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-002.html)9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-003.html)9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-004.html)19
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-005.html)9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-006.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-007.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-008.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-009.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-010.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html (renamed from tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-011.html)35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-fallback-position-parse.html39
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-fallback-cssom.html81
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-allowed-declarations.html (renamed from tests/wpt/tests/css/css-anchor-position/at-fallback-position-allowed-declarations.html)18
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html61
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html (renamed from tests/wpt/tests/css/css-anchor-position/at-position-fallback-invalidation-shadow-dom.html)21
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation.html (renamed from tests/wpt/tests/css/css-anchor-position/at-position-fallback-invalidation.html)28
-rw-r--r--tests/wpt/tests/css/css-anchor-position/at-position-try-parse.html34
-rw-r--r--tests/wpt/tests/css/css-anchor-position/chrome-1512373-2-crash.html11
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-001.html18
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-002.html18
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-003.html35
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-004.html9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-005.html9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-006.html9
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-001.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-001.html)63
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-002.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-002.html)33
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-003.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-003.html)118
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-004.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-004.html)31
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-cascade-layer-reorder.html)21
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-container-query.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-container-query.html)40
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-custom-property.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-custom-property.html)23
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-dynamic.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-dynamic.html)15
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-grid-001.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-grid-001.html)45
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-pseudo-element.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-pseudo-element.html)23
-rw-r--r--tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html (renamed from tests/wpt/tests/css/css-anchor-position/position-fallback-tree-scoped.html)101
-rw-r--r--tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen-ref.html23
-rw-r--r--tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen.html44
-rw-r--r--tests/wpt/tests/css/css-animations/empty-pseudo-class-with-animation.html47
-rw-r--r--tests/wpt/tests/css/css-box/margin-trim/computed-margin-values/grid-inline-end-columns-added-to-end.html54
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print-ref.html29
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print.html35
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-001b-print.html36
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print-ref.html31
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print.html36
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-001d-print.html37
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print-ref.html31
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print.html37
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-002b-print.html38
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print-ref.html33
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print.html38
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-002d-print.html39
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print-ref.html46
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print.html56
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-003b-print.html57
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print-ref.html47
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print.html57
-rw-r--r--tests/wpt/tests/css/css-break/table/table-fragmentation-003d-print.html58
-rw-r--r--tests/wpt/tests/css/css-color/system-color-consistency.html57
-rw-r--r--tests/wpt/tests/css/css-color/system-color-support.html8
-rw-r--r--tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-001.html139
-rw-r--r--tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-002.html140
-rw-r--r--tests/wpt/tests/css/css-grid/firefox-bug-1881495-ref.html45
-rw-r--r--tests/wpt/tests/css/css-grid/firefox-bug-1881495.html60
-rw-r--r--tests/wpt/tests/css/css-grid/subgrid/line-names-010-ref.html7
-rw-r--r--tests/wpt/tests/css/css-grid/subgrid/line-names-010.html7
-rw-r--r--tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001-ref.html68
-rw-r--r--tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001.html68
-rw-r--r--tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-002.html73
-rw-r--r--tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001-ref.html16
-rw-r--r--tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001.html39
-rw-r--r--tests/wpt/tests/css/css-properties-values-api/at-property-shadow.html10
-rw-r--r--tests/wpt/tests/css/css-pseudo/selection-background-color-001.html21
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-001.html33
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-002.html30
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-003.html30
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-004.html31
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-005.html33
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-006.html34
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-007.html28
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-008.html29
-rw-r--r--tests/wpt/tests/css/css-scoping/font-face-009.html34
-rw-r--r--tests/wpt/tests/css/css-scoping/keyframes-001.html5
-rw-r--r--tests/wpt/tests/css/css-scoping/keyframes-002.html11
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/nested-supercedes-common-to-both-axes.html91
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html151
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-element.html24
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-nested-containers.html12
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-inner-target.html14
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-positioned.html14
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element.html18
-rw-r--r--tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/resources/common.js74
-rw-r--r--tests/wpt/tests/css/css-sizing/contain-intrinsic-size/auto-006.html40
-rw-r--r--tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-033.html1
-rw-r--r--tests/wpt/tests/css/css-text/parsing/webkit-text-stroke-computed.html25
-rw-r--r--tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html31
-rw-r--r--tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html48
-rw-r--r--tests/wpt/tests/css/css-text/white-space/reference/text-wrap-balance-003-ref.html19
-rw-r--r--tests/wpt/tests/css/css-text/white-space/text-wrap-balance-003.html24
-rw-r--r--tests/wpt/tests/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html46
-rw-r--r--tests/wpt/tests/css/css-transforms/animation/scale-animation-math-functions-tentative.html46
-rw-r--r--tests/wpt/tests/css/css-transforms/animation/support/transform-interpolation-reftests.js16
-rw-r--r--tests/wpt/tests/css/css-transforms/transform-box/svgbox-stroke-box-005.html24
-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-values/calc-size/calc-size-height.tentative.html2
-rw-r--r--tests/wpt/tests/css/css-view-transitions/only-child-group.html14
-rw-r--r--tests/wpt/tests/css/css-view-transitions/only-child-image-pair.html5
-rw-r--r--tests/wpt/tests/css/css-view-transitions/only-child-new.html20
-rw-r--r--tests/wpt/tests/css/css-view-transitions/only-child-no-transition.html12
-rw-r--r--tests/wpt/tests/css/css-view-transitions/only-child-old.html19
-rw-r--r--tests/wpt/tests/device-posture/META.yml4
-rw-r--r--tests/wpt/tests/device-posture/README.md2
-rw-r--r--tests/wpt/tests/device-posture/idlharness.https.window.js12
-rw-r--r--tests/wpt/tests/dom/events/scrolling/scroll_support.js2
-rw-r--r--tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-form-and-script-from-fragment.tentative.html22
-rw-r--r--tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html29
-rw-r--r--tests/wpt/tests/editing/other/inserttext-at-end-of-block-when-br-always-block.html36
-rw-r--r--tests/wpt/tests/fetch/api/basic/request-upload.h2.any.js23
-rw-r--r--tests/wpt/tests/fetch/api/body/formdata.any.js11
-rw-r--r--tests/wpt/tests/fetch/api/request/request-consume-empty.any.js22
-rw-r--r--tests/wpt/tests/fetch/api/request/request-consume.any.js29
-rw-r--r--tests/wpt/tests/fetch/api/response/response-consume-empty.any.js23
-rw-r--r--tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js429
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/request-tracker.py2
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html35
-rw-r--r--tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-1.html16
-rw-r--r--tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-2.html56
-rw-r--r--tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer.html26
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-iframe.html31
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-top-to-nested-iframe.html36
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/assign-with-nested-iframe.html21
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/replace-with-nested-iframe.html21
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-contents.sub.html14
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-postmessage-to-parent-parent.sub.html14
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-with-iframe.html9
-rw-r--r--tests/wpt/tests/html/browsers/history/the-location-interface/resources/replace-or-assign-call-on-iframe.html20
-rw-r--r--tests/wpt/tests/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html28
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html22
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html69
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html50
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html49
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html44
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html49
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html27
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html31
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html43
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html40
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html51
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html49
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html48
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html320
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html56
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.blur.exceptions.html37
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.colorMatrix.html104
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete-expected.html50
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html38
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma-expected.html44
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html41
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity-expected.html27
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html34
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear-expected.html44
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html37
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table-expected.html51
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html38
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html60
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow-expected.html57
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html269
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.html94
-rw-r--r--tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html130
-rw-r--r--tests/wpt/tests/html/canvas/element/layers/2d.layer.global-states.filter.alpha.blending.html2
-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/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html22
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js22
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html69
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js69
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html50
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html53
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html54
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js62
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html44
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html53
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html57
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js53
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html27
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html35
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html50
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js40
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html43
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html44
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html53
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js52
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html51
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html53
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html54
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js62
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html48
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js48
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html320
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js320
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html56
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html56
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html38
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js33
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html105
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js100
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete-expected.html50
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html41
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html55
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma-expected.html44
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html44
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html58
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity-expected.html27
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html37
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html51
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear-expected.html44
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html40
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html54
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table-expected.html51
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html41
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html55
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html61
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js56
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow-expected.html57
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html270
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js265
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.html97
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html111
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html131
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js126
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html2
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html2
-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/gentestutilsunion.py18
-rw-r--r--tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml1
-rw-r--r--tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml3
-rw-r--r--tests/wpt/tests/html/canvas/tools/name2dir.yaml1
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml-new/drawing-images-to-the-canvas.yaml8
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml644
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml2
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml-new/webgpu-access.yaml10
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-029.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-029.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-030.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-030.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-031.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-031.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-032.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-032.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-033.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-033.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-034.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-034.tentative.html)2
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-035.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-035.tentative.html)2
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-036.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-036.tentative.html)0
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-037.html (renamed from tests/wpt/tests/html/dom/render-blocking/element-render-blocking-037.tentative.html)4
-rw-r--r--tests/wpt/tests/html/dom/render-blocking/element-render-blocking-038.html35
-rw-r--r--tests/wpt/tests/html/rendering/widgets/field-sizing-textarea.html4
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/302-no-Location-header-text-css.asis4
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css0
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css.headers1
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css3
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css.headers1
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html27
-rw-r--r--tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-non-OK-status.html17
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html)0
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html)0
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/resources/sandbox-top-navigation-helper.js11
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js28
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js43
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js (renamed from tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js)19
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html23
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist.tentative.html2
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html81
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-canceling.html1
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-summary-element/interactive-content.html232
-rw-r--r--tests/wpt/tests/html/semantics/invokers/interestelement-interface.tentative.html78
-rw-r--r--tests/wpt/tests/html/semantics/invokers/invokeelement-interface.tentative.html16
-rw-r--r--tests/wpt/tests/html/semantics/invokers/invokeevent-interface.tentative.html6
-rw-r--r--tests/wpt/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-1.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-2.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-3.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html2
-rw-r--r--tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html2
-rw-r--r--tests/wpt/tests/inert/inert-with-fullscreen-element.html65
-rw-r--r--tests/wpt/tests/inert/inert-with-modal-dialog-003.html59
-rw-r--r--tests/wpt/tests/infrastructure/expected-fail/user-prompt.html28
-rw-r--r--tests/wpt/tests/infrastructure/metadata/infrastructure/expected-fail/user-prompt.html.ini17
-rw-r--r--tests/wpt/tests/interfaces/css-view-transitions-2.idl2
-rw-r--r--tests/wpt/tests/interfaces/html.idl13
-rw-r--r--tests/wpt/tests/interfaces/invokers.tentative.idl4
-rw-r--r--tests/wpt/tests/interfaces/webnn.idl88
-rw-r--r--tests/wpt/tests/interfaces/webtransport.idl5
-rw-r--r--tests/wpt/tests/mathml/crashtests/mozilla/1092053.html20
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html136
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001-ref.html22
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001.html24
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002-ref.html12
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002.html16
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003-ref.html13
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003.html17
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004-ref.html41
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004.html47
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html11
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html15
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-1.html64
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-2.html132
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-3.html145
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001-ref.html15
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001.html17
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002-ref.html16
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002.html18
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003-ref.html42
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003.html42
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false-ref.html70
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false.html57
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true-ref.html70
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true.html57
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false-ref.html85
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false.html60
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true-ref.html85
-rw-r--r--tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true.html60
-rw-r--r--tests/wpt/tests/mathml/relations/html5-tree/tabindex-focus-001.tentative.html34
-rw-r--r--tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font-ref.html13
-rw-r--r--tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font.html52
-rw-r--r--tests/wpt/tests/mediacapture-streams/historical.https.html4
-rw-r--r--tests/wpt/tests/notifications/resources/helpers.js17
-rw-r--r--tests/wpt/tests/notifications/resources/shownotification-window-iframe.html8
-rw-r--r--tests/wpt/tests/notifications/shownotification-window.https.html37
-rw-r--r--tests/wpt/tests/notifications/shownotification-without-permission.https.window.js12
-rw-r--r--tests/wpt/tests/png/errors/support/invalid-unknown-ancillary-after-IDAT.pngbin0 -> 261 bytes
-rw-r--r--tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2-ref.html17
-rw-r--r--tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2.html21
-rw-r--r--tests/wpt/tests/resources/chromium/fake-serial.js30
-rw-r--r--tests/wpt/tests/service-workers/service-worker/tentative/static-router/resources/router-rules.js13
-rw-r--r--tests/wpt/tests/service-workers/service-worker/tentative/static-router/static-router-invalid-rules.https.html11
-rw-r--r--tests/wpt/tests/svg-aam/role/role-img.tentative.html32
-rw-r--r--tests/wpt/tests/svg-aam/role/roles-generic.html6
-rw-r--r--tests/wpt/tests/svg/animations/repeatcount-attribute-mutation.html19
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-001.svg4
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-003-ref.svg17
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-003.svg26
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-004-ref.svg30
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-004.svg31
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-005-ref.svg22
-rw-r--r--tests/wpt/tests/svg/painting/reftests/paint-context-005.svg39
-rw-r--r--tests/wpt/tests/tools/wpt/browser.py5
-rw-r--r--tests/wpt/tests/tools/wpt/update.py1
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py3
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py317
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorcontentshell.py328
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py12
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/metadata.py14
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/products.py19
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/update/metadata.py14
-rw-r--r--tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttribute.html38
-rw-r--r--tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttributeNS.html45
-rw-r--r--tests/wpt/tests/trusted-types/support/helper.sub.js11
-rw-r--r--tests/wpt/tests/trusted-types/support/navigation-report-only-support.html2
-rw-r--r--tests/wpt/tests/trusted-types/support/navigation-support.html2
-rw-r--r--tests/wpt/tests/web-animations/testcommon.js2
-rw-r--r--tests/wpt/tests/webaudio/the-audio-api/the-oscillatornode-interface/crashtests/stop-before-start.html16
-rw-r--r--tests/wpt/tests/webcodecs/audio-data.any.js533
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/external/permissions/set_permission/set_permission.py17
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/invalid.py15
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py19
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py24
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py31
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/conftest.py8
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/continue_response/credentials.py26
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/action.py13
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py12
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py10
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py33
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py28
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py30
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/partition.py31
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py8
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py4
-rw-r--r--tests/wpt/tests/webdriver/tests/classic/new_session/response.py7
-rw-r--r--tests/wpt/tests/webmidi/idlharness.https.window.js3
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/buffer.https.any.js12
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/gpu/buffer.https.any.js12
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js60
-rw-r--r--tests/wpt/tests/webnn/resources/utils_validation.js14
-rw-r--r--tests/wpt/tests/webnn/validation_tests/gru.https.any.js398
-rw-r--r--tests/wpt/tests/webnn/validation_tests/lstm.https.any.js386
-rw-r--r--tests/wpt/tests/webnn/validation_tests/triangular.https.any.js16
757 files changed, 21626 insertions, 6272 deletions
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
index a647125277a..5496474410b 100644
--- 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
@@ -1,2 +1,2 @@
[mix-blend-mode-animation.html]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-animations/animation-offscreen-to-onscreen.html.ini b/tests/wpt/meta-legacy-layout/css/css-animations/animation-offscreen-to-onscreen.html.ini
new file mode 100644
index 00000000000..9876f879b14
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-animations/animation-offscreen-to-onscreen.html.ini
@@ -0,0 +1,2 @@
+[animation-offscreen-to-onscreen.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/css/css-animations/empty-pseudo-class-with-animation.html.ini b/tests/wpt/meta-legacy-layout/css/css-animations/empty-pseudo-class-with-animation.html.ini
new file mode 100644
index 00000000000..5d78e3a8de2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-animations/empty-pseudo-class-with-animation.html.ini
@@ -0,0 +1,3 @@
+[empty-pseudo-class-with-animation.html]
+ [Setting an "animation" style property on an element does not interfere with the :empty pseudo-class.]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/system-color-consistency.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/system-color-consistency.html.ini
index 343156ca80d..d8796787e59 100644
--- a/tests/wpt/meta-legacy-layout/css/css-color/system-color-consistency.html.ini
+++ b/tests/wpt/meta-legacy-layout/css/css-color/system-color-consistency.html.ini
@@ -79,3 +79,171 @@
[Property color value 'MarkText' has the same color as the color of a mark element]
expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a submit button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a submit button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a submit button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a reset button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a reset button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a reset button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a color picker (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a color picker (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a color picker (light)]
+ expected: FAIL
+
+ [Property color value 'CanvasText' has the same color as the color of the html element (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a password field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a password field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a email field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a email field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a number field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a number field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a date field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a date field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text area (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text area (light)]
+ expected: FAIL
+
+ [Property color value 'Mark' has the same color as the background-color of a mark element (light)]
+ expected: FAIL
+
+ [Property color value 'MarkText' has the same color as the color of a mark element (light)]
+ expected: FAIL
+
+ [Property color value 'LinkText' has the same color as the color of an anchor element (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a submit button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a submit button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a submit button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a reset button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a reset button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a reset button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a color picker (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a color picker (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a color picker (dark)]
+ expected: FAIL
+
+ [Property color value 'CanvasText' has the same color as the color of the html element (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a password field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a password field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a email field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a email field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a number field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a number field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a date field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a date field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text area (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text area (dark)]
+ expected: FAIL
+
+ [Property color value 'Mark' has the same color as the background-color of a mark element (dark)]
+ expected: FAIL
+
+ [Property color value 'MarkText' has the same color as the color of a mark element (dark)]
+ expected: FAIL
+
+ [Property color value 'LinkText' has the same color as the color of an anchor element (dark)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-pseudo/selection-background-color-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-pseudo/selection-background-color-001.html.ini
new file mode 100644
index 00000000000..2ba2bb4894f
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-pseudo/selection-background-color-001.html.ini
@@ -0,0 +1,2 @@
+[selection-background-color-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-text/parsing/webkit-text-stroke-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/parsing/webkit-text-stroke-computed.html.ini
new file mode 100644
index 00000000000..6b4372771dd
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-text/parsing/webkit-text-stroke-computed.html.ini
@@ -0,0 +1,9 @@
+[webkit-text-stroke-computed.html]
+ [Property -webkit-text-stroke value 'green']
+ expected: FAIL
+
+ [Property -webkit-text-stroke value '3px']
+ expected: FAIL
+
+ [Property -webkit-text-stroke value '1px red']
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-text/white-space/text-wrap-balance-003.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/white-space/text-wrap-balance-003.html.ini
new file mode 100644
index 00000000000..3a4f210bbf0
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-text/white-space/text-wrap-balance-003.html.ini
@@ -0,0 +1,2 @@
+[text-wrap-balance-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini
new file mode 100644
index 00000000000..ad1ee1284d2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini
@@ -0,0 +1,144 @@
+[rotate-interpolation-math-functions-tentative.html]
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini
new file mode 100644
index 00000000000..1df3f824ee2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini
@@ -0,0 +1,144 @@
+[scale-animation-math-functions-tentative.html]
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ 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 ba84cd6c00b..9a753b3a13b 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
@@ -79,3 +79,12 @@
[resolved height for height in definite height container: calc-size(calc-size(min-content, 30px), 15em)]
expected: FAIL
+
+ [resolved height for height in definite height container: calc(12% + calc-size(any, 31%))]
+ expected: FAIL
+
+ [resolved height for height in auto height container: calc-size(any, 31% + 12px)]
+ expected: FAIL
+
+ [resolved height for height in definite height container: calc-size(any, 31% + 12px)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini b/tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini
new file mode 100644
index 00000000000..0d747763bda
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini
@@ -0,0 +1,3 @@
+[Node-append-meta-referrer-and-script-from-fragment.tentative.html]
+ [<meta name=referrer> should apply before script, as it is an insertion step and not a post-insertion step]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/fetch/api/basic/request-upload.h2.any.js.ini b/tests/wpt/meta-legacy-layout/fetch/api/basic/request-upload.h2.any.js.ini
index 40f8cb45732..e039ea7fbfc 100644
--- a/tests/wpt/meta-legacy-layout/fetch/api/basic/request-upload.h2.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/fetch/api/basic/request-upload.h2.any.js.ini
@@ -36,6 +36,9 @@
[Streaming upload should fail on a 401 response]
expected: NOTRUN
+ [ReadbleStream should be closed on signal.abort]
+ expected: NOTRUN
+
[request-upload.h2.any.html]
expected: TIMEOUT
@@ -72,6 +75,9 @@
[Streaming upload should fail on a 401 response]
expected: NOTRUN
+ [ReadbleStream should be closed on signal.abort]
+ expected: NOTRUN
+
[request-upload.h2.any.sharedworker.html]
expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/fetch/api/body/formdata.any.js.ini b/tests/wpt/meta-legacy-layout/fetch/api/body/formdata.any.js.ini
index 2fbdce4291b..f70c16e0801 100644
--- a/tests/wpt/meta-legacy-layout/fetch/api/body/formdata.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/fetch/api/body/formdata.any.js.ini
@@ -5,6 +5,9 @@
[Consume empty request.formData() as FormData]
expected: FAIL
+ [Consume multipart/form-data headers case-insensitively]
+ expected: FAIL
+
[formdata.any.html]
[Consume empty response.formData() as FormData]
@@ -12,3 +15,6 @@
[Consume empty request.formData() as FormData]
expected: FAIL
+
+ [Consume multipart/form-data headers case-insensitively]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
deleted file mode 100644
index 3e07e6b7d1f..00000000000
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[empty-iframe-load-event.html]
- [Check execution order from nested timeout]
- expected: FAIL
-
- [Check execution order on load handler]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
index 149bcb4ff8c..b8fd22e2b81 100644
--- a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html.ini
@@ -10,3 +10,6 @@
[load & pageshow events do not fire on contentWindow of <iframe> element created with src='about:blank']
expected: FAIL
+
+ [load & pageshow events do not fire on contentWindow of <iframe> element created with src='']
+ expected: FAIL
diff --git a/tests/wpt/meta/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
index 4ecd6d9f753..4ecd6d9f753 100644
--- a/tests/wpt/meta/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
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/history_reload_referrer.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/history_reload_referrer.html.ini
new file mode 100644
index 00000000000..8771b1488b8
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/history_reload_referrer.html.ini
@@ -0,0 +1,18 @@
+[history_reload_referrer.html]
+ [Step 2: Checking HTTP referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 2: Checking document.referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 3: Checking HTTP referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 3: Checking document.referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 4: Checking HTTP referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 4: Checking document.referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
deleted file mode 100644
index 7a5fcb79165..00000000000
--- a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[traverse_the_history_5.html]
- [Multiple history traversals, last would be aborted]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini b/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini
deleted file mode 100644
index 443ba6bad27..00000000000
--- a/tests/wpt/meta-legacy-layout/html/browsers/history/the-history-interface/traverse_the_history_write_onload_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_write_onload_1.html]
- expected: TIMEOUT
- [Traverse the history when a history entry is written in the load event]
- expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini
new file mode 100644
index 00000000000..61b88554d0e
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini
@@ -0,0 +1,3 @@
+[2d.drawImage.detachedcanvas.html]
+ [drawImage with detached OffscreenCanvas as the source should throw exception]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
index 4451a7d8a32..e5fbdab7da4 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.blur.exceptions.tentative.html]
[Test exceptions on CanvasFilter() blur.object]
expected: FAIL
+
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
index 61dafe7fce7..50f0600fa7e 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.colorMatrix.tentative.html]
[Test the functionality of ColorMatrix filters in CanvasFilter objects]
expected: FAIL
+
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
index 8c7cb3e0057..44fb3c2c991 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with discrete type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
index 53f59082097..b250f2e5ea5 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with gamma type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
index aebe150b830..d494c5e861b 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with identity type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
index 4057e21a548..88e01144a3e 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with linear type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
index 19140a3824d..13a97856ea6 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.table.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with table type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini
new file mode 100644
index 00000000000..9b2b4119845
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.colorMatrix.html]
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini
new file mode 100644
index 00000000000..28eee7745b4
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.discrete.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini
new file mode 100644
index 00000000000..59b029b6229
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.gamma.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini
new file mode 100644
index 00000000000..e09298d1220
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.identity.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini
new file mode 100644
index 00000000000..5a9b35c68fa
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.linear.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini
new file mode 100644
index 00000000000..3ec9d635126
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.table.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
new file mode 100644
index 00000000000..d868cd8c204
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.convolveMatrix.exceptions.html]
+ [Test exceptions on CanvasFilter() convolveMatrix]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini
new file mode 100644
index 00000000000..7d7a9154df7
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.dropShadow.exceptions.html]
+ [Test exceptions on CanvasFilter() dropShadow object]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini
new file mode 100644
index 00000000000..7369fa6d232
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.dropShadow.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini
new file mode 100644
index 00000000000..e16419cdde1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.turbulence.inputTypes.html]
+ [Test exceptions on CanvasFilter() turbulence object]
+ expected: FAIL
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
new file mode 100644
index 00000000000..5ef89398095
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..d0dd1552396
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
index 4451a7d8a32..e5fbdab7da4 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.blur.exceptions.tentative.html]
[Test exceptions on CanvasFilter() blur.object]
expected: FAIL
+
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini
index a9ec08d8a7c..e21f89baa71 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.html]
[Test exceptions on CanvasFilter() blur.object]
expected: FAIL
+
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
index 61dafe7fce7..50f0600fa7e 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.colorMatrix.tentative.html]
[Test the functionality of ColorMatrix filters in CanvasFilter objects]
expected: FAIL
+
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini
index bb5dabba5e0..664e0fc8529 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.colorMatrix.tentative.worker.html]
[Test the functionality of ColorMatrix filters in CanvasFilter objects]
expected: FAIL
+
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
index 8c7cb3e0057..44fb3c2c991 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with discrete type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini
new file mode 100644
index 00000000000..fea0f2668e9
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini
deleted file mode 100644
index 24b1fac3ccc..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with discrete type]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
index 53f59082097..b250f2e5ea5 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with gamma type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini
new file mode 100644
index 00000000000..37efdad8181
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini
deleted file mode 100644
index 5f78a2365a0..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with gamma type]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
index aebe150b830..d494c5e861b 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with identity type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini
new file mode 100644
index 00000000000..cdbf822301f
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini
deleted file mode 100644
index 0275b7913e7..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with identity type]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
index 4057e21a548..88e01144a3e 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with linear type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini
new file mode 100644
index 00000000000..8bee7228c85
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini
deleted file mode 100644
index d0fbf3043f4..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with linear type]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
index 19140a3824d..13a97856ea6 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.table.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with table type]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini
new file mode 100644
index 00000000000..95347189c0d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini
deleted file mode 100644
index 4c87d952f06..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with table type]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini
new file mode 100644
index 00000000000..9b2b4119845
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.colorMatrix.html]
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini
new file mode 100644
index 00000000000..e2f8f0a630a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.colorMatrix.worker.html]
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini
new file mode 100644
index 00000000000..28eee7745b4
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.discrete.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini
new file mode 100644
index 00000000000..b01f46aed3d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.discrete.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini
new file mode 100644
index 00000000000..59b029b6229
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.gamma.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini
new file mode 100644
index 00000000000..00e0f519dbd
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.gamma.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini
new file mode 100644
index 00000000000..e09298d1220
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.identity.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini
new file mode 100644
index 00000000000..93ebc7a0293
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.identity.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini
new file mode 100644
index 00000000000..5a9b35c68fa
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.linear.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini
new file mode 100644
index 00000000000..38923d05ade
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.linear.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini
new file mode 100644
index 00000000000..3ec9d635126
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.table.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini
new file mode 100644
index 00000000000..a5076d74370
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.table.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
new file mode 100644
index 00000000000..d868cd8c204
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.convolveMatrix.exceptions.html]
+ [Test exceptions on CanvasFilter() convolveMatrix]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini
new file mode 100644
index 00000000000..a1ae7043728
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.convolveMatrix.exceptions.worker.html]
+ [Test exceptions on CanvasFilter() convolveMatrix]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini
new file mode 100644
index 00000000000..7d7a9154df7
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.dropShadow.exceptions.html]
+ [Test exceptions on CanvasFilter() dropShadow object]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini
new file mode 100644
index 00000000000..5e424dff115
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.dropShadow.exceptions.worker.html]
+ [Test exceptions on CanvasFilter() dropShadow object]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini
new file mode 100644
index 00000000000..4c282823717
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.dropShadow.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini
new file mode 100644
index 00000000000..e16419cdde1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.turbulence.inputTypes.html]
+ [Test exceptions on CanvasFilter() turbulence object]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini
new file mode 100644
index 00000000000..2655d8b0b11
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.turbulence.inputTypes.worker.html]
+ [Test exceptions on CanvasFilter() turbulence object]
+ expected: FAIL
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
new file mode 100644
index 00000000000..5ef89398095
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..6250c94a0e1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..d0dd1552396
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..e137417e456
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini
@@ -0,0 +1,3 @@
+[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 42584efd4bd..759156c30fe 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
@@ -2096,6 +2096,33 @@
[NotRestoredReasons interface: operation toJSON()]
expected: FAIL
+ [PageSwapEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [PageSwapEvent interface object length]
+ expected: FAIL
+
+ [PageSwapEvent interface object name]
+ expected: FAIL
+
+ [PageSwapEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [PageSwapEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [PageSwapEvent interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [PageSwapEvent interface: attribute activation]
+ expected: FAIL
+
+ [PageSwapEvent interface: attribute viewTransition]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpageswap]
+ expected: FAIL
+
[idlharness.https.html?include=(Document|Window)]
[Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
@@ -2758,6 +2785,12 @@
[Window interface: window must inherit property "onpagereveal" with the proper type]
expected: FAIL
+ [Window interface: attribute onpageswap]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onpageswap" with the proper type]
+ expected: FAIL
+
[idlharness.https.html?include=HTML.*]
[HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
@@ -5099,3 +5132,15 @@
[HTMLTemplateElement interface: document.createElement("template") must inherit property "shadowRootClonable" with the proper type]
expected: FAIL
+
+ [HTMLBodyElement interface: attribute onpageswap]
+ expected: FAIL
+
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "onpageswap" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: attribute onpageswap]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-001.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-001.html.ini
index 346d7282c0a..332e5d8560d 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-001.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-001.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-001.tentative.html]
+[element-render-blocking-001.html]
[blocking defers frames until full parsing]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.html.ini
index 511925c1b61..e45579f7cfe 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-002.tentative.html]
+[element-render-blocking-002.html]
[blocking defers until needed element is parsed]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-003.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-003.html.ini
index 92a6b95f046..9ce0274bd34 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-003.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-003.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-003.tentative.html]
+[element-render-blocking-003.html]
[adding link in the head defers frames]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-006.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-006.html.ini
index a6e9373200b..77041e12473 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-006.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-006.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-006.tentative.html]
+[element-render-blocking-006.html]
[adding 'blocking=render' in the head makes it blocking]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-008.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-008.html.ini
index 9561d696beb..e8b52644582 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-008.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-008.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-008.tentative.html]
+[element-render-blocking-008.html]
[changing media to matching causes link to have an effect]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-011.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-011.html.ini
index 0675b813616..79f8db6e440 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-011.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-011.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-011.tentative.html]
+[element-render-blocking-011.html]
[changing rel to expect in the head causes it to be blocking]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-012.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-012.html.ini
index 1e31c3f000e..3389a59607c 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-012.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-012.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-012.tentative.html]
+[element-render-blocking-012.html]
[adding href in the head makes it blocking]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-024.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-024.html.ini
index 3e821238f4e..31bccf7da9d 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-024.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-024.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-024.tentative.html]
+[element-render-blocking-024.html]
[unknown href causes the whole document to be blocked]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-027.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-027.html.ini
index 61f04ef7a4d..19a5687b603 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-027.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-027.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-027.tentative.html]
+[element-render-blocking-027.html]
[unknown href causes the whole document to be blocked (with href changes!)]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.html.ini
index 342b4dbb48d..ff4108cee18 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-028.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-028.tentative.html]
+[element-render-blocking-028.html]
[removing some links but not all keeps at least the matching link blocking]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-033.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-033.html.ini
index 990ba49fedc..6580246c973 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-033.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-033.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-033.tentative.html]
+[element-render-blocking-033.html]
[blocking defers frames until full parsing]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-034.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-034.html.ini
index 0e2f5bf93c1..41f8675b78c 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-034.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-034.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-034.tentative.html]
+[element-render-blocking-034.html]
[relative URLs that match this document are OK]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-035.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-035.html.ini
index 99856076384..e3db94cc14a 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-035.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-035.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-035.tentative.html]
+[element-render-blocking-035.html]
[relative URLs that match this document are OK, regarless of <base>]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-037.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-037.html.ini
index b6357e1f207..651497adf58 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-037.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-037.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-037.tentative.html]
+[element-render-blocking-037.html]
[relative URLs that match this document are OK, regarless of <base>]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-038.html.ini b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-038.html.ini
new file mode 100644
index 00000000000..1c828648d44
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-038.html.ini
@@ -0,0 +1,3 @@
+[element-render-blocking-038.html]
+ [link rel=expect: only connected elements are eligible]
+ 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 2ef0896e3b3..8b8af2b9c2e 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,4 +1,3 @@
[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/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini
new file mode 100644
index 00000000000..d2ba1364703
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini
@@ -0,0 +1,6 @@
+[stylesheet-bad-mime-type.html]
+ ['load' event does not fire at link@rel=stylesheet having non-empty resource with bad MIME type]
+ expected: FAIL
+
+ ['load' event does not fire at link@rel=stylesheet having empty resource with bad MIME type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini
deleted file mode 100644
index 09c049e4b58..00000000000
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[media_fragment_seek.html]
- [Video should seek to time specified in media fragment syntax]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html.ini
index 380d474f385..a45a29d3b6b 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html.ini
@@ -1,8 +1,7 @@
-[iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html]
+[iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html]
expected: TIMEOUT
[Navigation resulted download in sandbox is allowed by allow-downloads.]
expected: FAIL
[Navigation resulted download in sandbox from <object> is allowed by allow-downloads.]
expected: TIMEOUT
-
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 26704422bbe..4b77e7d8e61 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
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta-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 49e3449f144..f2378357bcc 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,4 +1,5 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html.ini
index 451c172d31f..abac491b14a 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html.ini
@@ -1,4 +1,4 @@
-[iframe_sandbox_window_open_download_allow_downloads.tentative.html]
+[iframe_sandbox_window_open_download_allow_downloads.tentative.https.html]
expected: TIMEOUT
[window.open(download, ) triggering download in sandbox is allowed by allow-downloads.]
expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini
index 31745fdcdcf..f94afff765f 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini
@@ -1,7 +1,4 @@
-[sandbox-top-navigation-child-special-cases.tentative.sub.window.html]
- [Allow top with user activation + user activation]
- expected: FAIL
-
+[sandbox-top-navigation-child-cross-origin.tentative.sub.window.html]
[A cross-origin frame with frame sandbox flags can navigate top]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini
deleted file mode 100644
index 3f9e0522fd4..00000000000
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js.ini
+++ /dev/null
@@ -1,13 +0,0 @@
-[sandbox-top-navigation-child-special-cases.tentative.sub.window.html]
- expected: TIMEOUT
- [Allow top with user activation + user activation]
- expected: TIMEOUT
-
- [A cross-origin frame with frame sandbox flags can navigate top]
- expected: NOTRUN
-
- [A cross-origin frame with delivered sandbox flags can not navigate top]
- expected: NOTRUN
-
- [allow-top-navigation-by-user-activation set but no sticky activation]
- expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini
new file mode 100644
index 00000000000..299cab92fd5
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini
@@ -0,0 +1,10 @@
+[sandbox-top-navigation-cross-site.tentative.sub.window.html]
+ expected: TIMEOUT
+ [A cross-site unsandboxed iframe navigation consumes user activation and disallows top-level navigation.]
+ expected: TIMEOUT
+
+ [A same-site unsandboxed iframe navigation does not consume user activation and allows top-level navigation.]
+ expected: NOTRUN
+
+ [A same-site unsandboxed iframe navigation without sticky user activation does not allow top-level navigation.]
+ expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini
new file mode 100644
index 00000000000..b0ed7c451c2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini
@@ -0,0 +1,7 @@
+[sandbox-top-navigation-user-activation.tentative.sub.window.html]
+ expected: TIMEOUT
+ [Allow top with user activation + user activation]
+ expected: TIMEOUT
+
+ [allow-top-navigation-by-user-activation set but no sticky activation]
+ expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini
new file mode 100644
index 00000000000..e2858b0f762
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini
@@ -0,0 +1,2 @@
+[select-child-button-and-datalist-invalidation.tentative.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini
new file mode 100644
index 00000000000..685f04dcb25
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini
@@ -0,0 +1,9 @@
+[select-datalist-options-idl.tentative.html]
+ [Option elements should work if they are a descendant of a selects datalist.]
+ expected: FAIL
+
+ [Options in datalist should still work when the multiple attribute is added.]
+ expected: FAIL
+
+ [Options in datalist in multiple should work after re-parsing and re-attaching.]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/invokers/interestelement-interface.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/invokers/interestelement-interface.tentative.html.ini
index 5f7e2c98053..65ca46c5024 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/invokers/interestelement-interface.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/invokers/interestelement-interface.tentative.html.ini
@@ -16,3 +16,24 @@
[interestTargetElement throws error on assignment of non Element]
expected: FAIL
+
+ [interestAction reflects '' when attribute not present]
+ expected: FAIL
+
+ [interestAction reflects '' when attribute empty, setAttribute version]
+ expected: FAIL
+
+ [interestAction reflects '' when attribute empty, IDL setter version]
+ expected: FAIL
+
+ [interestAction reflects same casing]
+ expected: FAIL
+
+ [interestAction reflects '' when attribute set to [\]]
+ expected: FAIL
+
+ [interestAction reflects tostring value]
+ expected: FAIL
+
+ [interestAction reflects tostring value 2]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/invokers/invokeelement-interface.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/invokers/invokeelement-interface.tentative.html.ini
index e8781936e24..587bdaf84d3 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/invokers/invokeelement-interface.tentative.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/invokers/invokeelement-interface.tentative.html.ini
@@ -34,3 +34,12 @@
[invokeAction reflects same casing]
expected: FAIL
+
+ [invokeAction reflects '' when attribute not present]
+ expected: FAIL
+
+ [invokeAction reflects '' when attribute empty, setAttribute version]
+ expected: FAIL
+
+ [invokeAction reflects '' when attribute set to [\]]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
index d53e777878e..f91a8774519 100644
--- a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
@@ -164,3 +164,21 @@
[shadowed pagereveal removal (window)]
expected: FAIL
+
+ [shadowed pageswap (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap (document.createElement("body"))]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.createElement("body"))]
+ expected: FAIL
+
+ [shadowed pageswap (window)]
+ expected: FAIL
+
+ [shadowed pageswap removal (window)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
index e43e5549ed3..b248907ed2c 100644
--- a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
@@ -160,3 +160,21 @@
[shadowed pagereveal removal (window)]
expected: FAIL
+
+ [shadowed pageswap (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap (document.createElement("frameset"))]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.createElement("frameset"))]
+ expected: FAIL
+
+ [shadowed pageswap (window)]
+ expected: FAIL
+
+ [shadowed pageswap removal (window)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
index ea730d5c049..64fda051bb5 100644
--- a/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
@@ -97,3 +97,15 @@
[Ignore setting of pagereveal window event handlers on windowless frameset]
expected: FAIL
+
+ [Return null when getting the pageswap event handler of a windowless body]
+ expected: FAIL
+
+ [Ignore setting of pageswap window event handlers on windowless body]
+ expected: FAIL
+
+ [Return null when getting the pageswap event handler of a windowless frameset]
+ expected: FAIL
+
+ [Ignore setting of pageswap window event handlers on windowless frameset]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/webmessaging/with-ports/018.html.ini b/tests/wpt/meta-legacy-layout/webmessaging/without-ports/018.html.ini
index b7b36c1d3a4..b7b36c1d3a4 100644
--- a/tests/wpt/meta-legacy-layout/webmessaging/with-ports/018.html.ini
+++ b/tests/wpt/meta-legacy-layout/webmessaging/without-ports/018.html.ini
diff --git a/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini
index fe8654e447c..24daae4c2e7 100644
--- a/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini
+++ b/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini
@@ -1,4 +1,3 @@
[WorkerGlobalScope-close.html]
[Test sending a message after closing.]
expected: FAIL
-
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 0690fe385b7..53ae549808c 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -413,13 +413,6 @@
{}
]
],
- "svg-mouse-listener.html": [
- "2de613e1d373d487f9cf5d55076c03b426e1b41e",
- [
- null,
- {}
- ]
- ],
"table-ignored-child.html": [
"99f385f6eaf3ebdbc5b8c4517c9a7ec7fce50117",
[
@@ -601,7 +594,7 @@
]
],
"chrome-1512373-2-crash.html": [
- "ac27d8c2647c138fff1d4a93862aeb3291864596",
+ "433609766c9195344c5bb45a4c20d0843ae0d697",
[
null,
{}
@@ -7000,6 +6993,13 @@
{}
]
],
+ "1092053.html": [
+ "51b5858b6f33d06a486deaef99ad4564312efad9",
+ [
+ null,
+ {}
+ ]
+ ],
"1221888-1.html": [
"741daa7503fb5a997478bbcc252aeb7cbdd093cf",
[
@@ -8232,6 +8232,17 @@
]
]
}
+ },
+ "the-oscillatornode-interface": {
+ "crashtests": {
+ "stop-before-start.html": [
+ "89d22c0d18b3622f38975b30c312256d963738bb",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
}
}
},
@@ -9670,6 +9681,13 @@
{}
]
],
+ "display-override-member-media-feature-tabbed-manual.tentative.html": [
+ "04560071dfa4cc1590475b6ff87feab545b8255e",
+ [
+ null,
+ {}
+ ]
+ ],
"display-override-member-media-feature-window-controls-overlay-overrides-browser-manual.tentative.html": [
"0929b43dec89c0ad50fd733fa48eb68177e9b8fa",
[
@@ -30751,7 +30769,163 @@
{}
]
]
- }
+ },
+ "table-fragmentation-001a-print.html": [
+ "4f2123b6487cb81d8bc42e4654b35dc136c1a1c3",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-001a-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-001b-print.html": [
+ "d445206a2b8df031bd2f9a7d78d1f6874ac86913",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-001a-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-001c-print.html": [
+ "4615270c4000db50d56c1c95d6a2610e887212fb",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-001c-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-001d-print.html": [
+ "ad120c24818b6134a6d7fdac79cb14889697c186",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-001c-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-002a-print.html": [
+ "88ea8cd6977577d49ebba689ca88835c8933f19f",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-002a-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-002b-print.html": [
+ "97e102e3cd725e5e1eaa6f35d6361557f49a5e45",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-002a-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-002c-print.html": [
+ "29fccdef999087aa88d429e6cc0351cf4471f9ad",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-002c-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-002d-print.html": [
+ "67aa7624b76e2fddb1e406178ac91c6f0128f7ae",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-002c-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-003a-print.html": [
+ "c6190855b01b7a2e71e7cec577739654e930348d",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-003a-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-003b-print.html": [
+ "a1d3b21298e594d0dd14bd74b74a7319b9fd3c7c",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-003a-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-003c-print.html": [
+ "9c4f8d3873af50c72292ba9428f4afe455db20fb",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-003c-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "table-fragmentation-003d-print.html": [
+ "1903a68c58d4d5cc58ba2bec19154114bccd2e5e",
+ [
+ null,
+ [
+ [
+ "/css/css-break/table/table-fragmentation-003c-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
},
"underflow-from-next-page-print.html": [
"57fd12a831937dad52f99a6d3fc65248464a11f5",
@@ -120221,7 +120395,7 @@
]
],
"anchor-default-001.html": [
- "8bb59851ee656715cb30d3a26690ee807b7fd7ca",
+ "1700a84aa8814e0f6e0533125803609fa6568535",
[
null,
[
@@ -120234,7 +120408,7 @@
]
],
"anchor-default-002.html": [
- "261119e0174544b86548dc2f06000853f6cd5656",
+ "c0a962ad3679a7b96f906e6a213f2aeb74f10a97",
[
null,
[
@@ -120403,7 +120577,7 @@
]
],
"anchor-scroll-chained-fallback.tentative.html": [
- "bc7e231e7ce7de0b1b484b945914c3b02e5c2f37",
+ "32cd9de0054b713c623d3adab27fe53d981bdf92",
[
null,
[
@@ -120742,6 +120916,19 @@
{}
]
],
+ "animation-offscreen-to-onscreen.html": [
+ "bfdf432a61e16d20d26f5e0ccfa419f7754950c3",
+ [
+ null,
+ [
+ [
+ "/css/css-animations/animation-offscreen-to-onscreen-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"animation-opacity-pause-and-set-time.html": [
"cbf63ea2178638e6f476307954ba0337d35cd570",
[
@@ -180518,6 +180705,19 @@
{}
]
],
+ "firefox-bug-1881495.html": [
+ "355d26dfb0ba9ca4ca040184e6868c55813d051a",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/firefox-bug-1881495-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"grid-child-percent-basis-resize-1.html": [
"7fb5d8e117d9f0b7e23bf3921843e8ea29ef4522",
[
@@ -185322,7 +185522,7 @@
]
],
"line-names-010.html": [
- "f22cfe3303ec5be1d58092e3b70d50e67e1e6df3",
+ "49295b50b40984bc0ac8d232779bd9da420787a7",
[
null,
[
@@ -185607,6 +185807,32 @@
{}
]
],
+ "scrollbar-gutter-001.html": [
+ "664e4bc70eb519a264c1ec1406647be1ce7fdea5",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/subgrid/scrollbar-gutter-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scrollbar-gutter-002.html": [
+ "724bf06104c83c1a11c6eeb0143333f6448fd8b9",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/subgrid/scrollbar-gutter-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"standalone-axis-size-001.html": [
"aaa71ddbef27768ccae6601c2b0df7428637469a",
[
@@ -187079,6 +187305,19 @@
{}
]
],
+ "custom-highlight-painting-priority-text-decoration-001.html": [
+ "7ab318b5a118c46af4e4a01f146240d433fa8a5d",
+ [
+ null,
+ [
+ [
+ "/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"custom-highlight-painting-staticrange-001.html": [
"ee81bb89d713b6df203b00a0b92d67b2da7800b1",
[
@@ -217827,6 +218066,19 @@
{}
]
],
+ "selection-background-color-001.html": [
+ "a416d31e186606bb6b8c9ee5a8ef987bcce5b844",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"selection-background-painting-order.html": [
"a21cfe8ab732c365ebff20b072e00d3384a6506e",
[
@@ -241410,6 +241662,129 @@
{}
]
],
+ "text-spacing-trim-span-001.html": [
+ "623abbf7c7f9c78188e89990ff7fc878ea9bf15f",
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=chws,htb",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=chws,htb",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=chws,vrl",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=chws,vrl",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=halt,htb",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=halt,htb",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=halt,vrl",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=halt,vrl",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=space-first,chws,htb",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=space-first,chws,htb",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=space-first,chws,vrl",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=space-first,chws,vrl",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=space-first,halt,htb",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=space-first,halt,htb",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=space-first,halt,vrl",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=space-first,halt,vrl",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=trim-start,chws,htb",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=trim-start,chws,htb",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=trim-start,chws,vrl",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=trim-start,chws,vrl",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=trim-start,halt,htb",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=trim-start,halt,htb",
+ "=="
+ ]
+ ],
+ {}
+ ],
+ [
+ "css/css-text/text-spacing-trim/text-spacing-trim-span-001.html?class=trim-start,halt,vrl",
+ [
+ [
+ "/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html?class=trim-start,halt,vrl",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"text-spacing-trim-start-001.html": [
"f007245277b7c26bcc92ac5a70664b42b914a5fc",
[
@@ -245984,6 +246359,19 @@
{}
]
],
+ "text-wrap-balance-003.html": [
+ "a2eb8bbff561acf3105103ee8189672c8c34d96e",
+ [
+ null,
+ [
+ [
+ "/css/css-text/white-space/reference/text-wrap-balance-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"text-wrap-balance-align-001.html": [
"b27823b72a4dfec983e0e0eae7a5436d9f958b74",
[
@@ -259302,6 +259690,19 @@
{}
]
],
+ "svgbox-stroke-box-005.html": [
+ "c1a741b7411e4dbcc02588b158ac298ccc2ae6cf",
+ [
+ null,
+ [
+ [
+ "/css/css-transforms/transform-box/reference/svgbox-rect-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"svgbox-view-box.html": [
"dbce635d6e78652c5f96904fa095f3d3f23ac134",
[
@@ -311586,8 +311987,137 @@
]
],
"filters": {
+ "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [
+ "0a4830568b409ea329a99eed9b06aa6f41000572",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [
+ "22e3abe624fbe6b8ac795be09ee3e06018166ba5",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [
+ "17761ce31a2f3c2beffff54ba17109aaa9d669e4",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [
+ "5ea5f8e0e310dc2f1d0687231ed5acd519f41c0c",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [
+ "0f74d9c3bfd3735dca158fe28f2dd82944310349",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"2d.filter.canvasFilterObject.dropShadow.tentative.html": [
- "47bb891b3f88cb0253cc646bc1e649bd4907fa06",
+ "d6e706647387a54c790f227bf282cea0cde00d8c",
[
null,
[
@@ -311664,6 +312194,148 @@
{}
]
],
+ "2d.filter.layers.componentTransfer.discrete.html": [
+ "ef9db79547c7bc8c0fd43f564e7f36d93ca0721a",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.gamma.html": [
+ "cccd07e92b9a715d129b21f0f692937e53ce4f20",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.identity.html": [
+ "3a06353849c7b88b12651488d088bfc40429cf61",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.linear.html": [
+ "c9e744ebef0b3982a2bb32feaf234118d6620756",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.table.html": [
+ "eae036b142dba42476a99677e2c6b635eb95f12e",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.layers.componentTransfer.table-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.dropShadow.html": [
+ "ceb20bb9eb3bc59a9e853a6a42d6e65af95065eb",
+ [
+ null,
+ [
+ [
+ "/html/canvas/element/filters/2d.filter.layers.dropShadow-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"2d.filter.layers.gaussianBlur.isotropic.html": [
"a2cc098896823a201c7e6f108e6b2e81b432c13d",
[
@@ -312161,7 +312833,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.html": [
- "27989c79e93db9fe4bb26782efacce20dd3570ff",
+ "98ea67e9e96e0d969ad8be8b26a47a25bb6fdce0",
[
null,
[
@@ -312181,7 +312853,7 @@
],
[
0,
- 2440
+ 2453
]
]
]
@@ -313793,8 +314465,266 @@
},
"offscreen": {
"filters": {
+ "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [
+ "491d073efbcc569e467d74e3a44c3407f694bca6",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html": [
+ "d3a999a24262684532b71c8b9610ebfd7bd683ea",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [
+ "b262f3b1d32dcb9cfc4d37c254713838137cc567",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html": [
+ "1fe346eacf23f411c6b02c38f5c0fe65206e03f7",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [
+ "26b6e4c70226463f5b46723bc1035496d77524b3",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html": [
+ "d2216d16479ebae91505f295fd988f78c9fdd0c0",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [
+ "3fc3bd9eec249e77fde9c2beb663d8b978d6d1c9",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html": [
+ "054dbce92992231cc3140bb6e76ab25e8328cf05",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [
+ "ef2da126eb47370ebd7b801158ffd778b364c27d",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html": [
+ "f39723da8e86e066f03fc95b20b6aa27127eb596",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"2d.filter.canvasFilterObject.dropShadow.tentative.html": [
- "81eb1eae453045c01afd3b74d8e72bd00540c684",
+ "7569304b95aa253bc9ec2f4a9787bab3fc12bdf8",
[
null,
[
@@ -313807,7 +314737,7 @@
]
],
"2d.filter.canvasFilterObject.dropShadow.tentative.w.html": [
- "fe9087244a08f47fbdca8bfd9b844abe56bb984a",
+ "2a26af4ec3eae0bd8e8f65ac29752e67633d975e",
[
null,
[
@@ -313949,6 +314879,290 @@
{}
]
],
+ "2d.filter.layers.componentTransfer.discrete.html": [
+ "459c2f28504da3ceb69a75fa7d5df85708c799a8",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.discrete.w.html": [
+ "86e1d54fb7c87db8a741c96db6adb1415c866701",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.gamma.html": [
+ "9012115adfca1274609ee2dd8f6c74c86bc8c58b",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.gamma.w.html": [
+ "767bcc58e5fdedffd83ad20c64908cb7e7f8414d",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.identity.html": [
+ "901dae3bed499a0afd1ca84b8728bcc6b396e9df",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.identity.w.html": [
+ "2e45018755a315c332cf5507c69b385c6d47246a",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.linear.html": [
+ "f418b72ad552f2c1b508cadf5c0428acbf106ccc",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.linear.w.html": [
+ "fbc29c86c170c2f2ae3cfe521ce5a774702d1e0c",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.table.html": [
+ "ef5e0f847ba693406191b6aa26f9326a23052a7d",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.componentTransfer.table.w.html": [
+ "b11f0ef6f30e125001fe99aa3c90881967236bee",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table-expected.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 500
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "2d.filter.layers.dropShadow.html": [
+ "1ecf309fc4e59a4dbf1baa6855bdb88a58852705",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.dropShadow-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "2d.filter.layers.dropShadow.w.html": [
+ "e73b573779ede7e9dbe7a0d512b77ae9818a3311",
+ [
+ null,
+ [
+ [
+ "/html/canvas/offscreen/filters/2d.filter.layers.dropShadow-expected.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"2d.filter.layers.gaussianBlur.isotropic.html": [
"50a98df1bed0b50618c9ffd2e9ccae1b37fccfdd",
[
@@ -314914,7 +316128,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.html": [
- "1e5c6ad8b7597e9dc17b5bc06b1fa3216f512442",
+ "0e48cb49f795269f2920e66b99f2cdba88ba69b0",
[
null,
[
@@ -314934,7 +316148,7 @@
],
[
0,
- 2440
+ 2453
]
]
]
@@ -314969,7 +316183,7 @@
]
],
"2d.layer.global-states.filter.alpha.blending.w.html": [
- "142e900fd1b611492c10bc904d317e8ae9370033",
+ "3887ed4485bdc2c4180493bbc430e1882f191ea1",
[
null,
[
@@ -314989,7 +316203,7 @@
],
[
0,
- 2440
+ 2453
]
]
]
@@ -322378,8 +323592,21 @@
{}
]
],
+ "select-child-button-and-datalist-invalidation.tentative.html": [
+ "f71c1e52fc612baf0a30a2280fae8f2a76204898",
+ [
+ null,
+ [
+ [
+ "/html/semantics/forms/the-select-element/select-child-button-and-datalist-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"select-child-button-and-datalist.tentative.html": [
- "b74957feed89b7c488bb9902a39942361c8edbf8",
+ "54785ace95150ef1013565241d4d74fc078657b3",
[
null,
[
@@ -326380,6 +327607,71 @@
],
{}
]
+ ],
+ "semantics-001.html": [
+ "63aa9a4da887a3271f2058a59c525ee46a2dcd46",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/mrow/semantics-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "semantics-002.html": [
+ "62028fb863ee2f1fb89556748501f9ccf226f680",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/mrow/semantics-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "semantics-003.html": [
+ "83572f4c8c3820e347a73dbcb5a130651b7627a0",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/mrow/semantics-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "semantics-004.html": [
+ "17f0f1ecd09419d55840424e27f11c35e21ff79b",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/mrow/semantics-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "semantics-005.html": [
+ "e4fe611c475d0caa28677019868cb54a1c9bb7b6",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/mrow/semantics-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"operators": {
@@ -327193,6 +328485,45 @@
]
},
"scripts": {
+ "mmultiscript-001.html": [
+ "e55a04e12864577004fe1cbfc2201bc91db4bb7b",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/mmultiscript-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mmultiscript-002.html": [
+ "c5e426008f9f7517a858703416e84d17f78a4989",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/mmultiscript-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "mmultiscript-003.html": [
+ "7de3e98b8ab8a06ef5e66f52bb2fb4bcbce99da4",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/mmultiscript-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"mover-accent-dynamic-change.html": [
"a744149e6061310a2df2461635fba4a69c116707",
[
@@ -327219,6 +328550,58 @@
{}
]
],
+ "munder-mover-align-accent-false.html": [
+ "0d4205410a9e842c89b17d6eac0df47c6cd9bf36",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/munder-mover-align-accent-false-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "munder-mover-align-accent-true.html": [
+ "aa70d244f33f4babd64492913dfd4b1645df56bd",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/munder-mover-align-accent-true-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "munderover-align-accent-false.html": [
+ "2c082612a255e2d20cd504783e24a494c4465d94",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/munderover-align-accent-false-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "munderover-align-accent-true.html": [
+ "e6578ade5238fd615e011573b1b5720598fe9685",
+ [
+ null,
+ [
+ [
+ "/mathml/presentation-markup/scripts/munderover-align-accent-true-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"none-001.html": [
"f1bfb442f79b3adf3ba51a5aeaa7b6f82ff522d2",
[
@@ -328983,6 +330366,19 @@
{}
]
],
+ "mo-glyph-height-with-default-font.html": [
+ "262d3b927774a539f21530ae3c24327b79abcc63",
+ [
+ null,
+ [
+ [
+ "/mathml/relations/text-and-math/mo-glyph-height-with-default-font-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"use-typo-metrics-1.html": [
"1af8fdfde16ae9ec3d85aa7abf325536baed31f7",
[
@@ -329410,6 +330806,19 @@
]
],
"errors": {
+ "unknown-ancillary-error-recovery-2.html": [
+ "23191fe39f714875f1692d9499f971e4254e288b",
+ [
+ null,
+ [
+ [
+ "/png/errors/unknown-ancillary-error-recovery-2-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"unknown-ancillary-error-recovery.html": [
"df37153fd76026be581c4da33f9df0fd60e2c05b",
[
@@ -332198,7 +333607,7 @@
]
],
"paint-context-001.svg": [
- "fd58d9b790a512940e2d8244148a3c62fb107898",
+ "7be33cb20fb257496cb1357a5481edecf364bc59",
[
null,
[
@@ -332223,6 +333632,32 @@
{}
]
],
+ "paint-context-003.svg": [
+ "be1f378bf820b42770d3f8c89ccd2cbe250e6b4d",
+ [
+ null,
+ [
+ [
+ "/svg/painting/reftests/paint-context-003-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "paint-context-004.svg": [
+ "669d44de46bc0f06c979cf26e4db30657dad578e",
+ [
+ null,
+ [
+ [
+ "/svg/painting/reftests/paint-context-004-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"paint-order-001.svg": [
"c8d60bd5bf68d0dc5f56fb360acdd2bac5aa1aa2",
[
@@ -340209,6 +341644,14 @@
"2bab061d43ab9e533b0160ca506231939886cd89",
[]
],
+ "display-override-member-media-feature-tabbed.webmanifest": [
+ "b8b5fdb0f0bf0db30e1c79d529639d1290b69c58",
+ []
+ ],
+ "display-override-member-media-feature-tabbed.webmanifest.headers": [
+ "2bab061d43ab9e533b0160ca506231939886cd89",
+ []
+ ],
"display-override-member-media-feature-window-controls-overlay-overrides-browser.webmanifest": [
"75e91eaf877a2a520ff0baee6d96c49e3e138e7b",
[]
@@ -341871,9 +343314,15 @@
"4534ab8abe2449c419cab3779e2c8ee0955aa75b",
[]
],
+ "esc-key": {
+ "README.md": [
+ "817edc09ab821b8eda047055edc90818587d625c",
+ []
+ ]
+ },
"resources": {
"helpers.js": [
- "97a62309cd5b39c14ab9c31b9c1305b160ba5c7e",
+ "dd9e191c4dbcbe4ee53034310639bc76a9307285",
[]
]
}
@@ -362976,15 +364425,15 @@
[]
],
"third-party-cookies-cross-site-popup-opener.html": [
- "0e25f79261924edcc92c755e9a9f48d39afec2bc",
+ "a09b07e5b702317d4f7a194a9673a7489aad9505",
[]
],
"third-party-cookies-cross-site-popup-verify.html": [
- "8d4819ad82912dbcb59abaeebedcdaf75f81fcbd",
+ "6deb88b5d03d7439ac816807e890d52e08beff35",
[]
],
"third-party-cookies-cross-site-popup.html": [
- "6f802007f8d0748ce7314f6f1c36fd3dd3285546",
+ "7addc7943c0ee29dd92f6319d92501984f7f46fe",
[]
]
}
@@ -363212,7 +364661,7 @@
[]
],
"manifest_with_variable_accounts.json": [
- "10c2ddd55d1308cb7d88810898fbc6fe446b7a69",
+ "9e4af250045757a3ce7b58bc7d0347ecd2794a40",
[]
],
"no_accounts.py": [
@@ -363235,6 +364684,10 @@
"d4f1efff6a74c7636f60cba35b4eff010fccfd29",
[]
],
+ "set_accounts_cookie.py": [
+ "ab349922104c007c341658901659e7d6b9ebfd86",
+ []
+ ],
"simple.html": [
"d62419ce8a0ac12a85f5b8e595a874714b038b44",
[]
@@ -363272,7 +364725,7 @@
[]
],
"variable_accounts.py": [
- "c9db2c4528e15c74cdd9b3d056fd2044b8e7eeb1",
+ "fc4446acc49e4e1538a10478e3aa744ccc495db2",
[]
]
},
@@ -381132,6 +382585,10 @@
"52855cb91e6b780fc6375280b0643335802dd4e3",
[]
],
+ "animation-offscreen-to-onscreen-ref.html": [
+ "76fd70f3e02f93c460ef29fb34488243a9a2a2f5",
+ []
+ ],
"animation-opacity-pause-and-set-time-ref.html": [
"ab9f614ed8e7e846b9c5f3c5d66a0827db4d6637",
[]
@@ -383829,6 +385286,30 @@
"2721bc0af0b11cddb17087d988990379cc48ebc5",
[]
],
+ "table-fragmentation-001a-print-ref.html": [
+ "d4229ebb873ef95f1abe12b31493dad789183a04",
+ []
+ ],
+ "table-fragmentation-001c-print-ref.html": [
+ "d7778e340ab092422994fa3fcd0d87dc4fee6599",
+ []
+ ],
+ "table-fragmentation-002a-print-ref.html": [
+ "d7272352a158923070af69e47e07ed08ebb5b11c",
+ []
+ ],
+ "table-fragmentation-002c-print-ref.html": [
+ "18c1e0d5a9b8cc291f1142776736680f791f8aed",
+ []
+ ],
+ "table-fragmentation-003a-print-ref.html": [
+ "bf99e5b41e2094ade866ef5ff9451f414a2e2916",
+ []
+ ],
+ "table-fragmentation-003c-print-ref.html": [
+ "50738fbaa8af3ed2abe0cd8a498d8f299000578f",
+ []
+ ],
"table-grid-paint-htb-ltr-ref.html": [
"5830aa5fd51585120e86e4579ecee85bb5b84628",
[]
@@ -397670,6 +399151,10 @@
"df8393a1f0310b7b524d49b05962600602c1500e",
[]
],
+ "firefox-bug-1881495-ref.html": [
+ "aa6275c4a712a8c9873c694e20a820f3bdde3c27",
+ []
+ ],
"grid-child-percent-basis-resize-1-ref.html": [
"2ee6b077d3c6a9375029209a6ce202478db437a4",
[]
@@ -398380,7 +399865,7 @@
[]
],
"line-names-010-ref.html": [
- "9232f1dcf2a8b805a707c16f7f5976fb90a852f2",
+ "a4408517b4d8a14fb1621d2f46a33fcab3287775",
[]
],
"line-names-011-ref.html": [
@@ -398447,6 +399932,10 @@
"4cbb1540de1972dd6baaa0c56d2c18dcf10e1103",
[]
],
+ "scrollbar-gutter-001-ref.html": [
+ "0d00d380b66f73184d0b16a277b6d63e3d49b999",
+ []
+ ],
"subgrid-baseline-001-ref.html": [
"dd4b0dccf211d46336e41b3f225fce80629c86cd",
[]
@@ -398659,6 +400148,10 @@
"9d3e3b00b08dd3242be7f5b180a5505aeb26354b",
[]
],
+ "custom-highlight-painting-priority-text-decoration-001-ref.html": [
+ "aa76cf08b46c2f1ab1a7ab2b5f4dbf5a1a11bbef",
+ []
+ ],
"custom-highlight-painting-staticrange-001-ref.html": [
"a89d86dc819c3235846a83a49b58755459098ace",
[]
@@ -405344,7 +406837,7 @@
],
"resources": {
"common.js": [
- "26ee5f75eab6fbcf08d45a71d31270496fbe1e43",
+ "2d74baae577c9c16ca5c4a2f60363d292a596c10",
[]
]
}
@@ -410095,6 +411588,10 @@
"d33e3b62edd31029751ac32bcbdb6178df90d563",
[]
],
+ "text-spacing-trim-span-001-ref.html": [
+ "072fd1e917f1af3567a387b0e3dee4146dab05f1",
+ []
+ ],
"text-spacing-trim-start-001-ref.html": [
"60a255160f2753157b7b46c79ec6d71c8d15f444",
[]
@@ -410672,6 +412169,10 @@
"d8c1834d9572e33a8f4b5306871fb725dbd9ce5d",
[]
],
+ "text-wrap-balance-003-ref.html": [
+ "318480bb5028d95c6a1ec3a3dfcd7fd50c0b662d",
+ []
+ ],
"text-wrap-balance-align-001-ref.html": [
"e522e3711c9d1a68f6a90d97cba248ecb4e47d32",
[]
@@ -412209,7 +413710,7 @@
],
"support": {
"transform-interpolation-reftests.js": [
- "d79cbedefe7d1f299ce4d9bef056bb7860bc2dcc",
+ "4070aec84abb3fed35d0187616d42a650b299d64",
[]
]
},
@@ -421916,6 +423417,16 @@
[]
]
},
+ "device-posture": {
+ "META.yml": [
+ "d4dc2c24e6b4c406d513c0426c0454b3e04a00b2",
+ []
+ ],
+ "README.md": [
+ "60559c1f72bdaccdc911b191857e621792034cf6",
+ []
+ ]
+ },
"direct-sockets": {
"META.yml": [
"85c05e8c834847aa6a1d5aa1f1faa8c60a7ea9ca",
@@ -422604,7 +424115,7 @@
},
"scrolling": {
"scroll_support.js": [
- "c0c198f236654924cf9c115379b9ab80ef00fdbb",
+ "a0aefe636ab8d5efbf8d3f6e4a6a1ad404344b2b",
[]
],
"scrollend-event-fires-to-iframe-inner-frame.html": [
@@ -427570,7 +429081,7 @@
[]
],
"request-tracker.py": [
- "c449d2ab021003e0f38b1b4888bdb1d91c3ecd85",
+ "3514741f6343e4f27b55d1838ee43857a354fafe",
[]
],
"set-cookie.asis": [
@@ -430160,6 +431671,14 @@
"17e520a810ac3a158a711dcee6354b5fd71a8150",
[]
],
+ "history_reload_referrer-1.html": [
+ "d083a2a1d3c3f144dfc4771358968129828ce93f",
+ []
+ ],
+ "history_reload_referrer-2.html": [
+ "d85517a15f8649417533c03f0d157ef63245710b",
+ []
+ ],
"joint_session_history": {
"001-1.html": [
"9aa5d30d16ecc48a7c503b34f0fb9e12d47fed83",
@@ -430327,6 +431846,18 @@
[]
],
"resources": {
+ "iframe-contents.sub.html": [
+ "8ac0a264dbc1d2b2d9a45ad8e51e3bfbc064254d",
+ []
+ ],
+ "iframe-postmessage-to-parent-parent.sub.html": [
+ "25c4af19a3e2296cbbbcb31755e5f4ce0c3ea510",
+ []
+ ],
+ "iframe-with-iframe.html": [
+ "675f293ffa3b57f39807bcc6fb86e0f8a748b421",
+ []
+ ],
"post-your-origin.html": [
"a8a614c182b19cf38af90030a17ef20b1f8dfc09",
[]
@@ -430338,6 +431869,10 @@
"reload_post_1-1.py": [
"56397f07b44028a0f1e572484480d6fa522c5816",
[]
+ ],
+ "replace-or-assign-call-on-iframe.html": [
+ "bdad8334a5e65d556d35474c051bdb9e1bcad4e9",
+ []
]
},
"same_origin_frame.html": [
@@ -432044,6 +433579,26 @@
]
},
"filters": {
+ "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html": [
+ "2b1c1c1c0768b40e50ccd7c030adff59913a4d5e",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html": [
+ "5adc9f53e206b76fc9b729d86d2a85e52c65d67b",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html": [
+ "895d531206c9fe2e649dc841a95de675be60c32a",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html": [
+ "c4ad790d56ea891cd1f49c35f0d5e5fc4c903539",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html": [
+ "29e250614c2f5db7d0920b8d86313b920ee4326a",
+ []
+ ],
"2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [
"86c5710132f348bd3e2332983d7211f4b3315cdb",
[]
@@ -432068,6 +433623,30 @@
"c6d915cb078f55d306cc369da8b1c3d1c4c0ef63",
[]
],
+ "2d.filter.layers.componentTransfer.discrete-expected.html": [
+ "8419953b3d263ba60fde03e9048a4edb4554d536",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.gamma-expected.html": [
+ "3e5d98089677d08e99356241463a30687320490a",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.identity-expected.html": [
+ "9f1439f37b6e63c8ff6eb575bb1d65a9644c00f3",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.linear-expected.html": [
+ "f922055ff26807e85e93bee9b9a8170c34ae7c5f",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.table-expected.html": [
+ "0f6736d87d4f4f504b928da817a5a2ec8344a19e",
+ []
+ ],
+ "2d.filter.layers.dropShadow-expected.html": [
+ "1719d99b4a7f4cea868b97b518caadde3bc18c26",
+ []
+ ],
"2d.filter.layers.gaussianBlur.isotropic-expected.html": [
"4f937548628d17bb9a1760c04471f8386e080261",
[]
@@ -433164,6 +434743,26 @@
]
},
"filters": {
+ "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html": [
+ "2b1c1c1c0768b40e50ccd7c030adff59913a4d5e",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html": [
+ "5adc9f53e206b76fc9b729d86d2a85e52c65d67b",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html": [
+ "895d531206c9fe2e649dc841a95de675be60c32a",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html": [
+ "c4ad790d56ea891cd1f49c35f0d5e5fc4c903539",
+ []
+ ],
+ "2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html": [
+ "29e250614c2f5db7d0920b8d86313b920ee4326a",
+ []
+ ],
"2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [
"86c5710132f348bd3e2332983d7211f4b3315cdb",
[]
@@ -433188,6 +434787,30 @@
"c6d915cb078f55d306cc369da8b1c3d1c4c0ef63",
[]
],
+ "2d.filter.layers.componentTransfer.discrete-expected.html": [
+ "8419953b3d263ba60fde03e9048a4edb4554d536",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.gamma-expected.html": [
+ "3e5d98089677d08e99356241463a30687320490a",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.identity-expected.html": [
+ "9f1439f37b6e63c8ff6eb575bb1d65a9644c00f3",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.linear-expected.html": [
+ "f922055ff26807e85e93bee9b9a8170c34ae7c5f",
+ []
+ ],
+ "2d.filter.layers.componentTransfer.table-expected.html": [
+ "0f6736d87d4f4f504b928da817a5a2ec8344a19e",
+ []
+ ],
+ "2d.filter.layers.dropShadow-expected.html": [
+ "1719d99b4a7f4cea868b97b518caadde3bc18c26",
+ []
+ ],
"2d.filter.layers.gaussianBlur.isotropic-expected.html": [
"4f937548628d17bb9a1760c04471f8386e080261",
[]
@@ -433648,19 +435271,19 @@
[]
],
"gentestutilsunion.py": [
- "4fe7f2bd42ee4fca6f3613fb60caca862f6d1baa",
+ "d7042810be89748854b3d096aadfcee71875d710",
[]
],
"name2dir-canvas.yaml": [
- "1e0caff5b982da5ef914aaae6e376bf749ac412c",
+ "79b5fb61f283e6443861cd8e3a28022be20e6f50",
[]
],
"name2dir-offscreen.yaml": [
- "c52acb793ba717f02a37fe8692e95941b2f7bf34",
+ "3f59fd8eead9e0e11809319f5ffd924698e9fce7",
[]
],
"name2dir.yaml": [
- "ae69c153780ed2398466bfa12287462bf04c3bfa",
+ "b0e541289f59f832ae48f2fef826e355c1990e84",
[]
],
"templates": {
@@ -433733,7 +435356,7 @@
[]
],
"drawing-images-to-the-canvas.yaml": [
- "93c556288d7125988f3190c0ecd8e3ce2e71f3fe",
+ "09e9e0018674e4946c98cbcce9bae150cf41559a",
[]
],
"drawing-rectangles-to-the-canvas.yaml": [
@@ -433745,11 +435368,11 @@
[]
],
"filters.yaml": [
- "e18ab61b41ef31153e4d55eb4020f60e02a492ef",
+ "f327b9fe949b8d3d2ad886af2998175abca22eaa",
[]
],
"layers.yaml": [
- "938cc74d21460434856f5cff4a8851cb92a126db",
+ "437a70c3f7a4fede779e6d0c91ecaa43659409d8",
[]
],
"line-styles.yaml": [
@@ -433791,6 +435414,10 @@
"video.yaml": [
"f9b48fb8daa2a247e9e22a18b5e891be3351bda9",
[]
+ ],
+ "webgpu-access.yaml": [
+ "fcf38d1f3d050dcdc48fbfdd06ad0f2f800ba9b5",
+ []
]
}
}
@@ -439989,6 +441616,10 @@
[]
],
"resources": {
+ "302-no-Location-header-text-css.asis": [
+ "ddf4898d3f0e4aa52335f9dfb0bd41d446ff92c7",
+ []
+ ],
"bad.css": [
"4e1fe36165c52792e3a3816962c36e6090f04f67",
[]
@@ -440021,6 +441652,22 @@
"796c55c42f6c305476d53d1ba9c4939cddb39f9e",
[]
],
+ "stylesheet-bad-mime-type-empty.css": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ []
+ ],
+ "stylesheet-bad-mime-type-empty.css.headers": [
+ "156209f9c81ff73b6aaf1a0734ef770ddf0a8e3e",
+ []
+ ],
+ "stylesheet-bad-mime-type.css": [
+ "e1b2552ffea7300e3ffba041dd3e5d3ab26c2c33",
+ []
+ ],
+ "stylesheet-bad-mime-type.css.headers": [
+ "156209f9c81ff73b6aaf1a0734ef770ddf0a8e3e",
+ []
+ ],
"stylesheet.css": [
"e1b2552ffea7300e3ffba041dd3e5d3ab26c2c33",
[]
@@ -440742,7 +442389,7 @@
[]
],
"sandbox-top-navigation-helper.js": [
- "413f392dfc6e437a8fa382e86c7b8921c4d491d4",
+ "e38334f4148aed427aaf2086e2a4f5ace60c480e",
[]
],
"subframe.html": [
@@ -446452,6 +448099,10 @@
"da4fe27e58959f7e3d6ba5ebbc7edd58a93dcf5c",
[]
],
+ "user-prompt.html.ini": [
+ "45ebf7acc33872a17d844d87dbb68039b862f843",
+ []
+ ],
"window-onload-test.html.ini": [
"e380f5e58150d941647df4fa5d0aab8a1b3c2247",
[]
@@ -447302,7 +448953,7 @@
[]
],
"css-view-transitions-2.idl": [
- "7435605cdaf6b0583e3682002130f0020894303a",
+ "89e57e251b1783e2d5c3641cfbf9861adcf87487",
[]
],
"css-view-transitions.idl": [
@@ -447454,7 +449105,7 @@
[]
],
"html.idl": [
- "8992ceab1ee2cd423f8c34ed154a453ca2c6d97d",
+ "7211231980f6d71e04bd0f33ac415b86c7440c00",
[]
],
"idle-detection.idl": [
@@ -447494,7 +449145,7 @@
[]
],
"invokers.tentative.idl": [
- "62f7398b82735670809610de90ad2f91a9dde06e",
+ "eb1b8247f06e9681cef5c0a2eb8cf71530a5dbd9",
[]
],
"is-input-pending.idl": [
@@ -448022,7 +449673,7 @@
[]
],
"webnn.idl": [
- "cafba9de5e122fe78aa5ed490858a14060076079",
+ "50ee64b185ab933d95b20731daf7cf1d04a10f74",
[]
],
"webrtc-encoded-transform.idl": [
@@ -448058,7 +449709,7 @@
[]
],
"webtransport.idl": [
- "7421dcb432c02b176876c30e620d71c32a94fe02",
+ "e598059c93ec86e95bac0ae7cc9bee0b306e7036",
[]
],
"webusb.idl": [
@@ -449080,6 +450731,26 @@
"mrow-painting-order-ref.html": [
"72694959a86f1917cbd3db13b7f1a8b71714b711",
[]
+ ],
+ "semantics-001-ref.html": [
+ "7d99e48c928d6c9d70c51e45bd01c280b972e76c",
+ []
+ ],
+ "semantics-002-ref.html": [
+ "8abdad93dea33dc5d678a225ff0094e3b3140564",
+ []
+ ],
+ "semantics-003-ref.html": [
+ "7b6e21a3eb85f236699ee4566a089126c033c87f",
+ []
+ ],
+ "semantics-004-ref.html": [
+ "855d887bbca7ee1d6d91b75a75709c7fe33f8e41",
+ []
+ ],
+ "semantics-005-ref.html": [
+ "cf722603e1debb82566e1c2f7a0cfb27e609f194",
+ []
]
},
"operators": {
@@ -449341,6 +451012,18 @@
]
},
"scripts": {
+ "mmultiscript-001-ref.html": [
+ "d814944f5317cfbb91107f4cd0441bbca2ae3e14",
+ []
+ ],
+ "mmultiscript-002-ref.html": [
+ "33f12d7cdfac270c43ba6731bfde3a9a24efd282",
+ []
+ ],
+ "mmultiscript-003-ref.html": [
+ "daac6b3346763b5c19292c7809c8b3c1bc86554b",
+ []
+ ],
"mover-accent-dynamic-change-ref.html": [
"a4f16aa07f969e43dee4be45c48f7252e5c109ca",
[]
@@ -449349,6 +451032,22 @@
"f8631539c02fff09b865c1d98ef56d68bb03d506",
[]
],
+ "munder-mover-align-accent-false-ref.html": [
+ "db72d0c5e2f005f512e1595f83032a621331a830",
+ []
+ ],
+ "munder-mover-align-accent-true-ref.html": [
+ "da1033563eb00807fc03442545add2adaac13b8b",
+ []
+ ],
+ "munderover-align-accent-false-ref.html": [
+ "c339149c25624326b8a9e3c01b2163bbbf506c87",
+ []
+ ],
+ "munderover-align-accent-true-ref.html": [
+ "aababcb17bb987ff2b71f033e21888809c03715a",
+ []
+ ],
"none-001-ref.html": [
"55add014151905f9e8be454ffc579f447effb9d8",
[]
@@ -449791,6 +451490,10 @@
"27a58b9ba00820c44f48ae6e90e682f2488c5748",
[]
],
+ "mo-glyph-height-with-default-font-ref.html": [
+ "5c295152ba0039dcd06c11074f471d652c7269a4",
+ []
+ ],
"use-typo-metrics-1-ref.html": [
"3f7f7640458639ab0b548489e04b63f98cdad40b",
[]
@@ -451447,7 +453150,7 @@
[]
],
"helpers.js": [
- "8c30173336eed990dba215bd441801ac0e2b1ac9",
+ "ca44e32f7f4921011226b9647bc4ba5d76495980",
[]
],
"icon.png": [
@@ -451457,6 +453160,10 @@
"shownotification-sw.js": [
"63a1569460d302bd72011675d4dabed7013b49d0",
[]
+ ],
+ "shownotification-window-iframe.html": [
+ "2a45e794656fcbe20d7dcd741b37bffcc9630851",
+ []
]
}
},
@@ -452601,6 +454308,10 @@
],
"errors": {
"support": {
+ "invalid-unknown-ancillary-after-IDAT.png": [
+ "e9c9e7ee02598ab11189049b455b39ce8b72db57",
+ []
+ ],
"invalid-unknown-ancillary.png": [
"21373a5a5aff91c2755cdc9a7f381da29658850c",
[]
@@ -452610,6 +454321,10 @@
[]
]
},
+ "unknown-ancillary-error-recovery-2-ref.html": [
+ "cfa2cbb6f14cc95cb5930dab38fa3fb11bda49bd",
+ []
+ ],
"unknown-ancillary-error-recovery-ref.html": [
"cfa2cbb6f14cc95cb5930dab38fa3fb11bda49bd",
[]
@@ -455245,7 +456960,7 @@
[]
],
"fake-serial.js": [
- "29c8168fb59891ffe9292937c8f921dcf5c839a8",
+ "8614b4d64f993a6df17ac77f304b2b779e02fba2",
[]
],
"mock-barcodedetection.js": [
@@ -458970,7 +460685,7 @@
]
},
"router-rules.js": [
- "4e6f8bb95594cc6b45608ff3aa99507d6fb4096c",
+ "5a1c53671b9ef175d83a966290f49c120707a525",
[]
],
"simple-test-for-condition-main-resource.html": [
@@ -461151,6 +462866,18 @@
"446e8e3fca8ddc48707f8df678eec655e303086c",
[]
],
+ "paint-context-003-ref.svg": [
+ "69ba36f44821e9f41fc739ffbd54369326e1e65b",
+ []
+ ],
+ "paint-context-004-ref.svg": [
+ "25acb75ba00ec48e95515f7c803f52e1aaf9418b",
+ []
+ ],
+ "paint-context-005-ref.svg": [
+ "fa30a5361cb7461de2a653bc5df99243d97e25a7",
+ []
+ ],
"paint-order-001-ref.svg": [
"7822a80b942fee54a87106d7def13429454cc26e",
[]
@@ -472209,7 +473936,7 @@
[]
],
"browser.py": [
- "c7f67d334e13a6c5be5ce0cf74c5fc94f00631d9",
+ "2f9c4531315303c3db73f8fb2e442836682eba30",
[]
],
"commands.json": [
@@ -472353,7 +474080,7 @@
[]
],
"update.py": [
- "4dba7e69df8376e7e8566525ab083e6e0348a92f",
+ "06fe9bfbaddf48e14725045816ea8f596c2ff619",
[]
],
"utils.py": [
@@ -472459,7 +474186,7 @@
[]
],
"chrome.py": [
- "05f81461e2a097259543a59eba2b231988dc0202",
+ "7cb46783fc367e03dd3cb1bda5c145ad3e82a821",
[]
],
"chrome_android.py": [
@@ -472479,7 +474206,7 @@
[]
],
"content_shell.py": [
- "23f4e99da62291005bb94450cde7d5ce592288a0",
+ "6df8671e0ac32ae7e4b51e31b96fde3a4b8c3b35",
[]
],
"edgechromium.py": [
@@ -472566,10 +474293,6 @@
"f5641471562b65c56701423329b9a16f4d103561",
[]
],
- "executorcontentshell.py": [
- "82a6aebcdb17dda71925a1398a890e2b89e0d8ec",
- []
- ],
"executoredge.py": [
"cbe5eadf9a608da0b8d767f26a4fca6b15eb4681",
[]
@@ -472591,7 +474314,7 @@
[]
],
"executorwebdriver.py": [
- "b49b9e2b574a7e361403d7010c0abe60ae05f0d6",
+ "6df2d96461637ff022d1d0b0759feaf179b40e02",
[]
],
"executorwktr.py": [
@@ -472698,7 +474421,7 @@
[]
],
"metadata.py": [
- "b9cb61eb07f3069df007c33cdcf24f48ae457da9",
+ "5d7ea2b011a42c37c15b609a3d27f15240c6894c",
[]
],
"mpcontext.py": [
@@ -472710,7 +474433,7 @@
[]
],
"products.py": [
- "c81396f3dd313541cfd053f9183dc6a476abd3f2",
+ "9657bde5f5a82e03c213e25ef637b7793854c674",
[]
],
"stability.py": [
@@ -472843,7 +474566,7 @@
[]
],
"metadata.py": [
- "48519900e7db5ad5f395ef03409b5c95fc9250af",
+ "f1ab74accfe93ecede4c5452c543e004f3050ae4",
[]
],
"state.py": [
@@ -473457,11 +475180,11 @@
[]
],
"helper.sub.js": [
- "2d1bd436bdf35f54474c8b53eb422d1948a7fa8c",
+ "1775cd985c24df970f00903a3c8d7f4705d77851",
[]
],
"navigation-report-only-support.html": [
- "5f7856fabb7bb16085ffaffffbf6d7553179e8f3",
+ "a16995ba903688327d5b58dc9d7c5457583ec758",
[]
],
"navigation-report-only-support.html.headers": [
@@ -473469,7 +475192,7 @@
[]
],
"navigation-support.html": [
- "5e02e6d4bf5aff9fa4f0b4b897a35726ed24168b",
+ "c2c8a82f5145885f64e5ce99a9e8c6f039efa370",
[]
],
"navigation-support.html.headers": [
@@ -474808,7 +476531,7 @@
]
},
"testcommon.js": [
- "5b22c658d5cac8b513a4801074c8fa694bbe250d",
+ "b431b213dbef47d27954a4622a17f9a6e7a6a126",
[]
],
"timing-model": {
@@ -476265,7 +477988,7 @@
]
},
"conftest.py": [
- "40fe20ddfe94533b10c636c6489b9f50be6e77c6",
+ "7813530c4cc4a5dd3e1ff3d7abf0a07a567dc666",
[]
],
"continue_request": {
@@ -476459,7 +478182,7 @@
},
"storage": {
"__init__.py": [
- "0d7cea96bce369323028f2910c5738ac095ece0a",
+ "4ca0f7bdd7e293514f7621189ff0a0d059796e07",
[]
],
"conftest.py": [
@@ -477573,11 +479296,11 @@
]
},
"utils.js": [
- "002ddbd706c0c86d26036483de4b769bc825108f",
+ "0e404dbcd07e4b935e4b5bee35f07785ded19c19",
[]
],
"utils_validation.js": [
- "10c704384f46107be234bcbd65d3beea034ba2bf",
+ "7f1d4a4a9457e6a782063a17c10ea601f765adee",
[]
]
}
@@ -484958,32 +486681,83 @@
{}
]
],
- "idbindex_count.htm": [
- "5b45b5223bdaccd24a0974dfcb7ebc7f73a177ac",
+ "idbindex_count.any.js": [
+ "25d743e422f93cf5f069e2d27252d9f6afa8e959",
[
- null,
- {}
- ]
- ],
- "idbindex_count2.htm": [
- "2a68770df91ceb777fb1bb2417649bec9cc7b1d2",
+ "IndexedDB/idbindex_count.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBIndex.count()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
+ ],
[
- null,
- {}
- ]
- ],
- "idbindex_count3.htm": [
- "a94e8985546101a374fbd79102294a418a626408",
+ "IndexedDB/idbindex_count.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBIndex.count()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
+ ],
[
- null,
- {}
- ]
- ],
- "idbindex_count4.htm": [
- "ce19968bf16652484d3e3361580ee12ae44dd610",
+ "IndexedDB/idbindex_count.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBIndex.count()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
+ ],
[
- null,
- {}
+ "IndexedDB/idbindex_count.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "title",
+ "IDBIndex.count()"
+ ],
+ [
+ "script",
+ "resources/support.js"
+ ]
+ ]
+ }
]
],
"idbindex_get.any.js": [
@@ -485579,7 +487353,7 @@
]
],
"idbobjectstore_add.any.js": [
- "b3071c1f94cbf863d5deb531c6b0dad332b80135",
+ "dfc15294e82a66640c853c5ece5f3c4ff3486d8d",
[
"IndexedDB/idbobjectstore_add.any.html",
{
@@ -485590,7 +487364,7 @@
],
[
"title",
- "IDBObjectStore.add() - add with an inline key"
+ "IDBObjectStore.add()"
],
[
"script",
@@ -485609,7 +487383,7 @@
],
[
"title",
- "IDBObjectStore.add() - add with an inline key"
+ "IDBObjectStore.add()"
],
[
"script",
@@ -485628,7 +487402,7 @@
],
[
"title",
- "IDBObjectStore.add() - add with an inline key"
+ "IDBObjectStore.add()"
],
[
"script",
@@ -485647,1192 +487421,7 @@
],
[
"title",
- "IDBObjectStore.add() - add with an inline key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add10.any.js": [
- "7b93dec16a060398d5e01725a7e853081d589e69",
- [
- "IndexedDB/idbobjectstore_add10.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the object store uses out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add10.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the object store uses out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add10.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the object store uses out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add10.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the object store uses out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add11.any.js": [
- "cff8f6f1a02f0251565c9c1c7344a41c1119c670",
- [
- "IndexedDB/idbobjectstore_add11.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's key does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add11.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's key does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add11.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's key does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add11.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's key does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add12.any.js": [
- "c7ebe751d7ef0d87ae29fc5f117abbeaad48c536",
- [
- "IndexedDB/idbobjectstore_add12.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's in-line key is not defined"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add12.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's in-line key is not defined"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add12.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's in-line key is not defined"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add12.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the record's in-line key is not defined"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add13.any.js": [
- "fdd77751c0059e2b78b79705df7c8ff786b95928",
- [
- "IndexedDB/idbobjectstore_add13.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the out of line key provided does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add13.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the out of line key provided does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add13.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the out of line key provided does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add13.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record where the out of line key provided does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add14.any.js": [
- "9952a6d12c91c383f83e3139cd7591293ba219b6",
- [
- "IndexedDB/idbobjectstore_add14.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Add a record where a value being indexed does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add14.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Add a record where a value being indexed does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add14.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Add a record where a value being indexed does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add14.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Add a record where a value being indexed does not meet the constraints of a valid key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add15.any.js": [
- "f1820b0259da82e1b675c8b904d492fac1a762c8",
- [
- "IndexedDB/idbobjectstore_add15.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the transaction this IDBObjectStore belongs to has its mode set to readonly, throw ReadOnlyError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add15.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the transaction this IDBObjectStore belongs to has its mode set to readonly, throw ReadOnlyError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add15.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the transaction this IDBObjectStore belongs to has its mode set to readonly, throw ReadOnlyError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add15.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the transaction this IDBObjectStore belongs to has its mode set to readonly, throw ReadOnlyError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add16.any.js": [
- "42f943fd25f8875a90acc4f4c137ef98d391c86f",
- [
- "IndexedDB/idbobjectstore_add16.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the object store has been deleted, the implementation must throw a DOMException of type InvalidStateError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add16.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the object store has been deleted, the implementation must throw a DOMException of type InvalidStateError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add16.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the object store has been deleted, the implementation must throw a DOMException of type InvalidStateError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add16.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - If the object store has been deleted, the implementation must throw a DOMException of type InvalidStateError"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add2.any.js": [
- "ddddb4ca13029fa22b2c45a4b90f7dd5cab5b8fb",
- [
- "IndexedDB/idbobjectstore_add2.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add with an out-of-line key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add2.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add with an out-of-line key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add2.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add with an out-of-line key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add2.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add with an out-of-line key"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add3.any.js": [
- "a108f6b132ce2763300c333d37b157eabb000b39",
- [
- "IndexedDB/idbobjectstore_add3.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - record with same key already exists"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add3.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - record with same key already exists"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add3.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - record with same key already exists"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add3.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - record with same key already exists"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add4.any.js": [
- "6a4f61e0d5b1b26c4bdb4f5a5915e4381c472ae7",
- [
- "IndexedDB/idbobjectstore_add4.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add where an index has unique:true specified"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add4.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add where an index has unique:true specified"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add4.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add where an index has unique:true specified"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add4.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - add where an index has unique:true specified"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add5.any.js": [
- "002e7dcf87e018a0c65f627fb30bba8559c56471",
- [
- "IndexedDB/idbobjectstore_add5.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store's key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add5.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store's key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add5.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store's key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add5.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store's key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add6.any.js": [
- "bc5242156d4b1fed08c171cf3d733d55fcb80ba7",
- [
- "IndexedDB/idbobjectstore_add6.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and inline keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add6.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and inline keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add6.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and inline keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add6.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and inline keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add7.any.js": [
- "eb381c4d45ad66d3a20267564048c59e68f356ce",
- [
- "IndexedDB/idbobjectstore_add7.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add7.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add7.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add7.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - autoIncrement and out-of-line keys"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add8.any.js": [
- "60266835bcb3d3cc5559e2cc29ef0dece44d81ce",
- [
- "IndexedDB/idbobjectstore_add8.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store has autoIncrement:true and the key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add8.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store has autoIncrement:true and the key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add8.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store has autoIncrement:true and the key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add8.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - object store has autoIncrement:true and the key path is an object attribute"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ]
- ],
- "idbobjectstore_add9.any.js": [
- "dba9655867e858087fb67406c6e74358c09d91a6",
- [
- "IndexedDB/idbobjectstore_add9.any.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record that does not meet the constraints of an object store's inline key requirements"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add9.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record that does not meet the constraints of an object store's inline key requirements"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add9.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record that does not meet the constraints of an object store's inline key requirements"
- ],
- [
- "script",
- "resources/support.js"
- ]
- ]
- }
- ],
- [
- "IndexedDB/idbobjectstore_add9.any.worker.html",
- {
- "script_metadata": [
- [
- "global",
- "window,worker"
- ],
- [
- "title",
- "IDBObjectStore.add() - Attempt to add a record that does not meet the constraints of an object store's inline key requirements"
+ "IDBObjectStore.add()"
],
[
"script",
@@ -497272,6 +497861,17 @@
]
]
},
+ "accessibility": {
+ "svg-mouse-listener.html": [
+ "e2ca983d00af8f969e1cafb300a1456cee1b8af6",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
"accname": {
"basic.html": [
"d84f4dc3b95a062b61e1cc4bd2554d744545f82d",
@@ -497338,7 +497938,7 @@
]
],
"comp_name_from_content.html": [
- "deae6699c6e985761da84978bc87cb704ac80bdd",
+ "3504658ea46156ab7cac72fd7d2b92089c9ddc63",
[
null,
{
@@ -497705,6 +498305,15 @@
}
]
],
+ "header-parsing-error-debug-report.sub.https.html": [
+ "3c3ebe48d9f4664b0e5813918020855bacc4015d",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"request-format.sub.https.html": [
"a9e36dd126771f12089367a2fabf0171a9ace7bf",
[
@@ -506820,24 +507429,53 @@
}
]
],
- "closewatcher-dialog-popover.html": [
- "50d5cb7a4ca9425838f07d1ec916bb60e704b23a",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
- "esc-key.html": [
- "16fcce691730c686c4191318b819ba9b93756f04",
- [
- null,
- {
- "testdriver": true
- }
+ "esc-key": {
+ "keydown.html": [
+ "cb0ddf0638f7ae682731f8cc190909a6ad9bf530",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "keypress.html": [
+ "8dd58b064d7178184511a465e24b39220424abc2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "keyup.html": [
+ "341012d6bc8b54eef9956912e8ebf09769fe9982",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "not-user-activation.html": [
+ "ac29f84f06cd25eea8a56ea59a346c25849d8721",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "synthetic-keyboard-event.html": [
+ "37b5507ac4af9d4fd4f765c79cfec8020f433637",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
]
- ],
+ },
"event-properties.html": [
"6a3dbebad7912b0cde34233ae7546fc8d8aac06c",
[
@@ -506863,57 +507501,395 @@
}
]
],
- "popover-closewatcher-multiple-plus-free.html": [
- "4913b1454ef80fb246983fa100998b2810bf17c6",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
- "popover-closewatcher.html": [
- "b40ea2ec7c56a4ba3a79b7fd9cfe44eb0a4ffef5",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
- "user-activation-CloseWatcher.html": [
- "70435993f54cddf6d2d68b5b0ffd7a81642c4f4f",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
- "user-activation-multiple-plus-free.html": [
- "a94b47904a10a9116b69fbc87b8cd78f09d602d2",
- [
- null,
- {
- "testdriver": true
- }
- ]
- ],
- "user-activation-shared.html": [
- "77e748532a3309f16f2cd1203119b4a92ce24262",
- [
- "close-watcher/user-activation-shared.html?CloseWatcher",
- {
- "testdriver": true
- }
+ "user-activation": {
+ "n-activate-preventDefault.html": [
+ "531ef425998cb3d88f82b29c5f875f68e8c86195",
+ [
+ "close-watcher/user-activation/n-activate-preventDefault.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/n-activate-preventDefault.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
],
- [
- "close-watcher/user-activation-shared.html?dialog",
- {
- "testdriver": true
- }
+ "n-activate.html": [
+ "babcf54c3c160dd48a85919543b37fc0657b6741",
+ [
+ "close-watcher/user-activation/n-activate.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/n-activate.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "n-closerequest-n.html": [
+ "2424af7820e5ab442e314d7a82fbcddc60369913",
+ [
+ "close-watcher/user-activation/n-closerequest-n.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/n-closerequest-n.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "n-destroy-n.html": [
+ "c26f87dd6f81352bdc6f678015d3645ef33f61e3",
+ [
+ "close-watcher/user-activation/n-destroy-n.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/n-destroy-n.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "n.html": [
+ "fe04e0dc1b9efb91a131d5150641367d41b4d3fa",
+ [
+ "close-watcher/user-activation/n.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/n.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nn-activate-CloseWatcher.html": [
+ "8045f30b482647d9364876d812e3eeb5b0cb9116",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nn-activate-dialog.html": [
+ "5cc866044ce26cd7b94fb8bb3b125d0e651eb276",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nn.html": [
+ "beb63f1b4f531cd68405e666480987c9a876c479",
+ [
+ "close-watcher/user-activation/nn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nnn-CloseWatcher-dialog-popover.html": [
+ "f8b9061d019fae0191b4528978b1275a87efda03",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nnn-popovers.html": [
+ "ed5d15598fcdd1f24880f133fcd0dc6d852f8add",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nnn.html": [
+ "9b604e91db2dd2f4967551c9aadd323125e4dc51",
+ [
+ "close-watcher/user-activation/nnn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nnn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "ny-activate-preventDefault.html": [
+ "5ffb64b1134b3e4741a05f1453a37bab77613e04",
+ [
+ "close-watcher/user-activation/ny-activate-preventDefault.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/ny-activate-preventDefault.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "ny.html": [
+ "226912233e21aeb6df69d652c53cd1fe22bacc98",
+ [
+ "close-watcher/user-activation/ny.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/ny.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nyn-popovers.html": [
+ "b6df610ae03160db9b8fad37ef1b046dff624ef8",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nyn.html": [
+ "ec5153c7674a1efd37e27eacbc15420ced861f13",
+ [
+ "close-watcher/user-activation/nyn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nyn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nynn-destroy.html": [
+ "8519c8a2a94067b89482e7374425757dd6bee83d",
+ [
+ "close-watcher/user-activation/nynn-destroy.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nynn-destroy.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nynn.html": [
+ "f6e74a0ba1104e065f2f1b90ca57af752a6abc06",
+ [
+ "close-watcher/user-activation/nynn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nynn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nyyn.html": [
+ "f3987c1a2145055b0405fc5c5e592936a00826b1",
+ [
+ "close-watcher/user-activation/nyyn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nyyn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "nyyyn.html": [
+ "6cb8f3a4456925429c4ccfe2b4b06c108e8b2b92",
+ [
+ "close-watcher/user-activation/nyyyn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/nyyyn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "y.html": [
+ "ee58a92293ab9831c7d8e6c93ed89595155f858d",
+ [
+ "close-watcher/user-activation/y.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/y.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yn-activate.html": [
+ "af7289aa28e14f05a02fdcdde251f001ddb23699",
+ [
+ "close-watcher/user-activation/yn-activate.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/yn-activate.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yn.html": [
+ "8f7e90e2d85c8d847ec4e93a7252b39997caf5a1",
+ [
+ "close-watcher/user-activation/yn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/yn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "ynn.html": [
+ "8cc7f5bfb66c735780ee451c87f4dedb8173b33a",
+ [
+ "close-watcher/user-activation/ynn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/ynn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yy.html": [
+ "0aa03cdd050ca8101714cc1b8e2c3fb2d240d281",
+ [
+ "close-watcher/user-activation/yy.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/yy.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yyn.html": [
+ "b87cf7a7e342e7b9967bb1f429e95b79fb1a8fc7",
+ [
+ "close-watcher/user-activation/yyn.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/yyn.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yyy-CloseWatcher-dialog-popover.html": [
+ "f0a1cb06d101cd7da389b11bab1d7fe7108addf2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yyy-activate-CloseWatcher-dialog-popover.html": [
+ "ed41d1bc3210c1ddcb07c31ce4ff3a55cbd8cdd3",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yyy-popovers.html": [
+ "6f1b739465513605eb2e9667344cae8bacb96cda",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "yyy.html": [
+ "f16767a86bdfcf62b62d9ac69947fd93d084d1f4",
+ [
+ "close-watcher/user-activation/yyy.html?CloseWatcher",
+ {
+ "testdriver": true
+ }
+ ],
+ [
+ "close-watcher/user-activation/yyy.html?dialog",
+ {
+ "testdriver": true
+ }
+ ]
]
- ]
+ }
},
"compat": {
"css-style-declaration-alias-enumeration.html": [
@@ -517723,11 +518699,12 @@
},
"third-party-cookies": {
"third-party-cookie-heuristics.tentative.https.html": [
- "3eb70432b947a9444e209d0c6aeda856413f855d",
+ "32e7ab6d9ab344250d67b889ff08873ae3991c7b",
[
null,
{
- "testdriver": true
+ "testdriver": true,
+ "timeout": "long"
}
]
],
@@ -518013,6 +518990,15 @@
{}
]
],
+ "digital-identity.https.html": [
+ "1a9e09dbf3cfb69f1ecfe52a28f45d07e7113b6c",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"fedcm-abort.https.html": [
"0f03bff832f800c9ce69de69003c88bbbd471fca",
[
@@ -518078,15 +519064,44 @@
}
]
],
- "fedcm-button-mode-basics.https.html": [
- "abf46ee7db0511e14278e683d4b5cac00d4d615f",
- [
- null,
- {
- "testdriver": true
- }
+ "fedcm-button-and-other-account": {
+ "fedcm-button-mode-basics.tentative.https.html": [
+ "a71e26213524928d01f552f6dcf522247636619d",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "fedcm-button-mode-priority.tentative.https.html": [
+ "b71e84db47e458f42931cfcbcc6e0100cd1d40d3",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "fedcm-use-other-account-button-flow.tentative.https.html": [
+ "996523af84727a32240f03c3c3ac2963bf4ee4f2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "fedcm-use-other-account.tentative.https.html": [
+ "2022bbc0f72c7d2fc41e1ce608b0a10eb4c2f729",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
]
- ],
+ },
"fedcm-client-metadata-not-cached.https.html": [
"b802369256ab44c793f8c6c340660954de54d078",
[
@@ -520438,7 +521453,7 @@
]
],
"anchor-getComputedStyle-003.html": [
- "f9fca976544f1aaac8d84e9acd918c7538b7e86d",
+ "da9ec4a1451ad9f47290b9ef268a69b22d5ca928",
[
null,
{}
@@ -520815,85 +521830,85 @@
{}
]
],
- "anchor-scroll-fallback-position-001.html": [
- "04518e5019349f74a2435f6c80318b2481f8fa15",
+ "anchor-scroll-js-expose.html": [
+ "1ef44d03c2202dfc053f27c0e12e2a397634267e",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-002.html": [
- "f30c35d390da9384d9a7deb7a7079ff8dc84a399",
+ "anchor-scroll-position-try-001.html": [
+ "b696ae0060c544390ed2b26e6f4071af53afd6b6",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-003.html": [
- "60bc9b919af0cf027d760af66f567a55556e1161",
+ "anchor-scroll-position-try-002.html": [
+ "3b84124705c58514d66d437c19113a76848d19eb",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-004.html": [
- "99e4f9c30d1dd626773276c5e6af206641487d5f",
+ "anchor-scroll-position-try-003.html": [
+ "dd9fdc92c2e7b93b3254f1a19097fb422a7f3da8",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-005.html": [
- "0adfe0834d850c000cbe0692446ec70d33036de1",
+ "anchor-scroll-position-try-004.html": [
+ "0aab60b7a81c247d1a2621f5e3d04e71b1b44693",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-006.html": [
- "b4a1a24de69f7d3163226707de6f5ce35b1163ff",
+ "anchor-scroll-position-try-005.html": [
+ "e2dac13abd745dfa1a60804dc3ff77bbae492f66",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-007.html": [
- "baa283ba94454071c682f3ae66bb3a1b45060dae",
+ "anchor-scroll-position-try-006.html": [
+ "1f9004de54f717d66091f5fb0965dac24ac15f3b",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-008.html": [
- "ae625d5823982ed9f24ca80fb599f1f7332c0977",
+ "anchor-scroll-position-try-007.html": [
+ "32b7f641732662c7cc4bc132a52401cf2210e281",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-009.html": [
- "b355d476e6b7f6a323e7cdc69bc3a4a0a926256a",
+ "anchor-scroll-position-try-008.html": [
+ "99f180bb46338deb32640d2143a24b9a99d508ad",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-010.html": [
- "a0dd599b3b66effef00d28774783793a92349115",
+ "anchor-scroll-position-try-009.html": [
+ "0267d1987be687fd04031c895df486d108d0f628",
[
null,
{}
]
],
- "anchor-scroll-fallback-position-011.html": [
- "98fa4b5f86cd5239ea77f527d6cf6453ca0373a1",
+ "anchor-scroll-position-try-010.html": [
+ "133649c720f0a8f80741fcabfcec27a2d7b344a2",
[
null,
{}
]
],
- "anchor-scroll-js-expose.html": [
- "1ef44d03c2202dfc053f27c0e12e2a397634267e",
+ "anchor-scroll-position-try-011.html": [
+ "005a4ee728cbf6566f9a32b1626b04324c42c36f",
[
null,
{}
@@ -520962,36 +521977,36 @@
{}
]
],
- "at-fallback-position-allowed-declarations.html": [
- "cca222ac6d78031e31f161839d9a3a65164202f3",
+ "at-position-try-allowed-declarations.html": [
+ "622e9827b449eecdcfdf2680d58174c550ca4631",
[
null,
{}
]
],
- "at-fallback-position-parse.html": [
- "942d9a2984595bfec8b86d01fc0d6332bef496ea",
+ "at-position-try-cssom.html": [
+ "d4a1f4fa24c04bfb1be8fab64ad33ec035a44dd3",
[
null,
{}
]
],
- "at-position-fallback-cssom.html": [
- "df295bf2d0adc79d7792775d29e8373a88609112",
+ "at-position-try-invalidation-shadow-dom.html": [
+ "e5d6c51a0b95bcd3ba873b05d982054a7d1a49f9",
[
null,
{}
]
],
- "at-position-fallback-invalidation-shadow-dom.html": [
- "066cba1dac72d85562cf56adc99a23156040d56e",
+ "at-position-try-invalidation.html": [
+ "3f7c5062f21ddc67464c51c9ab8df113a882ba82",
[
null,
{}
]
],
- "at-position-fallback-invalidation.html": [
- "68a0874931245741b7b35e2c517367f8733bc764",
+ "at-position-try-parse.html": [
+ "27f5c8687b29fc8ee4e174b439c8b0ea8f71c020",
[
null,
{}
@@ -521083,134 +522098,134 @@
]
]
},
- "position-fallback-001.html": [
- "d28c71ec6813000296012a4fcab8787dbb3e8f5d",
+ "position-fallback-basics.html": [
+ "bfeb921de1bab4b194f0bb07b46bc7208c5e2166",
[
null,
{}
]
],
- "position-fallback-002.html": [
- "ea6ff11479a8c482c49820ec7fb40b33d732676d",
+ "position-fallback-bounds-001.html": [
+ "ebd1e78fb9a86fd595a4607fa7285f5734ce5726",
[
null,
{}
]
],
- "position-fallback-003.html": [
- "531dc303d657ae72738e1f6593627e9367dcd071",
+ "position-fallback-bounds-002.html": [
+ "159484ad33b366c09e5d2c404660e8d3f4ad9617",
[
null,
{}
]
],
- "position-fallback-004.html": [
- "e4dbd718664fca1d5aa1276b32a8c6e94f907c3a",
+ "position-fallback-bounds-003.html": [
+ "9da7bf9ccd774b28aaa5dc83dd7d8a3f6b458902",
[
null,
{}
]
],
- "position-fallback-basics.html": [
- "bfeb921de1bab4b194f0bb07b46bc7208c5e2166",
+ "position-fallback-bounds-004.html": [
+ "eeee710e0fa242eafea6f1957e84c86958fec256",
[
null,
{}
]
],
- "position-fallback-bounds-001.html": [
- "7735115e592dca0168cc3ac41e6762534de9bfa9",
+ "position-fallback-bounds-005.html": [
+ "fecd4328a5996b5cd6c30e186b0343043a3642b9",
[
null,
{}
]
],
- "position-fallback-bounds-002.html": [
- "7bd71216e7df9625d9901083151d1f1408de301f",
+ "position-fallback-bounds-006.html": [
+ "023c650cfc9fa6c82a580d2d2d1d7141212352a2",
[
null,
{}
]
],
- "position-fallback-bounds-003.html": [
- "0e0e243a16e8637160738e0a2a17c1c37e017f0a",
+ "position-fallback-bounds-basics.html": [
+ "3b8b67bd978f3361512222f75cd71f08143007b1",
[
null,
{}
]
],
- "position-fallback-bounds-004.html": [
- "ff982ea93e49f666a254ea6704332c576c7842bc",
+ "position-try-001.html": [
+ "a15c808d95658ee022723ff37985ad66c279c31e",
[
null,
{}
]
],
- "position-fallback-bounds-005.html": [
- "deb546a1e2eca11f9928cdbbf85299cc0bdce29c",
+ "position-try-002.html": [
+ "c3d550adb1ee4f2e111f37baa643fbbe0724ca4a",
[
null,
{}
]
],
- "position-fallback-bounds-006.html": [
- "5a19c59f3104aaa556186e7dfa93d237bf46ad79",
+ "position-try-003.html": [
+ "196b7b0304b8e8c48e54fc0180e879a5f35ed45f",
[
null,
{}
]
],
- "position-fallback-bounds-basics.html": [
- "3b8b67bd978f3361512222f75cd71f08143007b1",
+ "position-try-004.html": [
+ "b172f2e8bf392deb95c42475b11f54cfc5845760",
[
null,
{}
]
],
- "position-fallback-cascade-layer-reorder.html": [
- "ec1a64205c55788b021040b278ce1e51c2cbfc5e",
+ "position-try-cascade-layer-reorder.html": [
+ "6c09fd0ea17b17b27428408751f7b60230382391",
[
null,
{}
]
],
- "position-fallback-container-query.html": [
- "b4ef806206e6b20490ba6846dd8be5509ca40d05",
+ "position-try-container-query.html": [
+ "528217c917c5f1e2b948a54bf114addf45d2e795",
[
null,
{}
]
],
- "position-fallback-custom-property.html": [
- "edb7efc7ed6884a52f6b3a3b7ba8a06833d1c349",
+ "position-try-custom-property.html": [
+ "69ca0d12f430f77dce96fbe0ceb3f713013448f0",
[
null,
{}
]
],
- "position-fallback-dynamic.html": [
- "f6d82104276121aa86b81daed6337339ebc24ac0",
+ "position-try-dynamic.html": [
+ "fad3db62a31e535aa943b9709ebc4bb4f02f6e4d",
[
null,
{}
]
],
- "position-fallback-grid-001.html": [
- "abe80bf51ef38adc7cd56a99797408da6433e1bb",
+ "position-try-grid-001.html": [
+ "87a30e26eca4a92edb796f6c22cbe6b2f8da54cd",
[
null,
{}
]
],
- "position-fallback-pseudo-element.html": [
- "e2f95b9a24ae963e459ca6c92a3d366ff1631509",
+ "position-try-pseudo-element.html": [
+ "5895f2a4077b697b4d59dec4e0cb2dbace4aefd6",
[
null,
{}
]
],
- "position-fallback-tree-scoped.html": [
- "2650a32f60a20675eb97ed028dfff29143045c88",
+ "position-try-tree-scoped.html": [
+ "a8fe0106833d08d8c015c7c9ebe6ecb2efb52dca",
[
null,
{}
@@ -521558,6 +522573,13 @@
{}
]
],
+ "empty-pseudo-class-with-animation.html": [
+ "d8dba1ab5bdae3b752004ae7112d680582cd010f",
+ [
+ null,
+ {}
+ ]
+ ],
"event-dispatch.tentative.html": [
"3e577d6ea6c67269766ed9ec38d13bd4cbda435c",
[
@@ -523134,6 +524156,13 @@
{}
]
],
+ "grid-inline-end-columns-added-to-end.html": [
+ "9c88c2981598f316a3b19be88b5bc99c10c76725",
+ [
+ null,
+ {}
+ ]
+ ],
"grid-inline-start-item-negative-span.html": [
"80b97e9cd0d10526c713e58887733e51bad62ffb",
[
@@ -524521,14 +525550,14 @@
]
],
"system-color-consistency.html": [
- "4eb9d8110055a60cdce54515f306d061b6986fb7",
+ "0d23d84ad25f0287c90a927703f2cbd2ae0fe0d9",
[
null,
{}
]
],
"system-color-support.html": [
- "2392739a0089fd05eaac91ef4989ee305513ffdb",
+ "8c278f51193884ae8b81e2aa3f2d3948b22703c8",
[
null,
{}
@@ -531496,6 +532525,20 @@
{}
]
],
+ "grid-item-aspect-ratio-justify-self-001.html": [
+ "5104c2837b720b74781c8b70d6cd863130f4bb4a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "grid-item-aspect-ratio-justify-self-002.html": [
+ "9f40289775dbefbeec7ab64add0082986b48717c",
+ [
+ null,
+ {}
+ ]
+ ],
"grid-item-auto-margins-alignment-vertical-lr.html": [
"e11398907ec3468214172d0ce5de80d430e1b1af",
[
@@ -538131,7 +539174,7 @@
]
],
"at-property-shadow.html": [
- "db282d10b0ec19f1b561f1435d36255edddb8967",
+ "69f4f4c10753ba2ff536c0b237ecd6db357626b2",
[
null,
{}
@@ -538710,6 +539753,69 @@
{}
]
],
+ "font-face-001.html": [
+ "7e47d18cbaa240af93b4cc598545aeba69ae2d17",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-002.html": [
+ "2e3272c44f7cc27b5cf3e28a4712ef0c3ca65cb6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-003.html": [
+ "d3f83e4ec3720af544daac1640258e7e3324b3b5",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-004.html": [
+ "6ac50bd4323339b0ab78a4777015227eaeda7b9a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-005.html": [
+ "fdf86fb56e298cbdd60d232a99869140710442d2",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-006.html": [
+ "5eabe6ab767abb8c1efe90a905823e3ab52cff1c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-007.html": [
+ "ae669f638fe8787fcb96fcce0f1d99d52ced28bf",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-008.html": [
+ "a40b0247d134ae45fbe1c6ac5814c5886e30c234",
+ [
+ null,
+ {}
+ ]
+ ],
+ "font-face-009.html": [
+ "5d770929cad0b6ce52005937bb1a20099425bea9",
+ [
+ null,
+ {}
+ ]
+ ],
"host-context-parsing.html": [
"56055ece63733e8c58c6add661566572356d67aa",
[
@@ -538746,14 +539852,14 @@
]
],
"keyframes-001.html": [
- "b0a95ac6865674462c5d4fc28c46d249e84498d9",
+ "56f0f32dcf901ec53b6465e756f25b466e4f2f7f",
[
null,
{}
]
],
"keyframes-002.html": [
- "b80b250460be2941b96454a26be4b8bf859702ab",
+ "347adcb0f525e95b27e09d9101e53adc76595875",
[
null,
{}
@@ -539777,8 +540883,26 @@
]
],
"multiple-aligned-targets": {
+ "nested-supercedes-common-to-both-axes.html": [
+ "15743026bc3ea726e573d5a6311f87f8a68e8cab",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "prefer-common-to-both-axes.html": [
+ "09b81e7c0dad69746012a6738b2f21689b699806",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"prefer-focused-element.html": [
- "f15a291f08a8ebfb5e37afa3d2da01d72211e416",
+ "9acf0e905cb05ad72fb1185b472798364a96b42d",
[
null,
{
@@ -539787,7 +540911,7 @@
]
],
"prefer-focused-nested-containers.html": [
- "a6a087316fdcf50718b158bba51690c22a6eb450",
+ "4330022b27ad52d79280e5aa0120110f466cff53",
[
null,
{
@@ -539796,7 +540920,7 @@
]
],
"prefer-inner-target.html": [
- "053b6a1d7e6e2224a58172f603944b1f28888427",
+ "3cabbc7945f9f819f8eef892b5743affaa49a7da",
[
null,
{
@@ -539805,7 +540929,7 @@
]
],
"prefer-targeted-element-positioned.html": [
- "22727d19ebddcb0c1be5332f353792fe60f8e826",
+ "3a2b1a90892436f1a074f89d06c633b40330ed50",
[
null,
{
@@ -539814,7 +540938,7 @@
]
],
"prefer-targeted-element.html": [
- "87e7098fa35e43f192c42743aecbff7cd51c3598",
+ "1f7f087180df8377130b8284e5c3a50a186e280d",
[
null,
{
@@ -541838,7 +542962,7 @@
]
],
"auto-006.html": [
- "422b730c2e862af4ee5f89313580d2854db7a864",
+ "ff1c30135ae245cd78bcfba6d8961d06bec76eb7",
[
null,
{}
@@ -541971,7 +543095,7 @@
]
],
"contain-intrinsic-size-033.html": [
- "f98a48a0a973f942a24341713ab6f89b678ca616",
+ "c40b9cdc8e5cdc36378047ace49fadc80cec6f17",
[
null,
{}
@@ -545419,6 +546543,13 @@
{}
]
],
+ "webkit-text-stroke-computed.html": [
+ "0dadfe402a58bf7c480910fe5a2ce6bf427f186f",
+ [
+ null,
+ {}
+ ]
+ ],
"white-space-collapse-computed.html": [
"506e257cbe72c4c9469dc20d0e360c80e4367a5f",
[
@@ -546291,6 +547422,13 @@
{}
]
],
+ "rotate-interpolation-math-functions-tentative.html": [
+ "eccb554fd8ab6d147935853b6d9e5f37c261cf7b",
+ [
+ null,
+ {}
+ ]
+ ],
"rotate-interpolation.html": [
"17fb7e499c66d14bb770a82895790a4a6977a674",
[
@@ -546300,6 +547438,13 @@
}
]
],
+ "scale-animation-math-functions-tentative.html": [
+ "2ad177469a434ab62aa9c411dce0b475b9f949c4",
+ [
+ null,
+ {}
+ ]
+ ],
"scale-composition.html": [
"107aa0b273f83e97a906bbc59037ee29336a90e9",
[
@@ -548340,7 +549485,7 @@
},
"properties": {
"accent-color.html": [
- "8cd0b986e8665ee6a4e9830b9346f5a4957b89b8",
+ "a02a8493be32e879085415061497bd8c79726f04",
[
null,
{}
@@ -548473,7 +549618,7 @@
]
],
"background-color.html": [
- "f684a40fb62528d123c224e16db4bc62254e23e6",
+ "d0a55d52d4d00ed56610297ec3e3d5a08e600e38",
[
null,
{}
@@ -548543,7 +549688,7 @@
]
],
"border-color.html": [
- "3ce4ca94fce9e616074827e8cc57b48652d5e202",
+ "a38f7c7d80600679b4de765ee7fd33794cd681bd",
[
null,
{}
@@ -548641,7 +549786,7 @@
]
],
"caret-color.html": [
- "5ea78a08d389852e0346c913c9c6b98ec9252961",
+ "b79beacf4be6aa58c06709633d1e0ec30743693d",
[
null,
{}
@@ -548690,7 +549835,7 @@
]
],
"color.html": [
- "f56182977c58a482f240f82930a8af9d20bd360f",
+ "58555ff8052fc04e2f9da56e45b9d2e6dced85f1",
[
null,
{}
@@ -548704,7 +549849,7 @@
]
],
"column-rule-color.html": [
- "3d35b856d71f2de9c87e83aa1ace57b3b4d8cf5d",
+ "ea27c9eaec6418953f1fc57dd5a6504995eb676a",
[
null,
{}
@@ -548921,7 +550066,7 @@
]
],
"flood-color.html": [
- "bb3ddc9fc9aeb948d47cf87ed20dbb123cfbfd52",
+ "99ee9f05adff154ebe56bc3806c195b81dbde7d2",
[
null,
{}
@@ -549208,7 +550353,7 @@
]
],
"lighting-color.html": [
- "aec16433723313664ba37974c5190be08a540ad7",
+ "5d69f2fa4aa3a276f30e89cded7ac0cc28e2b179",
[
null,
{}
@@ -549376,7 +550521,7 @@
]
],
"outline-color.html": [
- "6bfec87a8c799e621d7c7c5d8b3b33a09c35c62f",
+ "e779d709fe253cd518a0e9b0d85ebb4260c173cf",
[
null,
{}
@@ -549607,7 +550752,7 @@
]
],
"stop-color.html": [
- "83dcf0218a0cf8903ae066bb14c04032a65fa3dd",
+ "36b364bd4f3b87812a6449da638a8a54633439e7",
[
null,
{}
@@ -549719,7 +550864,7 @@
]
],
"text-decoration-color.html": [
- "b76f82c3ea13fe06ab3318435fb456949b0d8ea9",
+ "f49a5739fdbad8a46dd6a997b8bd18fe9892e9c6",
[
null,
{}
@@ -549768,7 +550913,7 @@
]
],
"text-emphasis-color.html": [
- "8623d3dfb9b741c7243f45374e22f71ebadad0cb",
+ "8f106e6054f6a97206f5150373d6287488dab623",
[
null,
{}
@@ -550880,7 +552025,7 @@
]
},
"calc-size-height.tentative.html": [
- "6f93cc0c8998c27c7db4e823f7fffa75656c7a36",
+ "3c97ceb15876010c8ef145bd5c5c3b5a5318623d",
[
null,
{}
@@ -551929,35 +553074,35 @@
]
],
"only-child-group.html": [
- "05275a344882732bebdc4cc28db2dc947f238e69",
+ "551e8816116c9b54f35dc2afbff57eb5460251f5",
[
null,
{}
]
],
"only-child-image-pair.html": [
- "288d496346e3b55585dbb8cffaff826c2f9c2351",
+ "d84b74f0ab38c3aebd8db18de5c504f0ff5d0f29",
[
null,
{}
]
],
"only-child-new.html": [
- "9f365282194c3992304d3b2aa2e59cc202ee3e61",
+ "7bc8a447ce56e96c7237a8f0b2ddf7a2a04af745",
[
null,
{}
]
],
"only-child-no-transition.html": [
- "7dc2bf12176d9d45dc6af80017617206f4d6dbee",
+ "9152253dff3fac342ce031d0d8323c04a360ca14",
[
null,
{}
]
],
"only-child-old.html": [
- "7a55af7397ddad2cf1e54aea1df49a5a998ec173",
+ "4d57121aa16f25d60b04a37ecbb44bbb53b0ce59",
[
null,
{}
@@ -558938,6 +560083,26 @@
]
]
},
+ "device-posture": {
+ "idlharness.https.window.js": [
+ "74ebd11af97835a9973186ff9a61131550bf54c3",
+ [
+ "device-posture/idlharness.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/WebIDLParser.js"
+ ],
+ [
+ "script",
+ "/resources/idlharness.js"
+ ]
+ ]
+ }
+ ]
+ ]
+ },
"direct-sockets": {
"disabled-by-permissions-policy.https.sub.html": [
"f2f6e50be0fd2274b7c3b7e453d7661b6dd99daa",
@@ -562607,6 +563772,20 @@
]
],
"insertion-removing-steps": {
+ "Node-append-form-and-script-from-fragment.tentative.html": [
+ "10351d1645dda6aadf39cfb071f420ea5515870a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "Node-append-meta-referrer-and-script-from-fragment.tentative.html": [
+ "d24779760337626697e807c085597196b7a4ca9a",
+ [
+ null,
+ {}
+ ]
+ ],
"Node-appendChild-script-and-button-from-div.tentative.html": [
"91f09ae50056661a9aa8553ca75fd6a5dc1482fb",
[
@@ -565286,6 +566465,13 @@
{}
]
],
+ "inserttext-at-end-of-block-when-br-always-block.html": [
+ "922b8bd1c86230c1284fc0f14ce2031ab345c1ee",
+ [
+ null,
+ {}
+ ]
+ ],
"join-different-white-space-style-left-line-and-right-paragraph.html": [
"48fa581115228567660771aa126f133f444159bc",
[
@@ -585296,7 +586482,7 @@
]
],
"request-upload.h2.any.js": [
- "eedc2bf6a769d0ba84171eeecac659ba5ea2b501",
+ "68122278ccd2b1009de7697f3a092308d5695ce1",
[
"fetch/api/basic/request-upload.h2.any.html",
{
@@ -585896,7 +587082,7 @@
},
"body": {
"formdata.any.js": [
- "e25035923c1f9e93042889a914f0253a01eb4a15",
+ "6733fa0ed70afe5b20935c6b5cd3050ca28787b7",
[
"fetch/api/body/formdata.any.html",
{}
@@ -589721,7 +590907,7 @@
]
],
"request-consume-empty.any.js": [
- "034a86041a74f58c4d0310ef809f6170b09dbb05",
+ "0bf9672a7950570d8bee99fdec4307429b5ae786",
[
"fetch/api/request/request-consume-empty.any.html",
{
@@ -589784,7 +590970,7 @@
]
],
"request-consume.any.js": [
- "aff5d65244a15e9fb7cbded180bcdb55ef65be2b",
+ "3db9e8f265713abd56ba6b9e4831ca41708e9c2c",
[
"fetch/api/request/request-consume.any.html",
{
@@ -590623,7 +591809,7 @@
]
],
"response-consume-empty.any.js": [
- "0fa85ecbcb2d7b9093307b189c392aa9c528d9c7",
+ "a5df356258658957137d09ef38da6d71fd7ed488",
[
"fetch/api/response/response-consume-empty.any.html",
{
@@ -600710,7 +601896,7 @@
]
],
"generate-bid-browser-signals.https.window.js": [
- "615702ba9e21e009628c6a9f2fc72ad94ff02ab7",
+ "8687e3f296d63d395cf00039115860383c986706",
[
"fledge/tentative/generate-bid-browser-signals.https.window.html?1-4",
{
@@ -600753,7 +601939,19 @@
],
[
"variant",
- "?17-last"
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
]
],
"timeout": "long"
@@ -600801,14 +601999,26 @@
],
[
"variant",
- "?17-last"
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
]
],
"timeout": "long"
}
],
[
- "fledge/tentative/generate-bid-browser-signals.https.window.html?17-last",
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?17-20",
{
"script_metadata": [
[
@@ -600849,7 +602059,199 @@
],
[
"variant",
- "?17-last"
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?21-24",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?25-28",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?29-last",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
]
],
"timeout": "long"
@@ -600897,7 +602299,19 @@
],
[
"variant",
- "?17-last"
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
]
],
"timeout": "long"
@@ -600945,7 +602359,19 @@
],
[
"variant",
- "?17-last"
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-last"
]
],
"timeout": "long"
@@ -611663,6 +613089,15 @@
}
]
],
+ "pageswap-initial-navigation.html": [
+ "5483b9394d4e4b5762966a80e19158955805d353",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"pageswap-push-from-click.html": [
"936158cd4737845bc3d2bdda2edacd25abee54b9",
[
@@ -614466,6 +615901,13 @@
{}
]
],
+ "history_reload_referrer.html": [
+ "d11ee8970289059ab318da0327c875152459a384",
+ [
+ null,
+ {}
+ ]
+ ],
"history_replacestate.html": [
"794c2f371304a7c8d05bf9169278f34ac2580de1",
[
@@ -614654,6 +616096,27 @@
{}
]
],
+ "assign-replace-from-iframe.html": [
+ "a0cd9f25ef9def35917f1817eb841cf811652c5e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "assign-replace-from-top-to-nested-iframe.html": [
+ "eb6e4960dc2c8ebce37a1f32e3b4237224b50dd3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "assign-with-nested-iframe.html": [
+ "e043623c08292cb284c77790ad4e67752828abda",
+ [
+ null,
+ {}
+ ]
+ ],
"assign_after_load.html": [
"00dc931d4e7204ef302c7ab8d7340ec19feee61d",
[
@@ -614948,6 +616411,13 @@
{}
]
],
+ "replace-with-nested-iframe.html": [
+ "e6620bd29c7537af74b4b8e55e1c5aafb319ca50",
+ [
+ null,
+ {}
+ ]
+ ],
"same-hash.html": [
"430a57662ac34e5150b44b210fdc44cf158e2c3f",
[
@@ -618800,6 +620270,13 @@
{}
]
],
+ "2d.drawImage.detachedcanvas.html": [
+ "e301537330ea08534b70e4488d9aaaaef0029eda",
+ [
+ null,
+ {}
+ ]
+ ],
"2d.drawImage.floatsource.html": [
"3e100c257fed3fa8f2e218d394a9db6a113f3dd6",
[
@@ -620963,77 +622440,77 @@
},
"filters": {
"2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [
- "42fb1ee8f84ff038c9b67f681d05a6a7323b88b3",
+ "dc9479286765c4ba0bb9711c4355c682888c8f6e",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.colorMatrix.tentative.html": [
- "b2f6a6ac97ef2109c9af632be71975b54a8391bd",
+ "56cf1bf0b1c6619d14cf01ef767b4ef3c13648d8",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [
- "b392b189f21ef09e1a27f293b71ef9031469ab70",
+ "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [
+ "a28854105703450afe35065eea809992800c4c08",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [
- "e5bff7e44dfc5afa69788ce7577e154d55be2557",
+ "2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html": [
+ "05984a47f827ca4782ce1fa193bb1564eb98018a",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [
- "ecd3830be3e2e0bf8c9aa7192d4d3c79d0b3082d",
+ "2d.filter.canvasFilterObject.tentative.html": [
+ "c40e718d7229d64f4f0edb6a53267c0e01b7330a",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [
- "8708887f6a511699e8d1132c1e78c754fb5b7ec4",
+ "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [
+ "b85add4b664fe8b814fd710ed97823746052ed1d",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [
- "4b296d9fd7d513d96b6f6f63045cebcf057697bc",
+ "2d.filter.layers.blur.exceptions.html": [
+ "7176a7d0a488bb99c57a81c5510c43d682f5d69c",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [
- "b80600c14175f48e1e871f1fc5893cb0755a4228",
+ "2d.filter.layers.colorMatrix.html": [
+ "ef0ae0f949b8f460802c02e33cbb7e74195d854d",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html": [
- "8c07a72b2b3ff6675d49c0313e653d2a655401c7",
+ "2d.filter.layers.convolveMatrix.exceptions.html": [
+ "ae45cb865c552efd6527ed580faaa91ff501c6bb",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.tentative.html": [
- "c40e718d7229d64f4f0edb6a53267c0e01b7330a",
+ "2d.filter.layers.dropShadow.exceptions.html": [
+ "df5e0c7dc3e42c557df9d4c07132f4f86b575b0b",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [
- "c24cfd23981e89809fac0717ce267247a5ca5f14",
+ "2d.filter.layers.turbulence.inputTypes.html": [
+ "26dceaae1659f2ae70f6c2718125cbed54690025",
[
null,
{}
@@ -625243,6 +626720,22 @@
]
]
},
+ "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",
@@ -631381,156 +632874,156 @@
},
"filters": {
"2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [
- "d8f14529c5306cccc5dd4806186e935edb2c4a2a",
+ "e7461eacdbd2c9f56ec9454b02edbbb7f5d5c1a4",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js": [
- "9b3fb3c04cd5a98f0d4f6b5b27035ba72bd98c39",
+ "1c271689688b67dfb5ac8ec09ed99666f192f46d",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.colorMatrix.tentative.html": [
- "242094d9f9fb8cc500bed216f9ed9d72ef53b66d",
+ "0370c1387bc5714b02d42fc529bb706c4e7007e2",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js": [
- "d214e1d836e0e4dbb1ebeb572a56853c2c0c2cfd",
+ "62e4582efdadb1a9bc9b0d9f44120366c0bf6c24",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [
- "ff1de6bc9cf648c47f0f5d45a62fb7030dca0b65",
+ "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [
+ "08f8860e99882873786ac3aa7dd846b9bb27ffa7",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js": [
- "0e68f4899fe7167e28a9804a1aa3c20d034247a8",
+ "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js": [
+ "105ed67a758ee611069a28562955ef69680e3470",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [
- "64c30fc4177e4388b6d5323be1ef0a520b6f1c5f",
+ "2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html": [
+ "cdd501ba8e986eb3d2c75a9db6edf8c86701ff47",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js": [
- "d59bc699df90ed04d8cf6fa23fc86ce3a399813c",
+ "2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js": [
+ "1d56865e687e5ee9fecc0907340637c571540d35",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [
- "e0d628952e0f01af9c0db1082ec2fee1854e6d86",
+ "2d.filter.canvasFilterObject.tentative.html": [
+ "fb99ef7d1ff8013e7ebfd4146ed0688f9ed2277c",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js": [
- "1b714b58ff741ca5f025c1863d61722092470edd",
+ "2d.filter.canvasFilterObject.tentative.worker.js": [
+ "db95e0b006c414019f3cc687a359e0b833b6ed75",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [
- "adbe557fd96dccfe4e8260ef0a51e745eea7f5c9",
+ "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [
+ "8ad2a5ccfb04ebde5ca9b8c74a803a7b2613187f",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js": [
- "fb2e01876fcb270908f80b5e6844308a7fa2dcc0",
+ "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js": [
+ "16199cb0ecf390d99494c14f456c8bac396c9647",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [
- "47048b68a149d83916023974af2ea45381a8363a",
+ "2d.filter.layers.blur.exceptions.html": [
+ "36dd856456c52944ab1edc0017c5344a4fd7fe04",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js": [
- "0799e73a583d20709c630470f6d226b455a29a6e",
+ "2d.filter.layers.blur.exceptions.worker.js": [
+ "a053b8113c4ef8d1e510f41356ee014ed42a33ff",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [
- "301d11f888cbe584604a9e99c7cbbcd7124d8547",
+ "2d.filter.layers.colorMatrix.html": [
+ "9e12acbbe0bb53521e7ddb7267c0a308bdba07b2",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js": [
- "b4ce4d76b24e733495907f9bc0ac9e0a5ae0b6bb",
+ "2d.filter.layers.colorMatrix.worker.js": [
+ "12cdff3868881decae30b3e2d7249b237320ca4b",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html": [
- "3e55e97e54f8bb7124611ef2c2ece6094dc77800",
+ "2d.filter.layers.convolveMatrix.exceptions.html": [
+ "798822f1042bad113dff0ee44c73ac9c3a4c69a8",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js": [
- "bd18524f28b7e6880d83c74df2a1fc487ed5bce9",
+ "2d.filter.layers.convolveMatrix.exceptions.worker.js": [
+ "fa3be89ba2f1a3ee9e665913f3297d38dbe95a82",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.tentative.html": [
- "fb99ef7d1ff8013e7ebfd4146ed0688f9ed2277c",
+ "2d.filter.layers.dropShadow.exceptions.html": [
+ "10392dea5aceedca61d868d5879a6cfbb00d5c36",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.tentative.worker.js": [
- "db95e0b006c414019f3cc687a359e0b833b6ed75",
+ "2d.filter.layers.dropShadow.exceptions.worker.js": [
+ "86b8c56af69a0d3baccc14bf443c2354325b1aa1",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.html",
{}
]
],
- "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [
- "040c62a96bbb633dc6bf1602461f08a33fe9ec1a",
+ "2d.filter.layers.turbulence.inputTypes.html": [
+ "27f7748c8472436a968935c6f81187754ddd309f",
[
null,
{}
]
],
- "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js": [
- "1a950a9207b9c3080d69bc7a191d3ebfb4d664e1",
+ "2d.filter.layers.turbulence.inputTypes.worker.js": [
+ "3728566c9972833ba5d9a6ecb7d13bbcdb735bf4",
[
- "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.html",
+ "html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.html",
{}
]
],
@@ -638926,6 +640419,36 @@
]
]
},
+ "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",
@@ -643695,260 +645218,267 @@
{}
]
],
- "element-render-blocking-001.tentative.html": [
+ "element-render-blocking-001.html": [
"36567f9d54adea41a703b23adac438e160f397cf",
[
null,
{}
]
],
- "element-render-blocking-002.tentative.html": [
+ "element-render-blocking-002.html": [
"3c907597f7ac35b84e29ccd37627499c347f511a",
[
null,
{}
]
],
- "element-render-blocking-003.tentative.html": [
+ "element-render-blocking-003.html": [
"2858798a35f58e1152b7047c35359878d1820ecc",
[
null,
{}
]
],
- "element-render-blocking-004.tentative.html": [
+ "element-render-blocking-004.html": [
"f45f5587204674691349f298f9367204233aa235",
[
null,
{}
]
],
- "element-render-blocking-005.tentative.html": [
+ "element-render-blocking-005.html": [
"098a3c57676cc88788a23efa0818e00b9a8e6344",
[
null,
{}
]
],
- "element-render-blocking-006.tentative.html": [
+ "element-render-blocking-006.html": [
"223e42109e5c65985e0aec2b0c24ef8f1d810d15",
[
null,
{}
]
],
- "element-render-blocking-007.tentative.html": [
+ "element-render-blocking-007.html": [
"9aa0aeea79834833ff0151227723c1a6c17e06e2",
[
null,
{}
]
],
- "element-render-blocking-008.tentative.html": [
+ "element-render-blocking-008.html": [
"e671dda19c43b44d3f065b8de0e68f7326e88aba",
[
null,
{}
]
],
- "element-render-blocking-009.tentative.html": [
+ "element-render-blocking-009.html": [
"8498816ea5c435cce0ea3d597b7f0b381d73d7f6",
[
null,
{}
]
],
- "element-render-blocking-010.tentative.html": [
+ "element-render-blocking-010.html": [
"ef6f709012e4bd4bb222b8cc74317abdbc40768f",
[
null,
{}
]
],
- "element-render-blocking-011.tentative.html": [
+ "element-render-blocking-011.html": [
"dee82d8c5950c16360d2ff799393a50bed1f7a95",
[
null,
{}
]
],
- "element-render-blocking-012.tentative.html": [
+ "element-render-blocking-012.html": [
"4110e54c5f20420d8da783d21e43d2f9961aed5a",
[
null,
{}
]
],
- "element-render-blocking-013.tentative.html": [
+ "element-render-blocking-013.html": [
"ecd97be86a6633daf0d03f86f231de295abee459",
[
null,
{}
]
],
- "element-render-blocking-014.tentative.html": [
+ "element-render-blocking-014.html": [
"ea8948de42dec015384aa2bd7a13edb283b6d522",
[
null,
{}
]
],
- "element-render-blocking-015.tentative.html": [
+ "element-render-blocking-015.html": [
"a775ee417403ab3fef3635194ff1d62b4c335266",
[
null,
{}
]
],
- "element-render-blocking-016.tentative.html": [
+ "element-render-blocking-016.html": [
"8968c5dacd329537b9d7c1d0d0ce38786077f583",
[
null,
{}
]
],
- "element-render-blocking-017.tentative.html": [
+ "element-render-blocking-017.html": [
"2d3b5747216f50902714bff725cddf50ec7556c0",
[
null,
{}
]
],
- "element-render-blocking-018.tentative.html": [
+ "element-render-blocking-018.html": [
"76e6394b5b16586de768ad553c671b8594d0635e",
[
null,
{}
]
],
- "element-render-blocking-019.tentative.html": [
+ "element-render-blocking-019.html": [
"80a7019edc4beb272ef65d7cd1d28f88fb18a813",
[
null,
{}
]
],
- "element-render-blocking-020.tentative.html": [
+ "element-render-blocking-020.html": [
"10019c943f402c91c0ca07efefe462d5bc6ece48",
[
null,
{}
]
],
- "element-render-blocking-021.tentative.html": [
+ "element-render-blocking-021.html": [
"1ca2114689a6cdbc961c9eecd1fa4e328117d431",
[
null,
{}
]
],
- "element-render-blocking-022.tentative.html": [
+ "element-render-blocking-022.html": [
"5dfbcac30a4c065a888f5ea804ba306758d83e6c",
[
null,
{}
]
],
- "element-render-blocking-023.tentative.html": [
+ "element-render-blocking-023.html": [
"8fe8b6a8c8e30f05250c2ca569f5b4d938bed71c",
[
null,
{}
]
],
- "element-render-blocking-024.tentative.html": [
+ "element-render-blocking-024.html": [
"19e4020fb769bb59053a6a64cc1c499583044c73",
[
null,
{}
]
],
- "element-render-blocking-025.tentative.html": [
+ "element-render-blocking-025.html": [
"689ae69f452d421b66554c8e547ca95f5f269af9",
[
null,
{}
]
],
- "element-render-blocking-026.tentative.html": [
+ "element-render-blocking-026.html": [
"6abfc43b8b237b3f8f0f6474d36fcce1c3aaac52",
[
null,
{}
]
],
- "element-render-blocking-027.tentative.html": [
+ "element-render-blocking-027.html": [
"56f88e0fc2b773f74afb86e306f42a1aa39d9c1b",
[
null,
{}
]
],
- "element-render-blocking-028.tentative.html": [
+ "element-render-blocking-028.html": [
"a64d542c4ac7ef97a2e3427dabe485519da97518",
[
null,
{}
]
],
- "element-render-blocking-029.tentative.html": [
+ "element-render-blocking-029.html": [
"44dff3cb8429d901b65f5991d3696abb31ff6831",
[
null,
{}
]
],
- "element-render-blocking-030.tentative.html": [
+ "element-render-blocking-030.html": [
"307c2d303d045d090c180ae22476b1419b91d9bc",
[
null,
{}
]
],
- "element-render-blocking-031.tentative.html": [
+ "element-render-blocking-031.html": [
"2098483a0600c642f32403fff97be2bb4fed4572",
[
null,
{}
]
],
- "element-render-blocking-032.tentative.html": [
+ "element-render-blocking-032.html": [
"307c2d303d045d090c180ae22476b1419b91d9bc",
[
null,
{}
]
],
- "element-render-blocking-033.tentative.html": [
+ "element-render-blocking-033.html": [
"59d41c08c0a677e0e462c53e47e76635cb3bf9b1",
[
null,
{}
]
],
- "element-render-blocking-034.tentative.html": [
- "92d4a06b1a93f4f2f6dfb77b4c293064522ebca4",
+ "element-render-blocking-034.html": [
+ "a505de48756a9fbf1b947e6e01be8020f9d2be23",
[
null,
{}
]
],
- "element-render-blocking-035.tentative.html": [
- "fd3b6b1759f21d2b71fd9b0b137324529c72f14a",
+ "element-render-blocking-035.html": [
+ "050244c7a690cdc840505bf73173464e0aef69c9",
[
null,
{}
]
],
- "element-render-blocking-036.tentative.html": [
+ "element-render-blocking-036.html": [
"83637b3a08b859b0fa46b3bfdab6edc8df86c7bb",
[
null,
{}
]
],
- "element-render-blocking-037.tentative.html": [
- "885d64604fe8c1ad4b605a3582c90c70c8302f5d",
+ "element-render-blocking-037.html": [
+ "5fe469a2fdd3b6231a84cd842c1bea877f42bb14",
+ [
+ null,
+ {}
+ ]
+ ],
+ "element-render-blocking-038.html": [
+ "c7fabe7f320c4af2cbdb4089916796a9eb333874",
[
null,
{}
@@ -647915,7 +649445,7 @@
]
],
"field-sizing-textarea.html": [
- "f8d90dc659b119133cce6f651e7331d83c35fd3c",
+ "114d60c72d02329c8572d1308e86c5dc37bd55c5",
[
null,
{}
@@ -648297,6 +649827,20 @@
{}
]
],
+ "stylesheet-bad-mime-type.html": [
+ "08176d6cd253124851de87194b308259edfa07e4",
+ [
+ null,
+ {}
+ ]
+ ],
+ "stylesheet-non-OK-status.html": [
+ "28ac55ff1a408309e1fe6fdf0662bee701f13068",
+ [
+ null,
+ {}
+ ]
+ ],
"stylesheet-not-removed-until-next-stylesheet-loads.html": [
"ab8ee727f2a27467430b38c4f9ce52f117dda75d",
[
@@ -652030,7 +653574,7 @@
{}
]
],
- "iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html": [
+ "iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html": [
"6b3b3104ef38a9cbc1596961e62cb7804489dd94",
[
null,
@@ -652088,7 +653632,7 @@
{}
]
],
- "iframe_sandbox_window_open_download_allow_downloads.tentative.html": [
+ "iframe_sandbox_window_open_download_allow_downloads.tentative.https.html": [
"158fc4f947bae135e7501566e94a1553d9ce9e51",
[
null,
@@ -652158,10 +653702,10 @@
{}
]
],
- "sandbox-top-navigation-child-special-cases.tentative.sub.window.js": [
- "8681411dd71a296f5c2138274e3056d4ec2e89fb",
+ "sandbox-top-navigation-child-cross-origin.tentative.sub.window.js": [
+ "fa71972222b094285f624a8b190f267624c4e8df",
[
- "html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.html",
+ "html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.html",
{
"script_metadata": [
[
@@ -652242,6 +653786,52 @@
}
]
],
+ "sandbox-top-navigation-cross-site.tentative.sub.window.js": [
+ "fcd53e0780e52e2ae1f059525a615f5904d162e6",
+ [
+ "html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Top-level navigation tests with cross origin & user activated child frames"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-actions.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/sandbox-top-navigation-helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
"sandbox-top-navigation-escalate-privileges.tentative.sub.window.js": [
"a5cda9b0b981cc0a5281f85897ede3f87481e252",
[
@@ -652326,6 +653916,52 @@
}
]
],
+ "sandbox-top-navigation-user-activation.tentative.sub.window.js": [
+ "9e0ea57a99e403d70593e588a3c5afe30fc44c2a",
+ [
+ "html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Top-level navigation tests with cross origin & user activated child frames"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-actions.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/sandbox-top-navigation-helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
"sandbox_001.htm": [
"97af61163a8dd1e463cf2af4f5d350e167c407be",
[
@@ -655482,6 +657118,13 @@
{}
]
],
+ "select-datalist-options-idl.tentative.html": [
+ "993f6e126ce059e02b9555045f31a980a286269f",
+ [
+ null,
+ {}
+ ]
+ ],
"select-multiple.html": [
"e348064151a6ae2928e8c27c95c4bd0b25e4c8ac",
[
@@ -656251,7 +657894,7 @@
]
],
"dialog-canceling.html": [
- "e368bde6fb30fb59cf5d254c07070c9b177fa892",
+ "db757861e79f6c108e1b95aa9267ae2be765135c",
[
null,
{
@@ -656657,6 +658300,15 @@
}
]
],
+ "interactive-content.html": [
+ "94869dc9b69b86d3a3eab1b756caafe3f6cbc438",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"summary-untrusted-key-event.html": [
"21b66d52e7b828dd91d1ca2a15dcc6da90f9c05d",
[
@@ -656682,14 +658334,14 @@
]
],
"interestelement-interface.tentative.html": [
- "531bf0e1a629989c743094686f50388d9bbe28be",
+ "dc119de83380b55597e4720078fcf086fe77dfa4",
[
null,
{}
]
],
"invokeelement-interface.tentative.html": [
- "b003daf20d4be5b9eac15b930d10ae2b859ec505",
+ "5a2854fe318d4713c64c012a0fcab958f53883e4",
[
null,
{}
@@ -656705,7 +658357,7 @@
]
],
"invokeevent-interface.tentative.html": [
- "82910b3d4418de12453d7ebbee762e3eb9724141",
+ "382f8080716c0e235d64185f88057771def9734b",
[
null,
{
@@ -656714,7 +658366,7 @@
]
],
"invoketarget-button-event-dispatch.tentative.html": [
- "5150499bcf0cc090be7af43e77a8648b1477c9d0",
+ "d8d9c04022c2a0e551296af12f3552e94553084c",
[
null,
{
@@ -659989,21 +661641,21 @@
]
],
"choice-of-error-1.html": [
- "50933da2c1d56c1427edaea838bcb477b05951ca",
+ "3645279d61c942520fe50353f13d30bb83332da9",
[
null,
{}
]
],
"choice-of-error-2.html": [
- "51adb09d11ada5391f93d931e990e9242afaa3ed",
+ "d40aaba8dfd423c4e1f2c3acb1a75c80215a4ccb",
[
null,
{}
]
],
"choice-of-error-3.html": [
- "bc52119bfe4877bb7c779218fcbf14baf35954dd",
+ "2d74af864bac98ffaf3d18a75e0ba6deacadad84",
[
null,
{}
@@ -660480,21 +662132,21 @@
]
],
"error-type-1.html": [
- "2480a60d6d42a2f6e630c3c20a827621aeb3a256",
+ "0484b614ab0f50d35873b40b1c3b34f6088b639d",
[
null,
{}
]
],
"error-type-2.html": [
- "673bf28ca2057b375b563b0b0eb53c553919157b",
+ "7303a838a5ee26cb0c3d8b1c6f8beacf73438b06",
[
null,
{}
]
],
"error-type-3.html": [
- "8a16266f4cdf700b381c9e7dc1c0dbc39eee8377",
+ "f80f74cbe45f978c47b42df3934c9f9a38680737",
[
null,
{}
@@ -660508,28 +662160,28 @@
]
],
"evaluation-error-1.html": [
- "3f2bb35f4e273e0a14e3f010d629761177e22a06",
+ "b12d178fb59604589765c95880f50acbfad38a21",
[
null,
{}
]
],
"evaluation-error-2.html": [
- "4f2b3c5a745cd8d7bf907778d7bacefacd1effa1",
+ "a890ca64578c19d4b01d29534189cfb94bb4990b",
[
null,
{}
]
],
"evaluation-error-3.html": [
- "9bfb5df2cf0eab603cdf8798f9b2d2660dfdebd2",
+ "4062bc8a3a3c3cd3252ba629a6c6ec43b78d0012",
[
null,
{}
]
],
"evaluation-error-4.html": [
- "0b4b7d16622c452abcf4d70d40790c6bb437065c",
+ "256aea508e5c46781eba8452cd8d374ca0ec1b8f",
[
null,
{}
@@ -668559,6 +670211,15 @@
}
]
],
+ "inert-with-fullscreen-element.html": [
+ "e5ea4138a3a68438cfaa0916268857535b61e583",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"inert-with-modal-dialog-001.html": [
"aa0c29c7339c437cab4e8e65adce41f6b4b3e669",
[
@@ -668572,6 +670233,13 @@
null,
{}
]
+ ],
+ "inert-with-modal-dialog-003.html": [
+ "2984aa43628d65f62ed27a10ed1af466ba2e9f8d",
+ [
+ null,
+ {}
+ ]
]
},
"infrastructure": {
@@ -668714,6 +670382,33 @@
{}
]
],
+ "user-prompt.html": [
+ "adac0bc909b6ac7da1f1d6b4fd7d75190c4b45c4",
+ [
+ "infrastructure/expected-fail/user-prompt.html?type=alert",
+ {}
+ ],
+ [
+ "infrastructure/expected-fail/user-prompt.html?type=alert&wait",
+ {}
+ ],
+ [
+ "infrastructure/expected-fail/user-prompt.html?type=confirm",
+ {}
+ ],
+ [
+ "infrastructure/expected-fail/user-prompt.html?type=confirm&wait",
+ {}
+ ],
+ [
+ "infrastructure/expected-fail/user-prompt.html?type=prompt",
+ {}
+ ],
+ [
+ "infrastructure/expected-fail/user-prompt.html?type=prompt&wait",
+ {}
+ ]
+ ],
"window-onload-test.html": [
"b0514bce045aa8c864209ec8cc929646bb4e30b9",
[
@@ -673975,7 +675670,7 @@
]
],
"legacy-mstyle-attributes.html": [
- "2463c404765fe92e5925a38cba8f9c7fe0dec7d0",
+ "0b14ac5334b7dff99205f935b9f042a218111093",
[
null,
{}
@@ -674378,6 +676073,27 @@
"timeout": "long"
}
]
+ ],
+ "stretchy-largeop-with-default-font-1.html": [
+ "9f37cddc398a3f9fc1e8c11cc806bb38a530971a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "stretchy-largeop-with-default-font-2.html": [
+ "7c43c80acc0b4df591498400a02aa424e7e18225",
+ [
+ null,
+ {}
+ ]
+ ],
+ "stretchy-largeop-with-default-font-3.html": [
+ "d588b9d4e074da3c17e2973bdcdd588167a9386f",
+ [
+ null,
+ {}
+ ]
]
},
"radicals": {
@@ -674958,6 +676674,13 @@
}
]
],
+ "tabindex-focus-001.tentative.html": [
+ "2ea0390eabd7ee3cb7e486be98618485e5051879",
+ [
+ null,
+ {}
+ ]
+ ],
"unique-identifier-2.html": [
"d4e69df324a6cf78c1dd5c0a2e216c0703cc1ed2",
[
@@ -677282,7 +679005,7 @@
]
],
"historical.https.html": [
- "84326cec0a61adafc27a2f07846b820a983d8d61",
+ "402bc9e957a53948811d33ef46a275626cede08a",
[
null,
{}
@@ -682680,8 +684403,17 @@
{}
]
],
+ "shownotification-window.https.html": [
+ "b21a5621df75d540379fe24d82734de521b0f82a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"shownotification-without-permission.https.window.js": [
- "37b3dbbef662380c6d1b7b36755653dda5606682",
+ "b09c0460fbd5ba19ef03a4c29d72c9d86eb1e9d0",
[
"notifications/shownotification-without-permission.https.window.html",
{
@@ -710270,7 +712002,7 @@
]
],
"static-router-invalid-rules.https.html": [
- "4ed4ad4b3c0698a0375b2dfb7843bc18a421e932",
+ "86a50215f2e2ad7e523ce8c1c9d1359be5e7b374",
[
null,
{}
@@ -723655,6 +725387,13 @@
{}
]
],
+ "repeatcount-attribute-mutation.html": [
+ "fd4952b4bab7a2877e855578a6b71490cc83c66c",
+ [
+ null,
+ {}
+ ]
+ ],
"repeatcount-numeric-limit.tentative.svg": [
"aa0432559bf916c1172c3d30b3bc105cbfb25fdd",
[
@@ -725339,6 +727078,15 @@
]
]
},
+ "reftests": {
+ "paint-context-005.svg": [
+ "8bbfff8d4744f69acdf79523df7bdc73f9ea0975",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"scripted": {
"paint-order-computed-value-01.svg": [
"7ea669f1508283f498e9b38030022deac3b091a0",
@@ -726329,8 +728077,17 @@
]
},
"role": {
+ "role-img.tentative.html": [
+ "57fd17cddfc85b7fc695fba53a67fc7ff365a612",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"roles-generic.html": [
- "e7fe9f33de55588ee45ddc66bbeaf7dec8e1711f",
+ "d8ad4f9ea1c7095d8cc346d09c1cfcb89ad51421",
[
null,
{
@@ -726905,14 +728662,14 @@
]
],
"block-string-assignment-to-Element-setAttribute.html": [
- "1d39a804f39c0891bc59c0d08f14fd22ee278de1",
+ "295890f319a482e18bd6a2c73a696cbcd9e9c9d6",
[
null,
{}
]
],
"block-string-assignment-to-Element-setAttributeNS.html": [
- "346e077a666507d0a5eba4bed6893c8c16adad6a",
+ "b7f74be6b7dd22a58bb6e9bc8c0d10d3044dd176",
[
null,
{}
@@ -741587,7 +743344,7 @@
]
],
"audio-data.any.js": [
- "4c2d96ab80edb0fcd2c5dd1776430e143eb5bc5f",
+ "d5d950647767bc4648e557157ad9abd4a7119740",
[
"webcodecs/audio-data.any.html",
{
@@ -748429,7 +750186,7 @@
},
"webmidi": {
"idlharness.https.window.js": [
- "8fbd6a903c462948c7b7cc61c5cb3f5c11605a90",
+ "ed7e461603c5f4ac42b9b7a057907609df5700c8",
[
"webmidi/idlharness.https.window.html",
{
@@ -748564,6 +750321,57 @@
}
]
],
+ "buffer.https.any.js": [
+ "5b0f46dae0211276fe1468ec15ffcde142d9de67",
+ [
+ "webnn/conformance_tests/buffer.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API buffer operations"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/conformance_tests/buffer.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API buffer operations"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"cast.https.any.js": [
"bde2b9a4ce1cf2d25cb5866fe68725f8e13db1dd",
[
@@ -749330,6 +751138,57 @@
}
]
],
+ "buffer.https.any.js": [
+ "66bba9ef4afc66cd4e3c3c9a761d4ea526530a6c",
+ [
+ "webnn/conformance_tests/gpu/buffer.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API buffer operations"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/conformance_tests/gpu/buffer.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API buffer operations"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../../resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"cast.https.any.js": [
"e4309ffd8e3e7152b414a05fbd2ce767755c447d",
[
@@ -752554,6 +754413,57 @@
}
]
],
+ "gru.https.any.js": [
+ "295baab9c286610ca8fcbb0ca7c6d0bd12b898c2",
+ [
+ "webnn/validation_tests/gru.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API gru operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/validation_tests/gru.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API gru operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"layer_normalization.https.any.js": [
"7dbcf5c74a71bc63e8b0b12907386f69e0ffa05f",
[
@@ -752605,6 +754515,57 @@
}
]
],
+ "lstm.https.any.js": [
+ "efa05090ca261fb601ca3563b2b55f5f85915869",
+ [
+ "webnn/validation_tests/lstm.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API lstm operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/validation_tests/lstm.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API lstm operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"reduction.https.any.js": [
"65b71239b96f503fc1dca4cb6cd59e588f183038",
[
@@ -752706,6 +754667,57 @@
"timeout": "long"
}
]
+ ],
+ "triangular.https.any.js": [
+ "4e4c368f82bdf2692a8870f147abd1d559a5d923",
+ [
+ "webnn/validation_tests/triangular.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API triangular operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/validation_tests/triangular.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "validation tests for WebNN API triangular operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "../resources/utils_validation.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
]
}
},
@@ -799717,7 +801729,7 @@
]
],
"set_permission.py": [
- "dc6ca14a8d5acab372581ace2290c298f02d7624",
+ "92ebed1e6342db71f9f2dcefccf11e90c1060a33",
[
null,
{}
@@ -799957,14 +801969,14 @@
]
],
"invalid.py": [
- "187fd9890e1236793b80cbdf8a1d69dc6fff7292",
+ "0821ba7782eb3e71bafae8c05d98e6a6e3a6f926",
[
null,
{}
]
],
"phase_auth_required.py": [
- "dd322a23405e2f3d999c46fc3b0361bd67ffc012",
+ "0df3e9e86afddafc7f03e5925d47f2173f482e65",
[
null,
{}
@@ -799987,14 +801999,14 @@
},
"auth_required": {
"auth_required.py": [
- "9a24946cde9c449039db83ef018ff03845baf874",
+ "4f5c836280dc69a03f7f3284382b44d5019c636b",
[
null,
{}
]
],
"unsubscribe.py": [
- "cf818fee6f5af92ee69b80eee2149ef744026019",
+ "0bbf8df266731055cc58f12836468fa45c1bfe2c",
[
null,
{}
@@ -800046,7 +802058,7 @@
},
"continue_response": {
"credentials.py": [
- "3e595722cc381e704210f0bc4cdb9d6ec7aa79db",
+ "499c8a28c126fccea5ec0af932595d0d2cefadb9",
[
null,
{}
@@ -800071,7 +802083,7 @@
},
"continue_with_auth": {
"action.py": [
- "a122ce0e4926346950083d57161a277fd567c17a",
+ "e4cf6da08f4117f6b7dbac529cf229c94bba1ff6",
[
null,
{}
@@ -800171,7 +802183,7 @@
},
"response_started": {
"response_started.py": [
- "dec743e175559b7068a44f043bce4951a17efcaa",
+ "fb99073fb338b3538092afa0e22be0fb7deda7db",
[
null,
{}
@@ -800662,7 +802674,7 @@
"storage": {
"delete_cookies": {
"filter.py": [
- "eff2f00dd320a45db4b3f7b0e99fcacee8a2c19f",
+ "7bfb743cfcf01a297016da60a0c064e6664a345e",
[
null,
{}
@@ -800676,7 +802688,7 @@
]
],
"partition.py": [
- "0b3726142cbba03602431402cb34fc48a1a8d6f9",
+ "bf23abb720ca34b7637f9c612e4f719785d8d8f5",
[
null,
{}
@@ -800685,7 +802697,7 @@
},
"get_cookies": {
"filter.py": [
- "b244ef86ac24d22c619fcdbc73f32d3edee828cc",
+ "efa22f7dc9af7301f63291f2ca2e21120bc261ae",
[
null,
{}
@@ -800699,7 +802711,7 @@
]
],
"partition.py": [
- "fb1755421ece4c9af0b1392c085af8286d17b0fd",
+ "1af0cfb759c18a1f8f2b940ee949f4c3486a833f",
[
null,
{}
@@ -800715,14 +802727,14 @@
]
],
"cookie_expiry.py": [
- "4e49479a871bf61026ad106388516250398bda7b",
+ "7aac38da69510bf1147e234d05dacf7b5c351dbe",
[
null,
{}
]
],
"cookie_http_only.py": [
- "4473fbf576cea60810708dd21400ef7730ffecec",
+ "b2155d1ac2069336079f86d38c32de4e185460a8",
[
null,
{}
@@ -800736,21 +802748,21 @@
]
],
"cookie_path.py": [
- "727d24348a51b9aedceb31875d9811d91a5554be",
+ "70084dee6e53074e9ce58fcb497697e9b66795bb",
[
null,
{}
]
],
"cookie_same_site.py": [
- "dfc94c572701c3d718ead0334fb1e53023237906",
+ "27640bb9a6afda9a3c01a6966a3acc7a112bd9f4",
[
null,
{}
]
],
"cookie_secure.py": [
- "ef1060cb46e0c25f73d2f3618104cd3ddea0c10a",
+ "81e462c87cc222ddb35079e0eb6fe9b19fdfa0b1",
[
null,
{}
@@ -800771,7 +802783,7 @@
]
],
"page_protocols.py": [
- "4cb712b37242df5690b8dba210ca68e1038597de",
+ "295b09c10e9b9bc4a42b9c802207f750d97cb979",
[
null,
{}
@@ -801886,7 +803898,7 @@
]
],
"response.py": [
- "43a8d57931143f9cf2b5cb0946f982b003afd85c",
+ "fa8d56c4493465f7ec945d577a9b3246be28b5dd",
[
null,
{}
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
index a647125277a..5496474410b 100644
--- 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
@@ -1,2 +1,2 @@
[mix-blend-mode-animation.html]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-animations/animation-offscreen-to-onscreen.html.ini b/tests/wpt/meta/css/css-animations/animation-offscreen-to-onscreen.html.ini
new file mode 100644
index 00000000000..9876f879b14
--- /dev/null
+++ b/tests/wpt/meta/css/css-animations/animation-offscreen-to-onscreen.html.ini
@@ -0,0 +1,2 @@
+[animation-offscreen-to-onscreen.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/css/css-animations/empty-pseudo-class-with-animation.html.ini b/tests/wpt/meta/css/css-animations/empty-pseudo-class-with-animation.html.ini
new file mode 100644
index 00000000000..5d78e3a8de2
--- /dev/null
+++ b/tests/wpt/meta/css/css-animations/empty-pseudo-class-with-animation.html.ini
@@ -0,0 +1,3 @@
+[empty-pseudo-class-with-animation.html]
+ [Setting an "animation" style property on an element does not interfere with the :empty pseudo-class.]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-color/system-color-consistency.html.ini b/tests/wpt/meta/css/css-color/system-color-consistency.html.ini
index 343156ca80d..d8796787e59 100644
--- a/tests/wpt/meta/css/css-color/system-color-consistency.html.ini
+++ b/tests/wpt/meta/css/css-color/system-color-consistency.html.ini
@@ -79,3 +79,171 @@
[Property color value 'MarkText' has the same color as the color of a mark element]
expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a submit button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a submit button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a submit button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a reset button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a reset button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a reset button (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a color picker (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a color picker (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a color picker (light)]
+ expected: FAIL
+
+ [Property color value 'CanvasText' has the same color as the color of the html element (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a password field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a password field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a email field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a email field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a number field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a number field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a date field (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a date field (light)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text area (light)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text area (light)]
+ expected: FAIL
+
+ [Property color value 'Mark' has the same color as the background-color of a mark element (light)]
+ expected: FAIL
+
+ [Property color value 'MarkText' has the same color as the color of a mark element (light)]
+ expected: FAIL
+
+ [Property color value 'LinkText' has the same color as the color of an anchor element (light)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a submit button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a submit button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a submit button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a reset button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a reset button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a reset button (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonBorder' resolves to the same color as the border-color of a color picker (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonFace' resolves to the same color as the background-color of a color picker (dark)]
+ expected: FAIL
+
+ [Property color value 'ButtonText' resolves to the same color as text on a color picker (dark)]
+ expected: FAIL
+
+ [Property color value 'CanvasText' has the same color as the color of the html element (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a password field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a password field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a email field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a email field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a number field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a number field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a date field (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a date field (dark)]
+ expected: FAIL
+
+ [Property color value 'Field' resolves to the same color as the background-color of a text area (dark)]
+ expected: FAIL
+
+ [Property color value 'FieldText' resolves to the same color as text on a text area (dark)]
+ expected: FAIL
+
+ [Property color value 'Mark' has the same color as the background-color of a mark element (dark)]
+ expected: FAIL
+
+ [Property color value 'MarkText' has the same color as the color of a mark element (dark)]
+ expected: FAIL
+
+ [Property color value 'LinkText' has the same color as the color of an anchor element (dark)]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-pseudo/selection-background-color-001.html.ini b/tests/wpt/meta/css/css-pseudo/selection-background-color-001.html.ini
new file mode 100644
index 00000000000..2ba2bb4894f
--- /dev/null
+++ b/tests/wpt/meta/css/css-pseudo/selection-background-color-001.html.ini
@@ -0,0 +1,2 @@
+[selection-background-color-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-text/parsing/webkit-text-stroke-computed.html.ini b/tests/wpt/meta/css/css-text/parsing/webkit-text-stroke-computed.html.ini
new file mode 100644
index 00000000000..6b4372771dd
--- /dev/null
+++ b/tests/wpt/meta/css/css-text/parsing/webkit-text-stroke-computed.html.ini
@@ -0,0 +1,9 @@
+[webkit-text-stroke-computed.html]
+ [Property -webkit-text-stroke value 'green']
+ expected: FAIL
+
+ [Property -webkit-text-stroke value '3px']
+ expected: FAIL
+
+ [Property -webkit-text-stroke value '1px red']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-text/white-space/text-wrap-balance-003.html.ini b/tests/wpt/meta/css/css-text/white-space/text-wrap-balance-003.html.ini
new file mode 100644
index 00000000000..3a4f210bbf0
--- /dev/null
+++ b/tests/wpt/meta/css/css-text/white-space/text-wrap-balance-003.html.ini
@@ -0,0 +1,2 @@
+[text-wrap-balance-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini b/tests/wpt/meta/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini
new file mode 100644
index 00000000000..ad1ee1284d2
--- /dev/null
+++ b/tests/wpt/meta/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html.ini
@@ -0,0 +1,144 @@
+[rotate-interpolation-math-functions-tentative.html]
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [100deg\] to [calc(sign(20rem - 20px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [CSS Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (-1) should be [20deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0) should be [100deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.125) should be [110deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (0.875) should be [170deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (1) should be [180deg\]]
+ expected: FAIL
+
+ [Web Animations: property <rotate> from [calc(sign(20rem - 20px) * 100deg)\] to [calc(progress(10rem from 20px to 100px) * 180deg)\] at (2) should be [260deg\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini b/tests/wpt/meta/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini
new file mode 100644
index 00000000000..1df3f824ee2
--- /dev/null
+++ b/tests/wpt/meta/css/css-transforms/animation/scale-animation-math-functions-tentative.html.ini
@@ -0,0 +1,144 @@
+[scale-animation-math-functions-tentative.html]
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [100\] to [calc(sign(20rem - 20px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Transitions with transition: all: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [CSS Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (-1) should be [20\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0) should be [100\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.125) should be [110\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (0.875) should be [170\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (1) should be [180\]]
+ expected: FAIL
+
+ [Web Animations: property <scale> from [calc(sign(20rem - 20px) * 100)\] to [calc(progress(10rem from 20px to 100px) * 180)\] at (2) should be [260\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-transitions/render-blocking/no-transition-from-ua-to-blocking-stylesheet.html.ini b/tests/wpt/meta/css/css-transitions/render-blocking/no-transition-from-ua-to-blocking-stylesheet.html.ini
deleted file mode 100644
index e35a452a186..00000000000
--- a/tests/wpt/meta/css/css-transitions/render-blocking/no-transition-from-ua-to-blocking-stylesheet.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[no-transition-from-ua-to-blocking-stylesheet.html]
- expected: TIMEOUT
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 ba84cd6c00b..9a753b3a13b 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
@@ -79,3 +79,12 @@
[resolved height for height in definite height container: calc-size(calc-size(min-content, 30px), 15em)]
expected: FAIL
+
+ [resolved height for height in definite height container: calc(12% + calc-size(any, 31%))]
+ expected: FAIL
+
+ [resolved height for height in auto height container: calc-size(any, 31% + 12px)]
+ expected: FAIL
+
+ [resolved height for height in definite height container: calc-size(any, 31% + 12px)]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/negativeMargins.html.ini b/tests/wpt/meta/css/cssom-view/negativeMargins.html.ini
deleted file mode 100644
index 0c57f9a1b6b..00000000000
--- a/tests/wpt/meta/css/cssom-view/negativeMargins.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[negativeMargins.html]
- [cssom-view - elementFromPoint and elementsFromPoint dealing with negative margins 1]
- expected: FAIL
diff --git a/tests/wpt/meta/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini b/tests/wpt/meta/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini
new file mode 100644
index 00000000000..0d747763bda
--- /dev/null
+++ b/tests/wpt/meta/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html.ini
@@ -0,0 +1,3 @@
+[Node-append-meta-referrer-and-script-from-fragment.tentative.html]
+ [<meta name=referrer> should apply before script, as it is an insertion step and not a post-insertion step]
+ expected: FAIL
diff --git a/tests/wpt/meta/fetch/api/basic/request-upload.h2.any.js.ini b/tests/wpt/meta/fetch/api/basic/request-upload.h2.any.js.ini
index c35164d1bf9..da4290873e9 100644
--- a/tests/wpt/meta/fetch/api/basic/request-upload.h2.any.js.ini
+++ b/tests/wpt/meta/fetch/api/basic/request-upload.h2.any.js.ini
@@ -39,6 +39,9 @@
[Streaming upload should fail on a 401 response]
expected: NOTRUN
+ [ReadbleStream should be closed on signal.abort]
+ expected: NOTRUN
+
[request-upload.h2.any.html]
expected: TIMEOUT
@@ -74,3 +77,6 @@
[Streaming upload should fail on a 401 response]
expected: NOTRUN
+
+ [ReadbleStream should be closed on signal.abort]
+ expected: NOTRUN
diff --git a/tests/wpt/meta/fetch/api/body/formdata.any.js.ini b/tests/wpt/meta/fetch/api/body/formdata.any.js.ini
index 2fbdce4291b..f70c16e0801 100644
--- a/tests/wpt/meta/fetch/api/body/formdata.any.js.ini
+++ b/tests/wpt/meta/fetch/api/body/formdata.any.js.ini
@@ -5,6 +5,9 @@
[Consume empty request.formData() as FormData]
expected: FAIL
+ [Consume multipart/form-data headers case-insensitively]
+ expected: FAIL
+
[formdata.any.html]
[Consume empty response.formData() as FormData]
@@ -12,3 +15,6 @@
[Consume empty request.formData() as FormData]
expected: FAIL
+
+ [Consume multipart/form-data headers case-insensitively]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
new file mode 100644
index 00000000000..60a4fa51f8a
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
@@ -0,0 +1,3 @@
+[a-click.html]
+ [aElement.click() before the load event must NOT replace]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/history_reload_referrer.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/history_reload_referrer.html.ini
new file mode 100644
index 00000000000..8771b1488b8
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/history/the-history-interface/history_reload_referrer.html.ini
@@ -0,0 +1,18 @@
+[history_reload_referrer.html]
+ [Step 2: Checking HTTP referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 2: Checking document.referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 3: Checking HTTP referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 3: Checking document.referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 4: Checking HTTP referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
+
+ [Step 4: Checking document.referrer (is "http://web-platform.test:8000/html/browsers/history/the-history-interface/history_reload_referrer-2.html?pipe=sub")]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini b/tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini
new file mode 100644
index 00000000000..61b88554d0e
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html.ini
@@ -0,0 +1,3 @@
+[2d.drawImage.detachedcanvas.html]
+ [drawImage with detached OffscreenCanvas as the source should throw exception]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
index 4451a7d8a32..e5fbdab7da4 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.blur.exceptions.tentative.html]
[Test exceptions on CanvasFilter() blur.object]
expected: FAIL
+
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
index 61dafe7fce7..50f0600fa7e 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.colorMatrix.tentative.html]
[Test the functionality of ColorMatrix filters in CanvasFilter objects]
expected: FAIL
+
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
index 8c7cb3e0057..44fb3c2c991 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with discrete type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
index 53f59082097..b250f2e5ea5 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with gamma type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
index aebe150b830..d494c5e861b 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with identity type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
index 4057e21a548..88e01144a3e 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with linear type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
index 19140a3824d..13a97856ea6 100644
--- a/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.table.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with table type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini
new file mode 100644
index 00000000000..9b2b4119845
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.colorMatrix.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.colorMatrix.html]
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini
new file mode 100644
index 00000000000..28eee7745b4
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.discrete.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini
new file mode 100644
index 00000000000..59b029b6229
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.gamma.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini
new file mode 100644
index 00000000000..e09298d1220
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.identity.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini
new file mode 100644
index 00000000000..5a9b35c68fa
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.linear.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini
new file mode 100644
index 00000000000..3ec9d635126
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.table.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
new file mode 100644
index 00000000000..d868cd8c204
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.convolveMatrix.exceptions.html]
+ [Test exceptions on CanvasFilter() convolveMatrix]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini
new file mode 100644
index 00000000000..7d7a9154df7
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.dropShadow.exceptions.html]
+ [Test exceptions on CanvasFilter() dropShadow object]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini
new file mode 100644
index 00000000000..7369fa6d232
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.dropShadow.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.dropShadow.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini
new file mode 100644
index 00000000000..e16419cdde1
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.turbulence.inputTypes.html]
+ [Test exceptions on CanvasFilter() turbulence object]
+ expected: FAIL
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
new file mode 100644
index 00000000000..5ef89398095
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..d0dd1552396
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
index 4451a7d8a32..e5fbdab7da4 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.blur.exceptions.tentative.html]
[Test exceptions on CanvasFilter() blur.object]
expected: FAIL
+
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini
index a9ec08d8a7c..e21f89baa71 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.html]
[Test exceptions on CanvasFilter() blur.object]
expected: FAIL
+
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
index 61dafe7fce7..50f0600fa7e 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.colorMatrix.tentative.html]
[Test the functionality of ColorMatrix filters in CanvasFilter objects]
expected: FAIL
+
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini
index bb5dabba5e0..664e0fc8529 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js.ini
@@ -1,3 +1,6 @@
[2d.filter.canvasFilterObject.colorMatrix.tentative.worker.html]
[Test the functionality of ColorMatrix filters in CanvasFilter objects]
expected: FAIL
+
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
index 8c7cb3e0057..44fb3c2c991 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with discrete type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini
new file mode 100644
index 00000000000..fea0f2668e9
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini
deleted file mode 100644
index 24b1fac3ccc..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with discrete type]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
index 53f59082097..b250f2e5ea5 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with gamma type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini
new file mode 100644
index 00000000000..37efdad8181
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini
deleted file mode 100644
index 5f78a2365a0..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with gamma type]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
index aebe150b830..d494c5e861b 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with identity type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini
new file mode 100644
index 00000000000..cdbf822301f
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini
deleted file mode 100644
index 0275b7913e7..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with identity type]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
index 4057e21a548..88e01144a3e 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with linear type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini
new file mode 100644
index 00000000000..8bee7228c85
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini
deleted file mode 100644
index d0fbf3043f4..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with linear type]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
index 19140a3824d..13a97856ea6 100644
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html.ini
@@ -1,3 +1,4 @@
[2d.filter.canvasFilterObject.componentTransfer.table.tentative.html]
+ expected: FAIL
[Test pixels on CanvasFilter() componentTransfer with table type]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini
new file mode 100644
index 00000000000..95347189c0d
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini
deleted file mode 100644
index 4c87d952f06..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.html]
- [Test pixels on CanvasFilter() componentTransfer with table type]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html.ini
new file mode 100644
index 00000000000..a07b1acad88
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.blur.exceptions.html]
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js.ini
new file mode 100644
index 00000000000..182a2435639
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.blur.exceptions.worker.html]
+ [Test exceptions on gaussianBlur filter]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini
new file mode 100644
index 00000000000..9b2b4119845
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.colorMatrix.html]
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini
new file mode 100644
index 00000000000..e2f8f0a630a
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.colorMatrix.worker.html]
+ [Test the functionality of ColorMatrix filters]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini
new file mode 100644
index 00000000000..28eee7745b4
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.discrete.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini
new file mode 100644
index 00000000000..b01f46aed3d
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.discrete.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini
new file mode 100644
index 00000000000..59b029b6229
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.gamma.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini
new file mode 100644
index 00000000000..00e0f519dbd
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.gamma.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini
new file mode 100644
index 00000000000..e09298d1220
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.identity.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini
new file mode 100644
index 00000000000..93ebc7a0293
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.identity.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini
new file mode 100644
index 00000000000..5a9b35c68fa
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.linear.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini
new file mode 100644
index 00000000000..38923d05ade
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.linear.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini
new file mode 100644
index 00000000000..3ec9d635126
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.table.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini
new file mode 100644
index 00000000000..a5076d74370
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.componentTransfer.table.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
new file mode 100644
index 00000000000..d868cd8c204
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.convolveMatrix.exceptions.html]
+ [Test exceptions on CanvasFilter() convolveMatrix]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini
new file mode 100644
index 00000000000..a1ae7043728
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.convolveMatrix.exceptions.worker.html]
+ [Test exceptions on CanvasFilter() convolveMatrix]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini
new file mode 100644
index 00000000000..7d7a9154df7
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.dropShadow.exceptions.html]
+ [Test exceptions on CanvasFilter() dropShadow object]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini
new file mode 100644
index 00000000000..5e424dff115
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.dropShadow.exceptions.worker.html]
+ [Test exceptions on CanvasFilter() dropShadow object]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini
new file mode 100644
index 00000000000..4c282823717
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html.ini
@@ -0,0 +1,2 @@
+[2d.filter.layers.dropShadow.w.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini
new file mode 100644
index 00000000000..e16419cdde1
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.turbulence.inputTypes.html]
+ [Test exceptions on CanvasFilter() turbulence object]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini
new file mode 100644
index 00000000000..2655d8b0b11
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.filter.layers.turbulence.inputTypes.worker.html]
+ [Test exceptions on CanvasFilter() turbulence object]
+ expected: FAIL
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
new file mode 100644
index 00000000000..5ef89398095
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..6250c94a0e1
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..d0dd1552396
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html.ini
@@ -0,0 +1,3 @@
+[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
new file mode 100644
index 00000000000..e137417e456
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js.ini
@@ -0,0 +1,3 @@
+[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 9b68cb7b610..dbbf5f8355d 100644
--- a/tests/wpt/meta/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini
@@ -1982,6 +1982,33 @@
[NotRestoredReasons interface: operation toJSON()]
expected: FAIL
+ [PageSwapEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [PageSwapEvent interface object length]
+ expected: FAIL
+
+ [PageSwapEvent interface object name]
+ expected: FAIL
+
+ [PageSwapEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [PageSwapEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [PageSwapEvent interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [PageSwapEvent interface: attribute activation]
+ expected: FAIL
+
+ [PageSwapEvent interface: attribute viewTransition]
+ expected: FAIL
+
+ [SVGSVGElement interface: attribute onpageswap]
+ expected: FAIL
+
[idlharness.https.html?include=(Document|Window)]
[Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
@@ -2611,6 +2638,12 @@
[Window interface: window must inherit property "onpagereveal" with the proper type]
expected: FAIL
+ [Window interface: attribute onpageswap]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onpageswap" with the proper type]
+ expected: FAIL
+
[idlharness.https.html?include=HTML.*]
[HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
@@ -4817,3 +4850,15 @@
[HTMLTemplateElement interface: document.createElement("template") must inherit property "shadowRootClonable" with the proper type]
expected: FAIL
+
+ [HTMLBodyElement interface: attribute onpageswap]
+ expected: FAIL
+
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "onpageswap" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: attribute onpageswap]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageswap" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-001.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-001.html.ini
index 346d7282c0a..332e5d8560d 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-001.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-001.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-001.tentative.html]
+[element-render-blocking-001.html]
[blocking defers frames until full parsing]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.html.ini
index 511925c1b61..e45579f7cfe 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-002.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-002.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-002.tentative.html]
+[element-render-blocking-002.html]
[blocking defers until needed element is parsed]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-003.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-003.html.ini
index 92a6b95f046..9ce0274bd34 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-003.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-003.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-003.tentative.html]
+[element-render-blocking-003.html]
[adding link in the head defers frames]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-006.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-006.html.ini
index a6e9373200b..77041e12473 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-006.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-006.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-006.tentative.html]
+[element-render-blocking-006.html]
[adding 'blocking=render' in the head makes it blocking]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-008.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-008.html.ini
index 9561d696beb..e8b52644582 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-008.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-008.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-008.tentative.html]
+[element-render-blocking-008.html]
[changing media to matching causes link to have an effect]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-011.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-011.html.ini
index 0675b813616..79f8db6e440 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-011.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-011.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-011.tentative.html]
+[element-render-blocking-011.html]
[changing rel to expect in the head causes it to be blocking]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-012.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-012.html.ini
index 1e31c3f000e..3389a59607c 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-012.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-012.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-012.tentative.html]
+[element-render-blocking-012.html]
[adding href in the head makes it blocking]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-024.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-024.html.ini
index 3e821238f4e..31bccf7da9d 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-024.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-024.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-024.tentative.html]
+[element-render-blocking-024.html]
[unknown href causes the whole document to be blocked]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-027.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-027.html.ini
index 61f04ef7a4d..19a5687b603 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-027.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-027.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-027.tentative.html]
+[element-render-blocking-027.html]
[unknown href causes the whole document to be blocked (with href changes!)]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.html.ini
index 342b4dbb48d..ff4108cee18 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-028.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-028.tentative.html]
+[element-render-blocking-028.html]
[removing some links but not all keeps at least the matching link blocking]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-033.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-033.html.ini
index 990ba49fedc..6580246c973 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-033.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-033.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-033.tentative.html]
+[element-render-blocking-033.html]
[blocking defers frames until full parsing]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-034.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-034.html.ini
index 0e2f5bf93c1..41f8675b78c 100644
--- a/tests/wpt/meta-legacy-layout/html/dom/render-blocking/element-render-blocking-034.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-034.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-034.tentative.html]
+[element-render-blocking-034.html]
[relative URLs that match this document are OK]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-035.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-035.html.ini
index 99856076384..e3db94cc14a 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-035.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-035.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-035.tentative.html]
+[element-render-blocking-035.html]
[relative URLs that match this document are OK, regarless of <base>]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-037.tentative.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-037.html.ini
index b6357e1f207..651497adf58 100644
--- a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-037.tentative.html.ini
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-037.html.ini
@@ -1,3 +1,3 @@
-[element-render-blocking-037.tentative.html]
+[element-render-blocking-037.html]
[relative URLs that match this document are OK, regarless of <base>]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-038.html.ini b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-038.html.ini
new file mode 100644
index 00000000000..1c828648d44
--- /dev/null
+++ b/tests/wpt/meta/html/dom/render-blocking/element-render-blocking-038.html.ini
@@ -0,0 +1,3 @@
+[element-render-blocking-038.html]
+ [link rel=expect: only connected elements are eligible]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini b/tests/wpt/meta/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/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
+++ b/tests/wpt/meta/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/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 b0c997e92a8..4f3c59e1742 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,3 +1,4 @@
[document-with-fragment-valid.html]
+ expected: TIMEOUT
[Autofocus elements in top-level browsing context's documents with URL fragments should be skipped.]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini b/tests/wpt/meta/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini
new file mode 100644
index 00000000000..d2ba1364703
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html.ini
@@ -0,0 +1,6 @@
+[stylesheet-bad-mime-type.html]
+ ['load' event does not fire at link@rel=stylesheet having non-empty resource with bad MIME type]
+ expected: FAIL
+
+ ['load' event does not fire at link@rel=stylesheet having empty resource with bad MIME type]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html.ini
index 7d701b7d05b..a45a29d3b6b 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html.ini
@@ -1,11 +1,7 @@
-[iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html]
+[iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html]
expected: TIMEOUT
[Navigation resulted download in sandbox is allowed by allow-downloads.]
expected: FAIL
- [Navigation resulted download in sandbox is blocked.]
- expected: FAIL
-
[Navigation resulted download in sandbox from <object> is allowed by allow-downloads.]
expected: TIMEOUT
-
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 7da2bc5ac80..ef88bb2e2fd 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-3.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index e8872b3585b..62a6e7fc812 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_nonescaping-1.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index 1ae1c2cc134..4034793cc72 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,4 +1,3 @@
[iframe_sandbox_popups_nonescaping-2.html]
- expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html.ini
index 451c172d31f..abac491b14a 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html.ini
@@ -1,4 +1,4 @@
-[iframe_sandbox_window_open_download_allow_downloads.tentative.html]
+[iframe_sandbox_window_open_download_allow_downloads.tentative.https.html]
expected: TIMEOUT
[window.open(download, ) triggering download in sandbox is allowed by allow-downloads.]
expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini
new file mode 100644
index 00000000000..f94afff765f
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js.ini
@@ -0,0 +1,6 @@
+[sandbox-top-navigation-child-cross-origin.tentative.sub.window.html]
+ [A cross-origin frame with frame sandbox flags can navigate top]
+ expected: FAIL
+
+ [A cross-origin frame with delivered sandbox flags can not navigate top]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini
new file mode 100644
index 00000000000..dd7548a86bc
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js.ini
@@ -0,0 +1,9 @@
+[sandbox-top-navigation-cross-site.tentative.sub.window.html]
+ [A cross-site unsandboxed iframe navigation consumes user activation and disallows top-level navigation.]
+ expected: FAIL
+
+ [A same-site unsandboxed iframe navigation does not consume user activation and allows top-level navigation.]
+ expected: FAIL
+
+ [A same-site unsandboxed iframe navigation without sticky user activation does not allow top-level navigation.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini
new file mode 100644
index 00000000000..9e4fd8f744f
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js.ini
@@ -0,0 +1,3 @@
+[sandbox-top-navigation-user-activation.tentative.sub.window.html]
+ [Allow top with user activation + user activation]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini
new file mode 100644
index 00000000000..e2858b0f762
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html.ini
@@ -0,0 +1,2 @@
+[select-child-button-and-datalist-invalidation.tentative.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini
new file mode 100644
index 00000000000..685f04dcb25
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html.ini
@@ -0,0 +1,9 @@
+[select-datalist-options-idl.tentative.html]
+ [Option elements should work if they are a descendant of a selects datalist.]
+ expected: FAIL
+
+ [Options in datalist should still work when the multiple attribute is added.]
+ expected: FAIL
+
+ [Options in datalist in multiple should work after re-parsing and re-attaching.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/invokers/interestelement-interface.tentative.html.ini b/tests/wpt/meta/html/semantics/invokers/interestelement-interface.tentative.html.ini
index 5f7e2c98053..65ca46c5024 100644
--- a/tests/wpt/meta/html/semantics/invokers/interestelement-interface.tentative.html.ini
+++ b/tests/wpt/meta/html/semantics/invokers/interestelement-interface.tentative.html.ini
@@ -16,3 +16,24 @@
[interestTargetElement throws error on assignment of non Element]
expected: FAIL
+
+ [interestAction reflects '' when attribute not present]
+ expected: FAIL
+
+ [interestAction reflects '' when attribute empty, setAttribute version]
+ expected: FAIL
+
+ [interestAction reflects '' when attribute empty, IDL setter version]
+ expected: FAIL
+
+ [interestAction reflects same casing]
+ expected: FAIL
+
+ [interestAction reflects '' when attribute set to [\]]
+ expected: FAIL
+
+ [interestAction reflects tostring value]
+ expected: FAIL
+
+ [interestAction reflects tostring value 2]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/invokers/invokeelement-interface.tentative.html.ini b/tests/wpt/meta/html/semantics/invokers/invokeelement-interface.tentative.html.ini
index e8781936e24..587bdaf84d3 100644
--- a/tests/wpt/meta/html/semantics/invokers/invokeelement-interface.tentative.html.ini
+++ b/tests/wpt/meta/html/semantics/invokers/invokeelement-interface.tentative.html.ini
@@ -34,3 +34,12 @@
[invokeAction reflects same casing]
expected: FAIL
+
+ [invokeAction reflects '' when attribute not present]
+ expected: FAIL
+
+ [invokeAction reflects '' when attribute empty, setAttribute version]
+ expected: FAIL
+
+ [invokeAction reflects '' when attribute set to [\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
index 6e05df1dd38..55b300bcfd8 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
@@ -151,3 +151,21 @@
[shadowed pagereveal removal (window)]
expected: FAIL
+
+ [shadowed pageswap (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap (document.createElement("body"))]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.createElement("body"))]
+ expected: FAIL
+
+ [shadowed pageswap (window)]
+ expected: FAIL
+
+ [shadowed pageswap removal (window)]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
index de223df7026..8629986643f 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
@@ -151,3 +151,21 @@
[shadowed pagereveal removal (window)]
expected: FAIL
+
+ [shadowed pageswap (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.body)]
+ expected: FAIL
+
+ [shadowed pageswap (document.createElement("frameset"))]
+ expected: FAIL
+
+ [shadowed pageswap removal (document.createElement("frameset"))]
+ expected: FAIL
+
+ [shadowed pageswap (window)]
+ expected: FAIL
+
+ [shadowed pageswap removal (window)]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
index f36de5a563e..adeee7fbca5 100644
--- a/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
+++ b/tests/wpt/meta/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
@@ -88,3 +88,15 @@
[Ignore setting of pagereveal window event handlers on windowless frameset]
expected: FAIL
+
+ [Return null when getting the pageswap event handler of a windowless body]
+ expected: FAIL
+
+ [Ignore setting of pageswap window event handlers on windowless body]
+ expected: FAIL
+
+ [Return null when getting the pageswap event handler of a windowless frameset]
+ expected: FAIL
+
+ [Ignore setting of pageswap window event handlers on windowless frameset]
+ 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 dbe1def99e3..7237f5792de 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,9 +1,10 @@
[promise-job-entry-different-function-realm.html]
+ expected: TIMEOUT
[Fulfillment handler on fulfilled promise]
expected: FAIL
[Rejection handler on pending-then-rejected promise]
- expected: FAIL
+ expected: TIMEOUT
[Thenable resolution]
expected: FAIL
@@ -12,4 +13,4 @@
expected: FAIL
[Fulfillment handler on pending-then-fulfilled promise]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webmessaging/with-ports/017.html.ini b/tests/wpt/meta/webmessaging/with-ports/017.html.ini
deleted file mode 100644
index c7946fc91b4..00000000000
--- a/tests/wpt/meta/webmessaging/with-ports/017.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[017.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, about:blank]
- expected: TIMEOUT
diff --git a/tests/wpt/tests/IndexedDB/idbindex_count.any.js b/tests/wpt/tests/IndexedDB/idbindex_count.any.js
new file mode 100644
index 00000000000..25d743e422f
--- /dev/null
+++ b/tests/wpt/tests/IndexedDB/idbindex_count.any.js
@@ -0,0 +1,108 @@
+// META: global=window,worker
+// META: title=IDBIndex.count()
+// META: script=resources/support.js
+// @author Microsoft <https://www.microsoft.com>
+// @author Odin Hørthe Omdal <mailto:odinho@opera.com>
+// @author Intel <http://www.intel.com>
+
+'use_strict';
+
+async_test(t => {
+ let db;
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const store = db.createObjectStore("store", { autoIncrement: true });
+ store.createIndex("index", "indexedProperty");
+ for (let i = 0; i < 10; i++) {
+ store.add({ indexedProperty: "data" + i });
+ }
+ };
+
+ open_rq.onsuccess = function(e) {
+ const rq = db.transaction("store", "readonly", { durability: 'relaxed' })
+ .objectStore("store")
+ .index("index")
+ .count();
+
+ rq.onsuccess = t.step_func(function(e) {
+ assert_equals(e.target.result, 10);
+ t.done();
+ });
+ };
+}, 'count() returns the number of records in the index');
+
+async_test(t => {
+ let db;
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const store = db.createObjectStore("store", { autoIncrement: true });
+ store.createIndex("index", "indexedProperty");
+
+ for (let i = 0; i < 10; i++) {
+ store.add({ indexedProperty: "data" + i });
+ }
+ };
+
+ open_rq.onsuccess = function(e) {
+ const rq = db.transaction("store", "readonly", { durability: 'relaxed' })
+ .objectStore("store")
+ .index("index")
+ .count(IDBKeyRange.bound('data0', 'data4'));
+
+ rq.onsuccess = t.step_func(function(e) {
+ assert_equals(e.target.result, 5);
+ t.done();
+ });
+ };
+}, 'count() returns the number of records that have keys within the range');
+
+async_test(t => {
+ let db;
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+
+ const store = db.createObjectStore("store", { autoIncrement: true });
+ store.createIndex("myindex", "idx");
+
+ for (let i = 0; i < 10; i++)
+ store.add({ idx: "data_" + (i%2) });
+
+ store.index("myindex").count("data_0").onsuccess = t.step_func(function(e) {
+ assert_equals(e.target.result, 5, "count(data_0)");
+ t.done();
+ });
+ };
+}, 'count() returns the number of records that have keys with the key');
+
+async_test(t => {
+ let db;
+
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const store = db.createObjectStore("store", { autoIncrement: true });
+ store.createIndex("index", "indexedProperty");
+
+ for (let i = 0; i < 10; i++) {
+ store.add({ indexedProperty: "data" + i });
+ }
+ };
+
+ open_rq.onsuccess = function(e) {
+ const index = db.transaction("store", "readonly", { durability: 'relaxed' })
+ .objectStore("store")
+ .index("index");
+
+ assert_throws_dom("DataError", function () {
+ index.count(NaN);
+ });
+
+ t.done();
+ };
+}, 'count() throws DataError when using invalid key');
diff --git a/tests/wpt/tests/IndexedDB/idbindex_count.htm b/tests/wpt/tests/IndexedDB/idbindex_count.htm
deleted file mode 100644
index 5b45b5223bd..00000000000
--- a/tests/wpt/tests/IndexedDB/idbindex_count.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBIndex.count() - returns the number of records in the index </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();
-
- var open_rq = createdb(t);
-
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var store = db.createObjectStore("store", { autoIncrement: true });
- store.createIndex("index", "indexedProperty");
-
- for(var i = 0; i < 10; i++) {
- store.add({ indexedProperty: "data" + i });
- }
- }
-
- open_rq.onsuccess = function(e) {
- var rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .index("index")
- .count();
-
- rq.onsuccess = t.step_func(function(e) {
- assert_equals(e.target.result, 10);
- t.done();
- });
- }
-</script>
-
-<div id=log></div>
diff --git a/tests/wpt/tests/IndexedDB/idbindex_count2.htm b/tests/wpt/tests/IndexedDB/idbindex_count2.htm
deleted file mode 100644
index 2a68770df91..00000000000
--- a/tests/wpt/tests/IndexedDB/idbindex_count2.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBIndex.count() - returns the number of records that have keys within the range </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();
-
- var open_rq = createdb(t);
-
- open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- var store = db.createObjectStore("store", { autoIncrement: true });
- store.createIndex("index", "indexedProperty");
-
- for(var i = 0; i < 10; i++) {
- store.add({ indexedProperty: "data" + i });
- }
- }
-
- open_rq.onsuccess = function(e) {
- var rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .index("index")
- .count(IDBKeyRange.bound('data0', 'data4'));
-
- rq.onsuccess = t.step_func(function(e) {
- assert_equals(e.target.result, 5);
- t.done();
- });
- }
-</script>
-
-<div id=log></div>
diff --git a/tests/wpt/tests/IndexedDB/idbindex_count3.htm b/tests/wpt/tests/IndexedDB/idbindex_count3.htm
deleted file mode 100644
index a94e8985546..00000000000
--- a/tests/wpt/tests/IndexedDB/idbindex_count3.htm
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>IDBIndex.count() - returns the number of records that have keys with the key</title>
-<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=resources/support.js></script>
-
-<script>
- var db
-
- createdb(async_test()).onupgradeneeded = function(e) {
- db = e.target.result
-
- var store = db.createObjectStore("store", { autoIncrement: true })
- store.createIndex("myindex", "idx")
-
- for (var i = 0; i < 10; i++)
- store.add({ idx: "data_" + (i%2) });
-
- store.index("myindex").count("data_0").onsuccess = this.step_func(function(e) {
- assert_equals(e.target.result, 5, "count(data_0)")
- this.done()
- })
- }
-
-</script>
-<div id=log></div>
diff --git a/tests/wpt/tests/IndexedDB/idbindex_count4.htm b/tests/wpt/tests/IndexedDB/idbindex_count4.htm
deleted file mode 100644
index ce19968bf16..00000000000
--- a/tests/wpt/tests/IndexedDB/idbindex_count4.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>IDBIndex.count() - throw DataError when using invalid key</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-IDBIndex-count-IDBRequest-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(e) {
- db = e.target.result;
- var store = db.createObjectStore("store", { autoIncrement: true });
- store.createIndex("index", "indexedProperty");
-
- for(var i = 0; i < 10; i++) {
- store.add({ indexedProperty: "data" + i });
- }
- }
-
- open_rq.onsuccess = function(e) {
- var index = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .index("index");
-
- assert_throws_dom("DataError", function() {
- index.count(NaN);
- });
-
- t.done();
- }
-</script>
-
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add.any.js
index b3071c1f94c..dfc15294e82 100644
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add.any.js
+++ b/tests/wpt/tests/IndexedDB/idbobjectstore_add.any.js
@@ -1,30 +1,408 @@
// META: global=window,worker
-// META: title=IDBObjectStore.add() - add with an inline key
+// META: title=IDBObjectStore.add()
// META: script=resources/support.js
// @author Microsoft <https://www.microsoft.com>
+// @author Intel <http://www.intel.com>
'use_strict';
-let db;
-const t = async_test();
-const record = { key: 1, property: "data" };
+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" });
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function(e) {
+ db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
- objStore.add(record);
-};
+ objStore.add(record);
+ };
-open_rq.onsuccess = function(e) {
- const rq = db.transaction("store", "readonly", {durability: 'relaxed'})
- .objectStore("store")
- .get(record.key);
+ 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) {
+ 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();
- });
-};
+ });
+ };
+}, 'add() 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.add(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();
+ });
+ };
+}, 'add() with an out-of-line key');
+
+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", { keyPath: "key" });
+ objStore.add(record);
+
+ const rq = objStore.add(record);
+ rq.onsuccess = fail(t, "success on adding duplicate record");
+
+ rq.onerror = t.step_func(function(e) {
+ assert_equals(e.target.error.name, "ConstraintError");
+ assert_equals(rq.error.name, "ConstraintError");
+ assert_equals(e.type, "error");
+
+ e.preventDefault();
+ e.stopPropagation();
+ });
+ };
+
+ // Defer done, giving rq.onsuccess a chance to run
+ open_rq.onsuccess = function(e) {
+ t.done();
+ };
+}, 'add() record with same 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.add(record);
+
+ const rq = objStore.add(record);
+ rq.onsuccess = fail(t, "success on adding 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();
+ };
+}, 'add() 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.add(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();
+ });
+ };
+}, 'add() 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.add(record);
+ objStore.add(record);
+ objStore.add(record);
+ objStore.add(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();
+ }
+ });
+ };
+}, 'add() 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", { autoIncrement: true });
+
+ objStore.add(record);
+ objStore.add(record);
+ objStore.add(record);
+ objStore.add(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.key);
+ cursor.continue();
+ } else {
+ assert_array_equals(actual_keys, expected_keys);
+ t.done();
+ }
+ });
+ };
+}, 'add() 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.add(record);
+ objStore.add(record);
+ objStore.add(record);
+ objStore.add(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;
+ db = e.target.result;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.add(record, 1);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+ }, 'Attempt to \'add()\' 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");
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.add(record);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to call \'add()\' without a 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) {
+ let db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.add(record);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to \'add()\' 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) {
+ let db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.add(record);
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to \'add()\' 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) {
+ let db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store");
+
+ assert_throws_dom("DataError", function() {
+ rq = objStore.add(record, { value: 1 });
+ });
+
+ assert_equals(rq, undefined);
+ t.done();
+ };
+}, 'Attempt to \'add()\' 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) {
+ let db = e.target.result;
+
+ let rq;
+ const objStore = db.createObjectStore("store", { keyPath: "key" });
+
+ objStore.createIndex("index", "indexedProperty");
+
+ rq = objStore.add(record);
+
+ assert_true(rq instanceof IDBRequest);
+ rq.onsuccess = function() {
+ t.done();
+ }
+ };
+}, 'add() 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.add({pKey: "primaryKey_0"});
+ });
+ });
+ t.done();
+ }
+}, 'If the transaction this IDBObjectStore belongs to has its mode set to \
+readonly, throw ReadOnlyError');
+
+async_test(t => {
+ const open_rq = createdb(t);
+ open_rq.onupgradeneeded = function (event) {
+ let db = event.target.result;
+ const ostore = db.createObjectStore("store", {keyPath: "pKey"});
+ db.deleteObjectStore("store");
+ assert_throws_dom("InvalidStateError", function() {
+ ostore.add({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_add10.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add10.any.js
deleted file mode 100644
index 7b93dec16a0..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add10.any.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the object store uses out-of-line keys
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-const record = { property: "data" };
-
-const open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- let rq;
- const objStore = db.createObjectStore("store");
-
- assert_throws_dom("DataError",
- function() { rq = objStore.add(record); });
-
- assert_equals(rq, undefined);
- t.done();
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add11.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add11.any.js
deleted file mode 100644
index cff8f6f1a02..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add11.any.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - Attempt to add a record where the record's key does not meet the constraints of a valid key
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-const record = { key: { value: 1 }, property: "data" };
-
-const open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- let rq;
- const objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.add(record); });
-
- assert_equals(rq, undefined);
- t.done();
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add12.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add12.any.js
deleted file mode 100644
index c7ebe751d7e..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add12.any.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - Attempt to add a record where the record's in-line key is not defined
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-const record = { property: "data" };
-
-const open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- let rq;
- const objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.add(record); });
-
- assert_equals(rq, undefined);
- t.done();
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add13.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add13.any.js
deleted file mode 100644
index fdd77751c00..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add13.any.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - Attempt to add a record where the out of line key provided does not meet the constraints of a valid key
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-const record = { property: "data" };
-
-const open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- let rq;
- const objStore = db.createObjectStore("store");
-
- assert_throws_dom("DataError",
- function() { rq = objStore.add(record, { value: 1 }); });
-
- assert_equals(rq, undefined);
- t.done();
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add14.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add14.any.js
deleted file mode 100644
index 9952a6d12c9..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add14.any.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - Add a record where a value being indexed does not meet the constraints of a valid key
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-const record = { key: 1, indexedProperty: { property: "data" } };
-
-const open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
-
- let rq;
- const objStore = db.createObjectStore("store", { keyPath: "key" });
-
- objStore.createIndex("index", "indexedProperty");
-
- rq = objStore.add(record);
-
- assert_true(rq instanceof IDBRequest);
- rq.onsuccess = function() {
- t.done();
- }
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add15.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add15.any.js
deleted file mode 100644
index f1820b0259d..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add15.any.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - If the transaction this IDBObjectStore belongs to has its mode set to readonly, throw ReadOnlyError
-// META: script=resources/support.js
-// @author Intel <http://www.intel.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-
-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.add({ pKey: "primaryKey_0"});
- });
- });
- t.done();
-}
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add16.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add16.any.js
deleted file mode 100644
index 42f943fd25f..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add16.any.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - If the object store has been deleted, the implementation must throw a DOMException of type InvalidStateError
-// META: script=resources/support.js
-// @author Intel <http://www.intel.com>
-
-'use_strict';
-
-let db;
-let ostore;
-const t = async_test();
-
-const 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.add({ pKey: "primaryKey_0"});
- });
- t.done();
-}
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add2.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add2.any.js
deleted file mode 100644
index ddddb4ca130..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add2.any.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - add with an out-of-line key
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-const key = 1;
-const record = { property: "data" };
-
-var open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- db = e.target.result;
- const objStore = db.createObjectStore("store");
-
- objStore.add(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();
- });
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add3.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add3.any.js
deleted file mode 100644
index a108f6b132c..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add3.any.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - record with same key already exists
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-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.add(record);
-
- const rq = objStore.add(record);
- rq.onsuccess = fail(t, "success on adding duplicate record");
-
- rq.onerror = t.step_func(function(e) {
- assert_equals(e.target.error.name, "ConstraintError");
- assert_equals(rq.error.name, "ConstraintError");
- assert_equals(e.type, "error");
-
- e.preventDefault();
- e.stopPropagation();
- });
-};
-
-// Defer done, giving rq.onsuccess a chance to run
-open_rq.onsuccess = function(e) {
- t.done();
-}
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add4.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add4.any.js
deleted file mode 100644
index 6a4f61e0d5b..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add4.any.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - add where an index has unique:true specified
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-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", { autoIncrement: true });
- objStore.createIndex("i1", "property", { unique: true });
- objStore.add(record);
-
- const rq = objStore.add(record);
- rq.onsuccess = fail(t, "success on adding 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();
-}
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add5.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add5.any.js
deleted file mode 100644
index 002e7dcf87e..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add5.any.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - object store's key path is an object attribute
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-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.add(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();
- });
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add6.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add6.any.js
deleted file mode 100644
index bc5242156d4..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add6.any.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - autoIncrement and inline keys
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-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.add(record);
- objStore.add(record);
- objStore.add(record);
- objStore.add(record);
-};
-
-open_rq.onsuccess = function(e) {
- const actual_keys = [],
- 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();
- }
- });
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add7.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add7.any.js
deleted file mode 100644
index eb381c4d45a..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add7.any.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - autoIncrement and out-of-line keys
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-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", { autoIncrement: true });
-
- objStore.add(record);
- objStore.add(record);
- objStore.add(record);
- objStore.add(record);
-};
-
-open_rq.onsuccess = function(e) {
- const actual_keys = [],
- 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.key);
- cursor.continue();
- }
- else {
- assert_array_equals(actual_keys, expected_keys);
- t.done();
- }
- });
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add8.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add8.any.js
deleted file mode 100644
index 60266835bcb..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add8.any.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - object store has autoIncrement:true and the key path is an object attribute
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let db;
-const t = async_test();
-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.add(record);
- objStore.add(record);
- objStore.add(record);
- objStore.add(record);
-};
-
-open_rq.onsuccess = function(e) {
- const actual_keys = [],
- 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();
- }
- });
-};
diff --git a/tests/wpt/tests/IndexedDB/idbobjectstore_add9.any.js b/tests/wpt/tests/IndexedDB/idbobjectstore_add9.any.js
deleted file mode 100644
index dba9655867e..00000000000
--- a/tests/wpt/tests/IndexedDB/idbobjectstore_add9.any.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// META: global=window,worker
-// META: title=IDBObjectStore.add() - Attempt to add a record that does not meet the constraints of an object store's inline key requirements
-// META: script=resources/support.js
-// @author Microsoft <https://www.microsoft.com>
-
-'use_strict';
-
-let t = async_test();
-const record = { key: 1, property: "data" };
-
-const open_rq = createdb(t);
-open_rq.onupgradeneeded = function(e) {
- let rq;
- db = e.target.result;
- const objStore = db.createObjectStore("store", { keyPath: "key" });
-
- assert_throws_dom("DataError",
- function() { rq = objStore.add(record, 1); });
-
- assert_equals(rq, undefined);
- t.done();
-};
diff --git a/tests/wpt/tests/accessibility/crashtests/svg-mouse-listener.html b/tests/wpt/tests/accessibility/crashtests/svg-mouse-listener.html
deleted file mode 100644
index 2de613e1d37..00000000000
--- a/tests/wpt/tests/accessibility/crashtests/svg-mouse-listener.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html class="test-wait">
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/resources/testdriver-actions.js"></script>
-<svg viewBox="0 0 500 500">
- <rect width="500" height="500" id="target" fill="red">
-</svg>
-
-<script>
-window.onload = async () => {
- document.getElementById("target").addEventListener("click", () => {},
- { once: true });
- await test_driver.click(document.body);
- document.documentElement.classList.remove('test-wait');
-};
-
-</script>
-</html>
diff --git a/tests/wpt/tests/accessibility/svg-mouse-listener.html b/tests/wpt/tests/accessibility/svg-mouse-listener.html
new file mode 100644
index 00000000000..e2ca983d00a
--- /dev/null
+++ b/tests/wpt/tests/accessibility/svg-mouse-listener.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<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="/resources/testdriver-actions.js"></script>
+<svg viewBox="0 0 500 500">
+ <rect width="500" height="500" id="target" fill="red">
+</svg>
+
+<script>
+function clickPromise() {
+ return new Promise(resolve => {
+ document.getElementById("target").addEventListener("click", resolve,
+ { once: true });
+ });
+}
+
+// While the other accessibility tests are crash-tests, this one cannot be
+// authored as one. The reason is that a crash-test is complete when a onload
+// is complete. The recommended strategy for supporting asynchronous testing
+// is to use reftest wait. Unfortunately, reftests are not compatible with
+// test-driver. The test needs to be asynchronous as unless we wait for the
+// click to be handled, we are not giving the browser a chance to crash. In
+// addition the lack of a wait triggers detection of a memory leak in Blink.
+promise_test(async () => {
+ const click_promise = clickPromise();
+ await test_driver.click(document.body);
+ return click_promise;
+}, 'Clicking SVG element does not crash the browser');
+
+</script>
+</html>
diff --git a/tests/wpt/tests/accname/name/comp_name_from_content.html b/tests/wpt/tests/accname/name/comp_name_from_content.html
index deae6699c6e..3504658ea46 100644
--- a/tests/wpt/tests/accname/name/comp_name_from_content.html
+++ b/tests/wpt/tests/accname/name/comp_name_from_content.html
@@ -49,6 +49,12 @@
content: " after "; /* [sic] leading and trailing space */
content: " after " / " alt-after "; /* Override the previous line for engines that support the Alternative Text syntax. */
}
+ .fallback-before-empty::before {
+ content: "before" / "";
+ }
+ .fallback-before-image-empty::before {
+ content: "before " url(/images/blue.png) / "";
+ }
.fallback-before-mixed::before {
content: " before "; /* [sic] leading and trailing space */
content: " before " / " start " attr(data-alt-text-before) " end "; /* Override the previous line for engines that support the Alternative Text syntax. */
@@ -145,6 +151,10 @@
<a href="#" data-alt-text-before="alt-before" data-alt-text-after="alt-after" data-expectedlabel="start alt-before end label start alt-after end" data-testname="link name from fallback content mixing attr() and strings with ::before and ::after" class="ex fallback-before-mixed fallback-after-mixed">label</a><br>
<br>
+<h1>Empty alternative text for CSS content in pseudo-elements when applied to primitive appearance form controls</h1>
+<p><input data-expectedlabel="" data-testname="primitive radio input with ::before containing empty alternative text" class="ex fallback-before-empty" type=radio style=appearance:none>
+<p><input data-expectedlabel="" data-testname="primitive radio input with ::before containing empty alternative text for an image" class="ex fallback-before-image-empty" type=radio style=appearance:none>
+
<h1>simple w/ for each child</h1>
<button data-expectedlabel="one two three" data-testname="button name from content for each child" class="ex"><span>one</span> <span>two</span> <span>three</span></button><br>
<h3 data-expectedlabel="one two three" data-testname="heading name from content for each child" class="ex"><span>one</span> <span>two</span> <span>three</span></h3>
diff --git a/tests/wpt/tests/appmanifest/display-override-member/display-override-member-media-feature-tabbed-manual.tentative.html b/tests/wpt/tests/appmanifest/display-override-member/display-override-member-media-feature-tabbed-manual.tentative.html
new file mode 100644
index 00000000000..04560071dfa
--- /dev/null
+++ b/tests/wpt/tests/appmanifest/display-override-member/display-override-member-media-feature-tabbed-manual.tentative.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>Test "tabbed" in display-override member + media feature</title>
+<link rel="help" href="https://w3c.github.io/manifest#display-member" />
+<link rel="help" href="https://www.w3.org/TR/mediaqueries-5/#display-modes" />
+<link rel="help" href="https://w3c.github.io/manifest/#dom-displaymodetype-browser" />
+<link rel="manifest" href="resources/display-override-member-media-feature-tabbed.webmanifest" />
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<script src="resources/display-override-member-media-feature-manual.js"></script>
+<h1>Test "tabbed" in display-override member + media feature</h1>
+<style>
+ .fail {
+ background-color: red;
+ }
+
+ @media all and (display-mode: tabbed) {
+ body {
+ background-color: green;
+ }
+ }
+</style>
+<script>
+const tabbed = matchMedia("(display-mode: tabbed)");
+
+tabbed.onchange = () => {
+ if (tabbed.matches) {
+ document.body.classList.remove("fail");
+ }
+}
+
+if (!tabbed.matches) {
+ document.body.classList.add("fail");
+}
+</script>
+<p>
+ To pass, the background color must be green after installing.
+</p>
diff --git a/tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest b/tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest
new file mode 100644
index 00000000000..b8b5fdb0f0b
--- /dev/null
+++ b/tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest
@@ -0,0 +1,11 @@
+{
+ "name": "Display override member media feature WPT",
+ "icons": [
+ {
+ "src": "icon.png",
+ "sizes": "192x192"
+ }
+ ],
+ "start_url": "../display-override-member-media-feature-tabbed-manual.tentative.html",
+ "display_override": [ "tabbed" ]
+}
diff --git a/tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest.headers b/tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest.headers
new file mode 100644
index 00000000000..2bab061d43a
--- /dev/null
+++ b/tests/wpt/tests/appmanifest/display-override-member/resources/display-override-member-media-feature-tabbed.webmanifest.headers
@@ -0,0 +1 @@
+Content-Type: application/manifest+json; charset=utf-8
diff --git a/tests/wpt/tests/attribution-reporting/header-parsing-error-debug-report.sub.https.html b/tests/wpt/tests/attribution-reporting/header-parsing-error-debug-report.sub.https.html
new file mode 100644
index 00000000000..3c3ebe48d9f
--- /dev/null
+++ b/tests/wpt/tests/attribution-reporting/header-parsing-error-debug-report.sub.https.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name=timeout content=long>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/attribution-reporting/resources/helpers.js"></script>
+<script>
+attribution_reporting_promise_test(async t => {
+ await registerAttributionSrc({
+ trigger: {
+ event_trigger_data: {},
+ },
+ extraHeaders: [
+ {
+ name: 'Attribution-Reporting-Info',
+ value: 'report-header-errors',
+ },
+ ],
+ method: 'img',
+ });
+
+ const payload = await pollVerboseDebugReports();
+ assert_equals(payload.reports.length, 1);
+ const report = JSON.parse(payload.reports[0].body);
+ assert_equals(report.length, 1);
+ assert_equals(report[0].type, 'header-parsing-error');
+ assert_own_property(report[0], 'body');
+ assert_equals(report[0].body.context_site, 'https://{{host}}');
+ assert_equals(report[0].body.header, 'Attribution-Reporting-Register-Trigger');
+ assert_equals(report[0].body.value, '{"event_trigger_data":{}}');
+}, 'Header error debug report is received.');
+</script>
diff --git a/tests/wpt/tests/close-watcher/closewatcher-dialog-popover.html b/tests/wpt/tests/close-watcher/closewatcher-dialog-popover.html
deleted file mode 100644
index 50d5cb7a4ca..00000000000
--- a/tests/wpt/tests/close-watcher/closewatcher-dialog-popover.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE html>
-<link rel=author href="mailto:jarhar@chromium.org">
-<link rel=help href="https://github.com/whatwg/html/pull/9462">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/resources/testdriver-actions.js"></script>
-<script src="/common/top-layer.js"></script>
-<script src="resources/helpers.js"></script>
-
-<button id=b0>button</button>
-
-<dialog id=dialog>
- <button id=b1>button</button>
- <div id=popover popover=auto>popover</div>
-</dialog>
-
-<script>
-const waitForPotentialCloseEvent = () => {
- // CloseWatchers fire close events synchronously, but dialog elements wait
- // for a rAF before firing them.
- return new Promise(resolve => requestAnimationFrame(resolve));
-};
-
-promise_test(async t => {
- const events = [];
- const closeWatcher = createRecordingCloseWatcher(t, events, 'CloseWatcher', 'CloseWatcher');
- const dialog = createRecordingCloseWatcher(t, events, 'dialog', 'dialog');
- const popover = createRecordingCloseWatcher(t, events, 'popover', 'popover');
- assert_true(dialog.hasAttribute('open'), 'The dialog should be open.');
- assert_true(popover.matches(':popover-open'), 'The popover should be open.');
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
-
- assert_false(popover.matches(':popover-open'), 'The popover should be closed.');
- assert_false(dialog.hasAttribute('open'), 'The dialog should be closed.');
- assert_array_equals(events, ['CloseWatcher close', 'dialog close']);
-}, 'Opening a CloseWatcher, modal dialog, and popover without user activation causes them all to be closed with one close request.');
-
-promise_test(async t => {
- const events = [];
- const closeWatcher = await createBlessedRecordingCloseWatcher(t, events, 'CloseWatcher', 'CloseWatcher');
- const dialog = await createBlessedRecordingCloseWatcher(t, events, 'dialog', 'dialog');
- const popover = await createBlessedRecordingCloseWatcher(t, events, 'popover', 'popover', dialog);
- assert_true(dialog.hasAttribute('open'), 'The dialog should be open.');
- assert_true(popover.matches(':popover-open'), 'The popover should be open.');
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_false(popover.matches(':popover-open'), 'First close request: The popover should be closed.');
- assert_true(dialog.hasAttribute('open'), 'First close request: The dialog should be open.');
- assert_array_equals(events, []);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_false(popover.matches(':popover-open'), 'Second close request: The popover should be closed.');
- assert_false(dialog.hasAttribute('open'), 'Second close request: The dialog should be closed.');
- assert_array_equals(events, ['dialog close']);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_false(popover.matches(':popover-open'), 'Third close request: The popover should be closed.');
- assert_false(dialog.hasAttribute('open'), 'Third close request: The dialog should be closed.');
- assert_array_equals(events, ['dialog close', 'CloseWatcher close']);
-}, 'Opening a CloseWatcher, modal dialog, and popover with user activation for each should close one at a time with close requests.');
-
-promise_test(async t => {
- const events = [];
- const closeWatcher = await createBlessedRecordingCloseWatcher(t, events, 'CloseWatcher', 'CloseWatcher');
- const dialog = await createBlessedRecordingCloseWatcher(t, events, 'dialog', 'dialog');
- const popover = await createBlessedRecordingCloseWatcher(t, events, 'popover', 'popover', dialog);
- assert_true(dialog.hasAttribute('open'), 'The dialog should be open.');
- assert_true(popover.matches(':popover-open'), 'The popover should be open.');
-
- await blessTopLayer(popover);
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_false(popover.matches(':popover-open'), 'First close request: The popover should be closed.');
- assert_true(dialog.hasAttribute('open'), 'First close request: The dialog should be open.');
- assert_array_equals(events, []);
-
- await blessTopLayer(dialog);
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_false(popover.matches(':popover-open'), 'Second close request: The popover should be closed.');
- assert_false(dialog.hasAttribute('open'), 'Second close request: The dialog should be closed.');
- assert_array_equals(events, ['dialog cancel', 'dialog close']);
-
- await test_driver.bless();
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_false(popover.matches(':popover-open'), 'Third close request: The popover should be closed.');
- assert_false(dialog.hasAttribute('open'), 'Third close request: The dialog should be closed.');
- assert_array_equals(events, ['dialog cancel', 'dialog close', 'CloseWatcher cancel', 'CloseWatcher close']);
-}, 'Opening a CloseWatcher, modal dialog, and popover with user activation for each and sending close requests with user activation should close one at a time and have cancel events.');
-</script>
diff --git a/tests/wpt/tests/close-watcher/esc-key.html b/tests/wpt/tests/close-watcher/esc-key.html
deleted file mode 100644
index 16fcce69173..00000000000
--- a/tests/wpt/tests/close-watcher/esc-key.html
+++ /dev/null
@@ -1,77 +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="/resources/testdriver-actions.js"></script>
-<script src="resources/helpers.js"></script>
-
-<!--
- Tests in this file are around the interaction of the Esc key specifically, not
- the general concept of close requests. Ideally, all other tests would work
- as-is if you changed the implementation of sendCloseRequest(). These tests
- assume that Esc is the close request for the platform being tested.
--->
-
-<body>
-<script>
-promise_test(async t => {
- let events = [];
- let watcher = createRecordingCloseWatcher(t, events);
-
- await sendEscKey();
-
- assert_array_equals(events, ["close"]);
-}, "Esc key does not count as user activation, so if it is the sole user interaction, that fires close but not cancel");
-
-promise_test(async t => {
- let events = [];
- let watcher = createRecordingCloseWatcher(t, events);
-
- window.onkeydown = e => e.preventDefault();
-
- await sendEscKey();
-
- assert_array_equals(events, []);
-}, "A keydown listener can prevent the Esc keypress from being interpreted as a close request");
-
-promise_test(async t => {
- let events = [];
- let watcher = createRecordingCloseWatcher(t, events);
-
- window.onkeyup = e => e.preventDefault();
-
- await sendEscKey();
-
- assert_array_equals(events, []);
-}, "A keyup listener can prevent the Esc keypress from being interpreted as a close request");
-
-promise_test(async t => {
- let events = [];
- let watcher = createRecordingCloseWatcher(t, events);
-
- window.onkeypress = e => e.preventDefault();
-
- await sendEscKey();
-
- assert_array_equals(events, []);
-}, "A keypress listener can prevent the Esc keypress from being interpreted as a close request");
-
-test(t => {
- let events = [];
- let watcher = createRecordingCloseWatcher(t, events);
-
- let keydown = new KeyboardEvent('keydown', {'key': 'Escape', 'keyCode': 27});
- window.dispatchEvent(keydown);
- let keyup = new KeyboardEvent('keyup', {'key': 'Escape', 'keyCode': 27});
- window.dispatchEvent(keyup);
-
- assert_array_equals(events, []);
-
- let keyup2 = document.createEvent("Event");
- keyup2.initEvent("keyup", true);
- window.dispatchEvent(keyup2);
-
- assert_array_equals(events, []);
-}, "close via synthesized Esc key must not work");
-</script>
diff --git a/tests/wpt/tests/close-watcher/esc-key/README.md b/tests/wpt/tests/close-watcher/esc-key/README.md
new file mode 100644
index 00000000000..817edc09ab8
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/esc-key/README.md
@@ -0,0 +1,4 @@
+Tests in this directory are around the interaction of the Esc key specifically,
+not the general concept of close requests. Ideally, all other tests would work
+as-is if you changed the implementation of `sendCloseRequest()`. These tests
+assume that Esc is the close request for the platform being tested.
diff --git a/tests/wpt/tests/close-watcher/esc-key/keydown.html b/tests/wpt/tests/close-watcher/esc-key/keydown.html
new file mode 100644
index 00000000000..cb0ddf0638f
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/esc-key/keydown.html
@@ -0,0 +1,21 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+promise_test(async t => {
+ let events = [];
+ let watcher = createRecordingCloseWatcher(t, events);
+
+ window.onkeydown = e => e.preventDefault();
+
+ await sendEscKey();
+
+ assert_array_equals(events, []);
+}, "A keydown listener can prevent the Esc keypress from being interpreted as a close request");
+</script>
diff --git a/tests/wpt/tests/close-watcher/esc-key/keypress.html b/tests/wpt/tests/close-watcher/esc-key/keypress.html
new file mode 100644
index 00000000000..8dd58b064d7
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/esc-key/keypress.html
@@ -0,0 +1,21 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+promise_test(async t => {
+ let events = [];
+ let watcher = createRecordingCloseWatcher(t, events);
+
+ window.onkeypress = e => e.preventDefault();
+
+ await sendEscKey();
+
+ assert_array_equals(events, ["close"]);
+}, "A keypress listener can NOT prevent the Esc keypress from being interpreted as a close request");
+</script>
diff --git a/tests/wpt/tests/close-watcher/esc-key/keyup.html b/tests/wpt/tests/close-watcher/esc-key/keyup.html
new file mode 100644
index 00000000000..341012d6bc8
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/esc-key/keyup.html
@@ -0,0 +1,21 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+promise_test(async t => {
+ let events = [];
+ let watcher = createRecordingCloseWatcher(t, events);
+
+ window.onkeyup = e => e.preventDefault();
+
+ await sendEscKey();
+
+ assert_array_equals(events, ["close"]);
+}, "A keyup listener can NOT prevent the Esc keypress from being interpreted as a close request");
+</script>
diff --git a/tests/wpt/tests/close-watcher/esc-key/not-user-activation.html b/tests/wpt/tests/close-watcher/esc-key/not-user-activation.html
new file mode 100644
index 00000000000..ac29f84f06c
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/esc-key/not-user-activation.html
@@ -0,0 +1,19 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+promise_test(async t => {
+ let events = [];
+ let watcher = createRecordingCloseWatcher(t, events);
+
+ await sendEscKey();
+
+ assert_array_equals(events, ["close"]);
+}, "Esc key does not count as user activation, so if it is the sole user interaction, that fires close but not cancel");
+</script>
diff --git a/tests/wpt/tests/close-watcher/esc-key/synthetic-keyboard-event.html b/tests/wpt/tests/close-watcher/esc-key/synthetic-keyboard-event.html
new file mode 100644
index 00000000000..37b5507ac4a
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/esc-key/synthetic-keyboard-event.html
@@ -0,0 +1,28 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+test(t => {
+ let events = [];
+ let watcher = createRecordingCloseWatcher(t, events);
+
+ let keydown = new KeyboardEvent("keydown", {key: "Escape", keyCode: 27});
+ window.dispatchEvent(keydown);
+ let keyup = new KeyboardEvent("keyup", {key: "Escape", keyCode: 27});
+ window.dispatchEvent(keyup);
+
+ assert_array_equals(events, []);
+
+ let keyup2 = document.createEvent("Event");
+ keyup2.initEvent("keyup", true);
+ window.dispatchEvent(keyup2);
+
+ assert_array_equals(events, []);
+}, "close via synthesized Esc key must not work");
+</script>
diff --git a/tests/wpt/tests/close-watcher/resources/helpers.js b/tests/wpt/tests/close-watcher/resources/helpers.js
index 97a62309cd5..dd9e191c4db 100644
--- a/tests/wpt/tests/close-watcher/resources/helpers.js
+++ b/tests/wpt/tests/close-watcher/resources/helpers.js
@@ -38,6 +38,14 @@ window.createBlessedRecordingCloseWatcher = async (t, events, name, type, parent
return createRecordingCloseWatcher(t, events, name, type, parentWatcher);
};
+window.destroyCloseWatcher = (watcher) => {
+ if (watcher instanceof HTMLElement) {
+ watcher.remove();
+ } else {
+ watcher.destroy();
+ }
+};
+
window.sendEscKey = () => {
// Esc is \uE00C, *not* \uu001B; see https://w3c.github.io/webdriver/#keyboard-actions.
//
@@ -59,3 +67,9 @@ window.maybeTopLayerBless = (watcher) => {
}
return test_driver.bless();
};
+
+window.waitForPotentialCloseEvent = () => {
+ // CloseWatchers fire close events synchronously, but dialog elements wait
+ // for a rAF before firing them.
+ return new Promise(requestAnimationFrame);
+};
diff --git a/tests/wpt/tests/close-watcher/user-activation-CloseWatcher.html b/tests/wpt/tests/close-watcher/user-activation-CloseWatcher.html
deleted file mode 100644
index 70435993f54..00000000000
--- a/tests/wpt/tests/close-watcher/user-activation-CloseWatcher.html
+++ /dev/null
@@ -1,75 +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="/resources/testdriver-actions.js"></script>
-<script src="resources/helpers.js"></script>
-
-<!-- The dialog element does not support requestClose(), so these tests
- are not shared between dialog elements and CloseWatchers. -->
-
-<body>
-<script>
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher");
-
- await test_driver.bless("call requestClose()", () => freeWatcher.requestClose());
-
- assert_array_equals(events, ["freeWatcher cancel", "freeWatcher close"]);
-}, "CloseWatchers created without user activation, but requestClose()d via user activation, fires cancel");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher");
- freeWatcher.addEventListener("cancel", e => e.preventDefault());
-
- await test_driver.bless("call requestClose()", () => freeWatcher.requestClose());
-
- assert_array_equals(events, ["freeWatcher cancel"]);
-}, "CloseWatchers created without user activation, but requestClose()d via user activation, fires cancel, which can be preventDefault()ed");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher");
- const activationWatcher = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher");
-
- await test_driver.bless("call activationWatcher.requestClose()", () => activationWatcher.requestClose());
- assert_array_equals(events, ["activationWatcher cancel", "activationWatcher close"]);
-
- await test_driver.bless("call freeWatcher.requestClose()", () => freeWatcher.requestClose());
- assert_array_equals(events, ["activationWatcher cancel", "activationWatcher close", "freeWatcher cancel", "freeWatcher close"]);
-}, "Creating a CloseWatcher from user activation, and requestClose()ing CloseWatchers with user activation, fires cancel");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher");
- const activationWatcher1 = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher1");
- activationWatcher1.addEventListener("cancel", e => e.preventDefault());
-
- await test_driver.bless("call activationWatcher1.requestClose()", () => activationWatcher1.requestClose());
- assert_array_equals(events, ["activationWatcher1 cancel"]);
-
- // This time we go straight to close, without a second cancel.
- activationWatcher1.requestClose();
- assert_array_equals(events, ["activationWatcher1 cancel", "activationWatcher1 close"]);
-
- freeWatcher.requestClose();
- assert_array_equals(events, ["activationWatcher1 cancel", "activationWatcher1 close", "freeWatcher close"]);
-}, "3 user activations let you have 2 close watchers with 1 cancel event, even if the first cancel event is prevented");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher1 = createRecordingCloseWatcher(t, events, "freeWatcher1");
-
- freeWatcher1.requestClose();
- assert_array_equals(events, ["freeWatcher1 close"]);
-
- const freeWatcher2 = createRecordingCloseWatcher(t, events, "freeWatcher2");
-
- await sendCloseRequest();
- assert_array_equals(events, ["freeWatcher1 close", "freeWatcher2 close"]);
-}, "requestClose()ing the free CloseWatcher allows a new free one to be created without user activation, and it receives the close request");
-
-</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation-multiple-plus-free.html b/tests/wpt/tests/close-watcher/user-activation-multiple-plus-free.html
deleted file mode 100644
index a94b47904a1..00000000000
--- a/tests/wpt/tests/close-watcher/user-activation-multiple-plus-free.html
+++ /dev/null
@@ -1,32 +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="/resources/testdriver-actions.js"></script>
-<script src="resources/helpers.js"></script>
-
-<body>
-<script>
-
-// This test needs to be separate from user-activation.html since, unlike those,
-// it relies on there not being any lingering user activation from previous
-// tests hanging around. That is, we need to be sure freeWatcher is created with
-// no user activation, to ensure that activationWatcher1 and activationWatcher2
-// get grouped as expected.
-promise_test(async t => {
- const events = [];
- createRecordingCloseWatcher(t, events, "freeWatcher");
-
- await test_driver.bless("create two more CloseWatchers", () => {
- createRecordingCloseWatcher(t, events, "activationWatcher1");
- createRecordingCloseWatcher(t, events, "activationWatcher2");
- });
-
- await sendCloseRequest();
- assert_array_equals(events, ["activationWatcher2 close", "activationWatcher1 close"]);
-
- await sendCloseRequest();
- assert_array_equals(events, ["activationWatcher2 close", "activationWatcher1 close", "freeWatcher close"]);
-}, "Multiple CloseWatchers created from a single user activation close together, but original free CloseWatcher closes separately");
-</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation-shared.html b/tests/wpt/tests/close-watcher/user-activation-shared.html
deleted file mode 100644
index 77e748532a3..00000000000
--- a/tests/wpt/tests/close-watcher/user-activation-shared.html
+++ /dev/null
@@ -1,201 +0,0 @@
-<!doctype html>
-<meta name=variant content="?dialog">
-<meta name=variant content="?CloseWatcher">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
-<script src="/resources/testdriver-actions.js"></script>
-<script src="/common/top-layer.js"></script>
-<script src="resources/helpers.js"></script>
-
-<body>
-<script>
-const type = location.search.substring(1);
-const waitForPotentialCloseEvent = () => {
- // CloseWatchers fire close events synchronously, but dialog elements wait
- // for a rAF before firing them.
- return new Promise(resolve => requestAnimationFrame(resolve));
-};
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
- freeWatcher.addEventListener("cancel", e => e.preventDefault());
-
- await maybeTopLayerBless(freeWatcher);
- freeWatcher.close();
- await waitForPotentialCloseEvent();
-
- assert_array_equals(events, ["freeWatcher close"]);
-}, "Close watchers created without user activation, but close()d via user activation, do not fire cancel");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
-
- await maybeTopLayerBless(freeWatcher);
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
-
- assert_array_equals(events, ["freeWatcher cancel", "freeWatcher close"]);
-}, "Close watchers created without user activation, but closed via a close request after user activation, fires cancel");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
- freeWatcher.addEventListener("cancel", e => e.preventDefault());
-
- await maybeTopLayerBless(freeWatcher);
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
-
- assert_array_equals(events, ["freeWatcher cancel"]);
-}, "Close watchers created without user activation, but closed via a close request after user activation, fires cancel, which can be preventDefault()ed");
-
-promise_test(async t => {
- const events = [];
- createRecordingCloseWatcher(t, events, "freeWatcher", type);
- createRecordingCloseWatcher(t, events, "watcher1", type);
- createRecordingCloseWatcher(t, events, "watcher2", type);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["watcher2 close", "watcher1 close", "freeWatcher close"]);
-}, "Multiple close watchers created without user activation close together (with no cancel)");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
- await createBlessedRecordingCloseWatcher(t, events, "activationWatcher", type, freeWatcher);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["activationWatcher close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["activationWatcher close", "freeWatcher close"]);
-}, "Creating a close watcher from user activation keeps it separate from the free close watcher, but they don't fire cancel");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
- const activationWatcher = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher", type, freeWatcher);
-
- await maybeTopLayerBless(activationWatcher);
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["activationWatcher cancel", "activationWatcher close"]);
-
- await maybeTopLayerBless(freeWatcher);
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["activationWatcher cancel", "activationWatcher close", "freeWatcher cancel", "freeWatcher close"]);
-}, "Creating a close watcher from user activation, and closing close watchers with a close request after user activation, fires cancel");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
- const activationWatcher1 = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher1", type, freeWatcher);
- await createBlessedRecordingCloseWatcher(t, events, "activationWatcher2", type, activationWatcher1);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["activationWatcher2 close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["activationWatcher2 close", "activationWatcher1 close"]);
-}, "Multiple close watchers created with user activation close in reverse order");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
- const activationWatcher1 = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher1", type, freeWatcher);
- const activationWatcher2 = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher2", type, activationWatcher1);
- await createBlessedRecordingCloseWatcher(t, events, "activationWatcher3", type, activationWatcher2);
- createRecordingCloseWatcher(t, events, "watcher4", type);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["watcher4 close", "activationWatcher3 close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["watcher4 close", "activationWatcher3 close", "activationWatcher2 close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["watcher4 close", "activationWatcher3 close", "activationWatcher2 close", "activationWatcher1 close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["watcher4 close", "activationWatcher3 close", "activationWatcher2 close", "activationWatcher1 close", "freeWatcher close"]);
-}, "3 user activations let you have 3 + 1 = 4 ungrouped close watchers/0 cancel events");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher1 = createRecordingCloseWatcher(t, events, "freeWatcher1", type);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher1 close"]);
-
- const freeWatcher2 = createRecordingCloseWatcher(t, events, "freeWatcher2", type);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher1 close", "freeWatcher2 close"]);
-}, "closing the free close watcher via a close request allows a new free one to be created without user activation, and it receives a second close request");
-
-promise_test(async t => {
- const events = [];
- const activationWatcher = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher", type);
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher close", "activationWatcher close"]);
-}, "The second watcher can be the free watcher, if the first is created with user activation");
-
-promise_test(async t => {
- const events = [];
- const activationWatcher1 = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher1", type);
- const activationWatcher2 = await createBlessedRecordingCloseWatcher(t, events, "activationWatcher2", type, activationWatcher1);
- const freeWatcher = createRecordingCloseWatcher(t, events, "freeWatcher", type);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher close", "activationWatcher2 close"]);
-
- await sendCloseRequest();
- await waitForPotentialCloseEvent();
- assert_array_equals(events, ["freeWatcher close", "activationWatcher2 close", "activationWatcher1 close"]);
-}, "The third watcher can be the free watcher, if the first two are created with user activation");
-
-promise_test(async t => {
- const events = [];
- const freeWatcher1 = createRecordingCloseWatcher(t, events, "freeWatcher1");
-
- if (freeWatcher1 instanceof HTMLDialogElement) {
- freeWatcher1.close();
- } else {
- freeWatcher1.destroy();
- }
- assert_array_equals(events, []);
-
- const freeWatcher2 = createRecordingCloseWatcher(t, events, "freeWatcher2");
-
- await sendCloseRequest();
- assert_array_equals(events, ["freeWatcher2 close"]);
-}, "destroy()ing the free close watcher allows a new free one to be created without user activation, and it receives the close request");
-</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/n-activate-preventDefault.html b/tests/wpt/tests/close-watcher/user-activation/n-activate-preventDefault.html
new file mode 100644
index 00000000000..531ef425998
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/n-activate-preventDefault.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+ const watcher = createRecordingCloseWatcher(t, events, undefined, type);
+ watcher.addEventListener("cancel", e => e.preventDefault());
+
+ await maybeTopLayerBless(watcher);
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+
+ assert_array_equals(events, ["cancel"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["cancel", "close"]);
+}, "Create a close watcher without user activation that preventDefault()s cancel; send user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/n-activate.html b/tests/wpt/tests/close-watcher/user-activation/n-activate.html
new file mode 100644
index 00000000000..babcf54c3c1
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/n-activate.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher = createRecordingCloseWatcher(t, events, undefined, type);
+
+ await maybeTopLayerBless(watcher);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["cancel", "close"]);
+}, "Create a close watcher without user activation; send user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/n-closerequest-n.html b/tests/wpt/tests/close-watcher/user-activation/n-closerequest-n.html
new file mode 100644
index 00000000000..2424af7820e
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/n-closerequest-n.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+promise_test(async t => {
+ const events = [];
+
+ createRecordingCloseWatcher(t, events, "watcher1", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher1 close"]);
+
+ createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher1 close", "watcher2 close"]);
+}, "Create a close watcher without user activation; send a close request; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/n-destroy-n.html b/tests/wpt/tests/close-watcher/user-activation/n-destroy-n.html
new file mode 100644
index 00000000000..c26f87dd6f8
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/n-destroy-n.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1", type);
+
+ destroyCloseWatcher(watcher1);
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, []);
+
+ createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 close"]);
+}, "Create a close watcher without user activation; destroy the close watcher; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/n.html b/tests/wpt/tests/close-watcher/user-activation/n.html
new file mode 100644
index 00000000000..fe04e0dc1b9
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/n.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ createRecordingCloseWatcher(t, events, undefined, type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["close"]);
+}, "Create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nn-activate-CloseWatcher.html b/tests/wpt/tests/close-watcher/user-activation/nn-activate-CloseWatcher.html
new file mode 100644
index 00000000000..8045f30b482
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nn-activate-CloseWatcher.html
@@ -0,0 +1,30 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<!--
+ See note in sibling -dialog.html file.
+-->
+
+<body>
+<script>
+const type = "CloseWatcher";
+
+promise_test(async t => {
+ const events = [];
+
+ createRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await maybeTopLayerBless(watcher2);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close", "watcher1 cancel", "watcher1 close"]);
+}, "Create two CloseWatchers without user activation; send user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nn-activate-dialog.html b/tests/wpt/tests/close-watcher/user-activation/nn-activate-dialog.html
new file mode 100644
index 00000000000..5cc866044ce
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nn-activate-dialog.html
@@ -0,0 +1,40 @@
+<!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="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<!--
+ This test has different expectations for dialogs vs. CloseWatchers because
+ dialogs queue a task to fire their close event, and do not do so for their
+ cancel event. Thus, when you have two dialogs grouped together, you get the
+ somewhat-strange behavior of both cancels firing first, then both closes.
+ Whereas CloseWatchers do not have this issue; both fire synchronously.
+
+ Note that scheduling the cancel event for dialogs is not really possible since
+ it would then fire after the dialog has been closed in the DOM and visually.
+ So the only reasonable fix for this would be to stop scheduling the close
+ event for dialogs. That's risky from a compat standpoint, so for now, test the
+ strange behavior.
+-->
+
+<body>
+<script>
+const type = "dialog";
+
+promise_test(async t => {
+ const events = [];
+
+ createRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await maybeTopLayerBless(watcher2);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher1 cancel", "watcher2 close", "watcher1 close"]);
+}, "Create two dialogs without user activation; send user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nn.html b/tests/wpt/tests/close-watcher/user-activation/nn.html
new file mode 100644
index 00000000000..beb63f1b4f5
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nn.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ createRecordingCloseWatcher(t, events, "watcher1", type);
+ createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 close", "watcher1 close"]);
+}, "Create two close watchers without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover.html b/tests/wpt/tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover.html
new file mode 100644
index 00000000000..f8b9061d019
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nnn-CloseWatcher-dialog-popover.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/pull/9462">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<button id=b0>button</button>
+
+<dialog id=dialog>
+ <button id=b1>button</button>
+ <div id=popover popover=auto>popover</div>
+</dialog>
+
+<script>
+promise_test(async t => {
+ const events = [];
+ const closeWatcher = createRecordingCloseWatcher(t, events, 'CloseWatcher', 'CloseWatcher');
+ const dialog = createRecordingCloseWatcher(t, events, 'dialog', 'dialog');
+ const popover = createRecordingCloseWatcher(t, events, 'popover', 'popover');
+ assert_true(dialog.hasAttribute('open'), 'The dialog should be open.');
+ assert_true(popover.matches(':popover-open'), 'The popover should be open.');
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+
+ assert_false(popover.matches(':popover-open'), 'The popover should be closed.');
+ assert_false(dialog.hasAttribute('open'), 'The dialog should be closed.');
+ assert_array_equals(events, ['CloseWatcher close', 'dialog close']);
+}, 'Create a CloseWatcher without user activation; create a dialog without user activation; create a popover without user activation');
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nnn-popovers.html b/tests/wpt/tests/close-watcher/user-activation/nnn-popovers.html
new file mode 100644
index 00000000000..ed5d15598fc
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nnn-popovers.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/pull/9462">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<button id=b0>b0</button>
+
+<div id=p1 popover=auto>
+ <button id=b1>b1</button>
+
+ <div id=p2 popover=auto>
+ <button id=b2>b2</button>
+
+ <div id=p3 popover=auto>p3</div>
+ </div>
+</div>
+
+<script>
+promise_test(async () => {
+ p1.showPopover();
+ p2.showPopover();
+ p3.showPopover();
+ assert_true(p1.matches(':popover-open'), 'p1 should be open.');
+ assert_true(p2.matches(':popover-open'), 'p2 should be open.');
+ assert_true(p3.matches(':popover-open'), 'p3 should be open.');
+
+ await sendCloseRequest();
+ assert_false(p1.matches(':popover-open'), 'p1 should be closed.');
+ assert_false(p2.matches(':popover-open'), 'p2 should be closed.');
+ assert_false(p3.matches(':popover-open'), 'p3 should be closed.');
+}, 'Create three popovers without user activation');
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nnn.html b/tests/wpt/tests/close-watcher/user-activation/nnn.html
new file mode 100644
index 00000000000..9b604e91db2
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nnn.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ createRecordingCloseWatcher(t, events, "watcher1", type);
+ createRecordingCloseWatcher(t, events, "watcher2", type);
+ createRecordingCloseWatcher(t, events, "watcher3", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create three close watchers without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/ny-activate-preventDefault.html b/tests/wpt/tests/close-watcher/user-activation/ny-activate-preventDefault.html
new file mode 100644
index 00000000000..5ffb64b1134
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/ny-activate-preventDefault.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ watcher2.addEventListener("cancel", e => e.preventDefault());
+
+ await maybeTopLayerBless(watcher2);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create a close watcher with user activation that preventDefault()s cancel; send user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/ny.html b/tests/wpt/tests/close-watcher/user-activation/ny.html
new file mode 100644
index 00000000000..226912233e2
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/ny.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1", type);
+ await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create a close watcher with user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/popover-closewatcher-multiple-plus-free.html b/tests/wpt/tests/close-watcher/user-activation/nyn-popovers.html
index 4913b1454ef..b6df610ae03 100644
--- a/tests/wpt/tests/close-watcher/popover-closewatcher-multiple-plus-free.html
+++ b/tests/wpt/tests/close-watcher/user-activation/nyn-popovers.html
@@ -6,7 +6,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
-<script src="resources/helpers.js"></script>
+<script src="../resources/helpers.js"></script>
<button id=b0>b0</button>
@@ -39,5 +39,5 @@ promise_test(async () => {
assert_false(p1.matches(':popover-open'), 'second escape: p1 should be closed.');
assert_false(p2.matches(':popover-open'), 'second escape: p2 should be closed.');
assert_false(p3.matches(':popover-open'), 'second escape: p3 should be closed.');
-}, 'Multiple popovers opened from a single user activation close together, but original popover closes separately.');
+}, 'Create a popover without user activation; create a popover with user activation; create a popover without user activation');
</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nyn.html b/tests/wpt/tests/close-watcher/user-activation/nyn.html
new file mode 100644
index 00000000000..ec5153c7674
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nyn.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1");
+ await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ createRecordingCloseWatcher(t, events, "watcher3");
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create a close watcher with user activation; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nynn-destroy.html b/tests/wpt/tests/close-watcher/user-activation/nynn-destroy.html
new file mode 100644
index 00000000000..8519c8a2a94
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nynn-destroy.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1");
+ const watcher2 = await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ createRecordingCloseWatcher(t, events, "watcher3");
+ createRecordingCloseWatcher(t, events, "watcher4");
+
+ destroyCloseWatcher(watcher2);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create a close watcher with user activation; create two close watchers without user activation; remove the second close watcher");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nynn.html b/tests/wpt/tests/close-watcher/user-activation/nynn.html
new file mode 100644
index 00000000000..f6e74a0ba11
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nynn.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1");
+ await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ createRecordingCloseWatcher(t, events, "watcher3");
+ createRecordingCloseWatcher(t, events, "watcher4");
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create a close watcher with user activation; create two close watchers without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nyyn.html b/tests/wpt/tests/close-watcher/user-activation/nyyn.html
new file mode 100644
index 00000000000..f3987c1a214
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nyyn.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ const watcher3 = await createBlessedRecordingCloseWatcher(t, events, "watcher3", type, watcher2);
+ createRecordingCloseWatcher(t, events, "watcher4", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher4 close", "watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create two close watchers with user activation; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/nyyyn.html b/tests/wpt/tests/close-watcher/user-activation/nyyyn.html
new file mode 100644
index 00000000000..6cb8f3a4456
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/nyyyn.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+ const watcher1 = createRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ const watcher3 = await createBlessedRecordingCloseWatcher(t, events, "watcher3", type, watcher2);
+ await createBlessedRecordingCloseWatcher(t, events, "watcher4", type, watcher3);
+ createRecordingCloseWatcher(t, events, "watcher5", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher5 close", "watcher4 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher5 close", "watcher4 close", "watcher3 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher5 close", "watcher4 close", "watcher3 close", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher5 close", "watcher4 close", "watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create a close watcher without user activation; create three close watchers with user activation; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/y.html b/tests/wpt/tests/close-watcher/user-activation/y.html
new file mode 100644
index 00000000000..ee58a92293a
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/y.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ await createBlessedRecordingCloseWatcher(t, events, undefined, type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["cancel", "close"]);
+}, "Create a close watcher with user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yn-activate.html b/tests/wpt/tests/close-watcher/user-activation/yn-activate.html
new file mode 100644
index 00000000000..af7289aa28e
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yn-activate.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ await createBlessedRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await maybeTopLayerBless(watcher2);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close", "watcher1 cancel", "watcher1 close"]);
+}, "Create a close watcher with user activation; create a close watcher without user activation; send user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yn.html b/tests/wpt/tests/close-watcher/user-activation/yn.html
new file mode 100644
index 00000000000..8f7e90e2d85
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yn.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ await createBlessedRecordingCloseWatcher(t, events, "watcher1", type);
+ createRecordingCloseWatcher(t, events, "watcher2", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 close", "watcher1 close"]);
+}, "Create a close watcher with user activation; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/ynn.html b/tests/wpt/tests/close-watcher/user-activation/ynn.html
new file mode 100644
index 00000000000..8cc7f5bfb66
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/ynn.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ await createBlessedRecordingCloseWatcher(t, events, "watcher1", type);
+ createRecordingCloseWatcher(t, events, "watcher2", type);
+ createRecordingCloseWatcher(t, events, "watcher3", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create a close watcher with user activation; create two close watchers without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yy.html b/tests/wpt/tests/close-watcher/user-activation/yy.html
new file mode 100644
index 00000000000..0aa03cdd050
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yy.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = await createBlessedRecordingCloseWatcher(t, events, "watcher1", type);
+ await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher2 cancel", "watcher2 close", "watcher1 cancel", "watcher1 close"]);
+}, "Create two close watchers with user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yyn.html b/tests/wpt/tests/close-watcher/user-activation/yyn.html
new file mode 100644
index 00000000000..b87cf7a7e34
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yyn.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = await createBlessedRecordingCloseWatcher(t, events, "watcher1", type);
+ await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ createRecordingCloseWatcher(t, events, "watcher3", type);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 close", "watcher2 close", "watcher1 close"]);
+}, "Create two close watchers with user activation; create a close watcher without user activation");
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover.html b/tests/wpt/tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover.html
new file mode 100644
index 00000000000..f0a1cb06d10
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yyy-CloseWatcher-dialog-popover.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/pull/9462">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<button id=b0>button</button>
+
+<dialog id=dialog>
+ <button id=b1>button</button>
+ <div id=popover popover=auto>popover</div>
+</dialog>
+
+<script>
+promise_test(async t => {
+ const events = [];
+ const closeWatcher = await createBlessedRecordingCloseWatcher(t, events, 'CloseWatcher', 'CloseWatcher');
+ const dialog = await createBlessedRecordingCloseWatcher(t, events, 'dialog', 'dialog');
+ const popover = await createBlessedRecordingCloseWatcher(t, events, 'popover', 'popover', dialog);
+ assert_true(dialog.hasAttribute('open'), 'The dialog should be open.');
+ assert_true(popover.matches(':popover-open'), 'The popover should be open.');
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_false(popover.matches(':popover-open'), 'First close request: The popover should be closed.');
+ assert_true(dialog.hasAttribute('open'), 'First close request: The dialog should be open.');
+ assert_array_equals(events, []);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_false(popover.matches(':popover-open'), 'Second close request: The popover should be closed.');
+ assert_false(dialog.hasAttribute('open'), 'Second close request: The dialog should be closed.');
+ assert_array_equals(events, ['dialog cancel', 'dialog close']);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_false(popover.matches(':popover-open'), 'Third close request: The popover should be closed.');
+ assert_false(dialog.hasAttribute('open'), 'Third close request: The dialog should be closed.');
+ assert_array_equals(events, ['dialog cancel', 'dialog close', 'CloseWatcher cancel', 'CloseWatcher close']);
+}, 'Create a CloseWatcher with user activation; create a dialog with user activation; create a popover with user activation');
+</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover.html b/tests/wpt/tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover.html
new file mode 100644
index 00000000000..ed41d1bc321
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yyy-activate-CloseWatcher-dialog-popover.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/pull/9462">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<button id=b0>button</button>
+
+<dialog id=dialog>
+ <button id=b1>button</button>
+ <div id=popover popover=auto>popover</div>
+</dialog>
+
+<script>
+promise_test(async t => {
+ const events = [];
+ const closeWatcher = await createBlessedRecordingCloseWatcher(t, events, 'CloseWatcher', 'CloseWatcher');
+ const dialog = await createBlessedRecordingCloseWatcher(t, events, 'dialog', 'dialog');
+ const popover = await createBlessedRecordingCloseWatcher(t, events, 'popover', 'popover', dialog);
+ assert_true(dialog.hasAttribute('open'), 'The dialog should be open.');
+ assert_true(popover.matches(':popover-open'), 'The popover should be open.');
+
+ await blessTopLayer(popover);
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_false(popover.matches(':popover-open'), 'First close request: The popover should be closed.');
+ assert_true(dialog.hasAttribute('open'), 'First close request: The dialog should be open.');
+ assert_array_equals(events, []);
+
+ await blessTopLayer(dialog);
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_false(popover.matches(':popover-open'), 'Second close request: The popover should be closed.');
+ assert_false(dialog.hasAttribute('open'), 'Second close request: The dialog should be closed.');
+ assert_array_equals(events, ['dialog cancel', 'dialog close']);
+
+ await test_driver.bless();
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_false(popover.matches(':popover-open'), 'Third close request: The popover should be closed.');
+ assert_false(dialog.hasAttribute('open'), 'Third close request: The dialog should be closed.');
+ assert_array_equals(events, ['dialog cancel', 'dialog close', 'CloseWatcher cancel', 'CloseWatcher close']);
+}, 'Create a CloseWatcher with user activation; create a dialog with user activation; create a popover with user activation; sending user activation before each close request');
+</script>
diff --git a/tests/wpt/tests/close-watcher/popover-closewatcher.html b/tests/wpt/tests/close-watcher/user-activation/yyy-popovers.html
index b40ea2ec7c5..6f1b7394655 100644
--- a/tests/wpt/tests/close-watcher/popover-closewatcher.html
+++ b/tests/wpt/tests/close-watcher/user-activation/yyy-popovers.html
@@ -6,7 +6,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testdriver-actions.js"></script>
-<script src="resources/helpers.js"></script>
+<script src="../resources/helpers.js"></script>
<button id=b0>b0</button>
@@ -22,20 +22,6 @@
<script>
promise_test(async () => {
- p1.showPopover();
- p2.showPopover();
- p3.showPopover();
- assert_true(p1.matches(':popover-open'), 'p1 should be open.');
- assert_true(p2.matches(':popover-open'), 'p2 should be open.');
- assert_true(p3.matches(':popover-open'), 'p3 should be open.');
-
- await sendCloseRequest();
- assert_false(p1.matches(':popover-open'), 'p1 should be closed.');
- assert_false(p2.matches(':popover-open'), 'p2 should be closed.');
- assert_false(p3.matches(':popover-open'), 'p3 should be closed.');
-}, 'Opening multiple popovers without user activation causes them all to be closed with one close request.');
-
-promise_test(async () => {
await test_driver.click(b0);
p1.showPopover();
await test_driver.click(b1);
@@ -60,5 +46,5 @@ promise_test(async () => {
assert_false(p1.matches(':popover-open'), 'third escape: p1 should be closed.');
assert_false(p2.matches(':popover-open'), 'third escape: p2 should be closed.');
assert_false(p3.matches(':popover-open'), 'third escape: p3 should be closed.');
-}, 'Opening multiple popovers with user activation should close one at a time with close requests.');
+}, 'Create three popovers with user activation');
</script>
diff --git a/tests/wpt/tests/close-watcher/user-activation/yyy.html b/tests/wpt/tests/close-watcher/user-activation/yyy.html
new file mode 100644
index 00000000000..f16767a86bd
--- /dev/null
+++ b/tests/wpt/tests/close-watcher/user-activation/yyy.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta name=variant content="?dialog">
+<meta name=variant content="?CloseWatcher">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/common/top-layer.js"></script>
+<script src="../resources/helpers.js"></script>
+
+<body>
+<script>
+const type = location.search.substring(1);
+
+promise_test(async t => {
+ const events = [];
+
+ const watcher1 = await createBlessedRecordingCloseWatcher(t, events, "watcher1", type);
+ const watcher2 = await createBlessedRecordingCloseWatcher(t, events, "watcher2", type, watcher1);
+ await createBlessedRecordingCloseWatcher(t, events, "watcher3", type, watcher2);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 cancel", "watcher3 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 cancel", "watcher3 close", "watcher2 cancel", "watcher2 close"]);
+
+ await sendCloseRequest();
+ await waitForPotentialCloseEvent();
+ assert_array_equals(events, ["watcher3 cancel", "watcher3 close", "watcher2 cancel", "watcher2 close", "watcher1 cancel", "watcher1 close"]);
+}, "Create three close watchers with user activation");
+</script>
diff --git a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-opener.html b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-opener.html
index 0e25f792619..a09b07e5b70 100644
--- a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-opener.html
+++ b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-opener.html
@@ -1,4 +1,6 @@
<!DOCTYPE html>
+<meta charset="utf-8" />
+<meta name="timeout" content="long">
<title>Window that opens a popup in a cross-site context</title>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
@@ -26,17 +28,17 @@
}
// Verify whether third-party cookies are blocked by default.
- promise_test(async () => {
- const thirdPartyHttpCookie = "3P_http"
- await credFetch(
- `${origin}/cookies/resources/set.py?${thirdPartyHttpCookie}=foobar;` +
- "Secure;Path=/;SameSite=None");
- await assertHttpOriginCanAccessCookies({
+ if (navigator.userAgent.toLowerCase().indexOf('firefox') == -1) {
+ assertThirdPartyHttpCookies({
+ desc: "3P fetch",
origin,
- cookieNames: [thirdPartyHttpCookie],
+ cookieNames,
expectsCookie: false,
});
- }, "3P fetch: Cross site window setting HTTP cookies");
+ } else {
+ // Default behavior for third-party cookie blocking is flaky in Firefox.
+ throw new AssertionError("Testing default third-party cookie blocking is not implemented in Firefox.");
+ }
// Open the cookies' origin in a popup to activate the heuristic.
const popupUrl = new URL(
diff --git a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-verify.html b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-verify.html
index 8d4819ad829..6deb88b5d03 100644
--- a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-verify.html
+++ b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup-verify.html
@@ -1,4 +1,6 @@
<!DOCTYPE html>
+<meta charset="utf-8" />
+<meta name="timeout" content="long">
<title>Verifies heuristics enabled by popup</title>
<script src="/resources/testharness.js"></script>
<script src="/common/get-host-info.sub.js"></script>
diff --git a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup.html b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup.html
index 6f802007f8d..7addc7943c0 100644
--- a/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup.html
+++ b/tests/wpt/tests/cookies/third-party-cookies/resources/third-party-cookies-cross-site-popup.html
@@ -1,4 +1,6 @@
<!DOCTYPE html>
+<meta charset="utf-8" />
+<meta name="timeout" content="long">
<title>Cross-site popup</title>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
diff --git a/tests/wpt/tests/cookies/third-party-cookies/third-party-cookie-heuristics.tentative.https.html b/tests/wpt/tests/cookies/third-party-cookies/third-party-cookie-heuristics.tentative.https.html
index 3eb70432b94..32e7ab6d9ab 100644
--- a/tests/wpt/tests/cookies/third-party-cookies/third-party-cookie-heuristics.tentative.https.html
+++ b/tests/wpt/tests/cookies/third-party-cookies/third-party-cookie-heuristics.tentative.https.html
@@ -1,4 +1,6 @@
<!DOCTYPE html>
+<meta charset="utf-8" />
+<meta name="timeout" content="long">
<title>Test third-party cookie heuristics</title>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
diff --git a/tests/wpt/tests/credential-management/digital-identity.https.html b/tests/wpt/tests/credential-management/digital-identity.https.html
new file mode 100644
index 00000000000..1a9e09dbf3c
--- /dev/null
+++ b/tests/wpt/tests/credential-management/digital-identity.https.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<title>Digital Identity Credential tests.</title>
+<link rel="help" href="https://wicg.github.io/digital-identities/">
+<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>
+// Builds valid digital identity request for navigator.credentials.get() API.
+function buildValidNavigatorCredentialsRequest() {
+ return {
+ identity: {
+ providers: [{
+ holder: {
+ selector: {
+ format: ['mdoc'],
+ doctype: 'org.iso.18013.5.1.mDL',
+ fields: [
+ 'org.iso.18013.5.1.family_name',
+ 'org.iso.18013.5.1.portrait',
+ ]
+ },
+ params: {
+ nonce: '1234',
+ readerPublicKey: 'test_reader_public_key',
+ extraParamAsNeededByDigitalCredentials: true,
+ },
+ },
+ }],
+ },
+ };
+}
+
+// Builds valid digital identity request for navigator.identity.get() API.
+function buildValidNavigatorIdentityRequest() {
+ return {
+ digital: {
+ providers: [{
+ selector: {
+ format: ['mdoc'],
+ doctype: 'org.iso.18013.5.1.mDL',
+ fields: [
+ 'org.iso.18013.5.1.family_name',
+ 'org.iso.18013.5.1.portrait',
+ ]
+ },
+ params: {
+ nonce: '1234',
+ readerPublicKey: 'test_reader_public_key',
+ extraParamAsNeededByDigitalCredentials: true,
+ },
+ }],
+ },
+ };
+}
+
+// Requires browser to have mode where OS-presented digital-identity-prompt is
+// bypassed in favour of returning "fake_test_token" directly.
+promise_test(async t => {
+ const {token} = await navigator.credentials.get(buildValidNavigatorCredentialsRequest());
+ assert_equals("fake_test_token", token);
+}, "navigator.credentials.get() API works in toplevel frame.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorCredentialsRequest();
+ request.identity.providers = undefined;
+
+ await promise_rejects_js(t, TypeError, navigator.credentials.get(request));
+}, "navigator.credentials.get() API fails if IdentityCredentialRequestOptions::providers is not specified.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorCredentialsRequest();
+ request.identity.providers = [];
+
+ await promise_rejects_js(t, TypeError, navigator.credentials.get(request));
+}, "navigator.credentials.get() API fails if there are no providers.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorCredentialsRequest();
+ let providerCopy = structuredClone(request.identity.providers[0]);
+ request.identity.providers.push(providerCopy);
+ await promise_rejects_js(t, TypeError, navigator.credentials.get(request));
+}, "navigator.credentials.get() API fails if there is more than one provider.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorCredentialsRequest();
+ request.identity.providers[0].holder = undefined;
+
+ await promise_rejects_js(t, TypeError, navigator.credentials.get(request));
+}, "navigator.credentials.get() API fails if IdentityProviderConfig::holder is not specified.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorIdentityRequest();
+ let {token} = await navigator.identity.get(request);
+ assert_equals("fake_test_token", token);
+}, "navigator.identity.get() API works in toplevel frame.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorIdentityRequest();
+ request.digital.providers = undefined;
+
+ await promise_rejects_js(t, TypeError, navigator.identity.get(request));
+}, "navigator.identity.get() API fails if DigitalCredentialRequestOptions::providers is not specified.");
+
+promise_test(async t => {
+ let request = buildValidNavigatorIdentityRequest();
+ let providerCopy = structuredClone(request.digital.providers[0]);
+ request.digital.providers.push(providerCopy);
+ await promise_rejects_js(t, TypeError, navigator.identity.get(request));
+}, "navigator.identity.get() API fails if there is more than one provider.");
+
+promise_test(async t=> {
+ let abortController = new AbortController();
+ let request = buildValidNavigatorIdentityRequest();
+ request.signal = abortController.signal;
+ let requestPromise = navigator.identity.get(request);
+ abortController.abort();
+ await promise_rejects_dom(t, "AbortError", requestPromise);
+}, "navigator.identity.get() promise is rejected when the page aborts the request.");
+</script>
diff --git a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-basics.tentative.https.html b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-basics.tentative.https.html
new file mode 100644
index 00000000000..a71e2621352
--- /dev/null
+++ b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-basics.tentative.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>Federated Credential Management API Button Mode basic 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>
+
+<script type="module">
+import {request_options_with_mediation_required,
+ fedcm_test,
+ select_manifest,
+ fedcm_get_and_select_first_account} from '../support/fedcm-helper.sub.js';
+
+fedcm_test(async t => {
+ let test_options = request_options_with_mediation_required();
+ test_options.identity.mode = "button";
+ await select_manifest(t, test_options);
+
+ let result = navigator.credentials.get(test_options);
+ return promise_rejects_dom(t, 'NetworkError', result);
+}, "Test that the button mode without user activation will fail.");
+
+fedcm_test(async t => {
+ let test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
+ test_options.identity.mode = "button";
+
+ return test_driver.bless('initiate FedCM request', async function() {
+ let cred = await fedcm_get_and_select_first_account(t, test_options);
+ assert_equals(cred.token, "mode=button");
+ });
+}, "Test that the button mode succeeds with user activation.");
+
+</script>
diff --git a/tests/wpt/tests/credential-management/fedcm-button-mode-basics.https.html b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-priority.tentative.https.html
index abf46ee7db0..b71e84db47e 100644
--- a/tests/wpt/tests/credential-management/fedcm-button-mode-basics.https.html
+++ b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-button-mode-priority.tentative.https.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>Federated Credential Management API auto selected flag tests.</title>
+<title>Federated Credential Management API Button Mode priority tests.</title>
<link rel="help" href="https://fedidcg.github.io/FedCM">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -9,28 +9,22 @@
<script type="module">
import {request_options_with_mediation_required,
fedcm_test,
- select_manifest,
- fedcm_get_and_select_first_account} from './support/fedcm-helper.sub.js';
+ fedcm_get_and_select_first_account} from '../support/fedcm-helper.sub.js';
fedcm_test(async t => {
- let test_options = request_options_with_mediation_required();
- test_options.identity.mode = "button";
-
- let result = navigator.credentials.get(test_options);
- return promise_rejects_dom(t, 'NetworkError', result);
-}, "Test that the button mode without user activation will fail.");
-
-fedcm_test(async t => {
- let test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
- test_options.identity.mode = "button";
+ let widget_test_options = request_options_with_mediation_required();
+ let button_test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
+ button_test_options.identity.mode = "button";
return test_driver.bless('initiate FedCM request', async function() {
- let cred = await fedcm_get_and_select_first_account(t, test_options);
- assert_equals(cred.token, "mode=button");
+ let first_cred = await fedcm_get_and_select_first_account(t, button_test_options);
+ assert_equals(first_cred.token, "mode=button");
+ let second_cred = await fedcm_get_and_select_first_account(t, widget_test_options);
+ assert_equals(second_cred.token, "token");
});
-}, "Test that the button mode requires user activation.");
+}, "Test that the widget mode can succeed after the button mode.");
- fedcm_test(async t => {
+fedcm_test(async t => {
let widget_test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
let button_test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
button_test_options.identity.mode = "button";
@@ -46,19 +40,6 @@ fedcm_test(async t => {
}, "Test that the button mode can replace widget mode.");
fedcm_test(async t => {
- let widget_test_options = request_options_with_mediation_required();
- let button_test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
- button_test_options.identity.mode = "button";
-
- return test_driver.bless('initiate FedCM request', async function() {
- let first_cred = await fedcm_get_and_select_first_account(t, button_test_options);
- assert_equals(first_cred.token, "mode=button");
- let second_cred = await fedcm_get_and_select_first_account(t, widget_test_options);
- assert_equals(second_cred.token, "token");
- });
-}, "Test that the widget mode can succeed after the button mode.");
-
-fedcm_test(async t => {
let button_test_options = request_options_with_mediation_required("manifest_with_rp_mode.json");
button_test_options.identity.mode = "button";
diff --git a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html
new file mode 100644
index 00000000000..996523af847
--- /dev/null
+++ b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<title>Federated Credential Management API Use Another Account API 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>
+
+<script type="module">
+import {request_options_with_mediation_required,
+ fedcm_test,
+ fedcm_get_dialog_type_promise,
+ manifest_origin,
+ open_and_wait_for_popup,
+ select_manifest} from '../support/fedcm-helper.sub.js';
+
+const url_path = '/credential-management/support/fedcm/'
+const url_prefix = manifest_origin + url_path;
+
+async function set_accounts_cookie(value) {
+ await open_and_wait_for_popup(manifest_origin, url_path + 'set_accounts_cookie.py?' + value);
+}
+
+fedcm_test(async t => {
+ await set_accounts_cookie("1");
+
+ let test_options =
+ request_options_with_mediation_required("manifest_with_variable_accounts.json");
+ test_options.identity.mode = "button";
+ await select_manifest(t, test_options);
+
+ // Trigger FedCM and wait for the initial dialog.
+ let cred_promise = null;
+ await test_driver.bless('initiate FedCM request', async function() {
+ cred_promise = navigator.credentials.get(test_options);
+ });
+
+ let type = await fedcm_get_dialog_type_promise(t);
+ assert_equals(type, "AccountChooser");
+
+ // Tell the account endpoint to now return 2 accounts and click use other account.
+ await set_accounts_cookie("2");
+ await window.test_driver.click_fedcm_dialog_button("ConfirmIdpLoginContinue");
+
+ // Wait for the account chooser to appear again.
+ type = await fedcm_get_dialog_type_promise(t);
+ assert_equals(type, "AccountChooser");
+
+ await window.test_driver.select_fedcm_account(1);
+ const cred = await cred_promise;
+ assert_equals(cred.token, "account_id=jane_doe");
+}, 'Test that the "Use Other Account" button works correctly.');
+
+
+fedcm_test(async t => {
+ await set_accounts_cookie("1");
+
+ let test_options =
+ request_options_with_mediation_required("manifest_with_variable_accounts.json");
+ test_options.identity.mode = "button";
+ await select_manifest(t, test_options);
+
+ // Trigger FedCM and wait for the initial dialog.
+ let cred_promise = null;
+ await test_driver.bless('initiate FedCM request', async function() {
+ cred_promise = navigator.credentials.get(test_options);
+ });
+
+ let type = await fedcm_get_dialog_type_promise(t);
+ assert_equals(type, "AccountChooser");
+
+ // Click use other account but without changing the account returned.
+ await window.test_driver.click_fedcm_dialog_button("ConfirmIdpLoginContinue");
+
+ // Wait for the account chooser to appear again.
+ type = await fedcm_get_dialog_type_promise(t);
+ assert_equals(type, "AccountChooser");
+
+ await window.test_driver.select_fedcm_account(0);
+ const cred = await cred_promise;
+ assert_equals(cred.token, "account_id=1234");
+}, 'Test that the "Use Other Account" button works correctly when accounts do not change.');
+
+</script>
diff --git a/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html
new file mode 100644
index 00000000000..2022bbc0f72
--- /dev/null
+++ b/tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>Federated Credential Management API Use Another Account API 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>
+
+<script type="module">
+import {request_options_with_mediation_required,
+ fedcm_test,
+ fedcm_get_dialog_type_promise,
+ manifest_origin,
+ open_and_wait_for_popup,
+ select_manifest} from '../support/fedcm-helper.sub.js';
+
+const url_path = '/credential-management/support/fedcm/'
+const url_prefix = manifest_origin + url_path;
+
+async function set_accounts_cookie(value) {
+ await open_and_wait_for_popup(manifest_origin, url_path + 'set_accounts_cookie.py?' + value);
+}
+
+fedcm_test(async t => {
+ await set_accounts_cookie("1");
+
+ let test_options =
+ request_options_with_mediation_required("manifest_with_variable_accounts.json");
+ await select_manifest(t, test_options);
+
+ // Trigger FedCM and wait for the initial dialog.
+ const cred_promise = navigator.credentials.get(test_options);
+ let type = await fedcm_get_dialog_type_promise(t);
+ assert_equals(type, "AccountChooser");
+
+ // Tell the account endpoint to now return 2 accounts and click use other account.
+ await set_accounts_cookie("2");
+ await window.test_driver.click_fedcm_dialog_button("ConfirmIdpLoginContinue");
+
+ // Wait for the account chooser to appear again.
+ type = await fedcm_get_dialog_type_promise(t);
+ assert_equals(type, "AccountChooser");
+
+ await window.test_driver.select_fedcm_account(1);
+ const cred = await cred_promise;
+ assert_equals(cred.token, "account_id=jane_doe");
+}, 'Test that the "Use Other Account" button works correctly.');
+
+</script>
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json b/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json
index 10c2ddd55d1..9e4af250045 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json
+++ b/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json
@@ -2,5 +2,13 @@
"accounts_endpoint": "variable_accounts.py",
"client_metadata_endpoint": "client_metadata.py",
"id_assertion_endpoint": "token_with_account_id.py",
- "login_url": "login.html"
+ "login_url": "login.html",
+ "modes": {
+ "button": {
+ "supports_use_other_account": true
+ },
+ "widget": {
+ "supports_use_other_account": true
+ }
+ }
}
diff --git a/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py b/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py
new file mode 100644
index 00000000000..ab349922104
--- /dev/null
+++ b/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py
@@ -0,0 +1,21 @@
+def main(request, response):
+ query_string = request.url_parts[3]
+ # We mark the cookie as HttpOnly so that this request
+ # can be made before login.html, which would overwrite
+ # the value to 1.
+ header_value = "accounts={}; SameSite=None; Secure; HttpOnly".format(query_string)
+ response.headers.set(b"Set-Cookie", header_value.encode("utf-8"))
+ response.headers.set(b"Content-Type", b"text/html")
+
+ return """
+<!DOCTYPE html>
+<script>
+// The important part of this page are the headers.
+
+// If this page was opened as a popup, notify the opener.
+if (window.opener) {
+ window.opener.postMessage("done_loading", "*");
+}
+</script>
+Sent header value: {}".format(header_value)
+"""
diff --git a/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py b/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py
index c9db2c4528e..fc4446acc49 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py
+++ b/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py
@@ -1,25 +1,14 @@
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
-
- response.headers.set(b"Content-Type", b"application/json")
-
- if request.cookies.get(b"accounts") != b"1":
- return """
-{
- "accounts": [
- ]
-}
+result_json = """
+{{
+ "accounts": [{}]
+}}
"""
-
- return """
+one_account = """
{
- "accounts": [{
"id": "1234",
"given_name": "John",
"name": "John Doe",
@@ -28,6 +17,33 @@ def main(request, response):
"approved_clients": ["123", "456", "789"],
"login_hints": ["john_doe"],
"hosted_domains": ["idp.example", "example"]
- }]
+ }
+"""
+
+
+two_accounts = one_account + """
+, {
+ "id": "jane_doe",
+ "given_name": "Jane",
+ "name": "Jane Doe",
+ "email": "jane_doe@idp.example",
+ "picture": "https://idp.example/profile/5678",
+ "approved_clients": ["123", "abc"]
}
"""
+
+def main(request, response):
+ request_error = error_checker.accountsCheck(request)
+ if (request_error):
+ return request_error
+
+ response.headers.set(b"Content-Type", b"application/json")
+
+ if request.cookies.get(b"accounts") == b"1":
+ return result_json.format(one_account)
+ if request.cookies.get(b"accounts") == b"2":
+ return result_json.format(two_accounts)
+
+ return result_json.format("")
+
+
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-default-001.html
index 8bb59851ee6..1700a84aa88 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-default-001.html
@@ -13,16 +13,15 @@
.target {
position: fixed;
background: lime;
- position-fallback: --pf;
+ position-try-options: --pf;
+ left: 999999px; /* force fallback */
}
-@position-fallback --pf {
- @try {
- top: anchor(bottom, 0px);
- left: anchor(left, 0px);
- width: anchor-size(width, 0px);
- height: anchor-size(height, 0px);
- }
+@position-try --pf {
+ top: anchor(bottom, 0px);
+ left: anchor(left, 0px);
+ width: anchor-size(width, 0px);
+ height: anchor-size(height, 0px);
}
body {
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-default-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-default-002.html
index 261119e0174..c0a962ad367 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-default-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-default-002.html
@@ -13,16 +13,15 @@
.target {
position: fixed;
background: lime;
- position-fallback: --pf;
+ position-try-options: --pf;
+ left: 999999px; /* force fallback */
}
-@position-fallback --pf {
- @try {
- top: anchor(bottom, 0px);
- left: anchor(left, 0px);
- width: anchor-size(width, 0px);
- height: anchor-size(height, 0px);
- }
+@position-try --pf {
+ top: anchor(bottom, 0px);
+ left: anchor(left, 0px);
+ width: anchor-size(width, 0px);
+ height: anchor-size(height, 0px);
}
body {
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 f9fca976544..da9ec4a1451 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
@@ -28,22 +28,21 @@ body {
.target {
position: absolute;
+ left: 999999px;
width: 100px;
height: 100px;
background: lime;
- position-fallback: --pf;
+ position-try-options: --pf, --pf2;
}
-@position-fallback --pf {
- @try {
- top: anchor(top);
- left: anchor(right);
- }
-
- @try {
- top: anchor(top);
- right: anchor(left);
- }
+@position-try --pf {
+ top: anchor(top);
+ left: anchor(right);
+}
+@position-try --pf2 {
+ top: anchor(top);
+ right: anchor(left);
+ left: auto;
}
#anchor1 {
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 bc7e231e7ce..32cd9de0054 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
@@ -29,8 +29,10 @@ div {
position: absolute;
anchor-default: --a1;
background: green;
- position-fallback: --fallback;
+ position-try-options: --fallback;
anchor-name: --a2;
+ left: anchor(--a1 left);
+ bottom: anchor(--a1 top);
}
#anchored2 {
@@ -41,15 +43,9 @@ div {
background: lime;
}
-@position-fallback --fallback {
- @try {
- left: anchor(--a1 left);
- bottom: anchor(--a1 top);
- }
- @try {
- left: anchor(--a1 right);
- top: anchor(--a1 top);
- }
+@position-try --fallback {
+ left: anchor(--a1 right);
+ top: anchor(--a1 top);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-001.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html
index 04518e50193..b696ae0060c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-001.html
@@ -36,29 +36,28 @@
position: absolute;
background: green;
anchor-default: --a;
- position-fallback: --fallback;
+ position-try-options: --f1, --f2;
+ width: 100px; height: 100px;
+ /* Above the anchor */
+ left: anchor(--a left);
+ bottom: anchor(--a top);
}
-@position-fallback --fallback {
- /* Above the anchor */
- @try {
- width: 100px; height: 100px;
- left: anchor(--a left);
- bottom: anchor(--a top);
- }
+@position-try --f1 {
/* Left of the anchor */
- @try {
- width: 100px; height: 100px;
- right: anchor(--a left);
- top: anchor(--a top);
- }
+ right: anchor(--a left);
+ top: anchor(--a top);
+ bottom: auto;
+ left: auto;
+}
+
+@position-try --f2 {
/* Right of the anchor */
- @try {
- width: 100px; height: 100px;
- left: anchor(--a right);
- top: anchor(--a top);
- }
+ left: anchor(--a right);
+ top: anchor(--a top);
+ bottom: auto;
}
+
</style>
<div id="cb">
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-002.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html
index f30c35d390d..3b84124705c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-002.html
@@ -33,12 +33,13 @@ body {
background: green;
anchor-default: --a;
top: anchor(--a top);
- position-fallback: --pf;
+ left: anchor(--a right);
+ position-try-options: --pf;
}
-@position-fallback --pf {
- @try { left: anchor(--a right); }
- @try { right: anchor(--a left); }
+@position-try --pf {
+ left: auto;
+ right: anchor(--a left);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-003.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html
index 60bc9b919af..dd9fdc92c2e 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-003.html
@@ -35,16 +35,17 @@
#anchored {
position: absolute;
+ top: anchor(--a bottom);
width: 100px;
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf;
}
-@position-fallback --pf {
- @try { top: anchor(--a bottom); }
- @try { bottom: anchor(--a top); }
+@position-try --pf {
+ top: auto;
+ bottom: anchor(--a top);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-004.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html
index 99e4f9c30d1..0aab60b7a81 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-004.html
@@ -34,16 +34,23 @@ body {
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf1, --pf2;
+ /* Top of the anchor */
+ bottom: anchor(--a top);
+ left: anchor(--a left);
}
-@position-fallback --pf {
- /* Top of the anchor */
- @try { bottom: anchor(--a top); left: anchor(--a left); }
+@position-try --pf1 {
/* Bottom of the anchor */
- @try { top: anchor(--a bottom); left: anchor(--a left); }
+ top: anchor(--a bottom);
+ bottom: auto;
+}
+@position-try --pf2 {
/* Left of the anchor */
- @try { top: anchor(--a top); right: anchor(--a left); }
+ top: anchor(--a top);
+ right: anchor(--a left);
+ bottom: auto;
+ left: auto;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-005.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html
index 0adfe0834d8..e2dac13abd7 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-005.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-005.html
@@ -34,12 +34,13 @@ body {
background: green;
anchor-default: --a;
top: anchor(--a top);
- position-fallback: --pf;
+ left: anchor(--a right);
+ position-try-options: --pf;
}
-@position-fallback --pf {
- @try { left: anchor(--a right); }
- @try { right: anchor(--a left); }
+@position-try --pf {
+ left: auto;
+ right: anchor(--a left);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-006.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html
index b4a1a24de69..1f9004de54f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-006.html
@@ -29,26 +29,25 @@ body {
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try: --pf1, --pf2, --pf3;
+ inset-block-start: anchor(--a end);
+ inset-inline-start: anchor(--a end);
}
-@position-fallback --pf {
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-end: anchor(--a start);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-end: anchor(--a start);
- }
+@position-try --pf1 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-start: anchor(--a end);
+}
+@position-try --pf2 {
+ inset: auto;
+ inset-block-start: anchor(--a end);
+ inset-inline-end: anchor(--a start);
+}
+@position-try --pf3 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-end: anchor(--a start);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-007.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html
index baa283ba944..32b7f641732 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-007.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-007.html
@@ -33,26 +33,25 @@ html {
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf1, --pf2, --pf3;
+ inset-block-start: anchor(--a end);
+ inset-inline-start: anchor(--a end);
}
-@position-fallback --pf {
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-end: anchor(--a start);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-end: anchor(--a start);
- }
+@position-try --pf1 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-start: anchor(--a end);
+}
+@position-try --pf2 {
+ inset: auto;
+ inset-block-start: anchor(--a end);
+ inset-inline-end: anchor(--a start);
+}
+@position-try --pf3 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-end: anchor(--a start);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-008.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html
index ae625d58239..99f180bb463 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-008.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-008.html
@@ -34,26 +34,25 @@ html {
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf1, --pf2, --pf3;
+ inset-block-start: anchor(--a end);
+ inset-inline-start: anchor(--a end);
}
-@position-fallback --pf {
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-end: anchor(--a start);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-end: anchor(--a start);
- }
+@position-try --pf1 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-start: anchor(--a end);
+}
+@position-try --pf2 {
+ inset: auto;
+ inset-block-start: anchor(--a end);
+ inset-inline-end: anchor(--a start);
+}
+@position-try --pf3 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-end: anchor(--a start);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-009.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html
index b355d476e6b..0267d1987be 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-009.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-009.html
@@ -33,26 +33,25 @@ html {
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf1, --pf2, --pf3;
+ inset-block-start: anchor(--a end);
+ inset-inline-start: anchor(--a end);
}
-@position-fallback --pf {
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-end: anchor(--a start);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-end: anchor(--a start);
- }
+@position-try --pf1 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-start: anchor(--a end);
+}
+@position-try --pf2 {
+ inset: auto;
+ inset-block-start: anchor(--a end);
+ inset-inline-end: anchor(--a start);
+}
+@position-try --pf3 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-end: anchor(--a start);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-010.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html
index a0dd599b3b6..133649c720f 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-010.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-010.html
@@ -34,26 +34,25 @@ html {
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf1, --pf2, --pf3;
+ inset-block-start: anchor(--a end);
+ inset-inline-start: anchor(--a end);
}
-@position-fallback --pf {
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-start: anchor(--a end);
- }
- @try {
- inset-block-start: anchor(--a end);
- inset-inline-end: anchor(--a start);
- }
- @try {
- inset-block-end: anchor(--a start);
- inset-inline-end: anchor(--a start);
- }
+@position-try --pf1 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-start: anchor(--a end);
+}
+@position-try --pf2 {
+ inset: auto;
+ inset-block-start: anchor(--a end);
+ inset-inline-end: anchor(--a start);
+}
+@position-try --pf3 {
+ inset: auto;
+ inset-block-end: anchor(--a start);
+ inset-inline-end: anchor(--a start);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-011.html b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html
index 98fa4b5f86c..005a4ee728c 100644
--- a/tests/wpt/tests/css/css-anchor-position/anchor-scroll-fallback-position-011.html
+++ b/tests/wpt/tests/css/css-anchor-position/anchor-scroll-position-try-011.html
@@ -46,26 +46,25 @@
height: 100px;
background: green;
anchor-default: --a;
- position-fallback: --pf;
+ position-try-options: --pf1, --pf2, --pf3;
+ bottom: anchor(--a top);
+ left: anchor(--a right);
}
-@position-fallback --pf {
- @try {
- bottom: anchor(--a top);
- left: anchor(--a right);
- }
- @try {
- top: anchor(--a bottom);
- left: anchor(--a right);
- }
- @try {
- bottom: anchor(--a top);
- right: anchor(--a left);
- }
- @try {
- top: anchor(--a bottom);
- right: anchor(--a left);
- }
+@position-try --pf1 {
+ inset: auto;
+ top: anchor(--a bottom);
+ left: anchor(--a right);
+}
+@position-try --pf2 {
+ inset: auto;
+ bottom: anchor(--a top);
+ right: anchor(--a left);
+}
+@position-try --pf3 {
+ inset: auto;
+ top: anchor(--a bottom);
+ right: anchor(--a left);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-fallback-position-parse.html b/tests/wpt/tests/css/css-anchor-position/at-fallback-position-parse.html
deleted file mode 100644
index 942d9a29845..00000000000
--- a/tests/wpt/tests/css/css-anchor-position/at-fallback-position-parse.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<title>Tests parsing of @fallback-position rule</title>
-<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
-<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>
-test_valid_rule('@position-fallback --foo {\n}');
-test_valid_rule(`@position-fallback --foo {
- @try { }
-}`);
-
-// @position-fallback needs exactly one <dashed-ident> as its name
-test_invalid_rule('@position-fallback {\n}');
-test_invalid_rule('@position-fallback foo {\n}');
-test_invalid_rule('@position-fallback --foo --bar {\n}');
-test_invalid_rule('@position-fallback --foo, --bar {\n}');
-
-// @position-fallback accepts only @try blocks as its child rules. Other
-// contents should be ignored.
-test_valid_rule('@position-fallback --foo { top: 1px; }',
- '@position-fallback --foo {\n}');
-test_valid_rule('@position-fallback --foo { --bar: 1px; }',
- '@position-fallback --foo {\n}');
-test_valid_rule('@position-fallback --foo { @keyframes bar {} }',
- '@position-fallback --foo {\n}');
-test_valid_rule('@position-fallback --foo { @font-face {} }',
- '@position-fallback --foo {\n}');
-test_valid_rule('@position-fallback --foo { arbitrary garbage }',
- '@position-fallback --foo {\n}');
-
-// @try accepts only regular style declarations. Other contents should be
-// ignored.
-test_valid_rule('@position-fallback --foo { @try { @keyframes bar { } } }',
- '@position-fallback --foo {\n @try { }\n}');
-test_valid_rule('@position-fallback --foo { @try { @font-face { } } }',
- '@position-fallback --foo {\n @try { }\n}');
-</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-position-fallback-cssom.html b/tests/wpt/tests/css/css-anchor-position/at-position-fallback-cssom.html
deleted file mode 100644
index df295bf2d0a..00000000000
--- a/tests/wpt/tests/css/css-anchor-position/at-position-fallback-cssom.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html>
-<title>Tests the CSSOM interfaces of @position-fallback and @try rules</title>
-<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#interfaces">
-<link rel="author" href="mailto:xiaochengh@chromium.org">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<div id="anchor"></div>
-<div id="not-anchor"></div>
-<div id="target"></div>
-
-<script>
-function createStyle(t, text) {
- const style = document.createElement('style');
- style.textContent = text;
- t.add_cleanup(() => style.remove());
- document.head.appendChild(style);
- return style;
-}
-
-test(t => {
- const style = createStyle(
- t, '@position-fallback --pf { @try { left: anchor(right); } }');
- const positionFallbackRule = style.sheet.cssRules[0];
- assert_true(positionFallbackRule instanceof CSSPositionFallbackRule);
- assert_equals(positionFallbackRule.name, '--pf');
- assert_equals(positionFallbackRule.cssRules.length, 1);
-
- const tryRule = positionFallbackRule.cssRules[0];
- assert_true(tryRule instanceof CSSTryRule);
- assert_true(tryRule.style instanceof CSSStyleDeclaration);
- assert_equals(tryRule.style.length, 1);
- assert_equals(tryRule.style.left, 'anchor(right)');
-}, 'CSSPositionFallbackRule and CSSTryRule attribute values');
-
-test(t => {
- const style = createStyle(t, '@position-fallback --pf {}');
- const positionFallbackRule = style.sheet.cssRules[0];
-
- assert_equals(positionFallbackRule.insertRule('@try {}', 0), 0,
- '@try rules can be inserted');
- assert_throws_dom('HierarchyRequestError',
- () => positionFallbackRule.insertRule('#target { color: red; }', 1),
- 'style rules cannot be inserted');
- assert_throws_dom('HierarchyRequestError',
- () => positionFallbackRule.insertRule('@keyframes foo {}', 1),
- 'other at-rules cannot be inserted');
-}, 'CSSPositionFallbackRule.insertRule can insert @try rules only');
-
-
-test(t => {
- const style = createStyle(t, `
- @position-fallback --pf { @try { top: anchor(top); } }
- #anchor, #not-anchor, #target {
- position: absolute; width: 100px; height: 100px; left: 0;
- }
- #anchor { top: 100px; anchor-name: --a; }
- #not-anchor { top: 200px; anchor-name: --b; }
- #target { position-fallback: --pf; anchor-default: --a; }
- `);
- const positionFallbackRule = style.sheet.cssRules[0];
- const tryRule = positionFallbackRule.cssRules[0];
-
- // Check the initial position fallback result
- assert_equals(target.getBoundingClientRect().left, 0);
- assert_equals(target.getBoundingClientRect().top, 100);
-
- // `left` is an allowed property in `@try` and should affect position fallback.
- tryRule.style.setProperty('left', 'anchor(right)');
- assert_equals(target.getBoundingClientRect().left, 100);
- assert_equals(target.getBoundingClientRect().top, 100);
-
- // These properties are disallowed in `@try` rule, and hence should not affect
- // position fallback.
- tryRule.style.setProperty('anchor-default', '--b');
- tryRule.style.setProperty('position', 'static');
- assert_equals(target.getBoundingClientRect().left, 100);
- assert_equals(target.getBoundingClientRect().top, 100);
-}, 'CSSTryRule.style.setProperty setting allowed and disallowed properties');
-
-</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-fallback-position-allowed-declarations.html b/tests/wpt/tests/css/css-anchor-position/at-position-try-allowed-declarations.html
index cca222ac6d7..622e9827b44 100644
--- a/tests/wpt/tests/css/css-anchor-position/at-fallback-position-allowed-declarations.html
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-allowed-declarations.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>Tests which properties are allowed in @fallback-position</title>
+<title>Tests which properties are allowed in @position-try</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
<link rel="author" href="mailto:xiaochengh@chromium.org">
<script src="/resources/testharness.js"></script>
@@ -15,21 +15,21 @@ function test_allowed_declaration(property, value = '1px') {
test(t => {
t.add_cleanup(cleanup);
const serialization = `${property}: ${value}`;
- const rule = `@position-fallback --foo { @try { ${property}: ${value}; } }`;
+ const rule = `@position-try --foo { ${property}: ${value}; }`;
const index = style.sheet.insertRule(rule);
- const parsed = style.sheet.cssRules[index].cssRules[0];
- assert_equals(parsed.cssText, `@try { ${serialization}; }`);
- }, `${property}: ${value} is allowed in @fallback-position`);
+ const parsed = style.sheet.cssRules[index];
+ assert_equals(parsed.cssText, `@position-try --foo { ${serialization}; }`);
+ }, `${property}: ${value} is allowed in @position-try`);
}
function test_disallowed_declaration(property, value = '1px') {
test(t => {
t.add_cleanup(cleanup);
- const rule = `@position-fallback --foo { @try { ${property}: ${value}; } }`;
+ const rule = `@position-try --foo { ${property}: ${value}; }`;
const index = style.sheet.insertRule(rule);
- const parsed = style.sheet.cssRules[index].cssRules[0];
- assert_equals(parsed.cssText, `@try { }`);
- }, `${property}: ${value} is disallowed in @fallback-position`);
+ const parsed = style.sheet.cssRules[index];
+ assert_equals(parsed.cssText, `@position-try --foo { }`);
+ }, `${property}: ${value} is disallowed in @position-try`);
}
// Inset properties are allowed
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
new file mode 100644
index 00000000000..d4a1f4fa24c
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-cssom.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<title>Tests the CSSOM interfaces of @position-try rules</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#interfaces">
+<link rel="author" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="anchor"></div>
+<div id="not-anchor"></div>
+<div id="target"></div>
+
+<script>
+function createStyle(t, text) {
+ const style = document.createElement('style');
+ style.textContent = text;
+ t.add_cleanup(() => style.remove());
+ document.head.appendChild(style);
+ return style;
+}
+
+test(t => {
+ const style = createStyle(
+ t, '@position-try --pf { left: anchor(right); }');
+ const positionTryRule = style.sheet.cssRules[0];
+ assert_true(positionTryRule instanceof CSSPositionTryRule);
+ assert_equals(positionTryRule.name, '--pf');
+ assert_true(positionTryRule.style instanceof CSSStyleDeclaration);
+ assert_equals(positionTryRule.style.length, 1);
+ assert_equals(positionTryRule.style.left, 'anchor(right)');
+}, 'CSSPositionTryRule attribute values');
+
+test(t => {
+ const style = createStyle(t, `
+ @position-try --pf { top: anchor(top); left: 0; }
+ #anchor, #not-anchor, #target {
+ position: absolute; width: 100px; height: 100px;
+ }
+ #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; }
+ `);
+ const positionTryRule = style.sheet.cssRules[0];
+
+ // Check the initial position fallback result
+ assert_equals(target.getBoundingClientRect().left, 0);
+ assert_equals(target.getBoundingClientRect().top, 100);
+
+ // `left` is an allowed property in `@position-try` and should affect position fallback.
+ positionTryRule.style.setProperty('left', 'anchor(right)');
+ assert_equals(target.getBoundingClientRect().left, 100);
+ assert_equals(target.getBoundingClientRect().top, 100);
+
+ // 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', 'static');
+ assert_equals(target.getBoundingClientRect().left, 100);
+ assert_equals(target.getBoundingClientRect().top, 100);
+}, 'CSSPositionTryRule.style.setProperty setting allowed and disallowed properties');
+
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-position-fallback-invalidation-shadow-dom.html b/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html
index 066cba1dac7..e5d6c51a0b9 100644
--- a/tests/wpt/tests/css/css-anchor-position/at-position-fallback-invalidation-shadow-dom.html
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation-shadow-dom.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>CSS Anchor Positioning Test: Dynamically change @position-fallback rules in Shadow DOM</title>
+<title>CSS Anchor Positioning Test: Dynamically change @position-try rules in Shadow DOM</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -11,8 +11,9 @@
<template shadowrootmode="open">
<style>
::slotted(#slotted), :host {
- position-fallback: --pf;
+ position-try-options: --pf;
position: absolute;
+ left: 999999px; /* force fallback */
}
</style>
<slot></slot>
@@ -22,24 +23,22 @@
<script>
test(() => {
- assert_equals(host.offsetLeft, 0);
- }, "#host is initially left:auto");
+ assert_equals(host.offsetLeft, 999999);
+ }, "#host is initially left: 999999px");
test(() => {
- assert_equals(slotted.offsetLeft, 0);
- }, "#slotted is initially left:auto");
+ assert_equals(slotted.offsetLeft, 999999);
+ }, "#slotted is initially left: 999999px");
host.shadowRoot.styleSheets[0].insertRule(`
- @position-fallback --pf {
- @try { left: 100px; }
- }
+ @position-try --pf { left: 100px; }
`);
test(() => {
assert_equals(host.offsetLeft, 100);
- }, "#host with inserted @position-fallback applied");
+ }, "#host with inserted @position-try applied");
test(() => {
assert_equals(slotted.offsetLeft, 100);
- }, "#slotted with inserted @position-fallback applied");
+ }, "#slotted with inserted @position-try applied");
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-position-fallback-invalidation.html b/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation.html
index 68a08749312..3f7c5062f21 100644
--- a/tests/wpt/tests/css/css-anchor-position/at-position-fallback-invalidation.html
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-invalidation.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>CSS Anchor Positioning Test: Dynamically change @position-fallback rules</title>
+<title>CSS Anchor Positioning Test: Dynamically change @position-try rules</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -10,17 +10,21 @@
anchor-name: --a;
margin-left: 100px;
width: 100px;
+ height: 100px;
}
#anchored {
position: absolute;
- position-fallback: --pf;
+ width: 100px;
+ height: 100px;
+ position-try-options: --pf;
+ left: 999999px; /* force fallback */
}
</style>
<style id="to-enable" media="print">
- @position-fallback --pf {
- @try { left: anchor(--a left); }
+ @position-try --pf {
+ left: anchor(--a left);
}
</style>
@@ -31,27 +35,27 @@
<script>
test(() => {
- assert_equals(anchored.offsetLeft, 0);
- }, "Position-fallback initially not matching any rules");
+ assert_equals(anchored.offsetLeft, 999999);
+ }, "position-try-options initially not matching any rules");
test(() => {
document.getElementById("to-enable").media = "";
assert_equals(anchored.offsetLeft, 100);
- }, "Enable @position-fallback rule stylesheet");
+ }, "Enable @position-try rule stylesheet");
const sheet = document.getElementById("to-enable").sheet;
test(() => {
sheet.insertRule(
- `@position-fallback --pf {
- @try { left: anchor(--a right); }
+ `@position-try --pf {
+ left: anchor(--a right);
}`, 1);
assert_equals(anchored.offsetLeft, 200);
- }, "Insert overriding @position-fallback rule");
+ }, "Insert overriding @position-try rule");
test(() => {
sheet.disabled = "true";
- assert_equals(anchored.offsetLeft, 0);
- }, "Disable the @position-fallback rules");
+ assert_equals(anchored.offsetLeft, 999999);
+ }, "Disable the @position-try rules");
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/at-position-try-parse.html b/tests/wpt/tests/css/css-anchor-position/at-position-try-parse.html
new file mode 100644
index 00000000000..27f5c8687b2
--- /dev/null
+++ b/tests/wpt/tests/css/css-anchor-position/at-position-try-parse.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>CSS Anchor Positioning Test: parsing of @position-try rules</title>
+<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script>
+test_valid_rule('@position-try --foo { }');
+test_valid_rule(`@position-try --foo { top: 1px; }`);
+
+// @position-try needs exactly one <dashed-ident> as its name
+test_invalid_rule('@position-try { }');
+test_invalid_rule('@position-try foo { }');
+test_invalid_rule('@position-try --foo --bar { }');
+test_invalid_rule('@position-try --foo, --bar { }');
+
+// @position-try only accepts a limited set of properties.
+test_valid_rule('@position-try --foo { backround-color: green; }',
+ '@position-try --foo { }');
+
+// @position-try accepts only regular style declarations. Other
+// contents should be ignored.
+test_valid_rule('@position-try --foo { @keyframes bar {} }',
+ '@position-try --foo { }');
+test_valid_rule('@position-try --foo { @font-face {} }',
+ '@position-try --foo { }');
+test_valid_rule('@position-try --foo { @media print {} }',
+ '@position-try --foo { }');
+test_valid_rule('@position-try --foo { & {} }',
+ '@position-try --foo { }');
+test_valid_rule('@position-try --foo { arbitrary garbage }',
+ '@position-try --foo { }');
+
+</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/chrome-1512373-2-crash.html b/tests/wpt/tests/css/css-anchor-position/chrome-1512373-2-crash.html
index ac27d8c2647..433609766c9 100644
--- a/tests/wpt/tests/css/css-anchor-position/chrome-1512373-2-crash.html
+++ b/tests/wpt/tests/css/css-anchor-position/chrome-1512373-2-crash.html
@@ -1,15 +1,12 @@
<!DOCTYPE html>
-<title>Chrome crash bug 1512373 with @try fallback</title>
+<title>Chrome crash bug 1512373 with @position-try fallback</title>
<link rel="help" href="https://crbug.com/1512373">
<style>
- @position-fallback --foo {
- @try {
- left: 0;
- }
- }
+ @position-try --foo { left: 0; }
#t {
position: absolute;
- position-fallback: --foo;
+ left: 999999px; /* force fallback */
+ position-try-options: --foo;
}
</style>
<div id="t"></div>
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 7735115e592..ebd1e78fb9a 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
@@ -49,20 +49,22 @@ body {
#target1 {
anchor-default: --a1;
- position-fallback: --top-then-bottom;
+ bottom: anchor(top);
+ position-try-options: --bottom;
}
#target2 {
anchor-default: --a2;
- position-fallback: --bottom-then-top;
+ top: anchor(bottom);
+ position-try-options: --top;
}
-@position-fallback --top-then-bottom {
- @try { bottom: anchor(top); }
- @try { top: anchor(bottom); }
+@position-try --bottom {
+ bottom: auto;
+ top: anchor(bottom);
}
-@position-fallback --bottom-then-top {
- @try { top: anchor(bottom); }
- @try { bottom: anchor(top); }
+@position-try --top {
+ top: auto;
+ bottom: anchor(top);
}
</style>
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 7bd71216e7d..159484ad33b 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
@@ -49,23 +49,25 @@ body {
#target1 {
anchor-default: --a1;
- position-fallback: --top-then-bottom;
+ bottom: anchor(top);
+ position-try: --bottom;
writing-mode: vertical-rl;
}
#target2 {
anchor-default: --a2;
- position-fallback: --bottom-then-top;
+ top: anchor(bottom);
+ position-try: --top;
writing-mode: vertical-lr;
direction: rtl;
}
-@position-fallback --top-then-bottom {
- @try { bottom: anchor(top); }
- @try { top: anchor(bottom); }
+@position-try --bottom {
+ bottom: auto;
+ top: anchor(bottom);
}
-@position-fallback --bottom-then-top {
- @try { top: anchor(bottom); }
- @try { bottom: anchor(top); }
+@position-try --top {
+ top: auto;
+ bottom: anchor(top);
}
</style>
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 0e0e243a16e..9da7bf9ccd7 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
@@ -39,26 +39,25 @@ body {
background-color: lime;
anchor-default: --a;
position-fallback-bounds: --bounds;
- position-fallback: --corners;
+ position-try-options: --corner1, --corner2, --corner3;
+ bottom: anchor(top);
+ right: anchor(left);
}
-@position-fallback --corners {
- @try {
- bottom: anchor(top);
- right: anchor(left);
- }
- @try {
- top: anchor(bottom);
- right: anchor(left);
- }
- @try {
- bottom: anchor(top);
- left: anchor(right);
- }
- @try {
- top: anchor(bottom);
- left: anchor(right);
- }
+@position-try --corner1 {
+ inset: auto;
+ top: anchor(bottom);
+ right: anchor(left);
+}
+@position-try --corner2 {
+ inset: auto;
+ bottom: anchor(top);
+ left: anchor(right);
+}
+@position-try --corner3 {
+ inset: auto;
+ top: anchor(bottom);
+ left: anchor(right);
}
</style>
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 ff982ea93e4..eeee710e0fa 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
@@ -57,12 +57,13 @@ body {
left: anchor(left);
anchor-default: --a;
position-fallback-bounds: --bounds;
- position-fallback: --top-then-bottom;
+ position-try-options: --bottom;
+ bottom: anchor(top);
}
-@position-fallback --top-then-bottom {
- @try { bottom: anchor(top); }
- @try { top: anchor(bottom); }
+@position-try --bottom {
+ top: anchor(bottom);
+ bottom: auto;
}
</style>
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 deb546a1e2e..fecd4328a59 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
@@ -42,14 +42,15 @@
height: 100px;
background: lime;
left: anchor(left);
+ bottom: anchor(top);
anchor-default: --a;
- position-fallback: --top-then-bottom;
+ position-try-options: --bottom;
position-fallback-bounds: --bounds1;
}
-@position-fallback --top-then-bottom {
- @try { bottom: anchor(top); }
- @try { top: anchor(bottom); }
+@position-try --bottom {
+ bottom: auto;
+ top: anchor(bottom);
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-006.html b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-006.html
index 5a19c59f310..023c650cfc9 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-006.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-fallback-bounds-006.html
@@ -36,13 +36,14 @@ body {
width: 100px;
height: 100px;
background: lime;
- position-fallback: --top-then-bottom;
+ position-try-options: --bottom;
position-fallback-bounds: --bounds;
+ bottom: anchor(--a top);
}
-@position-fallback --top-then-bottom {
- @try { bottom: anchor(--a top); }
- @try { top: anchor(--a bottom); }
+@position-try --bottom {
+ top: anchor(--a bottom);
+ bottom: auto;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-001.html b/tests/wpt/tests/css/css-anchor-position/position-try-001.html
index d28c71ec681..a15c808d956 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-001.html
@@ -26,39 +26,44 @@
}
.target {
position: absolute;
- position-fallback: --fallback1;
+ position-try-options: --f1, --f2, --f3, --f4;
width: 40px;
height: 15px;
margin: 5px;
background: orange;
+ /* Position to the right of the anchor. */
+ left: anchor(--a1 right);
+ top: anchor(--a1 top);
}
-@position-fallback --fallback1 {
- @try { /* 1: Position to the right of the anchor. */
- left: anchor(--a1 right);
- top: anchor(--a1 top);
- }
- @try { /* 2: Position to the left of the anchor. */
- right: anchor(--a1 left);
- top: anchor(--a1 top);
- }
- @try { /* 3: Position to the bottom of the anchor. */
- left: anchor(--a1 left);
- top: anchor(--a1 bottom);
- }
- @try { /* 4: Position to the top of the anchor. */
- left: anchor(--a1 left);
- bottom: anchor(--a1 top);
- }
- @try { /* 5: Position to the left with the narrower width. */
- left: anchor(--a1 right);
- top: anchor(--a1 top);
- width: 35px;
- height: 40px;
- }
+@position-try --f1 {
+ inset: auto;
+ /* Position to the left of the anchor. */
+ right: anchor(--a1 left);
+ top: anchor(--a1 top);
+}
+@position-try --f2 {
+ inset: auto;
+ /* Position to the bottom of the anchor. */
+ left: anchor(--a1 left);
+ top: anchor(--a1 bottom);
+}
+@position-try --f3 {
+ inset: auto;
+ /* Position to the top of the anchor. */
+ left: anchor(--a1 left);
+ bottom: anchor(--a1 top);
+}
+@position-try --f4 {
+ inset: auto;
+ /* Position to the left with the narrower width. */
+ left: anchor(--a1 right);
+ top: anchor(--a1 top);
+ width: 35px;
+ height: 40px;
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
- <!-- If the `cb` is wider, the 1st `@try` fits. -->
+ <!-- If the `cb` is wider, the base style fits. -->
<div class="cb" style="width: 195px">
<div class="spacer"></div>
<div class="anchor1"></div>
@@ -66,7 +71,7 @@
data-offset-x=150 data-offset-y=25
data-expected-width=40 data-expected-height=15></div>
</div>
- <!-- If the `margin-left` is wider, the 2nd `@try` fits. -->
+ <!-- If the `margin-left` is wider, the first `@position-try` fits. -->
<div class="cb">
<div class="spacer"></div>
<div class="anchor1" style="margin-left: 50px"></div>
@@ -74,14 +79,14 @@
data-offset-x=5 data-offset-y=25
data-expected-width=40 data-expected-height=15></div>
</div>
- <!-- Without a spacer, the 3rd `@try` fits. -->
+ <!-- Without a spacer, the 2nd `@position-try` fits. -->
<div class="cb">
<div class="anchor1"></div>
<div class="target"
data-offset-x=50 data-offset-y=35
data-expected-width=40 data-expected-height=15></div>
</div>
- <!-- With two spacers, the 4th `@try` fits. -->
+ <!-- With two spacers, the 3rd `@position-try` fits. -->
<div class="cb">
<div class="spacer"></div>
<div class="spacer"></div>
@@ -90,7 +95,7 @@
data-offset-x=50 data-offset-y=20
data-expected-width=40 data-expected-height=15></div>
</div>
- <!-- With a spacer, the last `@try` fits. -->
+ <!-- With a spacer, the last `@position-try` fits. -->
<div class="cb">
<div class="spacer"></div>
<div class="anchor1"></div>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-002.html b/tests/wpt/tests/css/css-anchor-position/position-try-002.html
index ea6ff11479a..c3d550adb1e 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-002.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-002.html
@@ -22,35 +22,34 @@
}
.target {
position: absolute;
- position-fallback: --fallback;
+ position-try-options: --f1, --f2;
width: min-content;
height: 100px;
background: orange;
+ /* 1: Position to the left of the anchor. */
+ left: 0;
+ right: anchor(--a left);
+ top: anchor(--a top);
}
.inline-spacer {
display: inline-block;
width: 200px;
height: 100px;
}
-@position-fallback --fallback {
- @try { /* 1: Position to the left of the anchor. */
- left: 0;
- right: anchor(--a left);
- top: anchor(--a top);
- }
- @try { /* 2: Position to the right of the anchor. */
- left: anchor(--a right);
- right: 0;
- top: anchor(--a top);
- }
- @try { /* 3: Placeholder fallback that shouldn't be selected when the previous
- ones do not overflow the available space. */
- inset: 0;
- }
+@position-try --f1 {
+ /* 2: Position to the right of the anchor. */
+ left: anchor(--a right);
+ right: 0;
+ top: anchor(--a top);
+}
+@position-try --f2 {
+ /* 3: Placeholder fallback that shouldn't be selected when the previous
+ ones do not overflow the available space. */
+ inset: 0;
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
- <!-- The first `@try` overflows the inset-modifed containing block -->
+ <!-- The first base style overflows the inset-modifed containing block -->
<div class="cb">
<div class="anchor1"></div>
<div class="target"
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-003.html b/tests/wpt/tests/css/css-anchor-position/position-try-003.html
index 531dc303d65..196b7b0304b 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-003.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-003.html
@@ -38,83 +38,79 @@ body { margin: 0; }
background: lime;
}
-.exceeds-end {
- position-fallback: --exceeds-end;
-}
-
/* Used on a element whose block and inline axes are the same with its
containing block, so that the first two positions will exceed the end edges
of the IMCB, and the last position will be used. */
-@position-fallback --exceeds-end {
- @try {
- left: 0;
- right: anchor(--a left);
- width: 100px;
- }
-
- @try {
- top: 0;
- bottom: anchor(--a top);
- height: 100px;
- }
-
- @try {
- top: 11px;
- left: 22px;
- }
+.exceeds-end {
+ position-try-options: --exceeds-end-1, --exceeds-end-2;
+ left: 0;
+ right: anchor(--a left);
+ width: 100px;
}
-.exceeds-start {
- position-fallback: --exceeds-start;
+@position-try --exceeds-end-1 {
+ inset: auto;
+ top: 0;
+ bottom: anchor(--a top);
+ width: auto;
+ height: 100px;
+}
+
+@position-try --exceeds-end-2 {
+ inset: auto;
+ top: 11px;
+ left: 22px;
+ width: auto;
+ height: auto;
}
/* Used on a element whose block and inline axes are in the opposite directions
of its containing block, so that the first two positions will exceed the
start edges of the IMCB, and the last position will be used. */
-@position-fallback --exceeds-start {
- @try {
- bottom: 0;
- top: anchor(--a bottom);
- height: 100px;
- }
-
- @try {
- right: 0;
- left: anchor(--a right);
- width: 100px;
- }
-
- @try {
- top: 11px;
- left: 22px;
- }
+.exceeds-start {
+ position-try-options: --exceeds-start-1, --exceeds-start-2;
+ bottom: 0;
+ top: anchor(--a bottom);
+ height: 100px;
}
-.exceeds-size {
- position-fallback: --exceeds-size;
+@position-try --exceeds-start-1 {
+ inset: auto;
+ right: 0;
+ left: anchor(--a right);
+ width: 100px;
+ height: auto;
+}
+
+@position-try --exceeds-start-2 {
+ inset: auto;
+ top: 11px;
+ left: 22px;
+ height: auto;
}
/* Both inset sides are `auto`, but the size is too big to fit in the containing
block. */
-@position-fallback --exceeds-size {
- @try {
- top: anchor(--a bottom);
- left: auto;
- right: auto;
- width: 300px;
- }
-
- @try {
- left: anchor(--a right);
- top: auto;
- bottom: auto;
- height: 300px;
- }
-
- @try {
- top: 11px;
- left: 22px;
- }
+.exceeds-size {
+ position-try-options: --exceeds-size-1, --exceeds-size-2;
+ top: anchor(--a bottom);
+ left: auto;
+ right: auto;
+ width: 300px;
+}
+
+@position-try --exceeds-size-1 {
+ inset: auto;
+ left: anchor(--a right);
+ width: auto;
+ height: 300px;
+}
+
+@position-try --exceeds-size-2 {
+ inset: auto;
+ width: auto;
+ top: 11px;
+ left: 22px;
}
</style>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-004.html b/tests/wpt/tests/css/css-anchor-position/position-try-004.html
index e4dbd718664..b172f2e8bf3 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-004.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-004.html
@@ -33,23 +33,20 @@ body {
width: 100px;
height: 100px;
background: lime;
- position-fallback: --fallbacks;
+ position-try-options: --fallback;
+ top: anchor(--a top);
+ right: anchor(--a left);
+ margin-top: 10px;
+ margin-right: 10px;
}
-@position-fallback --fallbacks {
- @try {
- top: anchor(--a top);
- right: anchor(--a left);
- margin-top: 10px;
- margin-right: 10px;
- }
-
- @try {
- bottom: anchor(--a bottom);
- left: anchor(--a right);
- margin-bottom: 10px;
- margin-left: 10px;
- }
+@position-try --fallback {
+ inset: auto;
+ bottom: anchor(--a bottom);
+ left: anchor(--a right);
+ margin: 0;
+ margin-bottom: 10px;
+ margin-left: 10px;
}
</style>
@@ -57,7 +54,7 @@ body {
<div class=cb>
<div class=anchor style="left: 110px"></div>
- <!-- Chooses 1st @try block. -->
+ <!-- Chooses base style. -->
<div class=target data-offset-x=0
data-expected-margin-left=0 data-expected-margin-right=10
data-expected-margin-top=10 data-expected-margin-bottom=0></div>
@@ -65,7 +62,7 @@ body {
<div class=cb>
<div class=anchor style="right: 110px"></div>
- <!-- Chooses 2nd @try block. -->
+ <!-- Chooses @position-try block. -->
<div class=target data-offset-x=200
data-expected-margin-left=10 data-expected-margin-right=0
data-expected-margin-top=0 data-expected-margin-bottom=10></div>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-cascade-layer-reorder.html b/tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html
index ec1a64205c5..6c09fd0ea17 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-cascade-layer-reorder.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-cascade-layer-reorder.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>Tests that @position-fallback rules are reordered by cascade layers</title>
+<title>Tests that @position-try rules are reordered by cascade layers</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
<link rel="help" href="https://www.w3.org/TR/css-cascade-5/#layering">
<link rel="author" href="mailto:xiaochengh@chromium.org">
@@ -21,7 +21,8 @@ body { margin: 0; }
width: 100px;
height: 100px;
color: lime;
- position-fallback: --fallback;
+ position-try-options: --fallback;
+ left: 999999px; /* force fallback */
}
</style>
@@ -46,11 +47,11 @@ function createTargetWithStyle(test, style) {
test(t => {
const target = createTargetWithStyle(t, `
- @position-fallback --fallback {
- @try { right: anchor(--a left); }
+ @position-try --fallback {
+ right: anchor(--a left);
}
- @position-fallback --fallback {
- @try { left: anchor(--a right); }
+ @position-try --fallback {
+ left: anchor(--a right);
}
`);
assert_equals(target.offsetLeft, 300);
@@ -58,12 +59,12 @@ test(t => {
test(t => {
const target = createTargetWithStyle(t, `
- @position-fallback --fallback {
- @try { bottom: anchor(--a top); }
+ @position-try --fallback {
+ bottom: anchor(--a top);
}
@layer {
- @position-fallback --fallback {
- @try { top: anchor(--a bottom); }
+ @position-try --fallback {
+ top: anchor(--a bottom);
}
}
`);
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-container-query.html b/tests/wpt/tests/css/css-anchor-position/position-try-container-query.html
index b4ef806206e..528217c917c 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-container-query.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-container-query.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>@position-fallback with container query responding to fallback widths</title>
+<title>@position-try with container query responding to fallback widths</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#fallback">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -13,20 +13,18 @@
#target1 {
container-type: inline-size;
container-name: target1;
- position-fallback: --fallback1;
+ position-try-options: --fallback1;
background: green;
position: absolute;
top: 0px;
- left: 100px;
+ left: 999999px; /* force fallback */
width: 100px;
height: 100px;
}
- @position-fallback --fallback1 {
- @try {
- top: 100px;
- left: 0px;
- width: 150px;
- }
+ @position-try --fallback1 {
+ top: 100px;
+ left: 0px;
+ width: 150px;
}
@container (width > 100px) {
#inner1 {
@@ -39,24 +37,22 @@
#target2 {
container-type: inline-size;
container-name: target2;
- position-fallback: --fallback2;
+ position-try-options: --fallback2, --fallback3;
background: orange;
position: absolute;
top: 0px;
- left: 100px;
+ left: 999999px; /* force fallback */
width: 100px;
}
- @position-fallback --fallback2 {
- @try {
- top: 100px;
- left: 0px;
- width: 150px;
- }
- @try {
- top: 0px;
- left: 0px;
- width: 150px;
- }
+ @position-try --fallback2 {
+ top: 100px;
+ left: 0px;
+ width: 150px;
+ }
+ @position-try --fallback3 {
+ top: 0px;
+ left: 0px;
+ width: 150px;
}
@container target2 (width = 150px) {
#inner2 {
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-custom-property.html b/tests/wpt/tests/css/css-anchor-position/position-try-custom-property.html
index edb7efc7ed6..69ca0d12f43 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-custom-property.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-custom-property.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>Variable substitution in @try rules</title>
+<title>Variable substitution in @position-try rules</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -26,7 +26,7 @@
}
.target {
position: absolute;
- position-fallback: --fallback1;
+ position-try-options: --fallback1;
width: 40px;
height: 15px;
margin: 5px;
@@ -35,22 +35,19 @@
--top: anchor(--a1 top);
}
.fallback1 {
- position-fallback: --fallback1;
+ position-try-options: --fallback1;
}
.fallback2 {
- position-fallback: --fallback2;
+ position-try-options: --fallback2;
}
-@position-fallback --fallback1 {
- @try { /* Position to the right of the anchor. */
- left: var(--left);
- top: var(--top);
- }
+@position-try --fallback1 {
+ /* Position to the right of the anchor. */
+ left: var(--left);
+ top: var(--top);
}
/* Same as above, but using a shorthand. */
-@position-fallback --fallback2 {
- @try {
- inset: var(--top) 0px 0px var(--left);
- }
+@position-try --fallback2 {
+ inset: var(--top) 0px 0px var(--left);
}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-dynamic.html b/tests/wpt/tests/css/css-anchor-position/position-try-dynamic.html
index f6d82104276..fad3db62a31 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-dynamic.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-dynamic.html
@@ -1,15 +1,13 @@
<!DOCTYPE html>
-<title>CSS Anchor Positioning Test: Dynamically change position via position-fallback property</title>
+<title>CSS Anchor Positioning Test: Dynamically change position via position-try-options property</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body { margin: 0; }
- @position-fallback --fallback1 {
- @try {
- left: anchor(--a1 right);
- }
+ @position-try --fallback1 {
+ left: anchor(--a1 right);
}
#anchor {
anchor-name: --a1;
@@ -18,6 +16,7 @@
}
#anchored {
position: absolute;
+ left: 999999px; /* Force fallback */
width: 100px;
height: 100px;
}
@@ -26,11 +25,11 @@
<div id="anchored"></div>
<script>
test(() => {
- assert_equals(anchored.offsetLeft, 0);
+ assert_equals(anchored.offsetLeft, 999999);
}, "Initial static left position is 0");
test(() => {
- anchored.style.positionFallback = "--fallback1";
+ anchored.style.positionTryOptions = "--fallback1";
assert_equals(anchored.offsetLeft, 100);
- }, "Left position set to right edge of anchor with @position-fallback");
+ }, "Left position set to right edge of anchor with @position-try");
</script>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-grid-001.html b/tests/wpt/tests/css/css-anchor-position/position-try-grid-001.html
index abe80bf51ef..87a30e26eca 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-grid-001.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-grid-001.html
@@ -33,33 +33,36 @@
grid-column: 2 / 4;
grid-row: 2 / 4;
position: absolute;
- position-fallback: --fallback1;
+ position-try-options: --f1, --f2, --f3;
width: 100px;
height: 100px;
background: lime;
opacity: .2;
-}
-@position-fallback --fallback1 {
- @try { /* Position to the left of the anchor. */
- right: anchor(--a1 left);
- top: anchor(--a1 top);
- }
- @try { /* Position to the right of the anchor with the wider width than CB. */
- left: anchor(--a1 right);
- top: anchor(--a1 top);
- width: 250px;
- }
- @try { /* Position to the right of the anchor. This entry should succeed. */
- left: anchor(--a1 right);
- top: anchor(--a1 top);
- }
- @try { /* Zero-sized, the last entry wins if none succeeded. */
- left: 0;
- top: 0;
- width: 0;
- height: 0;
+ /* Position to the left of the anchor. */
+ right: anchor(--a1 left);
+ top: anchor(--a1 top);
}
}
+@position-try --f1 {
+ inset: auto;
+ left: anchor(--a1 right);
+ top: anchor(--a1 top);
+ width: 250px;
+}
+@position-try --f2 {
+ /* Position to the right of the anchor. This entry should succeed. */
+ inset: auto;
+ left: anchor(--a1 right);
+ top: anchor(--a1 top);
+}
+@position-try --f3 {
+ /* Zero-sized, the last entry wins if none succeeded. */
+ inset: auto;
+ left: 0;
+ top: 0;
+ width: 0;
+ height: 0;
+}
</style>
<body onload="checkLayoutForAnchorPos('.target')">
<div>
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-pseudo-element.html b/tests/wpt/tests/css/css-anchor-position/position-try-pseudo-element.html
index e2f95b9a24a..5895f2a4077 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-pseudo-element.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-pseudo-element.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>@position-fallback for ::before and ::after pseudo elements</title>
+<title>@position-try for ::before and ::after pseudo elements</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#fallback">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -9,9 +9,10 @@
position: relative;
width: 195px;
height: 200px;
+ left: 999999px; /* force fallback */
}
#target::before {
- position-fallback: --fallback;
+ position-try-options: --f1, --f2;
background: lime;
position: absolute;
left: 200px;
@@ -21,7 +22,7 @@
content: "";
}
#target::after {
- position-fallback: --fallback;
+ position-try-options: --f1, --f2;
background: green;
position: absolute;
left: 100px;
@@ -29,15 +30,13 @@
height: 100px;
content: "";
}
- @position-fallback --fallback {
- @try {
- top: 100px;
- left: 50px;
- }
- @try {
- top: 0px;
- left: 0px;
- }
+ @position-try --f1 {
+ top: 100px;
+ left: 50px;
+ }
+ @position-try --f2 {
+ top: 0px;
+ left: 0px;
}
</style>
<div id="container">
diff --git a/tests/wpt/tests/css/css-anchor-position/position-fallback-tree-scoped.html b/tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html
index 2650a32f60a..a8fe0106833 100644
--- a/tests/wpt/tests/css/css-anchor-position/position-fallback-tree-scoped.html
+++ b/tests/wpt/tests/css/css-anchor-position/position-try-tree-scoped.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<title>CSS Anchor Positioning Test: @position-fallback - tree scoped names</title>
+<title>CSS Anchor Positioning Test: @position-try - tree scoped names</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#fallback-rule">
<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
<script src="/resources/testharness.js"></script>
@@ -8,17 +8,18 @@
<style>
body { margin: 0; }
- @position-fallback --doc {
- @try {
- left: 100px;
- }
+ @position-try --doc {
+ left: 100px;
}
- .abs { position: absolute; }
+ .abs {
+ position: absolute;
+ left: 999999px; /* force fallback */
+ }
- #doc_pf_doc { position-fallback: --doc; }
- #doc_pf_outer { position-fallback: --outer; }
- #doc_pf_inner { position-fallback: --inner; }
+ #doc_pf_doc { position-try-options: --doc; }
+ #doc_pf_outer { position-try-options: --outer; }
+ #doc_pf_inner { position-options: --inner; }
</style>
<div id="doc_pf_doc" class="abs"></div>
@@ -27,17 +28,18 @@
<div id="outer_host">
<template shadowrootmode="open">
<style>
- @position-fallback --outer {
- @try {
- left: 200px;
- }
+ @position-try --outer {
+ left: 200px;
}
- .abs { position: absolute; }
+ .abs {
+ position: absolute;
+ left: 999999px; /* force fallback */
+ }
- #outer_pf_doc { position-fallback: --doc; }
- #outer_pf_outer { position-fallback: --outer; }
- #outer_pf_inner { position-fallback: --inner; }
+ #outer_pf_doc { position-try-options: --doc; }
+ #outer_pf_outer { position-try-options: --outer; }
+ #outer_pf_inner { position-try-options: --inner; }
</style>
<div id="outer_pf_doc" class="abs"></div>
<div id="outer_pf_outer" class="abs"></div>
@@ -45,17 +47,18 @@
<div id="inner_host">
<template shadowrootmode="open">
<style>
- @position-fallback --inner {
- @try {
- left: 300px;
- }
+ @position-try --inner {
+ left: 300px;
}
- .abs { position: absolute; }
+ .abs {
+ position: absolute;
+ left: 999999px; /* force fallback */
+ }
- #inner_pf_doc { position-fallback: --doc; }
- #inner_pf_outer { position-fallback: --outer; }
- #inner_pf_inner { position-fallback: --inner; }
+ #inner_pf_doc { position-try-options: --doc; }
+ #inner_pf_outer { position-try-options: --outer; }
+ #inner_pf_inner { position-try-options: --inner; }
</style>
<div id="inner_pf_doc" class="abs"></div>
<div id="inner_pf_outer" class="abs"></div>
@@ -67,29 +70,27 @@
<style>
- @position-fallback --host-slot-part {
- @try {
- left: 1px;
- }
+ @position-try --host-slot-part {
+ left: 1px;
}
#host_slotted_part::part(part) {
- position-fallback: --host-slot-part;
+ position-try-options: --host-slot-part;
}
</style>
<div id="host_slotted_part">
<template shadowrootmode="open">
<style>
- @position-fallback --host-slot-part {
- @try {
- left: 2px;
- }
+ @position-try --host-slot-part {
+ left: 2px;
}
::slotted(#slotted), :host {
position: absolute;
- position-fallback: --host-slot-part;
+ left: 999999px; /* force fallback */
+ position-try-options: --host-slot-part;
}
#part {
position: absolute;
+ left: 999999px; /* force fallback */
}
</style>
<div id="part" part="part"></div>
@@ -102,52 +103,52 @@
<script>
test(() => {
assert_equals(doc_pf_doc.offsetLeft, 100);
- }, "Document position-fallback matches @position-fallback in document scope");
+ }, "Document position-try-options matches @position-try in document scope");
test(() => {
- assert_equals(doc_pf_outer.offsetLeft, 0);
- }, "Document position-fallback does not match @position-fallback in #outer_host scope");
+ assert_equals(doc_pf_outer.offsetLeft, 999999);
+ }, "Document position-try-options does not match @position-try in #outer_host scope");
test(() => {
- assert_equals(doc_pf_inner.offsetLeft, 0);
- }, "Document position-fallback does not match @position-fallback in #inner_host scope");
+ assert_equals(doc_pf_inner.offsetLeft, 999999);
+ }, "Document position-try-options does not match @position-try in #inner_host scope");
const outer_root = outer_host.shadowRoot;
const inner_root = outer_root.querySelector("#inner_host").shadowRoot;
test(() => {
assert_equals(outer_root.querySelector("#outer_pf_doc").offsetLeft, 100);
- }, "Outer position-fallback matches @position-fallback in document scope");
+ }, "Outer position-try-options matches @position-try in document scope");
test(() => {
assert_equals(outer_root.querySelector("#outer_pf_outer").offsetLeft, 200);
- }, "Outer position-fallback matches @position-fallback in #outer_host scope");
+ }, "Outer position-try-options matches @position-try in #outer_host scope");
test(() => {
- assert_equals(outer_root.querySelector("#outer_pf_inner").offsetLeft, 0);
- }, "Outer position-fallback does not match @position-fallback in #inner_host scope");
+ assert_equals(outer_root.querySelector("#outer_pf_inner").offsetLeft, 999999);
+ }, "Outer position-try-options does not match @position-try in #inner_host scope");
test(() => {
assert_equals(inner_root.querySelector("#inner_pf_doc").offsetLeft, 100)
- }, "Inner position-fallback matches @position-fallback in document scope");
+ }, "Inner position-try-options matches @position-try in document scope");
test(() => {
assert_equals(inner_root.querySelector("#inner_pf_outer").offsetLeft, 200);
- }, "Inner position-fallback matches @position-fallback in #outer_host scope");
+ }, "Inner position-try-options matches @position-try in #outer_host scope");
test(() => {
assert_equals(inner_root.querySelector("#inner_pf_inner").offsetLeft, 300);
- }, "Inner position-fallback matches @position-fallback in #inner_host scope");
+ }, "Inner position-try-options matches @position-try in #inner_host scope");
test(() => {
assert_equals(host_slotted_part.offsetLeft, 2);
- }, "@position-fallback from same scope as :host rule");
+ }, "@position-try from same scope as :host rule");
test(() => {
assert_equals(slotted.offsetLeft, 2);
- }, "@position-fallback from same scope as ::slotted() rule");
+ }, "@position-try from same scope as ::slotted() rule");
test(() => {
assert_equals(host_slotted_part.shadowRoot.querySelector("#part").offsetLeft, 1);
- }, "@position-fallback from same scope as ::part() rule");
+ }, "@position-try from same scope as ::part() rule");
</script>
diff --git a/tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen-ref.html b/tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen-ref.html
new file mode 100644
index 00000000000..76fd70f3e02
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<title>Validates rendering of a transformed element when the element is initially off screen</title>
+<style type="text/css" media="screen">
+ body {
+ margin: 0;
+ }
+
+ #box {
+ position: absolute;
+ left: 0px;
+ top: 100px;
+ height: 100px;
+ width: 100px;
+ margin: 0;
+ background-color: green;
+ transform: translate(100px, 0px);
+ }
+</style>
+<body>
+ <div id="box"></div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen.html b/tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen.html
new file mode 100644
index 00000000000..bfdf432a61e
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/animation-offscreen-to-onscreen.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Validates rendering of a transformed element when the element is initially off screen</title>
+<link rel="help" href="https://www.w3.org/TR/css-animations-1">
+<link rel="help" href="https://www.w3.org/TR/web-animations-1/#the-current-ready-promise">
+<link rel="match" href="animation-offscreen-to-onscreen-ref.html">
+<style type="text/css" media="screen">
+ body {
+ margin: 0;
+ }
+
+ @keyframes anim {
+ from { transform: translate(100px, 0px); }
+ to { transform: translate(100px, 0px); }
+ }
+
+ #box {
+ position: absolute;
+ left: 0px;
+ top: 100px;
+ height: 100px;
+ width: 100px;
+ margin: 0;
+ background-color: green;
+ transform: translate(-2000px, 0px);
+ animation-duration: 10s;
+ animation-direction: normal;
+ animation-timing-function: linear;
+ animation-name: anim;
+ }
+</style>
+<body>
+ <div id="box"></div>
+</body>
+<script src="/common/reftest-wait.js"></script>
+<script src="support/testcommon.js"></script>
+<script type="text/javascript">
+ window.onload = async () => {
+ await document.getAnimations()[0].ready;
+ await waitForNextFrame();
+ takeScreenshot();
+ }
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-animations/empty-pseudo-class-with-animation.html b/tests/wpt/tests/css/css-animations/empty-pseudo-class-with-animation.html
new file mode 100644
index 00000000000..d8dba1ab5bd
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/empty-pseudo-class-with-animation.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<link rel="author" href="mailto:graouts@apple.com">
+<link rel="help" href="https://drafts.csswg.org/css-animations/">
+<link rel="help" href="https://drafts.csswg.org/selectors/#the-empty-pseudo">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/css-animations/support/testcommon.js"></script>
+
+<div class="container"></div>
+
+<style>
+
+.container {
+ width: 100px;
+ height: 100px;
+ background-color: rgb(0, 255, 0);
+}
+
+.container:empty {
+ background-color: rgb(255, 0, 0);
+ animation: anim 1s;
+}
+
+@keyframes anim { }
+
+</style>
+
+<script>
+
+promise_test(async () => {
+ const container = document.querySelector(".container");
+ const computedStyle = getComputedStyle(container);
+
+ // Check that the :empty rule applies initially.
+ assert_equals(computedStyle.backgroundColor, 'rgb(255, 0, 0)',
+ 'The initial background-color matches the value set by the :empty rule.');
+
+ // Await a couple of frames to let any animation-related style updates happen.
+ await waitForAnimationFrames(2);
+
+ // Append a child which should no longer let the :empty rule apply.
+ container.appendChild(document.createElement("span"));
+ assert_equals(computedStyle.backgroundColor, 'rgb(0, 255, 0)',
+ 'The background-color after inserting a child into the container no longer matches the value set by the :empty rule.');
+}, 'Setting an "animation" style property on an element does not interfere with the :empty pseudo-class.');
+
+</script>
diff --git a/tests/wpt/tests/css/css-box/margin-trim/computed-margin-values/grid-inline-end-columns-added-to-end.html b/tests/wpt/tests/css/css-box/margin-trim/computed-margin-values/grid-inline-end-columns-added-to-end.html
new file mode 100644
index 00000000000..9c88c298159
--- /dev/null
+++ b/tests/wpt/tests/css/css-box/margin-trim/computed-margin-values/grid-inline-end-columns-added-to-end.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="author" href="mailto:sammy.gill@apple.com">
+<link rel="help" href="https://drafts.csswg.org/css-box-4/#margin-trim-grid">
+<meta name="assert" content="spanning grid item adds columns to implicit grid and should be trimmed">
+<style>
+grid {
+ display: grid;
+ grid-template-columns: repeat(2, auto);
+ outline: 1px solid black;
+ margin-trim: inline-end;
+}
+item {
+ display: block;
+ height: 50px;
+}
+.span-three {
+ grid-column: span 3;
+}
+.locked-position {
+ grid-row: 1;
+ grid-column: 2;
+}
+item:nth-child(1) {
+ background-color: aqua;
+ margin-inline-end: 10px;
+}
+item:nth-child(2) {
+ background-color: blueviolet;
+ margin-inline-end: 30%;
+}
+item:nth-child(3) {
+ background-color: blue;
+ margin-inline-end: -30px;
+}
+item:nth-child(4) {
+ background-color: coral;
+ margin-inline-end: 10px;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+</head>
+<body onload="checkLayout('grid > item')">
+ <div id="target">
+ <grid>
+ <item class="locked-position" data-expected-margin-right="10"></item>
+ <item class="span-three"></item>
+ </grid>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print-ref.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print-ref.html
new file mode 100644
index 00000000000..d4229ebb873
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print-ref.html
@@ -0,0 +1,29 @@
+<!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>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.table {
+ width: 3in;
+ box-sizing: border-box;
+ border: 0.25in solid black;
+ padding: 0.5in;
+}
+.td {
+ border: 0.25in solid orange;
+}
+.content {
+ height: 1.5in;
+ background: gold;
+}
+</style>
+
+<div class="table">
+ <div class="td">
+ <div class="content"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print.html
new file mode 100644
index 00000000000..4f2123b6487
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-001a-print.html
@@ -0,0 +1,35 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-001a-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 1.5in;
+ background: gold;
+}
+</style>
+
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-001b-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-001b-print.html
new file mode 100644
index 00000000000..d445206a2b8
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-001b-print.html
@@ -0,0 +1,36 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-001a-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ block-size: 3.5in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 1.5in;
+ background: gold;
+}
+</style>
+
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print-ref.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print-ref.html
new file mode 100644
index 00000000000..d7778e340ab
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print-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>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.table {
+ width: 3in;
+ box-sizing: border-box;
+ border: 0.25in solid black;
+ padding: 0.25in 0.5in;
+ box-decoration-break: clone;
+}
+.td {
+ margin: 0.25in 0;
+ border: 0.25in solid orange;
+}
+.content {
+ height: 2in;
+ background: gold;
+}
+</style>
+
+<div class="table">
+ <div class="td">
+ <div class="content"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print.html
new file mode 100644
index 00000000000..4615270c400
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-001c-print.html
@@ -0,0 +1,36 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-001c-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+ box-decoration-break: clone;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 2in;
+ background: gold;
+}
+</style>
+
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-001d-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-001d-print.html
new file mode 100644
index 00000000000..ad120c24818
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-001d-print.html
@@ -0,0 +1,37 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-001c-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ block-size: 4in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+ box-decoration-break: clone;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 2in;
+ background: gold;
+}
+</style>
+
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print-ref.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print-ref.html
new file mode 100644
index 00000000000..d7272352a15
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print-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>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.table {
+ width: 3in;
+ box-sizing: border-box;
+ border: 0.25in solid black;
+ padding: 0.5in;
+}
+.td {
+ border: 0.25in solid orange;
+}
+.content {
+ height: 1.5in;
+ background: gold;
+}
+</style>
+
+<div style="height: 0.25in">BEFORE TABLE</div>
+<div class="table">
+ <div class="td">
+ <div class="content"></div>
+ </div>
+</div>
+<div style="height: 0.25in">AFTER TABLE</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print.html
new file mode 100644
index 00000000000..88ea8cd6977
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-002a-print.html
@@ -0,0 +1,37 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-002a-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 1.5in;
+ background: gold;
+}
+</style>
+
+<div style="height: 0.25in">BEFORE TABLE</div>
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
+<div style="height: 0.25in">AFTER TABLE</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-002b-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-002b-print.html
new file mode 100644
index 00000000000..97e102e3cd7
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-002b-print.html
@@ -0,0 +1,38 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-002a-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ block-size: 3.5in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 1.5in;
+ background: gold;
+}
+</style>
+
+<div style="height: 0.25in">BEFORE TABLE</div>
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
+<div style="height: 0.25in">AFTER TABLE</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print-ref.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print-ref.html
new file mode 100644
index 00000000000..18c1e0d5a9b
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print-ref.html
@@ -0,0 +1,33 @@
+<!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>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.table {
+ width: 3in;
+ box-sizing: border-box;
+ border: 0.25in solid black;
+ padding: 0.25in 0.5in;
+ box-decoration-break: clone;
+}
+.td {
+ margin: 0.25in 0;
+ border: 0.25in solid orange;
+}
+.content {
+ height: 1.5in;
+ background: gold;
+}
+</style>
+
+<div style="height: 0.25in">BEFORE TABLE</div>
+<div class="table">
+ <div class="td">
+ <div class="content"></div>
+ </div>
+</div>
+<div style="height: 0.25in">AFTER TABLE</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print.html
new file mode 100644
index 00000000000..29fccdef999
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-002c-print.html
@@ -0,0 +1,38 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-002c-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+ box-decoration-break: clone;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 1.5in;
+ background: gold;
+}
+</style>
+
+<div style="height: 0.25in">BEFORE TABLE</div>
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
+<div style="height: 0.25in">AFTER TABLE</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-002d-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-002d-print.html
new file mode 100644
index 00000000000..67aa7624b76
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-002d-print.html
@@ -0,0 +1,39 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-002c-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ block-size: 3.5in;
+ border-spacing: 0.25in;
+ border: 0.25in solid black;
+ padding: 0.25in;
+ box-decoration-break: clone;
+}
+td {
+ vertical-align: top;
+ padding: 0;
+ border: 0.25in solid orange;
+}
+.content {
+ block-size: 1.5in;
+ background: gold;
+}
+</style>
+
+<div style="height: 0.25in">BEFORE TABLE</div>
+<table>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+</table>
+<div style="height: 0.25in">AFTER TABLE</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print-ref.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print-ref.html
new file mode 100644
index 00000000000..bf99e5b41e2
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print-ref.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.table {
+ inline-size: 3in;
+ box-sizing: border-box;
+ border: 0.25in solid black;
+ padding: 0.25in;
+}
+.thead {
+ block-size: 0.25in;
+ background: blue;
+}
+.tbody {
+ border: 0 solid orange;
+ margin-block: 0.125in;
+ background: gold;
+}
+.tfoot {
+ block-size: 0.25in;
+ background: purple;
+}
+</style>
+
+<div class="table">
+ <!-- Page 1 -->
+ <div class="thead"></div>
+ <div class="tbody" style="border-block-start-width: 0.25in; block-size: 0.5in;"></div>
+ <div class="tfoot"></div>
+
+ <!-- Page 2 -->
+ <div class="thead"></div>
+ <div class="tbody" style="block-size: 1.25in;"></div>
+ <div class="tfoot"></div>
+
+ <!-- Page 3 -->
+ <div class="thead"></div>
+ <div class="tbody" style="border-block-end-width: 0.25in; block-size: 0.25in;"></div>
+ <div class="tfoot"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print.html
new file mode 100644
index 00000000000..c6190855b01
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-003a-print.html
@@ -0,0 +1,56 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-003a-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ border-spacing: 0.125in;
+ border: 0.25in solid black;
+ padding: 0.125in;
+}
+td {
+ padding: 0;
+}
+thead td {
+ block-size: 0.25in;
+ background: blue;
+}
+tbody td {
+ vertical-align: top;
+ border: solid orange;
+ border-width: 0.25in 0;
+}
+.content {
+ block-size: 2in;
+ background: gold;
+}
+tfoot td {
+ block-size: 0.25in;
+ background: purple;
+}
+</style>
+
+<table>
+ <thead>
+ <tr>
+ <td></td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td></td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-003b-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-003b-print.html
new file mode 100644
index 00000000000..a1d3b21298e
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-003b-print.html
@@ -0,0 +1,57 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-003a-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ block-size: 4.25in;
+ border-spacing: 0.125in;
+ border: 0.25in solid black;
+ padding: 0.125in;
+}
+td {
+ padding: 0;
+}
+thead td {
+ block-size: 0.25in;
+ background: blue;
+}
+tbody td {
+ vertical-align: top;
+ border: solid orange;
+ border-width: 0.25in 0;
+}
+.content {
+ block-size: 2in;
+ background: gold;
+}
+tfoot td {
+ block-size: 0.25in;
+ background: purple;
+}
+</style>
+
+<table>
+ <thead>
+ <tr>
+ <td></td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td></td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print-ref.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print-ref.html
new file mode 100644
index 00000000000..50738fbaa8a
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+.table {
+ inline-size: 3in;
+ box-sizing: border-box;
+ border: 0.25in solid black;
+ padding: 0.125in 0.25in;
+ box-decoration-break: clone;
+}
+.thead {
+ block-size: 0.25in;
+ background: blue;
+}
+.tbody {
+ border: 0 solid orange;
+ margin-block: 0.125in;
+ background: gold;
+}
+.tfoot {
+ block-size: 0.25in;
+ background: purple;
+}
+</style>
+
+<div class="table">
+ <!-- Page 1 -->
+ <div class="thead" style="margin-block-start: 0.125in;"></div>
+ <div class="tbody" style="border-block-start-width: 0.25in; block-size: 0.125in;"></div>
+ <div class="tfoot"></div>
+
+ <!-- Page 2 -->
+ <div class="thead"></div>
+ <div class="tbody" style="block-size: 0.5in;"></div>
+ <div class="tfoot"></div>
+
+ <!-- Page 3 -->
+ <div class="thead"></div>
+ <div class="tbody" style="border-block-end-width: 0.25in; block-size: 0.125in;"></div>
+ <div class="tfoot" style="margin-block-end: 0.125in;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print.html
new file mode 100644
index 00000000000..9c4f8d3873a
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-003c-print.html
@@ -0,0 +1,57 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-003c-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ border-spacing: 0.125in;
+ border: 0.25in solid black;
+ padding: 0.125in;
+ box-decoration-break: clone;
+}
+td {
+ padding: 0;
+}
+thead td {
+ block-size: 0.25in;
+ background: blue;
+}
+tbody td {
+ vertical-align: top;
+ border: solid orange;
+ border-width: 0.25in 0;
+}
+.content {
+ block-size: 0.75in;
+ background: gold;
+}
+tfoot td {
+ block-size: 0.25in;
+ background: purple;
+}
+</style>
+
+<table>
+ <thead>
+ <tr>
+ <td></td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td></td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/tests/wpt/tests/css/css-break/table/table-fragmentation-003d-print.html b/tests/wpt/tests/css/css-break/table/table-fragmentation-003d-print.html
new file mode 100644
index 00000000000..1903a68c58d
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/table/table-fragmentation-003d-print.html
@@ -0,0 +1,58 @@
+<!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://bugzilla.mozilla.org/show_bug.cgi?id=1863421">
+<link rel="match" href="table-fragmentation-003c-print-ref.html">
+
+<style>
+@page { size: 5in 3in; margin: 0.5in; }
+body { margin: 0; }
+
+table {
+ inline-size: 3in;
+ block-size: 3in;
+ border-spacing: 0.125in;
+ border: 0.25in solid black;
+ padding: 0.125in;
+ box-decoration-break: clone;
+}
+td {
+ padding: 0;
+}
+thead td {
+ block-size: 0.25in;
+ background: blue;
+}
+tbody td {
+ vertical-align: top;
+ border: solid orange;
+ border-width: 0.25in 0;
+}
+.content {
+ block-size: 0.75in;
+ background: gold;
+}
+tfoot td {
+ block-size: 0.25in;
+ background: purple;
+}
+</style>
+
+<table>
+ <thead>
+ <tr>
+ <td></td>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><div class="content"></div></td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td></td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/tests/wpt/tests/css/css-color/system-color-consistency.html b/tests/wpt/tests/css/css-color/system-color-consistency.html
index 4eb9d811005..0d23d84ad25 100644
--- a/tests/wpt/tests/css/css-color/system-color-consistency.html
+++ b/tests/wpt/tests/css/css-color/system-color-consistency.html
@@ -29,31 +29,42 @@
<textarea name="text area"></textarea>
</div>
<mark id="mark">Marked text</mark>
+ <!-- Link -->
+ <a href="#" id="link">Link</a>
</div>
+
<script>
- // Buttons
- for (let element of document.getElementById("buttons").children) {
- style = document.defaultView.getComputedStyle(element);
- test_computed_value('color', 'ButtonBorder', style.getPropertyValue('border-color'), 'resolves to the same color as the border-color of a ' + element.name);
- test_computed_value('color', 'ButtonFace', style.getPropertyValue('background-color'), 'resolves to the same color as the background-color of a ' + element.name);
- test_computed_value('color', 'ButtonText', style.getPropertyValue('color'), 'resolves to the same color as text on a ' + element.name);
- }
-
- // CanvasText
- style = document.defaultView.getComputedStyle(document.getElementsByTagName('html')[0]);
- test_computed_value('color', 'CanvasText', style.getPropertyValue('color'), 'has the same color as the color of the html element');
-
- // Field and FieldText
- for (let element of document.getElementById("fields").children) {
- style = document.defaultView.getComputedStyle(element);
- test_computed_value('color', 'Field', style.getPropertyValue('background-color'), 'resolves to the same color as the background-color of a ' + element.name);
- test_computed_value('color', 'FieldText', style.getPropertyValue('color'), 'resolves to the same color as text on a ' + element.name);
- }
-
- // Mark and MarkText
- style = document.defaultView.getComputedStyle(document.getElementById('mark'));
- test_computed_value('color', 'Mark', style.getPropertyValue('background-color'), 'has the same color as the background-color of a mark element');
- test_computed_value('color', 'MarkText', style.getPropertyValue('color'), 'has the same color as the color of a mark element');
+ ['light', 'dark'].forEach(colorScheme => {
+ document.documentElement.style.colorScheme = colorScheme;
+
+ // Buttons
+ for (let element of document.getElementById("buttons").children) {
+ style = document.defaultView.getComputedStyle(element);
+ test_computed_value('color', 'ButtonBorder', style.getPropertyValue('border-color'), `resolves to the same color as the border-color of a ${element.name} (${colorScheme})`);
+ test_computed_value('color', 'ButtonFace', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
+ test_computed_value('color', 'ButtonText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
+ }
+
+ // CanvasText
+ style = document.defaultView.getComputedStyle(document.getElementsByTagName('html')[0]);
+ test_computed_value('color', 'CanvasText', style.getPropertyValue('color'), `has the same color as the color of the html element (${colorScheme})`);
+
+ // Field and FieldText
+ for (let element of document.getElementById("fields").children) {
+ style = document.defaultView.getComputedStyle(element);
+ test_computed_value('color', 'Field', style.getPropertyValue('background-color'), `resolves to the same color as the background-color of a ${element.name} (${colorScheme})`);
+ test_computed_value('color', 'FieldText', style.getPropertyValue('color'), `resolves to the same color as text on a ${element.name} (${colorScheme})`);
+ }
+
+ // Mark and MarkText
+ style = document.defaultView.getComputedStyle(document.getElementById('mark'));
+ test_computed_value('color', 'Mark', style.getPropertyValue('background-color'), `has the same color as the background-color of a mark element (${colorScheme})`);
+ test_computed_value('color', 'MarkText', style.getPropertyValue('color'), `has the same color as the color of a mark element (${colorScheme})`);
+
+ // LinkText
+ style = document.defaultView.getComputedStyle(document.getElementById('link'));
+ test_computed_value('color', 'LinkText', style.getPropertyValue('color'), `has the same color as the color of an anchor element (${colorScheme})`);
+ });
</script>
</body>
diff --git a/tests/wpt/tests/css/css-color/system-color-support.html b/tests/wpt/tests/css/css-color/system-color-support.html
index 2392739a008..8c278f51193 100644
--- a/tests/wpt/tests/css/css-color/system-color-support.html
+++ b/tests/wpt/tests/css/css-color/system-color-support.html
@@ -57,6 +57,14 @@
'CanvasText',
'AppWorkspace',
'Scrollbar',
+ 'ButtonFace',
+ 'ButtonText',
+ 'LinkText',
+ 'VisitedText',
+ 'Highlight',
+ 'SelectedItem',
+ 'Field',
+ 'FieldText',
];
for (let systemColor of SYSTEM_COLORS) {
diff --git a/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-001.html b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-001.html
new file mode 100644
index 00000000000..5104c2837b7
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-001.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
+<meta name="assert" content="For a grid item with an 'aspect-ratio' and a resolvable percent height and a non-stretching justify-self, the item's inline-size should be resolved based on the height and 'aspect-ratio'">
+<style>
+ .group { margin-bottom: 20px;}
+ .group.orthog .item { writing-mode: vertical-rl }
+ .grid {
+ height: 32px;
+ width: 24px;
+ display: inline-grid;
+ border: 2px solid black;
+ vertical-align: top;
+ background: cyan;
+ }
+
+ .item {
+ height: 100%;
+ background: fuchsia;
+ box-sizing: border-box;
+ aspect-ratio: 1/2;
+ }
+ .center { justify-self: center; }
+ .start { justify-self: start; }
+ .end { justify-self: end; }
+ .self-start { justify-self: self-start; }
+ .self-end { justify-self: self-end; }
+ .flex-start { justify-self: flex-start; }
+ .flex-end { justify-self: flex-end; }
+ .left { justify-self: left; }
+ .right { justify-self: right; }
+ .normal { justify-self: normal; }
+ .stretch { justify-self: stretch; }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.item')">
+ <div class="group">
+ <div class="grid">
+ <div class="item start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item left"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item right"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item center"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item normal"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ <div class="grid">
+ <div class="item stretch"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ </div>
+
+ <!-- For these ones, the item's writing-mode will be orthogonal to the
+ grid container's writing-mode -->
+ <div class="group orthog">
+ <div class="grid">
+ <div class="item start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item left"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item right"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item center"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <!-- TODO(dholbert):
+ These ones behave differently in every browser. Need to sort out
+ the expected rendering here...
+ <div class="grid">
+ <div class="item normal"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ <div class="grid">
+ <div class="item stretch"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ -->
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-002.html b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-002.html
new file mode 100644
index 00000000000..9f40289775d
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/alignment/grid-item-aspect-ratio-justify-self-002.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
+<meta name="assert" content="For a grid item with display:table, an 'aspect-ratio', a resolvable percent height, and a non-stretching justify-self, the item's inline-size should be resolved based on the height and 'aspect-ratio'">
+<style>
+ .group { margin-bottom: 20px;}
+ .group.orthog .item { writing-mode: vertical-rl }
+ .grid {
+ height: 32px;
+ width: 24px;
+ display: inline-grid;
+ border: 2px solid black;
+ vertical-align: top;
+ background: cyan;
+ }
+
+ .item {
+ display: table;
+ height: 100%;
+ background: fuchsia;
+ box-sizing: border-box;
+ aspect-ratio: 1/2;
+ }
+ .center { justify-self: center; }
+ .start { justify-self: start; }
+ .end { justify-self: end; }
+ .self-start { justify-self: self-start; }
+ .self-end { justify-self: self-end; }
+ .flex-start { justify-self: flex-start; }
+ .flex-end { justify-self: flex-end; }
+ .left { justify-self: left; }
+ .right { justify-self: right; }
+ .normal { justify-self: normal; }
+ .stretch { justify-self: stretch; }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.item')">
+ <div class="group">
+ <div class="grid">
+ <div class="item start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item left"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item right"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item center"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item normal"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ <div class="grid">
+ <div class="item stretch"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ </div>
+
+ <!-- For these ones, the item's writing-mode will be orthogonal to the
+ grid container's writing-mode -->
+ <div class="group orthog">
+ <div class="grid">
+ <div class="item start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item self-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-start"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item flex-end"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item left"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item right"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <div class="grid">
+ <div class="item center"
+ data-expected-width="16" data-expected-height="32"></div>
+ </div>
+ <!-- TODO(dholbert):
+ These ones behave differently in every browser. Need to sort out
+ the expected rendering here...
+ <div class="grid">
+ <div class="item normal"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ <div class="grid">
+ <div class="item stretch"
+ data-expected-width="24" data-expected-height="48"></div>
+ </div>
+ -->
+ </div>
+</body>
diff --git a/tests/wpt/tests/css/css-grid/firefox-bug-1881495-ref.html b/tests/wpt/tests/css/css-grid/firefox-bug-1881495-ref.html
new file mode 100644
index 00000000000..aa6275c4a71
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/firefox-bug-1881495-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+:root {
+ font: 30px/1 Ahem;
+}
+.grid {
+ display: inline-grid;
+ border: 4px solid gray;
+ vertical-align: top;
+}
+</style>
+<div class="grid" style="inline-size: 1em">
+ <div>
+ X<br>X
+ </div>
+</div>
+<div class="grid" style="inline-size: 2em">
+ <div>
+ X<br>X
+ </div>
+</div>
+<div class="grid" style="inline-size: 3em">
+ <div>
+ X<br>X
+ </div>
+</div>
+<br><br>
+<div class="grid" style="writing-mode: vertical-rl; inline-size: 1em">
+ <div>
+ X<br>X
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl; inline-size: 2em">
+ <div>
+ X<br>X
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl; inline-size: 3em">
+ <div>
+ X<br>X
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/firefox-bug-1881495.html b/tests/wpt/tests/css/css-grid/firefox-bug-1881495.html
new file mode 100644
index 00000000000..355d26dfb0b
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/firefox-bug-1881495.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1881671">
+<link rel="match" href="firefox-bug-1881495-ref.html">
+<meta name="assert" content="An auto-block-size grid should choose a content-based block-size that accounts for linewrapping in its content-sized items">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+:root {
+ font: 30px/1 Ahem;
+}
+.grid {
+ display: inline-grid;
+ border: 4px solid gray;
+ justify-items: start;
+ vertical-align: top;
+}
+.negMargin {
+ margin-inline-end: -1px;
+}
+</style>
+<div class="grid" style="inline-size: 1em">
+ <div>
+ X
+ <span class="negMargin">X</span>
+ </div>
+</div>
+<div class="grid" style="inline-size: 2em">
+ <div>
+ X
+ <span class="negMargin">X</span>
+ </div>
+</div>
+<div class="grid" style="inline-size: 3em">
+ <div>
+ X
+ <span class="negMargin">X</span>
+ </div>
+</div>
+<br>
+<br>
+<div class="grid" style="writing-mode: vertical-rl; inline-size: 1em">
+ <div>
+ X
+ <span class="negMargin">X</span>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl; inline-size: 2em">
+ <div>
+ X
+ <span class="negMargin">X</span>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl; inline-size: 3em">
+ <div>
+ X
+ <span class="negMargin">X</span>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/subgrid/line-names-010-ref.html b/tests/wpt/tests/css/css-grid/subgrid/line-names-010-ref.html
index 9232f1dcf2a..a4408517b4d 100644
--- a/tests/wpt/tests/css/css-grid/subgrid/line-names-010-ref.html
+++ b/tests/wpt/tests/css/css-grid/subgrid/line-names-010-ref.html
@@ -102,5 +102,12 @@
<x style="grid-column: 1 / 4">x</x>
</div>
</div>
+
+<div style="display:grid; grid-template-areas: 'a b c d'; grid-template-rows: 1fr 1fr;">
+ <i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i>
+ <div style="display:grid; grid:subgrid/subgrid; grid-column: a / d; grid-row: 2;">
+ <x style="grid-column: 3">x</x>
+ </div>
+</div>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/subgrid/line-names-010.html b/tests/wpt/tests/css/css-grid/subgrid/line-names-010.html
index f22cfe3303e..49295b50b40 100644
--- a/tests/wpt/tests/css/css-grid/subgrid/line-names-010.html
+++ b/tests/wpt/tests/css/css-grid/subgrid/line-names-010.html
@@ -103,5 +103,12 @@
<x style="grid-column: a">x</x>
</div>
</div>
+
+<div style="display:grid; grid-template-areas: 'a b c d'; grid-template-rows: 1fr 1fr;">
+ <i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i>
+ <div style="display:grid; grid:subgrid/subgrid; grid-column: a / d; grid-row: 2;">
+ <x style="grid-column: c">x</x>
+ </div>
+</div>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001-ref.html b/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001-ref.html
new file mode 100644
index 00000000000..0d00d380b66
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001-ref.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<title>CSS Grid Reference: Subgrids with 'overflow' and/or 'scrollbar-gutter'</title>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+
+<style>
+:root {
+ overflow: scroll; /* Required to reproduce the bug on Firefox */
+}
+.grid {
+ display: inline-block;
+ inline-size: 75px;
+ border: 5px solid blue;
+ vertical-align: top;
+}
+.subgrid {
+ block-size: 75px;
+}
+.item {
+ inline-size: 50px;
+ block-size: 50px;
+ background: green;
+}
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+}
+</style>
+
+<p>All the following subgrid scroll container shouldn't have any scrollbars.</p>
+
+<p>Testcase 1: subgrid with 'overflow: scroll'</p>
+<div class="grid">
+ <div class="subgrid" style="overflow: scroll;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <div class="subgrid" style="overflow: scroll;">
+ <div class="item"></div>
+ </div>
+</div>
+
+<p>Testcase 2: subgrid with 'overflow: auto' and 'scrollbar-gutter: stable'</p>
+<div class="grid">
+ <div class="subgrid" style="overflow: auto; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <div class="subgrid" style="overflow: auto; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
+
+<p>Testcase 3: subgrid with 'overflow: hidden' and 'scrollbar-gutter: stable'</p>
+<div class="grid">
+ <div class="subgrid" style="overflow: hidden; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <div class="subgrid" style="overflow: hidden; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001.html b/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001.html
new file mode 100644
index 00000000000..664e4bc70eb
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-001.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<title>CSS Grid Test: Subgrids with 'overflow' and/or 'scrollbar-gutter'</title>
+<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://bugzilla.mozilla.org/show_bug.cgi?id=1879770">
+<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-item-contribution">
+<link rel="match" href="scrollbar-gutter-001-ref.html">
+
+<style>
+:root {
+ overflow: scroll; /* Required to reproduce the bug on Firefox */
+}
+.grid {
+ inline-size: 75px;
+ display: inline-grid;
+ border: 5px solid blue;
+ vertical-align: top;
+}
+.subgrid {
+ block-size: 75px;
+ display: grid;
+ grid: auto / subgrid;
+}
+.item {
+ inline-size: 50px;
+ block-size: 50px;
+ background: green;
+}
+</style>
+
+<p>All the following subgrid scroll container shouldn't have any scrollbars.</p>
+
+<p>Testcase 1: subgrid with 'overflow: scroll'</p>
+<div class="grid">
+ <div class="subgrid" style="overflow: scroll;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <div class="subgrid" style="overflow: scroll;">
+ <div class="item"></div>
+ </div>
+</div>
+
+<p>Testcase 2: subgrid with 'overflow: auto' and 'scrollbar-gutter: stable'</p>
+<div class="grid">
+ <div class="subgrid" style="overflow: auto; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <div class="subgrid" style="overflow: auto; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
+
+<p>Testcase 3: subgrid with 'overflow: hidden' and 'scrollbar-gutter: stable'</p>
+<div class="grid">
+ <div class="subgrid" style="overflow: hidden; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <div class="subgrid" style="overflow: hidden; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-002.html b/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-002.html
new file mode 100644
index 00000000000..724bf06104c
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/subgrid/scrollbar-gutter-002.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<meta charset="utf-8">
+<title>CSS Grid Test: Fieldset subgrids with 'overflow' and/or 'scrollbar-gutter'</title>
+<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://bugzilla.mozilla.org/show_bug.cgi?id=1879770">
+<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-item-contribution">
+<link rel="match" href="scrollbar-gutter-001-ref.html">
+
+<style>
+:root {
+ overflow: scroll; /* Required to reproduce the bug on Firefox */
+}
+.grid {
+ inline-size: 75px;
+ display: inline-grid;
+ border: 5px solid blue;
+ vertical-align: top;
+}
+.subgrid {
+ block-size: 75px;
+ display: grid;
+ grid: auto / subgrid;
+}
+.item {
+ inline-size: 50px;
+ block-size: 50px;
+ background: green;
+}
+fieldset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+}
+</style>
+
+<p>All the following subgrid scroll container shouldn't have any scrollbars.</p>
+
+<p>Testcase 1: subgrid with 'overflow: scroll'</p>
+<div class="grid">
+ <fieldset class="subgrid" style="overflow: scroll;">
+ <div class="item"></div>
+ </fieldset>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <fieldset class="subgrid" style="overflow: scroll;">
+ <div class="item"></div>
+ </fieldset>
+</div>
+
+<p>Testcase 2: subgrid with 'overflow: auto' and 'scrollbar-gutter: stable'</p>
+<div class="grid">
+ <fieldset class="subgrid" style="overflow: auto; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </fieldset>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <fieldset class="subgrid" style="overflow: auto; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </fieldset>
+</div>
+
+<p>Testcase 3: subgrid with 'overflow: hidden' and 'scrollbar-gutter: stable'</p>
+<div class="grid">
+ <fieldset class="subgrid" style="overflow: hidden; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </fieldset>
+</div>
+<div class="grid" style="writing-mode: vertical-rl;">
+ <fieldset class="subgrid" style="overflow: hidden; scrollbar-gutter: stable;">
+ <div class="item"></div>
+ </fieldset>
+</div>
diff --git a/tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001-ref.html b/tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001-ref.html
new file mode 100644
index 00000000000..aa76cf08b46
--- /dev/null
+++ b/tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Highlight API Test: ::highlight text-decoration paints over higher priority when not clashing</title>
+ <style>
+ #yellow-highlight {
+ background-color: yellow;
+ text-decoration: underline;
+ text-decoration-color: red;
+ }
+ </style>
+</head>
+<body>
+ <span id="yellow-highlight">Yellow</span>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001.html b/tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001.html
new file mode 100644
index 00000000000..7ab318b5a11
--- /dev/null
+++ b/tests/wpt/tests/css/css-highlight-api/painting/custom-highlight-painting-priority-text-decoration-001.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Highlight API Test: ::highlight text-decoration paints over higher priority when not clashing</title>
+ <link rel="help" href="https://www.w3.org/TR/css-highlight-api-1/#priorities">
+ <link rel="match" href="custom-highlight-painting-priority-text-decoration-001-ref.html">
+ <style>
+ ::highlight(yellow-highlight) {
+ background-color: yellow;
+ }
+ ::highlight(underline-highlight) {
+ text-decoration: underline;
+ text-decoration-color: red;
+ }
+ </style>
+</head>
+<body>
+ <span id="yellow-highlight">Yellow</span>
+
+ <script>
+ let yellow = document.getElementById("yellow-highlight");
+ let highlightYellow = new Highlight(new StaticRange({
+ startContainer: yellow.childNodes[0],
+ startOffset: 0,
+ endContainer: yellow.childNodes[0],
+ endOffset: 6
+ }));
+ let highlightUnderline = new Highlight(new StaticRange({
+ startContainer: yellow.childNodes[0],
+ startOffset: 0,
+ endContainer: yellow.childNodes[0],
+ endOffset: 6
+ }));
+ CSS.highlights.set("yellow-highlight", highlightYellow);
+ CSS.highlights.set("underline-highlight", highlightUnderline);
+ highlightYellow.priority = 10;
+ </script>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-properties-values-api/at-property-shadow.html b/tests/wpt/tests/css/css-properties-values-api/at-property-shadow.html
index db282d10b0e..69f4f4c1075 100644
--- a/tests/wpt/tests/css/css-properties-values-api/at-property-shadow.html
+++ b/tests/wpt/tests/css/css-properties-values-api/at-property-shadow.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#at-property-rule">
+<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#shadow-dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/utils.js"></script>
@@ -16,7 +16,7 @@
</style>
<template id=template>
<style>
- /* This rule should have no effect */
+ /* This rule should be globally registered */
@property --y {
syntax: "<length>";
inherits: false;
@@ -38,9 +38,9 @@ test(() => {
root.append(template.content.cloneNode(true));
let inside = root.querySelector('#inside');
assert_equals(getComputedStyle(outside).getPropertyValue('--x'), '2px');
- assert_equals(getComputedStyle(outside).getPropertyValue('--y'), 'calc(1px + 1px)');
+ assert_equals(getComputedStyle(outside).getPropertyValue('--y'), '2px');
assert_equals(getComputedStyle(inside).getPropertyValue('--x'), '2px');
- assert_equals(getComputedStyle(inside).getPropertyValue('--y'), 'calc(1px + 1px)');
-}, '@property rules in shadow trees should have no effect');
+ assert_equals(getComputedStyle(inside).getPropertyValue('--y'), '2px');
+}, '@property rules in shadow trees should be globally registered');
</script>
diff --git a/tests/wpt/tests/css/css-pseudo/selection-background-color-001.html b/tests/wpt/tests/css/css-pseudo/selection-background-color-001.html
new file mode 100644
index 00000000000..a416d31e186
--- /dev/null
+++ b/tests/wpt/tests/css/css-pseudo/selection-background-color-001.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Pseudo-Elements Test: ::selection background color</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo/#selectordef-selection">
+<meta name="assert" content="This test checks that ::selection background color is not modified when it matches the text color">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<script src="support/selections.js"></script>
+<style>
+ div {
+ color: green;
+ font: 100px/1 Ahem;
+ }
+ ::selection {
+ background-color: green;
+ }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div>&nbsp;</div>
+<script>selectNodeContents(document.querySelector("div"));</script> \ No newline at end of file
diff --git a/tests/wpt/tests/css/css-scoping/font-face-001.html b/tests/wpt/tests/css/css-scoping/font-face-001.html
new file mode 100644
index 00000000000..7e47d18cbaa
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-001.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<title>CSS Test: @font-face applies in the shadow tree.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+#in-document {
+ font-family: ff-16-wide;
+}
+</style>
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ @font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+ }
+ #in-shadow {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_not_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face applies in the shadow tree")
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-002.html b/tests/wpt/tests/css/css-scoping/font-face-002.html
new file mode 100644
index 00000000000..2e3272c44f7
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-002.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<title>CSS Test: @font-face from the document applies in the shadow tree.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+@font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+}
+</style>
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ #in-shadow {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_not_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face from the document applies in the shadow tree");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-003.html b/tests/wpt/tests/css/css-scoping/font-face-003.html
new file mode 100644
index 00000000000..d3f83e4ec37
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-003.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<title>CSS Test: @font-face from document applies to :host.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+@font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+}
+</style>
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ :host {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face from document applies to :host");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-004.html b/tests/wpt/tests/css/css-scoping/font-face-004.html
new file mode 100644
index 00000000000..6ac50bd4323
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-004.html
@@ -0,0 +1,31 @@
+
+<!doctype html>
+<title>CSS Test: @font-face from document applies to ::slotted.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+@font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+}
+</style>
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ ::slotted(#in-document) {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_not_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face from document applies to a slotted element");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-005.html b/tests/wpt/tests/css/css-scoping/font-face-005.html
new file mode 100644
index 00000000000..fdf86fb56e2
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-005.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<title>CSS Test: @font-face should not leak out of shadow tree.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+ #in-document {
+ font-family: ff-16-wide;
+ }
+</style>
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ @font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+ }
+ #in-shadow {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_not_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face should not leak out of shadow tree.");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-006.html b/tests/wpt/tests/css/css-scoping/font-face-006.html
new file mode 100644
index 00000000000..5eabe6ab767
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-006.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<title>CSS Test: @font-face from document applies to :host::before/::after.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+@font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+}
+#host {
+ float: left;
+}
+</style>
+<div id="host"></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ :host::before, :host::after {
+ font-family: ff-16-wide;
+ content: "12345"
+ }
+ </style>
+ <slot></slot>
+ `;
+
+ //shrinkwrapped size for a default font will be a bit more than 80-90
+ //if the font is applied, it will be a bit more than 160
+ assert_greater_than(document.getElementById('host').offsetWidth, 160);
+}, "@font-face from document applies to to :host::before/::after.");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-007.html b/tests/wpt/tests/css/css-scoping/font-face-007.html
new file mode 100644
index 00000000000..ae669f638fe
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-007.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<title>CSS Test: @font-face from shadow applies to :host.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ @font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+ }
+ :host {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face from shadow applies to :host");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-008.html b/tests/wpt/tests/css/css-scoping/font-face-008.html
new file mode 100644
index 00000000000..a40b0247d13
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-008.html
@@ -0,0 +1,29 @@
+
+<!doctype html>
+<title>CSS Test: @font-face from shadow applies to ::slotted.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<div id="host"><span id="in-document">1234567890</span></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ @font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+ }
+ ::slotted(#in-document) {
+ font-family: ff-16-wide;
+ }
+ </style>
+ <slot></slot>
+ <span id="in-shadow">0123456789</span>
+ `;
+
+ assert_equals(document.getElementById('in-document').offsetWidth, 160);
+ assert_not_equals(host.shadowRoot.getElementById('in-shadow').offsetWidth, 160);
+}, "@font-face from shadow applies to a slotted element");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/font-face-009.html b/tests/wpt/tests/css/css-scoping/font-face-009.html
new file mode 100644
index 00000000000..5d770929cad
--- /dev/null
+++ b/tests/wpt/tests/css/css-scoping/font-face-009.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<title>CSS Test: @font-face from shadow applies to :host::before/::after.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Alan Stearns" href="mailto:stearns@adobe.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#shadow-names">
+
+<style>
+#host {
+ float: left;
+}
+</style>
+<div id="host"></div>
+<script>
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ @font-face {
+ font-family: ff-16-wide;
+ src: url(/fonts/Ahem.ttf);
+ }
+ :host::before, :host::after {
+ font-family: ff-16-wide;
+ content: "12345"
+ }
+ </style>
+ <slot></slot>
+ `;
+
+ //shrinkwrapped size for a default font will be a bit more than 80-90
+ //if the font is applied, it will be a bit more than 160
+ assert_greater_than(document.getElementById('host').offsetWidth, 160);
+}, "@font-face from shadow applies to to :host::before/::after.");
+</script>
diff --git a/tests/wpt/tests/css/css-scoping/keyframes-001.html b/tests/wpt/tests/css/css-scoping/keyframes-001.html
index b0a95ac6865..56f0f32dcf9 100644
--- a/tests/wpt/tests/css/css-scoping/keyframes-001.html
+++ b/tests/wpt/tests/css/css-scoping/keyframes-001.html
@@ -4,10 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="help" href="https://drafts.csswg.org/css-scoping/#selectors-data-model">
-<!--
- Beware of https://github.com/w3c/csswg-drafts/issues/1995 potentially, but
- unlikely, changing the expected result of this test.
--->
+
<style>
#in-document {
width: 100px;
diff --git a/tests/wpt/tests/css/css-scoping/keyframes-002.html b/tests/wpt/tests/css/css-scoping/keyframes-002.html
index b80b250460b..347adcb0f52 100644
--- a/tests/wpt/tests/css/css-scoping/keyframes-002.html
+++ b/tests/wpt/tests/css/css-scoping/keyframes-002.html
@@ -1,13 +1,10 @@
<!doctype html>
-<title>CSS Test: @keyframes from the document don't apply in the shadow tree.</title>
+<title>CSS Test: @keyframes from the document should apply in the shadow tree.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="help" href="https://drafts.csswg.org/css-scoping/#selectors-data-model">
-<!--
- Beware of https://github.com/w3c/csswg-drafts/issues/1995 potentially, but
- unlikely, changing the expected result of this test.
--->
+
<style>
@keyframes myanim {
from { background: red; }
@@ -29,6 +26,6 @@ test(function() {
<div id="in-shadow"></div>
`;
- assert_equals(host.shadowRoot.getElementById('in-shadow').getAnimations().length, 0);
-}, "@keyframes from the document don't apply in the shadow tree");
+ assert_equals(host.shadowRoot.getElementById('in-shadow').getAnimations().length, 1);
+}, "@keyframes from the document should apply in the shadow tree");
</script>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/nested-supercedes-common-to-both-axes.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/nested-supercedes-common-to-both-axes.html
new file mode 100644
index 00000000000..15743026bc3
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/nested-supercedes-common-to-both-axes.html
@@ -0,0 +1,91 @@
+<!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>
+ .scroller {
+ overflow: scroll;
+ width: 450px;
+ height: 450px;
+ border: solid 1px black;
+ scroll-snap-type: both mandatory;
+ position: relative;
+ resize: both;
+ }
+ .large-space {
+ height: 300vh;
+ width: 300vw;
+ position: absolute;
+ }
+ .snap {
+ scroll-snap-align: start;
+ }
+ .box {
+ width: 200px;
+ height: 200px;
+ background-color: green;
+ position: absolute;
+ }
+ .inner {
+ width: 50px;
+ height: 50px;
+ background-color: yellow;
+ }
+ #box2 {
+ top: 0px;
+ left: 100px;
+ }
+ #box3 {
+ top: 100px;
+ left: 0px;
+ }
+ </style>
+ <div class="scroller" id="scroller">
+ <div class="large-space"><div>
+ <div id="box1" class="snap box">Box 1</div>
+ <div id="box2" class="inner snap box">Box 2</div>
+ <div id="box3" class="inner snap box">Box 3</div>
+ </div>
+ <script>
+ window.onload = () => {
+ const scroller = document.getElementById("scroller");
+ const boxes = document.querySelectorAll(".snap.box");
+ function box(n) {
+ return boxes[n - 1];
+ }
+
+ promise_test(async (t) => {
+ await waitForCompositorCommit();
+
+ // Box 2 should be selected as the target in the y axis despite Box 1's
+ // being a common target in both axes because Box 2 is nested within
+ // Box 1.
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(1), box(2)],
+ /*axis=*/ "y",
+ /*expected_target_x=*/null,
+ /*expected_target_y=*/box(2));
+
+ // Box 3 should be selected as the target in the x axis despite Box 1's
+ // being a common target in both axes because Box 3 is nested within
+ // Box 1.
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[box(1), box(3)],
+ /*aligned_elements_y=*/[],
+ /*axis=*/"x",
+ /*expected_target_x=*/box(3));
+ }, "scroller prefers nested area over area aligned in both axes.");
+ }
+ </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
new file mode 100644
index 00000000000..09b81e7c0da
--- /dev/null
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-common-to-both-axes.html
@@ -0,0 +1,151 @@
+<!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>
+ .scroller {
+ overflow: scroll;
+ width: 350px;
+ height: 350px;
+ border: solid 1px black;
+ scroll-snap-type: both mandatory;
+ position: relative;
+ resize: both;
+ }
+ .large-space {
+ height: 300vh;
+ width: 300vw;
+ position: absolute;
+ }
+ .snap {
+ scroll-snap-align: start;
+ }
+ .box {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ display: inline-block;
+ position: relative;
+ }
+ .grid {
+ position: absolute;
+ width: 350px;
+ height: 350px;
+ }
+ .snap:focus {
+ background-color: blue;
+ }
+ </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>
+ <script>
+ window.onload = () => {
+ // 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 |
+ // -------------------------
+ const scroller = document.getElementById("scroller");
+ const boxes = document.querySelectorAll(".snap.box");
+ function box(n) {
+ return boxes[n - 1];
+ }
+
+ promise_test(async (t) => {
+ await waitForCompositorCommit();
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(1), box(2), box(3)],
+ /*axis=*/ "y",
+ /*expected_target_x=*/null,
+ /*expected_target_y=*/box(1));
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(4), box(5), box(6)],
+ /*axis=*/ "y",
+ /*expected_target_x=*/null,
+ /*expected_target_y=*/box(4));
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(7), box(8), box(9)],
+ /*axis=*/"y",
+ /*expected_target_x=*/null,
+ /*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));
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[box(2), box(5), box(8)],
+ /*aligned_elements_y=*/[],
+ /*axis=*/"x",
+ /*expected_target_x=*/box(2));
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[box(3), box(6), box(9)],
+ /*aligned_elements_y=*/[],
+ /*axis=*/"x",
+ /*expected_target_x=*/box(3));
+
+ await runScrollSnapSelectionVerificationTest(t, scroller,
+ /*aligned_elements_x=*/[box(2), box(5), box(8)],
+ /*aligned_elements_y=*/[box(4), box(5), box(6)],
+ /*axis=*/"both",
+ /*expected_target_x=*/box(5),
+ /*expected_target_y=*/box(5));
+ }, "scroller prefers target aligned in both axes.");
+
+ promise_test(async (t) => {
+ const box7 = box(7), box8 = box(8), box9 = box(9);
+ const initial_box8_top = box8.offsetTop;
+ t.add_cleanup(() => {
+ box8.style.top = `${initial_box8_top}px`;
+ });
+
+ // Move box 8 below box7 and box9.
+ box8.style.top = `${2 * box8.offsetTop}px`;
+
+ // Snap to box8.
+ scroller.scrollTop = box8.offsetTop;
+
+ // Test that if box7 and box9 are also shifted to align with box7,
+ // box8 is still treated as the selected snap target despite box7 being
+ // aligned on both axes.
+ runLayoutSnapSeletionVerificationTest(t, scroller, [box7, box9],
+ box8, "y");
+ }, "scroller follows selected snap target after layout shift, " +
+ "regardless of common snap area.");
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-element.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-element.html
index f15a291f08a..9acf0e905cb 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-element.html
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-element.html
@@ -71,15 +71,19 @@
focusAndAssert(bottomright);
await runScrollSnapSelectionVerificationTest(t, scroller,
- [bottomright,
- bottomleft],
- /*expected_target=*/bottomright, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[bottomright, bottomleft],
+ /*axis=*/"y",
+ /*expected_target_x=*/null,
+ /*expected_target_y=*/bottomright);
focusAndAssert(bottomleft);
await runScrollSnapSelectionVerificationTest(t, scroller,
- [bottomright,
- bottomleft],
- /*expected_target=*/bottomleft, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[bottomright, bottomleft],
+ /*axis=*/"y",
+ /*expected_target_x=*/null,
+ /*expected_target_y=*/bottomleft);
}, "scroller selects focused target from aligned choices on snap");
promise_test(async (t) => {
@@ -94,9 +98,11 @@
// Set focus on bottomright without scrolling to it.
focusAndAssert(bottomright, true);
await runScrollSnapSelectionVerificationTest(t, scroller,
- [bottomright,
- bottomleft],
- /*expected_target=*/bottomleft, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[bottomright, bottomleft],
+ /*axis=*/"y",
+ /*expected_target_x=*/null,
+ /*expected_target_y=*/bottomleft);
}, "out-of-viewport focused element is not the selected snap target.");
promise_test(async(t) => {
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-nested-containers.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-nested-containers.html
index a6a087316fd..4330022b27a 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-nested-containers.html
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-nested-containers.html
@@ -97,11 +97,19 @@
focusAndAssert(lefttarget1, /*preventScroll=*/true);
await runScrollSnapSelectionVerificationTest(t, outercontainer,
- [leftcontainer, rightcontainer], leftcontainer, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[leftcontainer, rightcontainer],
+ /*axis=*/"y",
+ /*expected_target_x=*/null,
+ /*expected_target_x=*/leftcontainer);
focusAndAssert(righttarget1, /*preventScroll=*/true);
await runScrollSnapSelectionVerificationTest(t, outercontainer,
- [leftcontainer, rightcontainer], rightcontainer, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[leftcontainer, rightcontainer],
+ /*axis=*/"y",
+ /*expected_target_x=*/null,
+ /*expected_target_x=*/rightcontainer);
}, "Snap container prefers focused nested snap target.");
}
</script>
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-inner-target.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-inner-target.html
index 053b6a1d7e6..3cabbc7945f 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-inner-target.html
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-inner-target.html
@@ -115,13 +115,23 @@
await waitForCompositorCommit();
await runScrollSnapSelectionVerificationTest(t, scroller,
- [inner1, inner2, inner3, inner4, outer], inner4, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[inner1, inner2, inner3, inner4, outer],
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_y*/inner4);
// Push inner4 outside the snapport. It should no longer be considered
// the snap target; inner3 is next in line.
inner4.style.left = "500px";
await runScrollSnapSelectionVerificationTest(t, scroller,
- [inner1, inner2, inner3, inner4, outer], inner3, "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[inner1, inner2, inner3, inner4, outer],
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_y*/inner3);
+
+ // Reset inner4's style.
inner4.style.left = "100px";
}, "snap container selects innermost area as snap target");
diff --git a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-positioned.html b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-positioned.html
index 22727d19ebd..3a2b1a90892 100644
--- a/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-positioned.html
+++ b/tests/wpt/tests/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-targeted-element-positioned.html
@@ -36,8 +36,11 @@
// There are 5 aligned boxes in positioned-target-iframe.html.
assert_equals(boxes.length, 5);
await runScrollSnapSelectionVerificationTest(t, scroller,
- [box(1), box(2), box(3), box(4), box(5)],
- box(target_number), "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(1), box(2), box(3), box(4), box(5)],
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_x*/box(target_number));
// Let scroller no longer be a scroll container.
scroller.style.overflow = "visible";
@@ -48,8 +51,11 @@
// Run the test again.
await runScrollSnapSelectionVerificationTest(t, scroller,
- [box(1), box(2), box(3), box(4), box(5)],
- box(target_number), "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(1), box(2), box(3), box(4), box(5)],
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_x*/box(target_number));
finish();
};
iframe.src = `positioned-target-iframe.html#target${target_number}`;
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 87e7098fa35..1f7f087180d 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
@@ -59,8 +59,13 @@
let scroller = iframe.contentDocument.getElementById("scroller");
assert_equals(boxes.length, 9);
await runScrollSnapSelectionVerificationTest(t, scroller,
- [box(box_number), box(other_box_1), box(other_box_2)],
- box(box_number), "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(box_number),
+ box(other_box_1),
+ box(other_box_2)],
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_y*/box(box_number));
// Let scroller no longer be a scroll container.
scroller.style.overflow = "visible";
@@ -71,8 +76,13 @@
// Run the test again.
await runScrollSnapSelectionVerificationTest(t, scroller,
- [box(box_number), box(other_box_1), box(other_box_2)],
- box(box_number), "y");
+ /*aligned_elements_x=*/[],
+ /*aligned_elements_y=*/[box(box_number),
+ box(other_box_1),
+ box(other_box_2)],
+ /*axis=*/"y",
+ /*expected_target_x*/null,
+ /*expected_target_y*/box(box_number));
finish();
};
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 26ee5f75eab..2d74baae577 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
@@ -6,33 +6,30 @@
// This function should be used by scroll snap WPTs wanting to test snap target
// selection when scrolling to multiple aligned targets.
-// It assumes scroll-snap-align: start alignment and tries to align to the list
-// of snap targets provided, |elements|, which are all expected to be at the
-// same offset.
-async function scrollToAlignedElementsInAxis(scroller, elements, axis) {
+// It assumes scroll-snap-align: start alignment and tries to align to the lists
+// of snap targets provided, |elements_x| and |elements_y|, which are all
+// expected to be at the same offset in the relevant axis.
+async function scrollToAlignedElements(scroller, elements_x, elements_y) {
let target_offset_y = null;
let target_offset_x = null;
- if (axis == "y") {
- for (const e of elements) {
- if (target_offset_y) {
- assert_equals(e.offsetTop, target_offset_y,
- `${e.id} is at y offset ${target_offset_y}`);
- } else {
- target_offset_y = e.offsetTop;
- }
+ for (const e of elements_y) {
+ if (target_offset_y != null) {
+ assert_equals(e.offsetTop, target_offset_y,
+ `${e.id} is at y offset ${target_offset_y}`);
+ } else {
+ target_offset_y = e.offsetTop;
}
- assert_equals();
- } else {
- for (const e of elements) {
- if (target_offset_x) {
- assert_equals(e.offsetLeft, target_offset_x,
- `${e.id} is at x offset ${target_offset_x}`);
- } else {
- target_offset_x = e.offsetLeft;
- }
+ }
+ for (const e of elements_x) {
+ if (target_offset_x != null) {
+ assert_equals(e.offsetLeft, target_offset_x,
+ `${e.id} is at x offset ${target_offset_x}`);
+ } else {
+ target_offset_x = e.offsetLeft;
}
}
- assert_not_equals(target_offset_x || target_offset_y, null);
+ assert_true((target_offset_x != null) || (target_offset_y != null),
+ "scrolls in at least 1 axis");
if ((target_offset_x != null && scroller.scrollLeft != target_offset_x) ||
(target_offset_y != null && scroller.scrollTop != target_offset_y)) {
@@ -44,14 +41,15 @@ async function scrollToAlignedElementsInAxis(scroller, elements, axis) {
.send();
await scrollend_promise;
}
- if (axis == "y") {
+ if (target_offset_y) {
assert_equals(scroller.scrollTop, target_offset_y, "vertical scroll done");
- } else {
- assert_equals(scroller.scrollLeft,target_offset_x, "horizontal scroll done");
+ }
+ if (target_offset_x) {
+ assert_equals(scroller.scrollLeft, target_offset_x, "horizontal scroll done");
}
}
-// This function verifies the snap target that a scroller picked by triggerring
+// This function verifies the snap target that a scroller picked by triggering
// a layout change and observing which target is followed. Tests using this
// method should ensure that there is at least 100px of room to scroll in the
// desired axis.
@@ -66,16 +64,16 @@ function verifySelectedSnapTarget(scroller, expected_snap_target, axis) {
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} after layout change`);
+ `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 y axis.
+ // 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} after layout change`);
+ `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");
}
@@ -86,15 +84,21 @@ function verifySelectedSnapTarget(scroller, expected_snap_target, axis) {
// This is a utility function for tests which verify that the correct element
// is snapped to when snapping at the end of a scroll.
-async function runScrollSnapSelectionVerificationTest(t, scroller, aligned_elements,
- expected_target, axis) {
+async function runScrollSnapSelectionVerificationTest(t, scroller,
+ aligned_elements_x=[], aligned_elements_y=[], axis="",
+ expected_target_x=null, expected_target_y=null) {
// Save initial scroll offset.
const initial_scroll_left = scroller.scrollLeft;
const initial_scroll_top = scroller.scrollTop;
- await scrollToAlignedElementsInAxis(scroller, aligned_elements, axis);
- // Wrapping this in t.step prevents timeouts in the event of a failure.
- t.step(async () => {
- verifySelectedSnapTarget(scroller, expected_target, axis);
+ await scrollToAlignedElements(scroller, aligned_elements_x,
+ aligned_elements_y);
+ t.step(() => {
+ if (axis == "y" || axis == "both") {
+ verifySelectedSnapTarget(scroller, expected_target_y, axis);
+ }
+ if (axis == "x" || axis == "both") {
+ verifySelectedSnapTarget(scroller, expected_target_x, axis);
+ }
});
// Restore initial scroll offsets.
await waitForScrollReset(t, scroller, initial_scroll_left, initial_scroll_top);
diff --git a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/auto-006.html b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/auto-006.html
index 422b730c2e8..ff1c30135ae 100644
--- a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/auto-006.html
+++ b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/auto-006.html
@@ -352,6 +352,46 @@ promise_test(async function() {
checkSize(1, 2, "Size containment with no last remembered size");
}, "Disconnected element ends up losing last remembered size");
+promise_test(async function () {
+ this.add_cleanup(cleanup);
+ target.classList.add("cis-auto");
+ contents.classList.add("size-100-50");
+ checkSize(100, 50, "Sizing normally");
+
+ await nextRendering();
+ target.classList.add("skip-contents");
+ contents.classList.remove("size-100-50");
+ contents.classList.add("size-75-25");
+ checkSize(100, 50, "Using last remembered size");
+
+ parent.innerHTML = "";
+ checkSize(0, 0, "No box");
+
+ await nextRendering();
+ parent.appendChild(target);
+ checkSize(1, 2, "Size containment with no last remembered size");
+}, "Disconnected element ends up losing last remembered size, parent removes all children");
+
+promise_test(async function () {
+ this.add_cleanup(cleanup);
+ target.classList.add("cis-auto");
+ contents.classList.add("size-100-50");
+ checkSize(100, 50, "Sizing normally");
+
+ await nextRendering();
+ target.classList.add("skip-contents");
+ contents.classList.remove("size-100-50");
+ contents.classList.add("size-75-25");
+ checkSize(100, 50, "Using last remembered size");
+
+ parent.remove();
+ checkSize(0, 0, "No box");
+
+ await nextRendering();
+ document.body.appendChild(parent);
+ checkSize(1, 2, "Size containment with no last remembered size");
+}, "Disconnected element ends up losing last remembered size, the parent node is removed");
+
promise_test(async function() {
this.add_cleanup(cleanup);
target.classList.add("cis-auto");
diff --git a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-033.html b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-033.html
index f98a48a0a97..c40b9cdc8e5 100644
--- a/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-033.html
+++ b/tests/wpt/tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-033.html
@@ -105,6 +105,7 @@ addEventListener("load", async function() {
wrapper.appendChild(tests);
wrapper.classList.add("skip-contents");
+ await new Promise(requestAnimationFrame);
checkLayout(".test");
});
</script>
diff --git a/tests/wpt/tests/css/css-text/parsing/webkit-text-stroke-computed.html b/tests/wpt/tests/css/css-text/parsing/webkit-text-stroke-computed.html
new file mode 100644
index 00000000000..0dadfe402a5
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/parsing/webkit-text-stroke-computed.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS webkit-text-stroke Test: Computed webkit-text-stroke</title>
+<link rel="author" title="Takuya Kurimoto" href="mailto:takuya004869@gmail.com">
+<link rel="help" href="https://compat.spec.whatwg.org/#propdef--webkit-text-stroke">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+ #target {
+ color: lime;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("-webkit-text-stroke", "green", "0px rgb(0, 128, 0)");
+test_computed_value("-webkit-text-stroke", "3px", "3px rgb(0, 255, 0)");
+test_computed_value("-webkit-text-stroke", "1px red", "1px rgb(255, 0, 0)");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html b/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html
new file mode 100644
index 00000000000..072fd1e917f
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="support/variant-class.js"></script>
+<style>
+@font-face {
+ font-family: halt-font;
+ src: url('/fonts/noto/cjk/NotoSansCJKjp-Regular-subset-halt.otf');
+}
+#container {
+ font-family: halt-font;
+ font-size: 20px;
+ inline-size: 4em;
+ text-spacing-trim: space-all;
+}
+.vrl {
+ writing-mode: vertical-rl;
+}
+halt {
+ font-feature-settings: 'halt' 1, 'vhal' 1;
+}
+.trim-start {
+ ps, ls { font-feature-settings: 'halt' 1, 'vhal' 1; }
+}
+.space-first {
+ ls { font-feature-settings: 'halt' 1, 'vhal' 1; }
+}
+</style>
+<div id="container">
+ <div>国)<halt>(国</halt></div>
+ <div>国国国)<ls>(国</ls></div>
+</div>
diff --git a/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html b/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html
new file mode 100644
index 00000000000..623abbf7c7f
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/text-spacing-trim/text-spacing-trim-span-001.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="help" href="https://drafts.csswg.org/css-text-4/#text-spacing-trim-property">
+<link rel="match" href="text-spacing-trim-span-001-ref.html">
+<meta name="variant" content="?class=halt,htb">
+<meta name="variant" content="?class=chws,htb">
+<meta name="variant" content="?class=halt,vrl">
+<meta name="variant" content="?class=chws,vrl">
+<meta name="variant" content="?class=space-first,halt,htb">
+<meta name="variant" content="?class=space-first,chws,htb">
+<meta name="variant" content="?class=space-first,halt,vrl">
+<meta name="variant" content="?class=space-first,chws,vrl">
+<meta name="variant" content="?class=trim-start,halt,htb">
+<meta name="variant" content="?class=trim-start,chws,htb">
+<meta name="variant" content="?class=trim-start,halt,vrl">
+<meta name="variant" content="?class=trim-start,chws,vrl">
+<script src="support/variant-class.js"></script>
+<style>
+@font-face {
+ font-family: halt-font;
+ src: url('/fonts/noto/cjk/NotoSansCJKjp-Regular-subset-halt.otf');
+}
+@font-face {
+ font-family: chws-font;
+ src: url('/fonts/noto/cjk/NotoSansCJKjp-Regular-subset-chws.otf');
+}
+#container {
+ font-family: halt-font;
+ font-size: 20px;
+ inline-size: 4em;
+}
+.chws #container {
+ font-family: chws-font;
+}
+.vrl {
+ writing-mode: vertical-rl;
+}
+.trim-start {
+ text-spacing-trim: trim-start;
+}
+.space-first {
+ text-spacing-trim: space-first;
+}
+</style>
+<div id="container">
+ <div>国)<span>(国</span></div>
+ <div>国国国)<span>(国</span></div>
+</div>
diff --git a/tests/wpt/tests/css/css-text/white-space/reference/text-wrap-balance-003-ref.html b/tests/wpt/tests/css/css-text/white-space/reference/text-wrap-balance-003-ref.html
new file mode 100644
index 00000000000..318480bb502
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/white-space/reference/text-wrap-balance-003-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+div {
+ font: 15px Ahem;
+ width: 35ch;
+ margin: 1em;
+}
+.green {
+ color: green;
+}
+.blue {
+ color: blue;
+}
+</style>
+<p>Both test blocks (green) should have the same layout as the reference (blue):</p>
+<div class="green">The quickest brown fox<br>jumped over the lazy dog</div>
+<div class="green">The quickest brown fox<br>jumped over the lazy dog</div>
+<div class="blue">The quickest brown fox<br>jumped over the lazy dog</div>
diff --git a/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-003.html b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-003.html
new file mode 100644
index 00000000000..a2eb8bbff56
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/white-space/text-wrap-balance-003.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-text-4/#text-wrap-style">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1881855">
+<link rel="match" href="reference/text-wrap-balance-003-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+div {
+ font: 15px Ahem;
+ width: 35ch;
+ margin: 1em;
+}
+.test {
+ text-wrap: balance;
+ color: green;
+}
+.ref {
+ color: blue;
+}
+</style>
+<p>Both test blocks (green) should have the same layout as the reference (blue):</p>
+<div class="test">The quickest brown fox jumped over the lazy dog</div>
+<!-- inline child elements should not affect wrapping -->
+<div class="test">The <span>quickest <span>brown</span> fox</span> jumped <span>over</span> the <span>lazy dog</span></div>
+<div class="ref">The quickest brown fox<br>jumped over the lazy dog</div>
diff --git a/tests/wpt/tests/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html b/tests/wpt/tests/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html
new file mode 100644
index 00000000000..eccb554fd8a
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/animation/rotate-interpolation-math-functions-tentative.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>rotate interpolation with css math functions</title>
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/css/support/interpolation-testcommon.js"></script>
+ </head>
+
+ <style>
+ :root {
+ font-size: 10px;
+ }
+ </style>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'rotate',
+ from: '100deg',
+ to: 'calc(sign(20rem - 20px) * 180deg)',
+ }, [
+ {at: -1, expect: '20deg'},
+ {at: 0, expect: '100deg'},
+ {at: 0.125, expect: '110deg'},
+ {at: 0.875, expect: '170deg'},
+ {at: 1, expect: '180deg'},
+ {at: 2, expect: '260deg'}
+ ]);
+
+ test_interpolation({
+ property: 'rotate',
+ from: 'calc(sign(20rem - 20px) * 100deg)',
+ to: 'calc(progress(10rem from 20px to 100px) * 180deg)',
+ }, [
+ {at: -1, expect: '20deg'},
+ {at: 0, expect: '100deg'},
+ {at: 0.125, expect: '110deg'},
+ {at: 0.875, expect: '170deg'},
+ {at: 1, expect: '180deg'},
+ {at: 2, expect: '260deg'}
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/css-transforms/animation/scale-animation-math-functions-tentative.html b/tests/wpt/tests/css/css-transforms/animation/scale-animation-math-functions-tentative.html
new file mode 100644
index 00000000000..2ad177469a4
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/animation/scale-animation-math-functions-tentative.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>scale interpolation with css math functions</title>
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#individual-transforms">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/css/support/interpolation-testcommon.js"></script>
+ </head>
+
+ <style>
+ :root {
+ font-size: 10px;
+ }
+ </style>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'scale',
+ from: '100',
+ to: 'calc(sign(20rem - 20px) * 180)',
+ }, [
+ {at: -1, expect: '20'},
+ {at: 0, expect: '100'},
+ {at: 0.125, expect: '110'},
+ {at: 0.875, expect: '170'},
+ {at: 1, expect: '180'},
+ {at: 2, expect: '260'}
+ ]);
+
+ test_interpolation({
+ property: 'scale',
+ from: 'calc(sign(20rem - 20px) * 100)',
+ to: 'calc(progress(10rem from 20px to 100px) * 180)',
+ }, [
+ {at: -1, expect: '20'},
+ {at: 0, expect: '100'},
+ {at: 0.125, expect: '110'},
+ {at: 0.875, expect: '170'},
+ {at: 1, expect: '180'},
+ {at: 2, expect: '260'}
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/css-transforms/animation/support/transform-interpolation-reftests.js b/tests/wpt/tests/css/css-transforms/animation/support/transform-interpolation-reftests.js
index d79cbedefe7..4070aec84ab 100644
--- a/tests/wpt/tests/css/css-transforms/animation/support/transform-interpolation-reftests.js
+++ b/tests/wpt/tests/css/css-transforms/animation/support/transform-interpolation-reftests.js
@@ -127,6 +127,13 @@ const midpointOptions = {
delay: -duration/2
};
+// Constant-valued animation using the ending keyframe's value.
+const referenceOptions = {
+ easing: 'steps(1, jump-start)',
+ duration: duration,
+ delay: -duration/2
+}
+
// Similar to midpointOptions, but to produce the interpolation result
// at -1 instead of the interpolation result at 0.5. This easing curve
// has zero slope at its midpoint of -100% (though does have curvature).
@@ -169,9 +176,8 @@ async function createTests(tests) {
takeScreenshot();
}
-// Create references using an animation with identical keyframes for start
-// and end so as to avoid rounding and anti-aliasing differences between
-// animated and non-animated pathways.
+// Create references using a constant-valued animation to avoid rounding and
+// anti-aliasing differences between animated and non-animated pathways.
async function createRefs(tests) {
styleBody();
for (const obj of tests) {
@@ -181,8 +187,8 @@ async function createRefs(tests) {
initialStyle(div);
finalStyle(div);
var anim = div.animate(
- {transform: [test[midIndex], test[midIndex]]},
- midpointOptions);
+ {transform: ['none', test[midIndex]]},
+ referenceOptions);
await anim.ready;
}
diff --git a/tests/wpt/tests/css/css-transforms/transform-box/svgbox-stroke-box-005.html b/tests/wpt/tests/css/css-transforms/transform-box/svgbox-stroke-box-005.html
new file mode 100644
index 00000000000..c1a741b7411
--- /dev/null
+++ b/tests/wpt/tests/css/css-transforms/transform-box/svgbox-stroke-box-005.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>transform-box: border-box, stroke with vector-effect: non-scaling-stroke</title>
+<link rel="match" href="reference/svgbox-rect-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-transforms-1/#transform-box">
+<link rel="help" href="https://svgwg.org/svg2-draft/coords.html#VectorEffects">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/9640">
+<meta name="assert" content="The used value of transform-box is fill-box on SVG with non-scaling-stroke"/>
+<style>
+#container {
+ fill: green;
+ stroke: black;
+ stroke-width: 20;
+ transform-box: border-box;
+ transform: scale(0.5) translateY(-100%);
+}
+#inner {
+ vector-effect: non-scaling-stroke;
+}
+</style>
+<svg width="400" height="300">
+ <a id="container">
+ <rect id="inner" width="100" height="200" x="50" y="180"/>
+ </a>
+</svg>
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 8cd0b986e86..a02a8493be3 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,11 +14,7 @@
'use strict';
runPropertyTests('accent-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- },
+ { syntax: 'currentcolor' },
{
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 f684a40fb62..d0a55d52d4d 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,11 +14,7 @@
'use strict';
runPropertyTests('background-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 3ce4ca94fce..a38f7c7d806 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,11 +15,7 @@
for (const prefix of ['top', 'left', 'right', 'bottom']) {
runPropertyTests(`border-${prefix}-color`, [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 5ea78a08d38..b79beacf4be 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,11 +14,7 @@
'use strict';
runPropertyTests('caret-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- },
+ { syntax: 'currentcolor' },
{
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 f56182977c5..58555ff8052 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,11 +14,7 @@
'use strict';
runPropertyTests('color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 3d35b856d71..ea27c9eaec6 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,11 +14,7 @@
'use strict';
runPropertyTests('column-rule-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 bb3ddc9fc9a..99ee9f05adf 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,11 +14,7 @@
'use strict';
runPropertyTests('flood-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 aec16433723..5d69f2fa4aa 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,11 +14,7 @@
'use strict';
runPropertyTests('lighting-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 6bfec87a8c7..e779d709fe2 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,11 +14,7 @@
'use strict';
runPropertyTests('outline-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
// 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 83dcf0218a0..36b364bd4f3 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,11 +14,7 @@
'use strict';
runPropertyTests('stop-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 b76f82c3ea1..f49a5739fdb 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,11 +14,7 @@
'use strict';
runPropertyTests('text-decoration-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <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 8623d3dfb9b..8f106e6054f 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,11 +14,7 @@
'use strict';
runPropertyTests('text-emphasis-color', [
- {
- syntax: 'currentcolor',
- // computes to a <color>, which is not supported in level 1
- computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
- }
+ { syntax: 'currentcolor' }
]);
// <color>s are not supported in level 1
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 6f93cc0c899..3c97ceb1587 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
@@ -37,6 +37,8 @@ let basic_tests = [
{ 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: "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" },
];
const container = document.getElementById("container");
const target = document.getElementById("target");
diff --git a/tests/wpt/tests/css/css-view-transitions/only-child-group.html b/tests/wpt/tests/css/css-view-transitions/only-child-group.html
index 05275a34488..551e8816116 100644
--- a/tests/wpt/tests/css/css-view-transitions/only-child-group.html
+++ b/tests/wpt/tests/css/css-view-transitions/only-child-group.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait foo">
<title>View transitions: ensure :only-child is supported on view-transition-group</title>
-<link rel="help" href="https://github.com/WICG/view-transitions">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:khushalsagar@chromium.org">
<script src="/resources/testharness.js"></script>
@@ -54,8 +54,7 @@ promise_test(() => {
return new Promise(async (resolve, reject) => {
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-group(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-group(root)");
if (style.backgroundColor == "rgb(255, 0, 0)" && style.color == "rgb(255, 0, 0)")
resolve();
else
@@ -70,8 +69,7 @@ promise_test(() => {
target.style.viewTransitionName = "target";
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-group(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-group(root)");
if (style.backgroundColor == "rgb(0, 0, 255)" && style.color == "rgb(0, 0, 255)")
resolve();
else
@@ -87,8 +85,7 @@ promise_test(() => {
target.style.viewTransitionName = "target";
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-group(target)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-group(target)");
if (style.backgroundColor == "rgb(255, 0, 0)" && style.color == "rgb(255, 0, 0)")
resolve();
else
@@ -105,8 +102,7 @@ promise_test(() => {
target2.style.viewTransitionName = "target2";
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-group(target)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-group(target)");
if (style.backgroundColor == "rgb(0, 0, 255)" && style.color == "rgb(0, 0, 255)")
resolve();
else
diff --git a/tests/wpt/tests/css/css-view-transitions/only-child-image-pair.html b/tests/wpt/tests/css/css-view-transitions/only-child-image-pair.html
index 288d496346e..d84b74f0ab3 100644
--- a/tests/wpt/tests/css/css-view-transitions/only-child-image-pair.html
+++ b/tests/wpt/tests/css/css-view-transitions/only-child-image-pair.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait foo">
<title>View transitions: ensure :only-child is supported on view-transition-image-pair</title>
-<link rel="help" href="https://github.com/WICG/view-transitions">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:khushalsagar@chromium.org">
<script src="/resources/testharness.js"></script>
@@ -38,8 +38,7 @@ promise_test(() => {
return new Promise(async (resolve, reject) => {
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-image-pair(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-image-pair(root)");
if (style.backgroundColor == "rgb(255, 0, 0)" && style.color == "rgb(255, 0, 0)")
resolve();
else
diff --git a/tests/wpt/tests/css/css-view-transitions/only-child-new.html b/tests/wpt/tests/css/css-view-transitions/only-child-new.html
index 9f365282194..7bc8a447ce5 100644
--- a/tests/wpt/tests/css/css-view-transitions/only-child-new.html
+++ b/tests/wpt/tests/css/css-view-transitions/only-child-new.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait foo">
<title>View transitions: ensure :only-child is supported on view-transition-new</title>
-<link rel="help" href="https://github.com/WICG/view-transitions">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:khushalsagar@chromium.org">
<script src="/resources/testharness.js"></script>
@@ -61,8 +61,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-new(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-new(root)");
if (style.backgroundColor == matchedColor && style.color == matchedColor)
resolve();
else
@@ -79,8 +78,7 @@ promise_test(() => {
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-new(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-new(root)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
@@ -100,8 +98,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-new(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-new(root)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
@@ -120,8 +117,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-new(target)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-new(target)");
if (style.backgroundColor == matchedColor && style.color == matchedColor)
resolve();
else
@@ -141,8 +137,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-new(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-new(root)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
@@ -159,8 +154,7 @@ promise_test(() => {
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-new(target)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-new(target)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
diff --git a/tests/wpt/tests/css/css-view-transitions/only-child-no-transition.html b/tests/wpt/tests/css/css-view-transitions/only-child-no-transition.html
index 7dc2bf12176..9152253dff3 100644
--- a/tests/wpt/tests/css/css-view-transitions/only-child-no-transition.html
+++ b/tests/wpt/tests/css/css-view-transitions/only-child-no-transition.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class=reftest-wait>
<title>View transitions: :only-child style queries without transition shouldn't crash</title>
-<link rel="help" href="https://github.com/WICG/view-transitions">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:khushalsagar@chromium.org">
<script src="/resources/testharness.js"></script>
@@ -21,11 +21,11 @@
promise_test(() => {
return new Promise(async (resolve, reject) => {
let elements = [
- "view-transition",
- "view-transition-group(foo)",
- "view-transition-image-pair(foo)",
- "view-transition-old(foo)",
- "view-transition-old(foo)"
+ "::view-transition",
+ "::view-transition-group(foo)",
+ "::view-transition-image-pair(foo)",
+ "::view-transition-old(foo)",
+ "::view-transition-old(foo)"
];
for (let i = 0; i < elements.length; i++) {
diff --git a/tests/wpt/tests/css/css-view-transitions/only-child-old.html b/tests/wpt/tests/css/css-view-transitions/only-child-old.html
index 7a55af7397d..4d57121aa16 100644
--- a/tests/wpt/tests/css/css-view-transitions/only-child-old.html
+++ b/tests/wpt/tests/css/css-view-transitions/only-child-old.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html class="reftest-wait foo">
<title>View transitions: ensure :only-child is supported on view-transition-old</title>
-<link rel="help" href="https://github.com/WICG/view-transitions">
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:khushalsagar@chromium.org">
<script src="/resources/testharness.js"></script>
@@ -61,8 +61,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-old(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-old(root)");
if (style.backgroundColor == matchedColor && style.color == matchedColor)
resolve();
else
@@ -79,8 +78,7 @@ promise_test(() => {
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-old(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-old(root)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
@@ -100,8 +98,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-old(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-old(root)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
@@ -121,7 +118,7 @@ promise_test(() => {
transition.ready.then(() => {
let style = getComputedStyle(
- document.documentElement, ":view-transition-old(target)");
+ document.documentElement, "::view-transition-old(target)");
if (style.backgroundColor == matchedColor && style.color == matchedColor)
resolve();
else
@@ -141,8 +138,7 @@ promise_test(() => {
});
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-old(root)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-old(root)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
@@ -159,8 +155,7 @@ promise_test(() => {
let transition = document.startViewTransition();
transition.ready.then(() => {
- let style = getComputedStyle(
- document.documentElement, ":view-transition-old(target)");
+ let style = getComputedStyle(document.documentElement, "::view-transition-old(target)");
if (style.backgroundColor == notMatchedColor && style.color == notMatchedColor)
resolve();
else
diff --git a/tests/wpt/tests/device-posture/META.yml b/tests/wpt/tests/device-posture/META.yml
new file mode 100644
index 00000000000..d4dc2c24e6b
--- /dev/null
+++ b/tests/wpt/tests/device-posture/META.yml
@@ -0,0 +1,4 @@
+spec: https://w3c.github.io/device-posture/
+suggested_reviewers:
+ - reillyeon
+ - darktears
diff --git a/tests/wpt/tests/device-posture/README.md b/tests/wpt/tests/device-posture/README.md
new file mode 100644
index 00000000000..60559c1f72b
--- /dev/null
+++ b/tests/wpt/tests/device-posture/README.md
@@ -0,0 +1,2 @@
+This directory contains (tentative) tests for the
+[Device Posture](https://w3c.github.io/device-posture/) specification.
diff --git a/tests/wpt/tests/device-posture/idlharness.https.window.js b/tests/wpt/tests/device-posture/idlharness.https.window.js
new file mode 100644
index 00000000000..74ebd11af97
--- /dev/null
+++ b/tests/wpt/tests/device-posture/idlharness.https.window.js
@@ -0,0 +1,12 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+// https://w3c.github.io/device-posture/
+
+'use strict';
+
+idl_test(["device-posture"], ["html", "dom", "webidl"], (idl_array) => {
+ idl_array.add_objects({
+ DevicePosture: ["navigator.devicePosture"],
+ });
+});
diff --git a/tests/wpt/tests/dom/events/scrolling/scroll_support.js b/tests/wpt/tests/dom/events/scrolling/scroll_support.js
index c0c198f2366..a0aefe636ab 100644
--- a/tests/wpt/tests/dom/events/scrolling/scroll_support.js
+++ b/tests/wpt/tests/dom/events/scrolling/scroll_support.js
@@ -120,7 +120,7 @@ function waitForCompositorCommit() {
// deferred running the tests until after paint holding.
async function waitForCompositorReady() {
const animation =
- document.body.animate({ opacity: [ 1, 1 ] }, {duration: 1 });
+ document.body.animate({ opacity: [ 0, 1 ] }, {duration: 1 });
return animation.finished;
}
diff --git a/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-form-and-script-from-fragment.tentative.html b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-form-and-script-from-fragment.tentative.html
new file mode 100644
index 00000000000..10351d1645d
--- /dev/null
+++ b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-form-and-script-from-fragment.tentative.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Node.appendChild: inserting script and associated form</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<button id="someButton" form="someForm"></button>
+<script>
+test(() => {
+ const script = document.createElement("script");
+ const form = document.createElement("form");
+ form.id = "someForm";
+ const fragment = new DocumentFragment();
+ script.textContent = `
+ window.buttonAssociatedForm = document.querySelector("#someButton").form;
+ `;
+ fragment.append(script, form);
+ document.body.append(fragment);
+ assert_equals(window.buttonAssociatedForm, form);
+}, "When adding a script+form in a fragment and the form matches an associated element, " +
+ "the script that checks whether the button is associated to the form should run after " +
+ "inserting the form");
+</script>
diff --git a/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html
new file mode 100644
index 00000000000..d2477976033
--- /dev/null
+++ b/tests/wpt/tests/dom/nodes/insertion-removing-steps/Node-append-meta-referrer-and-script-from-fragment.tentative.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Node.appendChild: inserting script and meta-referrer from a div</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+promise_test(async t => {
+ const script = document.createElement("script");
+ const meta = document.createElement("meta");
+ meta.name = "referrer";
+ meta.content = "no-referrer";
+ const fragment = new DocumentFragment();
+ const done = new Promise(resolve => {
+ window.didFetch = resolve;
+ });
+ script.textContent = `
+ (async function() {
+ const response = await fetch("/html/infrastructure/urls/terminology-0/resources/echo-referrer-text.py")
+ const text = await response.text();
+ window.didFetch(text);
+ })();
+ `;
+ fragment.append(script, meta);
+ document.head.append(fragment);
+ const result = await done;
+ assert_equals(result, "");
+}, "<meta name=referrer> should apply before script, as it is an insertion step " +
+ "and not a post-insertion step");
+</script>
diff --git a/tests/wpt/tests/editing/other/inserttext-at-end-of-block-when-br-always-block.html b/tests/wpt/tests/editing/other/inserttext-at-end-of-block-when-br-always-block.html
new file mode 100644
index 00000000000..922b8bd1c86
--- /dev/null
+++ b/tests/wpt/tests/editing/other/inserttext-at-end-of-block-when-br-always-block.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Typing white-space and another character at end of a block should preserve the white-space when br element is always block</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+br { display: block; }
+</style>
+<script>
+"use strict";
+
+addEventListener("load", () => {
+ test(
+ () => {
+ const editingHost = document.querySelector("div[contenteditable]");
+ editingHost.focus();
+ getSelection().collapse(editingHost.firstChild, "abc".length);
+ document.execCommand("insertText", false, " ");
+ document.execCommand("insertText", false, "d");
+ assert_in_array(
+ editingHost.innerHTML,
+ [
+ "abc d",
+ "abc d<br>",
+ ]
+ );
+ },
+ "Inserting white-space and a character at block end should keep the white-space even before block <br> element"
+ );
+}, {once: true});
+</script>
+</head>
+<body><div contenteditable>abc</div></body>
+</html>
diff --git a/tests/wpt/tests/fetch/api/basic/request-upload.h2.any.js b/tests/wpt/tests/fetch/api/basic/request-upload.h2.any.js
index eedc2bf6a76..68122278ccd 100644
--- a/tests/wpt/tests/fetch/api/basic/request-upload.h2.any.js
+++ b/tests/wpt/tests/fetch/api/basic/request-upload.h2.any.js
@@ -184,3 +184,26 @@ promise_test(async (t) => {
await promise_rejects_js(t, TypeError, fetch(url, { method, body, duplex }));
}, "Streaming upload should fail on a 401 response");
+promise_test(async (t) => {
+ const abortMessage = 'foo abort';
+ let streamCancelPromise = new Promise(async res => {
+ var stream = new ReadableStream({
+ cancel: function(reason) {
+ res(reason);
+ }
+ });
+ let abortController = new AbortController();
+ let fetchPromise = promise_rejects_exactly(t, abortMessage, fetch('', {
+ method: 'POST',
+ body: stream,
+ duplex: 'half',
+ signal: abortController.signal
+ }));
+ abortController.abort(abortMessage);
+ await fetchPromise;
+ });
+
+ let cancelReason = await streamCancelPromise;
+ assert_equals(
+ cancelReason, abortMessage, 'ReadableStream.cancel should be called.');
+}, 'ReadbleStream should be closed on signal.abort');
diff --git a/tests/wpt/tests/fetch/api/body/formdata.any.js b/tests/wpt/tests/fetch/api/body/formdata.any.js
index e25035923c1..6733fa0ed70 100644
--- a/tests/wpt/tests/fetch/api/body/formdata.any.js
+++ b/tests/wpt/tests/fetch/api/body/formdata.any.js
@@ -12,3 +12,14 @@ promise_test(async t => {
const fd = await req.formData();
assert_true(fd instanceof FormData);
}, 'Consume empty request.formData() as FormData');
+
+promise_test(async t => {
+ let formdata = new FormData();
+ formdata.append('foo', new Blob([JSON.stringify({ bar: "baz", })], { type: "application/json" }));
+ let blob = await new Response(formdata).blob();
+ let body = await blob.text();
+ blob = new Blob([body.toLowerCase()], { type: blob.type.toLowerCase() });
+ let formdataWithLowercaseBody = await new Response(blob).formData();
+ assert_true(formdataWithLowercaseBody.has("foo"));
+ assert_equals(formdataWithLowercaseBody.get("foo").type, "application/json");
+}, 'Consume multipart/form-data headers case-insensitively');
diff --git a/tests/wpt/tests/fetch/api/request/request-consume-empty.any.js b/tests/wpt/tests/fetch/api/request/request-consume-empty.any.js
index 034a86041a7..0bf9672a795 100644
--- a/tests/wpt/tests/fetch/api/request/request-consume-empty.any.js
+++ b/tests/wpt/tests/fetch/api/request/request-consume-empty.any.js
@@ -8,23 +8,11 @@ function checkBodyText(test, request) {
});
}
-function checkBodyBlob(test, request) {
- return request.blob().then(function(bodyAsBlob) {
- var promise = new Promise(function(resolve, reject) {
- var reader = new FileReader();
- reader.onload = function(evt) {
- resolve(reader.result)
- };
- reader.onerror = function() {
- reject("Blob's reader failed");
- };
- reader.readAsText(bodyAsBlob);
- });
- return promise.then(function(body) {
- assert_equals(body, "", "Resolved value should be empty");
- assert_false(request.bodyUsed);
- });
- });
+async function checkBodyBlob(test, request) {
+ const bodyAsBlob = await request.blob();
+ const body = await bodyAsBlob.text();
+ assert_equals(body, "", "Resolved value should be empty");
+ assert_false(request.bodyUsed);
}
function checkBodyArrayBuffer(test, request) {
diff --git a/tests/wpt/tests/fetch/api/request/request-consume.any.js b/tests/wpt/tests/fetch/api/request/request-consume.any.js
index aff5d65244a..3db9e8f2657 100644
--- a/tests/wpt/tests/fetch/api/request/request-consume.any.js
+++ b/tests/wpt/tests/fetch/api/request/request-consume.any.js
@@ -9,26 +9,15 @@ function checkBodyText(request, expectedBody) {
});
}
-function checkBodyBlob(request, expectedBody, checkContentType) {
- return request.blob().then(function(bodyAsBlob) {
- if (checkContentType)
- assert_equals(bodyAsBlob.type, "text/plain", "Blob body type should be computed from the request Content-Type");
-
- var promise = new Promise(function (resolve, reject) {
- var reader = new FileReader();
- reader.onload = function(evt) {
- resolve(reader.result)
- };
- reader.onerror = function() {
- reject("Blob's reader failed");
- };
- reader.readAsText(bodyAsBlob);
- });
- return promise.then(function(body) {
- assert_equals(body, expectedBody, "Retrieve and verify request's body");
- assert_true(request.bodyUsed, "body as blob: bodyUsed turned true");
- });
- });
+async function checkBodyBlob(request, expectedBody, checkContentType) {
+ const bodyAsBlob = await request.blob();
+
+ if (checkContentType)
+ assert_equals(bodyAsBlob.type, "text/plain", "Blob body type should be computed from the request Content-Type");
+
+ const body = await bodyAsBlob.text();
+ assert_equals(body, expectedBody, "Retrieve and verify request's body");
+ assert_true(request.bodyUsed, "body as blob: bodyUsed turned true");
}
function checkBodyArrayBuffer(request, expectedBody) {
diff --git a/tests/wpt/tests/fetch/api/response/response-consume-empty.any.js b/tests/wpt/tests/fetch/api/response/response-consume-empty.any.js
index 0fa85ecbcb2..a5df3562586 100644
--- a/tests/wpt/tests/fetch/api/response/response-consume-empty.any.js
+++ b/tests/wpt/tests/fetch/api/response/response-consume-empty.any.js
@@ -8,23 +8,12 @@ function checkBodyText(test, response) {
});
}
-function checkBodyBlob(test, response) {
- return response.blob().then(function(bodyAsBlob) {
- var promise = new Promise(function(resolve, reject) {
- var reader = new FileReader();
- reader.onload = function(evt) {
- resolve(reader.result)
- };
- reader.onerror = function() {
- reject("Blob's reader failed");
- };
- reader.readAsText(bodyAsBlob);
- });
- return promise.then(function(body) {
- assert_equals(body, "", "Resolved value should be empty");
- assert_false(response.bodyUsed);
- });
- });
+async function checkBodyBlob(test, response) {
+ const bodyAsBlob = await response.blob();
+ const body = await bodyAsBlob.text();
+
+ assert_equals(body, "", "Resolved value should be empty");
+ assert_false(response.bodyUsed);
}
function checkBodyArrayBuffer(test, response) {
diff --git a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
index 615702ba9e2..8687e3f296d 100644
--- a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
@@ -7,7 +7,10 @@
// META: variant=?5-8
// META: variant=?9-12
// META: variant=?13-16
-// META: variant=?17-last
+// META: variant=?17-20
+// META: variant=?21-24
+// META: variant=?25-28
+// META: variant=?29-last
"use strict;"
@@ -257,7 +260,7 @@ subsetTest(promise_test, async test => {
// Run two auctions at once, without any navigations.
// "bidCount" should be 0 for both auctions.
- fencedFrameConfigs =
+ let fencedFrameConfigs =
await Promise.all([runBasicFledgeTestExpectingWinner(test, uuid),
runBasicFledgeTestExpectingWinner(test, uuid)]);
@@ -278,6 +281,218 @@ subsetTest(promise_test, async test => {
await runBasicFledgeTestExpectingWinner(test, uuid);
}, 'browserSignals.bidCount two auctions at once.');
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use a tracker URL for the ad. It won't be successfully loaded, due to missing
+ // the fenced frame header, but it should be fetched twice.
+ let trackedRenderURL =
+ createTrackerURL(window.location.origin, uuid, 'track_get', /*id=*/'ad');
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(0),
+ ads: [{ renderURL: trackedRenderURL }]
+ });
+
+ let fencedFrameConfig = await runBasicFledgeTestExpectingWinner(test, uuid);
+
+ // Start navigating two frames to the winning ad.
+ createAndNavigateFencedFrame(test, fencedFrameConfig);
+ createAndNavigateFencedFrame(test, fencedFrameConfig);
+
+ // Wait for both navigations to have requested ads (and thus to have updated
+ // bid counts).
+ await waitForObservedRequests(uuid, [createSellerReportURL(uuid),
+ trackedRenderURL,
+ trackedRenderURL]);
+
+ // Check that "bidCount" has increased by only 1.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(1) });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount incremented once when winning ad used twice.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid, /*id=*/'winner');
+
+ // Join an interest group named "uuid", which will bid 0.1, losing the first auction.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { bid: 0.1, reportWin: `sendReportTo('${createBidderReportURL(uuid, /*id=*/'loser')}')` })
+ });
+
+ // Join an interest group with the default name, which will bid 1 and win the first
+ // auction, sending a bidder report.
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { bid: 1, reportWin: `sendReportTo('${bidderReportURL}')` })
+ });
+
+ // Run an auction that both bidders participate in. Despite the first interest group
+ // losing, its "bidCount" should be incremented.
+ await runBasicFledgeAuctionAndNavigate(test, uuid);
+ // Make sure the right bidder won.
+ await waitForObservedRequests(uuid, [bidderReportURL, createSellerReportURL(uuid)]);
+
+ // Leave the second interest group (which has the default name).
+ await leaveInterestGroup();
+
+ // Re-join the first interest group, with a bidding script that checks its "bidCount".
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(1)
+ });
+
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount incremented when another interest group wins.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use default interest group, other than using a unique name. It will make a bid.
+ await joinInterestGroup(test, uuid, { name: uuid });
+ // Run auction with seller that rejects all bids.
+ await runBasicFledgeTestExpectingNoWinner(
+ test, uuid,
+ { decisionLogicURL: createDecisionScriptURL(uuid, {scoreAd: `return 0;`})});
+
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(1)
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount incremented when seller rejects bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use default interest group, other than using a unique name. It will make a bid.
+ await joinInterestGroup(test, uuid, { name: uuid });
+ // Run auction with seller that always throws.
+ await runBasicFledgeTestExpectingNoWinner(
+ test, uuid,
+ { decisionLogicURL: createDecisionScriptURL(uuid, {scoreAd: `throw "a fit";`})});
+
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(1)
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount incremented when seller throws.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Interest group that does not bid.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { generateBid: 'return;' })
+ });
+ await runBasicFledgeTestExpectingNoWinner(test, uuid);
+
+ // Check that "bidCount" was not incremented.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(0)
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount not incremented when no bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid, /*id=*/'winner');
+
+ // Interest group that does not bid.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { generateBid: 'return;' })
+ });
+
+ // Join an interest group with the default name, which will bid 1 and win the first
+ // auction, sending a bidder report.
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { bid: 1, reportWin: `sendReportTo('${bidderReportURL}')` })
+ });
+
+ // Run an auction that both bidders participate in, and make sure the right bidder won.
+ await runBasicFledgeAuctionAndNavigate(test, uuid);
+ await waitForObservedRequests(uuid, [bidderReportURL, createSellerReportURL(uuid)]);
+
+ // Leave the second interest group (which has the default name).
+ await leaveInterestGroup();
+
+ // Re-join the first interest group, with a bidding script that checks its "bidCount".
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(0)
+ });
+
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount not incremented when no bid and another interest group wins.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid, /*id=*/'winner');
+
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { bid: 42, reportWin: `sendReportTo('${createBidderReportURL(uuid, /*id=*/'loser')}')` })
+ });
+
+ // Join an interest group with the default name, which will bid 1 and win the first
+ // auction, sending a bidder report.
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { bid: 1, reportWin: `sendReportTo('${bidderReportURL}')` })
+ });
+
+ // Run an auction that both bidders participate in. The scoreAd script rejects the
+ // first interest group's bid.
+ await runBasicFledgeAuctionAndNavigate(
+ test, uuid,
+ { decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { scoreAd: `if (bid === 42) return -1;`})});
+ // Make sure the second interest group won.
+ await waitForObservedRequests(uuid, [bidderReportURL]);
+
+ // Leave the second interest group (which has the default name).
+ await leaveInterestGroup();
+
+ // Re-join the first interest group, with a bidding script that checks its "bidCount".
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBidCountBiddingScriptURL(1)
+ });
+
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.bidCount incremented when makes largest bid, but seller rejects the bid.');
+
// Creates a bidding script URL that expects "prevWinsMs" to be
// "expectedPrevWinsMs". All times in "expectedPrevWinsMs" must be 0.
//
@@ -495,6 +710,216 @@ subsetTest(promise_test, async test => {
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([])
+ });
+
+ // Run two auctions at once, without any navigations.
+ // "prevWinsMs" should be empty for both auctions.
+ let fencedFrameConfigs =
+ await Promise.all([runBasicFledgeTestExpectingWinner(test, uuid),
+ runBasicFledgeTestExpectingWinner(test, uuid)]);
+
+ // Start navigating to both auction winners.
+ createAndNavigateFencedFrame(test, fencedFrameConfigs[0]);
+ createAndNavigateFencedFrame(test, fencedFrameConfigs[1]);
+
+ // Wait for navigations to have sent reports (and thus to have updated
+ // "prevWinsMs").
+ await waitForObservedRequests(uuid, [createSellerReportURL(uuid),
+ createSellerReportURL(uuid)]);
+
+ // Check that "prevWinsMs" has two URLs.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL(
+ [[0, {renderURL: createRenderURL(uuid)}],
+ [0, {renderURL: createRenderURL(uuid)}]])
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs two auctions at once.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use a tracker URL for the ad. It won't be successfully loaded, due to missing
+ // the fenced frame header, but it should be fetched twice.
+ let trackedRenderURL =
+ createTrackerURL(window.location.origin, uuid, 'track_get', /*id=*/'ad');
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([]),
+ ads: [{ renderURL: trackedRenderURL }]
+ });
+
+ let fencedFrameConfig = await runBasicFledgeTestExpectingWinner(test, uuid);
+
+ // Start navigating two frames to the winning ad.
+ createAndNavigateFencedFrame(test, fencedFrameConfig);
+ createAndNavigateFencedFrame(test, fencedFrameConfig);
+
+ // Wait for both navigations to have requested ads (and thus to have updated
+ // "prevWinsMs").
+ await waitForObservedRequests(uuid, [createSellerReportURL(uuid),
+ trackedRenderURL,
+ trackedRenderURL]);
+
+ // Check that "prevWins" has only a single win.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL(
+ [[0, {renderURL: trackedRenderURL}]]) });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs has only one win when winning ad used twice.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid, /*id=*/'winner');
+
+ // Join an interest group named "uuid", which will bid 0.1, losing the first auction.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { bid: 0.1, reportWin: `sendReportTo('${createBidderReportURL(uuid, /*id=*/'loser')}')` })
+ });
+
+ // Join an interest group with the default name, which will bid 1 and win the first
+ // auction, sending a bidder report.
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { bid: 1, reportWin: `sendReportTo('${bidderReportURL}')` })
+ });
+
+ // Run an auction that both bidders participate in, and make sure the right bidder won.
+ await runBasicFledgeAuctionAndNavigate(test, uuid);
+ await waitForObservedRequests(uuid, [bidderReportURL, createSellerReportURL(uuid)]);
+
+ // Leave the second interest group (which has the default name).
+ await leaveInterestGroup();
+
+ // Re-join the first interest group, with a bidding script that expects prevWinsMs to
+ // be empty.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([])
+ });
+
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs not updated when another interest group wins.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use default interest group, other than using a unique name. It will make a bid.
+ await joinInterestGroup(test, uuid, { name: uuid });
+ // Run auction with seller that rejects all bids.
+ await runBasicFledgeTestExpectingNoWinner(
+ test, uuid,
+ { decisionLogicURL: createDecisionScriptURL(uuid, {scoreAd: `return 0;`})});
+
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([])
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs not updated when seller rejects bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use default interest group, other than using a unique name. It will make a bid.
+ await joinInterestGroup(test, uuid, { name: uuid });
+ // Run auction with seller that always throws.
+ await runBasicFledgeTestExpectingNoWinner(
+ test, uuid,
+ { decisionLogicURL: createDecisionScriptURL(uuid, {scoreAd: `throw "a fit";`})});
+
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([])
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs not updated when seller throws.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Interest group that does not bid.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { generateBid: 'return;' })
+ });
+ await runBasicFledgeTestExpectingNoWinner(test, uuid);
+
+ // Check that "prevWinsMs" was not modified.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([])
+ });
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs not updated when no bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid, /*id=*/'winner');
+
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createBiddingScriptURL(
+ { bid: 42, reportWin: `sendReportTo('${createBidderReportURL(uuid, /*id=*/'loser')}')` })
+ });
+
+ // Join an interest group with the default name, which will bid 1 and win the first
+ // auction, sending a bidder report.
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { bid: 1, reportWin: `sendReportTo('${bidderReportURL}')` })
+ });
+
+ // Run an auction that both bidders participate in. The scoreAd script returns a low
+ // score for the first interest group's bid.
+ await runBasicFledgeAuctionAndNavigate(
+ test, uuid,
+ { decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { scoreAd: `if (bid === 42) return 0.1;`})});
+ // Make sure the second interest group won.
+ await waitForObservedRequests(uuid, [bidderReportURL]);
+
+ // Leave the second interest group (which has the default name).
+ await leaveInterestGroup();
+
+ // Re-join the first interest group, with a bidding script that expects prevWinsMs to
+ // be empty.
+ await joinInterestGroup(
+ test, uuid,
+ { name: uuid,
+ biddingLogicURL: createPrevWinsMsBiddingScriptURL([])
+ });
+
+ await runBasicFledgeTestExpectingWinner(test, uuid);
+}, 'browserSignals.prevWinsMs not updated when makes largest bid, but another interest group wins.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
// Join an interest group with a WASM helper that exposes a single "increment" method,
// and make sure that method can be invoked and behaves as expected.
await joinGroupAndRunBasicFledgeTestExpectingWinner(
diff --git a/tests/wpt/tests/fledge/tentative/resources/request-tracker.py b/tests/wpt/tests/fledge/tentative/resources/request-tracker.py
index c449d2ab021..3514741f634 100644
--- a/tests/wpt/tests/fledge/tentative/resources/request-tracker.py
+++ b/tests/wpt/tests/fledge/tentative/resources/request-tracker.py
@@ -110,4 +110,6 @@ def simple_response(request, response, status_code, status_message, body,
content_type=b"text/plain"):
response.status = (status_code, status_message)
response.headers.set(b"Content-Type", content_type)
+ # Force refetch on reuse, so multiple requests to tracked URLs are all visible.
+ response.headers.set(b"Cache-control", b"no-store")
return body
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html
new file mode 100644
index 00000000000..5483b9394d4
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/history-traversal/pageswap/pageswap-initial-navigation.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<title>Tests pageswap dispatch on initial doc navigation</title>
+<link rel="author" title="Khushal Sagar" href="mailto:khushalsagar@chromium.org">
+<link rel="help" href="https://html.spec.whatwg.org/">
+<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>
+setup({explicit_done: true});
+
+function runTest(frame) {
+ let frameWindow = frame.contentWindow;
+
+ let pageswapfired = false;
+ frameWindow.onpageswap = (e) => {
+ pageswapfired = true;
+ }
+
+ frameWindow.onpagehide = (e) => {
+ assert_true(pageswapfired, 'pageswap fired');
+ done();
+ }
+
+ frame.srcdoc = '<html></html>';
+}
+
+promise_test(async t => {
+ onload = () => {
+ let frame = document.createElement('iframe');
+ document.body.appendChild(frame);
+ runTest(frame);
+ };
+});
+</script>
diff --git a/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-1.html b/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-1.html
new file mode 100644
index 00000000000..d083a2a1d3c
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>
+ Ensure referrer header persists after
+ history.pushState/replaceState/fragment navigation and reload
+ </title>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div id="log"></div>
+ <script type="text/javascript">
+ location.href = "history_reload_referrer-2.html?pipe=sub";
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-2.html b/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-2.html
new file mode 100644
index 00000000000..d85517a15f8
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer-2.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>
+ Ensure referrer header persists after
+ history.pushState/replaceState/fragment navigation and reload
+ </title>
+ </head>
+ <body>
+ <a id="fragment" href="#fragment">fragment</a>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div id="log"></div>
+ <script type="text/javascript">
+ const step = localStorage.getItem("history_reload_referrer_step") || "1";
+ localStorage.setItem("history_reload_referrer_step", parseInt(step) + 1);
+
+ var httpReferer = unescape("{{headers[referer]}}");
+ var expectedReferrer = location.href.replace(
+ /\/[^\/]*$/,
+ "\/history_reload_referrer-1.html"
+ );
+
+ parent.test(function () {
+ parent.assert_equals(httpReferer, expectedReferrer);
+ }, `Step ${step}: Checking HTTP referrer (is "${httpReferer}")`);
+ parent.test(function () {
+ parent.assert_equals(document.referrer, expectedReferrer);
+ }, `Step ${step}: Checking document.referrer (is "${httpReferer}")`);
+
+ switch (step) {
+ case "1":
+ history.pushState("", "", location);
+ location.reload();
+ break;
+
+ case "2":
+ history.replaceState("", "", location);
+ location.reload();
+ break;
+
+ case "3":
+ document.getElementById("fragment").click();
+ location.reload();
+ break;
+
+ case "4":
+ localStorage.removeItem("history_reload_referrer_step");
+ parent.done();
+ break;
+
+ default:
+ throw new Error(`Unexpected step "${step}"`);
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer.html b/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer.html
new file mode 100644
index 00000000000..d11ee897028
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-history-interface/history_reload_referrer.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>
+ Ensure referrer header persists after
+ history.pushState/replaceState/fragment navigation and reload
+ </title>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script
+ type="text/javascript"
+ src="/resources/testharnessreport.js"
+ ></script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div id="log"></div>
+ <script type="text/javascript">
+ setup({ explicit_done: true });
+ var iframe = document.createElement("iframe");
+ window.onload = function () {
+ iframe.setAttribute("src", "history_reload_referrer-1.html");
+ document.body.appendChild(iframe);
+ };
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-iframe.html b/tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-iframe.html
new file mode 100644
index 00000000000..a0cd9f25ef9
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-iframe.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Referer with location.replace and location.assign</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <iframe src="/resources/blank.html" hidden></iframe>
+ <script>
+ async_test(function(t) {
+ function on_message(e) {
+ const referrer = e.data;
+ assert_equals(referrer, window.location.href);
+ t.done();
+ }
+ window.addEventListener('message', t.step_func(on_message), false);
+ document.querySelector("iframe").contentWindow.location.replace("resources/iframe-contents.sub.html?replace");
+ }, "Browser sends Referer header in iframe request when location.replace is called from an iframe");
+ async_test(function(t) {
+ function on_message(e) {
+ const referrer = e.data;
+ assert_equals(referrer, window.location.href);
+ t.done();
+ }
+ window.addEventListener('message', t.step_func(on_message), false);
+ document.querySelector("iframe").contentWindow.location.assign("resources/iframe-contents.sub.html?assign");
+ }, "Browser sends Referer header in iframe request when location.assign is called from an iframe");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-top-to-nested-iframe.html b/tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-top-to-nested-iframe.html
new file mode 100644
index 00000000000..eb6e4960dc2
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/assign-replace-from-top-to-nested-iframe.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Referer with location.replace and location.assign with nested iframes</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <iframe src="resources/iframe-with-iframe.html" hidden></iframe>
+ <script>
+ const iframe = document.querySelector("iframe");
+ async_test(function(t) {
+ function on_message(e) {
+ const referrer = e.data;
+ assert_equals(referrer, iframe.contentWindow.location.href);
+ t.done();
+ }
+ window.addEventListener('message', t.step_func(on_message), false);
+ window.addEventListener('load', function () {
+ iframe.contentDocument.querySelector("iframe").contentWindow.location.replace("/resources/blank.html");
+ }, false);
+ }, "Browser sends Referer header in nested iframe request when location.replace is called on an iframe");
+ async_test(function(t) {
+ function on_message(e) {
+ const referrer = e.data;
+ assert_equals(referrer, iframe.contentWindow.location.href);
+ t.done();
+ }
+ window.addEventListener('message', t.step_func(on_message), false);
+ window.addEventListener('load', function () {
+ iframe.contentDocument.querySelector("iframe").contentWindow.location.replace("/resources/blank.html");
+ }, false);
+ }, "Browser sends Referer header in nested iframe request when location.assign is called on an iframe");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/assign-with-nested-iframe.html b/tests/wpt/tests/html/browsers/history/the-location-interface/assign-with-nested-iframe.html
new file mode 100644
index 00000000000..e043623c082
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/assign-with-nested-iframe.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Referer with location.assign and nested frames</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <iframe src="resources/replace-or-assign-call-on-iframe.html?assign" hidden></iframe>
+ <script>
+ async_test(function(t) {
+ function on_message(e) {
+ const nestedIframeReferrer = e.data;
+ assert_equals(nestedIframeReferrer, document.querySelector("iframe").contentWindow.location.href);
+ t.done();
+ }
+ window.addEventListener('message', t.step_func(on_message), false);
+ }, "Browser sends Referer header when location.assign is called in iframe document on another nested iframe element");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/replace-with-nested-iframe.html b/tests/wpt/tests/html/browsers/history/the-location-interface/replace-with-nested-iframe.html
new file mode 100644
index 00000000000..e6620bd29c7
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/replace-with-nested-iframe.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Referer with location.replace and nested frames</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <iframe src="resources/replace-or-assign-call-on-iframe.html?replace" hidden></iframe>
+ <script>
+ async_test(function(t) {
+ function on_message(e) {
+ const nestedIframeReferrer = e.data;
+ assert_equals(nestedIframeReferrer, document.querySelector("iframe").contentWindow.location.href);
+ t.done();
+ }
+ window.addEventListener('message', t.step_func(on_message), false);
+ }, "Browser sends Referer header when location.replace is called in iframe document on another nested iframe element");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-contents.sub.html b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-contents.sub.html
new file mode 100644
index 00000000000..8ac0a264dbc
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-contents.sub.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Resource file for test of Referer with location.replace</title>
+ </head>
+ <body>
+ <div></div>
+ <script>
+ const referer = "{{header_or_default(referer, missing)}}"
+ window.parent.postMessage(referer);
+ document.querySelector("div").textContent = `Referer header: ${referer}`;
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-postmessage-to-parent-parent.sub.html b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-postmessage-to-parent-parent.sub.html
new file mode 100644
index 00000000000..25c4af19a3e
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-postmessage-to-parent-parent.sub.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Resource file for test of Referer with location.replace</title>
+ </head>
+ <body>
+ <div></div>
+ <script>
+ const referer = "{{header_or_default(referer, missing)}}"
+ window.parent.parent.postMessage(referer);
+ document.querySelector("div").textContent = `Referer header: ${referer}`;
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-with-iframe.html b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-with-iframe.html
new file mode 100644
index 00000000000..675f293ffa3
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/iframe-with-iframe.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Resource file for test of Referer with location.replace and location.assign</title>
+ </head>
+ <body>
+ <iframe src="iframe-postmessage-to-parent-parent.sub.html"></iframe>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/browsers/history/the-location-interface/resources/replace-or-assign-call-on-iframe.html b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/replace-or-assign-call-on-iframe.html
new file mode 100644
index 00000000000..bdad8334a5e
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/history/the-location-interface/resources/replace-or-assign-call-on-iframe.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Referer with location.replace and location.assign</title>
+ </head>
+ <body>
+ <iframe src="/resources/blank.html" hidden></iframe>
+ <script>
+ window.addEventListener('message', function (e) {
+ const referrer = e.data;
+ window.parent.postMessage(referrer);
+ });
+ if (window.location.search === "?replace") {
+ document.querySelector("iframe").contentWindow.location.replace("iframe-contents.sub.html?replace");
+ } else if (window.location.search === "?assign") {
+ document.querySelector("iframe").contentWindow.location.assign("iframe-contents.sub.html?assign");
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html b/tests/wpt/tests/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html
new file mode 100644
index 00000000000..e301537330e
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/drawing-images-to-the-canvas/2d.drawImage.detachedcanvas.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.drawImage.detachedcanvas</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.drawImage.detachedcanvas</h1>
+<p class="desc">drawImage with detached OffscreenCanvas as the source should throw exception</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("drawImage with detached OffscreenCanvas as the source should throw exception");
+_addTest(function(canvas, ctx) {
+
+ var canvas2 = new OffscreenCanvas(80, 80);
+ (new MessageChannel()).port1.postMessage(canvas2, [canvas2]);
+ assert_throws_dom("INVALID_STATE_ERR", function() { ctx.drawImage(canvas2, 0, 0); });
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
index 42fb1ee8f84..dc947928676 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
@@ -8,7 +8,7 @@
<body class="show_output">
<h1>2d.filter.canvasFilterObject.blur.exceptions.tentative</h1>
-<p class="desc">Test exceptions on CanvasFilter() blur.object</p>
+<p class="desc">Test exceptions on gaussianBlur filter</p>
<p class="output">Actual output:</p>
@@ -16,15 +16,21 @@
<ul id="d"></ul>
<script>
-var t = async_test("Test exceptions on CanvasFilter() blur.object");
+var t = async_test("Test exceptions on gaussianBlur filter");
_addTest(function(canvas, ctx) {
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: 'foo'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: [1,2,3]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: {}}); });
});
</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
index b2f6a6ac97e..56cf1bf0b1c 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
@@ -8,7 +8,7 @@
<body class="show_output">
<h1>2d.filter.canvasFilterObject.colorMatrix.tentative</h1>
-<p class="desc">Test the functionality of ColorMatrix filters in CanvasFilter objects</p>
+<p class="desc">Test the functionality of ColorMatrix filters</p>
<p class="output">Actual output:</p>
@@ -16,41 +16,70 @@
<ul id="d"></ul>
<script>
-var t = async_test("Test the functionality of ColorMatrix filters in CanvasFilter objects");
+var t = async_test("Test the functionality of ColorMatrix filters");
_addTest(function(canvas, ctx) {
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: 'foo'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: undefined}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: 'foo'}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: null}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: [1, 2, 3]}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}); });
+
ctx.fillStyle = '#f00';
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 0});
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 90});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 180});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 270});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'saturate', values: 0.5});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
+
ctx.clearRect(0, 0, 100, 50);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'luminanceToAlpha'});
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', values: [
- 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0
- ]});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]});
ctx.fillRect(0, 0, 50, 25);
ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html
new file mode 100644
index 00000000000..2b1c1c1c076
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k];
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
index b392b189f21..0a4830568b4 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
@@ -1,41 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</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.filter.canvasFilterObject.componentTransfer.discrete.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</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>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with discrete type");
-_addTest(function(canvas, ctx) {
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getTransformedValue(C, V) {
- // Get the right interval
- const n = V.length;
- const k = C == 1 ? n - 1 : Math.floor(C * n);
- return V[k];
- }
-
- function getColor(inputColor, tableValues) {
- const result = [0, 0, 0];
- for (const i in inputColor) {
- const C = inputColor[i]/255;
- const Cprime = getTransformedValue(C, tableValues[i]);
- result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
- }
- return result;
- }
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
@@ -54,13 +29,9 @@ _addTest(function(canvas, ctx) {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
-
-});
</script>
-
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html
new file mode 100644
index 00000000000..5adc9f53e20
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, amplitude, exponent, offset) {
+ return [
+ Math.max(0, Math.min(1, Math.pow(inputColor[0]/255,
+ exponent[0]) * amplitude[0] + offset[0])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[1]/255,
+ exponent[1]) * amplitude[1] + offset[1])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[2]/255,
+ exponent[2]) * amplitude[2] + offset[2])) * 255,
+ ];
+ }
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, amplitudes, exponents, offsets);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
index e5bff7e44df..22e3abe624f 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
@@ -1,40 +1,27 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</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.filter.canvasFilterObject.componentTransfer.gamma.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</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>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with gamma type");
-_addTest(function(canvas, ctx) {
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getColor(inputColor, amplitude, exponent, offset) {
- return [
- Math.max(0, Math.min(1, Math.pow(inputColor[0]/255, exponent[0]) * amplitude[0] + offset[0])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[1]/255, exponent[1]) * amplitude[1] + offset[1])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[2]/255, exponent[2]) * amplitude[2] + offset[2])) * 255,
- ];
- }
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
});
const inputColors = [
@@ -45,13 +32,9 @@ _addTest(function(canvas, ctx) {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, amplitudes, exponents, offsets);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
-
-});
</script>
-
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html
new file mode 100644
index 00000000000..895d531206c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.identity.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ let outputColor = inputColors[i];
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
index ecd3830be3e..17761ce31a2 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
@@ -1,23 +1,15 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html">
<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative</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.filter.canvasFilterObject.componentTransfer.identity.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</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>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with identity type");
-_addTest(function(canvas, ctx) {
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
ctx.filter = new CanvasFilter({name: 'componentTransfer',
funcR: {type: 'identity'},
@@ -33,12 +25,9 @@ _addTest(function(canvas, ctx) {
[50, 68, 87],
];
- for (const color of inputColors) {
- ctx.fillStyle = `rgba(${color[0]}, ${color[1]}, ${color[2]}, 1)`,
- ctx.fillRect(0, 0, 10, 10);
- _assertPixel(canvas, 5, 5, color[0],color[1],color[2],255);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
-
-});
</script>
-
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html
new file mode 100644
index 00000000000..c4ad790d56e
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.linear.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, slopes, intercepts) {
+ return [
+ Math.max(0, Math.min(1,
+ inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
+ ];
+ }
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, slopes, intercepts);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
index 8708887f6a5..5ea5f8e0e31 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
@@ -1,32 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative</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.filter.canvasFilterObject.componentTransfer.linear.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</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>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with linear type");
-_addTest(function(canvas, ctx) {
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getColor(inputColor, slopes, intercepts) {
- return [
- Math.max(0, Math.min(1, inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
- Math.max(0, Math.min(1, inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
- Math.max(0, Math.min(1, inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
- ];
- }
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
@@ -44,13 +28,9 @@ _addTest(function(canvas, ctx) {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, slopes, intercepts);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
-
-});
</script>
-
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html
new file mode 100644
index 00000000000..29e250614c2
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.table.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.table.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length - 1;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
index 4b296d9fd7d..0f74d9c3bfd 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
@@ -1,41 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.table.tentative</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.filter.canvasFilterObject.componentTransfer.table.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</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>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with table type");
-_addTest(function(canvas, ctx) {
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getTransformedValue(C, V) {
- // Get the right interval
- const n = V.length - 1;
- const k = C == 1 ? n - 1 : Math.floor(C * n);
- return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
- }
-
- function getColor(inputColor, tableValues) {
- const result = [0, 0, 0];
- for (const i in inputColor) {
- const C = inputColor[i]/255;
- const Cprime = getTransformedValue(C, tableValues[i]);
- result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
- }
- return result;
- }
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
@@ -54,13 +29,9 @@ _addTest(function(canvas, ctx) {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
-
-});
</script>
-
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
index b80600c1417..a2885410570 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
@@ -19,23 +19,39 @@
var t = async_test("Test exceptions on CanvasFilter() convolveMatrix");
_addTest(function(canvas, ctx) {
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', divisor: 2}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: 1}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: []}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], []]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', divisor: 2}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: null}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: 1}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: []}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [1]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[], []]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
// This should not throw an error
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[]]});
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1]]});
});
</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html
index 8c07a72b2b3..05984a47f82 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html
@@ -19,104 +19,250 @@
var t = async_test("Test exceptions on CanvasFilter() dropShadow object");
_addTest(function(canvas, ctx) {
+ // Should not throw an error.
// dx
- _assert(new CanvasFilter({name: 'dropShadow', dx: 10}), "new CanvasFilter({name: 'dropShadow', dx: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: -1}), "new CanvasFilter({name: 'dropShadow', dx: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: 0.5}), "new CanvasFilter({name: 'dropShadow', dx: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: null}), "new CanvasFilter({name: 'dropShadow', dx: null})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: true}), "new CanvasFilter({name: 'dropShadow', dx: true})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: false}), "new CanvasFilter({name: 'dropShadow', dx: false})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: []}), "new CanvasFilter({name: 'dropShadow', dx: []})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: [20]}), "new CanvasFilter({name: 'dropShadow', dx: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: '30'}), "new CanvasFilter({name: 'dropShadow', dx: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: '30'});
// dy
- _assert(new CanvasFilter({name: 'dropShadow', dy: 10}), "new CanvasFilter({name: 'dropShadow', dy: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: -1}), "new CanvasFilter({name: 'dropShadow', dy: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: 0.5}), "new CanvasFilter({name: 'dropShadow', dy: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: null}), "new CanvasFilter({name: 'dropShadow', dy: null})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: true}), "new CanvasFilter({name: 'dropShadow', dy: true})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: false}), "new CanvasFilter({name: 'dropShadow', dy: false})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: []}), "new CanvasFilter({name: 'dropShadow', dy: []})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: [20]}), "new CanvasFilter({name: 'dropShadow', dy: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: '30'}), "new CanvasFilter({name: 'dropShadow', dy: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: '30'});
// floodOpacity
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: 10}), "new CanvasFilter({name: 'dropShadow', floodOpacity: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: -1}), "new CanvasFilter({name: 'dropShadow', floodOpacity: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: 0.5}), "new CanvasFilter({name: 'dropShadow', floodOpacity: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: null}), "new CanvasFilter({name: 'dropShadow', floodOpacity: null})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: true}), "new CanvasFilter({name: 'dropShadow', floodOpacity: true})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: false}), "new CanvasFilter({name: 'dropShadow', floodOpacity: false})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: []}), "new CanvasFilter({name: 'dropShadow', floodOpacity: []})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: [20]}), "new CanvasFilter({name: 'dropShadow', floodOpacity: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: '30'}), "new CanvasFilter({name: 'dropShadow', floodOpacity: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: '30'});
+ // dx
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: '30'});
+ // dy
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: '30'});
+ // floodOpacity
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: '30'});
// stdDeviation
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: 10}), "new CanvasFilter({name: 'dropShadow', stdDeviation: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: -1}), "new CanvasFilter({name: 'dropShadow', stdDeviation: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: 0.5}), "new CanvasFilter({name: 'dropShadow', stdDeviation: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: null}), "new CanvasFilter({name: 'dropShadow', stdDeviation: null})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: true}), "new CanvasFilter({name: 'dropShadow', stdDeviation: true})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: false}), "new CanvasFilter({name: 'dropShadow', stdDeviation: false})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: []}), "new CanvasFilter({name: 'dropShadow', stdDeviation: []})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [20]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: '30'}), "new CanvasFilter({name: 'dropShadow', stdDeviation: '30'})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [10, -1]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [10, -1]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [0.5, null]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [0.5, null]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [true, false]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [true, false]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [[], [20]]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [[], [\""+(20)+"\"]]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: ['30', ['40']]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: ['30', ['40']]})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: '30'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [10, -1]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [0.5, null]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [true, false]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [[], [20]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: ['30', ['40']]});
// floodColor
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'red'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'red'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'canvas'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'canvas'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: '#aabbccdd'}), "new CanvasFilter({name: 'dropShadow', floodColor: '#aabbccdd'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: '#abcd'}), "new CanvasFilter({name: 'dropShadow', floodColor: '#abcd'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'red'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'canvas'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: '#aabbccdd'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: '#abcd'});
+ // Should throw a TypeError.
// dx
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [1, 2]}); });
// dy
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [1, 2]}); });
// floodOpacity
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [1, 2]}); });
// stdDeviation
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, 2, 3]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, NaN]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, Infinity]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, -Infinity]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, undefined]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, 'test']}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, {}]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, [2, 3]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, 2, 3]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, NaN]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, -Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, undefined]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, 'test']}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, {}]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, [2, 3]]}); });
// floodColor
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 10}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 10}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: null}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: NaN}); });
});
</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
index 47bb891b3f8..d6e70664738 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
@@ -22,86 +22,58 @@
// Parameter defaults.
ctx.filter = new CanvasFilter({name: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
-
// All parameters specified.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
-
// Named color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
-
// System color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
-
// Numerical color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(210, 110, 80, 80);
-
// Transparent floodColor.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(310, 110, 80, 80);
-
// Transparent floodColor and floodOpacity.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(410, 110, 80, 80);
-
// No blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
floodColor: 'purple'});
ctx.fillRect(10, 210, 80, 80);
-
// Single float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
floodColor: 'purple'});
ctx.fillRect(110, 210, 80, 80);
-
// Single negative float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
floodColor: 'purple'});
ctx.fillRect(210, 210, 80, 80);
-
// Two floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
floodColor: 'purple'});
ctx.fillRect(310, 210, 80, 80);
-
// Two negative floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
floodColor: 'purple'});
ctx.fillRect(410, 210, 80, 80);
-
// Degenerate parameter values.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 310, 80, 80);
-
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 310, 80, 80);
-
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 310, 80, 80);
</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
index c24cfd23981..b85add4b664 100644
--- a/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
@@ -116,12 +116,12 @@ _addTest(function(canvas, ctx) {
for (testCase of errorTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(filterOptions); });
}
for (testCase of workingTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- _assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null");
+ ctx.filter = new CanvasFilter(filterOptions);
}
});
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.blur.exceptions.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.blur.exceptions.html
new file mode 100644
index 00000000000..7176a7d0a48
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.blur.exceptions.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.blur.exceptions</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.filter.layers.blur.exceptions</h1>
+<p class="desc">Test exceptions on gaussianBlur filter</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("Test exceptions on gaussianBlur filter");
+_addTest(function(canvas, ctx) {
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: undefined}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: 'foo'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: [1,2,3]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: NaN}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: {}}}); });
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.colorMatrix.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.colorMatrix.html
new file mode 100644
index 00000000000..ef0ae0f949b
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.colorMatrix.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.colorMatrix</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.filter.layers.colorMatrix</h1>
+<p class="desc">Test the functionality of ColorMatrix filters</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("Test the functionality of ColorMatrix filters");
+_addTest(function(canvas, ctx) {
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: undefined}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: 'foo'}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: null}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: [1, 2, 3]}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}}); });
+
+ ctx.fillStyle = '#f00';
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 0}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 90}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 180}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 270}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'saturate', values: 0.5}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
+
+ ctx.clearRect(0, 0, 100, 50);
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'luminanceToAlpha'}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]}});
+ ctx.fillRect(0, 0, 50, 25);
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(50, 0, 50, 25);
+ ctx.fillStyle = '#00f';
+ ctx.fillRect(0, 25, 50, 25);
+ ctx.fillStyle = '#fff';
+ ctx.fillRect(50, 25, 50, 25);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 60,10, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 10,30, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 60,30, 0,255,0,255, 2);
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete-expected.html
new file mode 100644
index 00000000000..8419953b3d2
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete-expected.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.discrete</title>
+<h1>2d.filter.layers.componentTransfer.discrete</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k];
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html
new file mode 100644
index 00000000000..ef9db79547c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.discrete.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.discrete-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.discrete</title>
+<h1>2d.filter.layers.componentTransfer.discrete</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma-expected.html
new file mode 100644
index 00000000000..3e5d9808967
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma-expected.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.gamma</title>
+<h1>2d.filter.layers.componentTransfer.gamma</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, amplitude, exponent, offset) {
+ return [
+ Math.max(0, Math.min(1, Math.pow(inputColor[0]/255,
+ exponent[0]) * amplitude[0] + offset[0])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[1]/255,
+ exponent[1]) * amplitude[1] + offset[1])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[2]/255,
+ exponent[2]) * amplitude[2] + offset[2])) * 255,
+ ];
+ }
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, amplitudes, exponents, offsets);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html
new file mode 100644
index 00000000000..cccd07e92b9
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.gamma.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.gamma-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.gamma</title>
+<h1>2d.filter.layers.componentTransfer.gamma</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity-expected.html
new file mode 100644
index 00000000000..9f1439f37b6
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity-expected.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.identity</title>
+<h1>2d.filter.layers.componentTransfer.identity</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ let outputColor = inputColors[i];
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html
new file mode 100644
index 00000000000..3a06353849c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.identity.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.identity-expected.html">
+<title>Canvas test: 2d.filter.layers.componentTransfer.identity</title>
+<h1>2d.filter.layers.componentTransfer.identity</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear-expected.html
new file mode 100644
index 00000000000..f922055ff26
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear-expected.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.linear</title>
+<h1>2d.filter.layers.componentTransfer.linear</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, slopes, intercepts) {
+ return [
+ Math.max(0, Math.min(1,
+ inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
+ ];
+ }
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, slopes, intercepts);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html
new file mode 100644
index 00000000000..c9e744ebef0
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.linear.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.linear-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.linear</title>
+<h1>2d.filter.layers.componentTransfer.linear</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table-expected.html
new file mode 100644
index 00000000000..0f6736d87d4
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table-expected.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.table</title>
+<h1>2d.filter.layers.componentTransfer.table</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length - 1;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html
new file mode 100644
index 00000000000..eae036b142d
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.componentTransfer.table.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.table-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.table</title>
+<h1>2d.filter.layers.componentTransfer.table</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html
new file mode 100644
index 00000000000..ae45cb865c5
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.convolveMatrix.exceptions.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.convolveMatrix.exceptions</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.filter.layers.convolveMatrix.exceptions</h1>
+<p class="desc">Test exceptions on CanvasFilter() convolveMatrix</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("Test exceptions on CanvasFilter() convolveMatrix");
+_addTest(function(canvas, ctx) {
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', divisor: 2}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: null}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: 1}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: []}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [1]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[], []]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}}); });
+ // This should not throw an error
+ ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[]]}});
+ ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1]]}});
+ ctx.endLayer();
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow-expected.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow-expected.html
new file mode 100644
index 00000000000..1719d99b4a7
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow-expected.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.dropShadow</title>
+<h1>2d.filter.layers.dropShadow</h1>
+<p class="desc">Test CanvasFilter() dropShadow object.</p>
+
+<svg xmlns="http://www.w3.org/2000/svg"
+ width=520 height=420
+ color-interpolation-filters="sRGB">
+ <rect x=0 y=0 width=100% height=50 fill="teal" />
+ <rect x=0 y=100 width=100% height=50 fill="teal" />
+ <rect x=0 y=200 width=100% height=50 fill="teal" />
+ <rect x=0 y=300 width=100% height=50 fill="teal" />
+
+ <rect x=10 y=10 width=80 height=80 fill="crimson"
+ filter="drop-shadow(2px 2px 2px black)"/>
+ <rect x=110 y=10 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 5px rgba(128, 0, 128, 0.7))"/>
+
+ <rect x=10 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px purple)"/>
+ <rect x=110 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px LinkText)"/>
+ <rect x=210 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/>
+ <rect x=310 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px rgba(20, 50, 130, 0.7))"/>
+ <rect x=410 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px rgba(20, 50, 130, 0.49))"/>
+
+ <rect x=10 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 0px purple)"/>
+ <rect x=110 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 5px purple)"/>
+ <rect x=210 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 0px purple)"/>
+ <filter id="separable-filter"
+ x="-100%" y="-100%" width="300%" height="300%">
+ <feDropShadow dx=9 dy=12 stdDeviation="3 5" flood-color="purple"/>
+ </filter>
+ <rect x=310 y=210 width=80 height=80 fill="crimson"
+ filter="url(#separable-filter)"/>
+ <rect x=410 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 0px purple)"/>
+
+ <rect x=10 y=310 width=80 height=80 fill="crimson"
+ filter="drop-shadow(-5px 0px 0px purple)"/>
+ <filter id="separable-filter-degenerate"
+ x="-100%" y="-100%" width="300%" height="300%">
+ <feDropShadow dx=0 dy=5 stdDeviation="0 3"
+ flood-color="rgba(128, 0, 128, 0.8)"/>
+ </filter>
+ <rect x=110 y=310 width=80 height=80 fill="crimson"
+ filter="url(#separable-filter-degenerate)"/>
+ <rect x=210 y=310 width=80 height=80 fill="crimson"
+ filter="drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/>
+</svg>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html
new file mode 100644
index 00000000000..df5e0c7dc3e
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.exceptions.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.dropShadow.exceptions</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.filter.layers.dropShadow.exceptions</h1>
+<p class="desc">Test exceptions on CanvasFilter() dropShadow object</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("Test exceptions on CanvasFilter() dropShadow object");
+_addTest(function(canvas, ctx) {
+
+ // Should not throw an error.
+ // dx
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: '30'}}); ctx.endLayer();
+ // dy
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: '30'}}); ctx.endLayer();
+ // floodOpacity
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: '30'}}); ctx.endLayer();
+ // dx
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: '30'}}); ctx.endLayer();
+ // dy
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: '30'}}); ctx.endLayer();
+ // floodOpacity
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: '30'}}); ctx.endLayer();
+ // stdDeviation
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: '30'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [10, -1]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [0.5, null]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [true, false]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [[], [20]]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: ['30', ['40']]}}); ctx.endLayer();
+ // floodColor
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'red'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'canvas'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: '#aabbccdd'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: '#abcd'}}); ctx.endLayer();
+
+ // Should throw a TypeError.
+ // dx
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [1, 2]}}); ctx.endLayer(); });
+ // dy
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [1, 2]}}); ctx.endLayer(); });
+ // floodOpacity
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [1, 2]}}); ctx.endLayer(); });
+ // stdDeviation
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, 2, 3]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, NaN]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, Infinity]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, -Infinity]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, undefined]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, 'test']}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, {}]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, [2, 3]]}}); ctx.endLayer(); });
+ // floodColor
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 10}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: null}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: NaN}}); ctx.endLayer(); });
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.html
new file mode 100644
index 00000000000..ceb20bb9eb3
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.dropShadow.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.dropShadow-expected.html">
+<title>Canvas test: 2d.filter.layers.dropShadow</title>
+<h1>2d.filter.layers.dropShadow</h1>
+<p class="desc">Test CanvasFilter() dropShadow object.</p>
+<canvas id="canvas" width="520" height="420">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'teal';
+ ctx.fillRect(0, 0, 520, 50);
+ ctx.fillRect(0, 100, 520, 50);
+ ctx.fillRect(0, 200, 520, 50);
+ ctx.fillRect(0, 300, 520, 50);
+
+ ctx.fillStyle = 'crimson';
+
+ // Parameter defaults.
+ ctx.beginLayer({filter: {name: 'dropShadow'}});
+ ctx.fillRect(10, 10, 80, 80);
+ ctx.endLayer();
+ // All parameters specified.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7}});
+ ctx.fillRect(110, 10, 80, 80);
+ ctx.endLayer();
+ // Named color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'purple'}});
+ ctx.fillRect(10, 110, 80, 80);
+ ctx.endLayer();
+ // System color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'LinkText'}});
+ ctx.fillRect(110, 110, 80, 80);
+ ctx.endLayer();
+ // Numerical color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'}});
+ ctx.fillRect(210, 110, 80, 80);
+ ctx.endLayer();
+ // Transparent floodColor.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'}});
+ ctx.fillRect(310, 110, 80, 80);
+ ctx.endLayer();
+ // Transparent floodColor and floodOpacity.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}});
+ ctx.fillRect(410, 110, 80, 80);
+ ctx.endLayer();
+ // No blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ floodColor: 'purple'}});
+ ctx.fillRect(10, 210, 80, 80);
+ ctx.endLayer();
+ // Single float blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple'}});
+ ctx.fillRect(110, 210, 80, 80);
+ ctx.endLayer();
+ // Single negative float blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ floodColor: 'purple'}});
+ ctx.fillRect(210, 210, 80, 80);
+ ctx.endLayer();
+ // Two floats (X&Y) blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ floodColor: 'purple'}});
+ ctx.fillRect(310, 210, 80, 80);
+ ctx.endLayer();
+ // Two negative floats (X&Y) blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ floodColor: 'purple'}});
+ ctx.fillRect(410, 210, 80, 80);
+ ctx.endLayer();
+ // Degenerate parameter values.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]}});
+ ctx.fillRect(10, 310, 80, 80);
+ ctx.endLayer();
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ floodColor: 'purple', floodOpacity: '0.8'}});
+ ctx.fillRect(110, 310, 80, 80);
+ ctx.endLayer();
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']}});
+ ctx.fillRect(210, 310, 80, 80);
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html
new file mode 100644
index 00000000000..26dceaae165
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/filters/2d.filter.layers.turbulence.inputTypes.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.turbulence.inputTypes</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.filter.layers.turbulence.inputTypes</h1>
+<p class="desc">Test exceptions on CanvasFilter() turbulence object</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("Test exceptions on CanvasFilter() turbulence object");
+_addTest(function(canvas, ctx) {
+
+ const errorTestCases = [
+ {baseFrequency: {}},
+ {baseFrequency: -1},
+ {baseFrequency: [0, -1]},
+ {baseFrequency: NaN},
+ {baseFrequency: Infinity},
+ {baseFrequency: undefined},
+ {baseFrequency: -Infinity},
+ {baseFrequency: 'test'},
+
+ {numOctaves: {}},
+ {numOctaves: -1},
+ {numOctaves: NaN},
+ {numOctaves: Infinity},
+ {numOctaves: undefined},
+ {numOctaves: -Infinity},
+ {numOctaves: [1, 1]},
+ {numOctaves: 'test'},
+
+ {seed: {}},
+ {seed: NaN},
+ {seed: Infinity},
+ {seed: undefined},
+ {seed: -Infinity},
+ {seed: [1, 1]},
+ {seed: 'test'},
+
+ {stitchTiles: {}},
+ {stitchTiles: NaN},
+ {stitchTiles: Infinity},
+ {stitchTiles: undefined},
+ {stitchTiles: -Infinity},
+ {stitchTiles: [1, 1]},
+ {stitchTiles: 'test'},
+ {stitchTiles: null},
+ {stitchTiles: []},
+ {stitchTiles: [10]},
+ {stitchTiles: 30},
+ {stitchTiles: false},
+ {stitchTiles: true},
+ {stitchTiles: '10'},
+ {stitchTiles: -1},
+
+ {type: {}},
+ {type: NaN},
+ {type: Infinity},
+ {type: undefined},
+ {type: -Infinity},
+ {type: [1, 1]},
+ {type: 'test'},
+ {type: null},
+ {type: []},
+ {type: [10]},
+ {type: 30},
+ {type: false},
+ {type: true},
+ {type: '10'},
+ {type: -1},
+ ]
+
+ // null and [] = 0 when parsed as number
+ const workingTestCases = [
+ {baseFrequency: null},
+ {baseFrequency: []},
+ {baseFrequency: [10]},
+ {baseFrequency: [10, 3]},
+ {baseFrequency: 30},
+ {baseFrequency: false},
+ {baseFrequency: true},
+ {baseFrequency: '10'},
+
+ {numOctaves: null},
+ {numOctaves: []},
+ {numOctaves: [10]},
+ {numOctaves: 30},
+ {numOctaves: false},
+ {numOctaves: true},
+ {numOctaves: '10'},
+
+ {seed: null},
+ {seed: []},
+ {seed: [10]},
+ {seed: 30},
+ {seed: false},
+ {seed: true},
+ {seed: '10'},
+ {seed: -1},
+
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
+
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
+ ]
+
+ for (testCase of errorTestCases) {
+ const filterOptions = {...{name: 'turbulence'}, ...testCase};
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter: filterOptions}); });
+ }
+
+ for (testCase of workingTestCases) {
+ const filterOptions = {...{name: 'turbulence'}, ...testCase};
+ ctx.beginLayer({filter: filterOptions});
+ ctx.endLayer();
+ }
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/layers/2d.layer.global-states.filter.alpha.blending.html b/tests/wpt/tests/html/canvas/element/layers/2d.layer.global-states.filter.alpha.blending.html
index 27989c79e93..98ea67e9e96 100644
--- a/tests/wpt/tests/html/canvas/element/layers/2d.layer.global-states.filter.alpha.blending.html
+++ b/tests/wpt/tests/html/canvas/element/layers/2d.layer.global-states.filter.alpha.blending.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<link rel="match" href="2d.layer.global-states.filter.alpha.blending-expected.html">
-<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-2440">
+<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-2453">
<title>Canvas test: 2d.layer.global-states.filter.alpha.blending</title>
<h1>2d.layer.global-states.filter.alpha.blending</h1>
<p class="desc">Checks that layers with filters correctly use global render states.</p>
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
new file mode 100644
index 00000000000..a76c49d2d47
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html
@@ -0,0 +1,26 @@
+<!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
new file mode 100644
index 00000000000..ef576133742
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html
@@ -0,0 +1,26 @@
+<!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/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
index d8f14529c53..e7461eacdbd 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
@@ -6,11 +6,11 @@
<script src="/html/canvas/resources/canvas-tests.js"></script>
<h1>2d.filter.canvasFilterObject.blur.exceptions.tentative</h1>
-<p class="desc">Test exceptions on CanvasFilter() blur.object</p>
+<p class="desc">Test exceptions on gaussianBlur filter</p>
<script>
-var t = async_test("Test exceptions on CanvasFilter() blur.object");
+var t = async_test("Test exceptions on gaussianBlur filter");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -20,12 +20,18 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: 'foo'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: [1,2,3]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: {}}); });
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js
index 9b3fb3c04cd..1c271689688 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js
@@ -1,12 +1,12 @@
// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.blur.exceptions.tentative
-// Description:Test exceptions on CanvasFilter() blur.object
+// Description:Test exceptions on gaussianBlur filter
// Note:
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
-var t = async_test("Test exceptions on CanvasFilter() blur.object");
+var t = async_test("Test exceptions on gaussianBlur filter");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -16,12 +16,18 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur'}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN}); });
- assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: 'foo'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: [1,2,3]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'gaussianBlur', stdDeviation: {}}); });
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
index 242094d9f9f..0370c1387bc 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
@@ -6,11 +6,11 @@
<script src="/html/canvas/resources/canvas-tests.js"></script>
<h1>2d.filter.canvasFilterObject.colorMatrix.tentative</h1>
-<p class="desc">Test the functionality of ColorMatrix filters in CanvasFilter objects</p>
+<p class="desc">Test the functionality of ColorMatrix filters</p>
<script>
-var t = async_test("Test the functionality of ColorMatrix filters in CanvasFilter objects");
+var t = async_test("Test the functionality of ColorMatrix filters");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -20,38 +20,67 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: 'foo'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: undefined}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: 'foo'}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: null}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: [1, 2, 3]}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}); });
+
ctx.fillStyle = '#f00';
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 0});
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 90});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 180});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 270});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'saturate', values: 0.5});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
+
ctx.clearRect(0, 0, 100, 50);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'luminanceToAlpha'});
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', values: [
- 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0
- ]});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]});
ctx.fillRect(0, 0, 50, 25);
ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js
index d214e1d836e..62e4582efda 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js
@@ -1,12 +1,12 @@
// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.colorMatrix.tentative
-// Description:Test the functionality of ColorMatrix filters in CanvasFilter objects
+// Description:Test the functionality of ColorMatrix filters
// Note:
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
-var t = async_test("Test the functionality of ColorMatrix filters in CanvasFilter objects");
+var t = async_test("Test the functionality of ColorMatrix filters");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -16,38 +16,67 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: 'foo'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: undefined}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: 'foo'}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: null}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: [1, 2, 3]}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}); });
+
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}); });
+
ctx.fillStyle = '#f00';
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 0});
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 90});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 180});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 270});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'saturate', values: 0.5});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
+
ctx.clearRect(0, 0, 100, 50);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'luminanceToAlpha'});
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', values: [
- 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0
- ]});
+
+ ctx.filter = new CanvasFilter(
+ {name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]});
ctx.fillRect(0, 0, 50, 25);
ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html
new file mode 100644
index 00000000000..2b1c1c1c076
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k];
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
index ff1de6bc9cf..491d073efbc 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
@@ -1,42 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</title>
<h1>2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
-
-
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with discrete type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getTransformedValue(C, V) {
- // Get the right interval
- const n = V.length;
- const k = C == 1 ? n - 1 : Math.floor(C * n);
- return V[k];
- }
-
- function getColor(inputColor, tableValues) {
- const result = [0, 0, 0];
- for (const i in inputColor) {
- const C = inputColor[i]/255;
- const Cprime = getTransformedValue(C, tableValues[i]);
- result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
- }
- return result;
- }
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
@@ -55,13 +29,12 @@ t.step(function() {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
- t.done();
-});
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html
new file mode 100644
index 00000000000..d3a999a2426
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.w.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.discrete.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.discrete.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.filter = new CanvasFilter({name: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
+ });
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js
deleted file mode 100644
index 0e68f4899fe..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.componentTransfer.discrete.tentative
-// Description:Test pixels on CanvasFilter() componentTransfer with discrete type
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with discrete type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getTransformedValue(C, V) {
- // Get the right interval
- const n = V.length;
- const k = C == 1 ? n - 1 : Math.floor(C * n);
- return V[k];
- }
-
- function getColor(inputColor, tableValues) {
- const result = [0, 0, 0];
- for (const i in inputColor) {
- const C = inputColor[i]/255;
- const Cprime = getTransformedValue(C, tableValues[i]);
- result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
- }
- return result;
- }
-
- tableValuesR = [0, 0, 1, 1];
- tableValuesG = [2, 0, 0.5, 3];
- tableValuesB = [1, -1, 5, 0];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'discrete', tableValues: tableValuesR},
- funcG: {type: 'discrete', tableValues: tableValuesG},
- funcB: {type: 'discrete', tableValues: tableValuesB},
- });
-
- const inputColors = [
- [255, 255, 255],
- [0, 0, 0],
- [127, 0, 34],
- [252, 186, 3],
- [50, 68, 87],
- ];
-
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
- }
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html
new file mode 100644
index 00000000000..5adc9f53e20
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, amplitude, exponent, offset) {
+ return [
+ Math.max(0, Math.min(1, Math.pow(inputColor[0]/255,
+ exponent[0]) * amplitude[0] + offset[0])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[1]/255,
+ exponent[1]) * amplitude[1] + offset[1])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[2]/255,
+ exponent[2]) * amplitude[2] + offset[2])) * 255,
+ ];
+ }
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, amplitudes, exponents, offsets);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
index 64c30fc4177..b262f3b1d32 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
@@ -1,41 +1,27 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</title>
<h1>2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
-
-
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with gamma type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getColor(inputColor, amplitude, exponent, offset) {
- return [
- Math.max(0, Math.min(1, Math.pow(inputColor[0]/255, exponent[0]) * amplitude[0] + offset[0])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[1]/255, exponent[1]) * amplitude[1] + offset[1])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[2]/255, exponent[2]) * amplitude[2] + offset[2])) * 255,
- ];
- }
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
});
const inputColors = [
@@ -46,13 +32,12 @@ t.step(function() {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, amplitudes, exponents, offsets);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
- t.done();
-});
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html
new file mode 100644
index 00000000000..1fe346eacf2
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.w.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.gamma.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.gamma.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+ ctx.filter = new CanvasFilter({name: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
+ });
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js
deleted file mode 100644
index d59bc699df9..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.componentTransfer.gamma.tentative
-// Description:Test pixels on CanvasFilter() componentTransfer with gamma type
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with gamma type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getColor(inputColor, amplitude, exponent, offset) {
- return [
- Math.max(0, Math.min(1, Math.pow(inputColor[0]/255, exponent[0]) * amplitude[0] + offset[0])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[1]/255, exponent[1]) * amplitude[1] + offset[1])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[2]/255, exponent[2]) * amplitude[2] + offset[2])) * 255,
- ];
- }
-
- const amplitudes = [2, 1.1, 0.5];
- const exponents = [5, 3, 1];
- const offsets = [0.25, 0, 0.5];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
- });
-
- const inputColors = [
- [255, 255, 255],
- [0, 0, 0],
- [127, 0, 34],
- [252, 186, 3],
- [50, 68, 87],
- ];
-
- for (const color of inputColors) {
- let outputColor = getColor(color, amplitudes, exponents, offsets);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
- }
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html
new file mode 100644
index 00000000000..895d531206c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.identity.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ let outputColor = inputColors[i];
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
index e0d628952e0..26b6e4c7022 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
@@ -1,24 +1,15 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative</title>
<h1>2d.filter.canvasFilterObject.componentTransfer.identity.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
-
-
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with identity type");
-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');
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
ctx.filter = new CanvasFilter({name: 'componentTransfer',
funcR: {type: 'identity'},
@@ -34,12 +25,12 @@ t.step(function() {
[50, 68, 87],
];
- for (const color of inputColors) {
- ctx.fillStyle = `rgba(${color[0]}, ${color[1]}, ${color[2]}, 1)`,
- ctx.fillRect(0, 0, 10, 10);
- _assertPixel(canvas, 5, 5, color[0],color[1],color[2],255);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
- t.done();
-});
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html
new file mode 100644
index 00000000000..d2216d16479
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.w.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.identity.tentative-expected.html">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.identity.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ ctx.filter = new CanvasFilter({name: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
+ });
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js
deleted file mode 100644
index 1b714b58ff7..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.componentTransfer.identity.tentative
-// Description:Test pixels on CanvasFilter() componentTransfer with identity type
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with identity type");
-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');
-
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'identity'},
- funcG: {type: 'identity'},
- funcB: {type: 'identity'},
- });
-
- const inputColors = [
- [255, 255, 255],
- [0, 0, 0],
- [127, 0, 34],
- [252, 186, 3],
- [50, 68, 87],
- ];
-
- for (const color of inputColors) {
- ctx.fillStyle = `rgba(${color[0]}, ${color[1]}, ${color[2]}, 1)`,
- ctx.fillRect(0, 0, 10, 10);
- _assertPixel(canvas, 5, 5, color[0],color[1],color[2],255);
- }
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html
new file mode 100644
index 00000000000..c4ad790d56e
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.linear.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, slopes, intercepts) {
+ return [
+ Math.max(0, Math.min(1,
+ inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
+ ];
+ }
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, slopes, intercepts);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
index adbe557fd96..3fc3bd9eec2 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
@@ -1,33 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative</title>
<h1>2d.filter.canvasFilterObject.componentTransfer.linear.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
-
-
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with linear type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getColor(inputColor, slopes, intercepts) {
- return [
- Math.max(0, Math.min(1, inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
- Math.max(0, Math.min(1, inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
- Math.max(0, Math.min(1, inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
- ];
- }
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
@@ -45,13 +28,12 @@ t.step(function() {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, slopes, intercepts);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
- t.done();
-});
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html
new file mode 100644
index 00000000000..054dbce9299
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.w.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.linear.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.linear.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+ ctx.filter = new CanvasFilter({name: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
+ });
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js
deleted file mode 100644
index fb2e01876fc..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.componentTransfer.linear.tentative
-// Description:Test pixels on CanvasFilter() componentTransfer with linear type
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with linear type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getColor(inputColor, slopes, intercepts) {
- return [
- Math.max(0, Math.min(1, inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
- Math.max(0, Math.min(1, inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
- Math.max(0, Math.min(1, inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
- ];
- }
-
- const slopes = [0.5, 1.2, -0.2];
- const intercepts = [0.25, 0, 0.5];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
- funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
- funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
- });
-
- const inputColors = [
- [255, 255, 255],
- [0, 0, 0],
- [127, 0, 34],
- [252, 186, 3],
- [50, 68, 87],
- ];
-
- for (const color of inputColors) {
- let outputColor = getColor(color, slopes, intercepts);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
- }
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html
new file mode 100644
index 00000000000..29e250614c2
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.table.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.table.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length - 1;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
index 47048b68a14..ef2da126eb4 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
@@ -1,42 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.filter.canvasFilterObject.componentTransfer.table.tentative</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.table.tentative</title>
<h1>2d.filter.canvasFilterObject.componentTransfer.table.tentative</h1>
<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
-
-
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
<script>
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with table type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getTransformedValue(C, V) {
- // Get the right interval
- const n = V.length - 1;
- const k = C == 1 ? n - 1 : Math.floor(C * n);
- return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
- }
-
- function getColor(inputColor, tableValues) {
- const result = [0, 0, 0];
- for (const i in inputColor) {
- const C = inputColor[i]/255;
- const Cprime = getTransformedValue(C, tableValues[i]);
- result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
- }
- return result;
- }
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
@@ -55,13 +29,12 @@ t.step(function() {
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
- t.done();
-});
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html
new file mode 100644
index 00000000000..f39723da8e8
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.w.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.canvasFilterObject.componentTransfer.table.tentative-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.canvasFilterObject.componentTransfer.table.tentative</title>
+<h1>2d.filter.canvasFilterObject.componentTransfer.table.tentative</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.filter = new CanvasFilter({name: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
+ });
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js
deleted file mode 100644
index 0799e73a583..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.filter.canvasFilterObject.componentTransfer.table.tentative
-// Description:Test pixels on CanvasFilter() componentTransfer with table type
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("Test pixels on CanvasFilter() componentTransfer with table type");
-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');
-
- // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
- function getTransformedValue(C, V) {
- // Get the right interval
- const n = V.length - 1;
- const k = C == 1 ? n - 1 : Math.floor(C * n);
- return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
- }
-
- function getColor(inputColor, tableValues) {
- const result = [0, 0, 0];
- for (const i in inputColor) {
- const C = inputColor[i]/255;
- const Cprime = getTransformedValue(C, tableValues[i]);
- result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
- }
- return result;
- }
-
- tableValuesR = [0, 0, 1, 1];
- tableValuesG = [2, 0, 0.5, 3];
- tableValuesB = [1, -1, 5, 0];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'table', tableValues: tableValuesR},
- funcG: {type: 'table', tableValues: tableValuesG},
- funcB: {type: 'table', tableValues: tableValuesB},
- });
-
- const inputColors = [
- [255, 255, 255],
- [0, 0, 0],
- [127, 0, 34],
- [252, 186, 3],
- [50, 68, 87],
- ];
-
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
- }
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
index 301d11f888c..08f8860e998 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
@@ -20,23 +20,39 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', divisor: 2}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: 1}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: []}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], []]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', divisor: 2}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: null}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: 1}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: []}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [1]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[], []]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
// This should not throw an error
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[]]});
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1]]});
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js
index b4ce4d76b24..105ed67a758 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js
@@ -16,23 +16,39 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', divisor: 2}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: 1}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: []}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], []]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', divisor: 2}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: null}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: 1}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: []}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [1]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[], []]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
// This should not throw an error
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[]]});
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'convolveMatrix', kernelMatrix: [[1]]});
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html
index 3e55e97e54f..cdd501ba8e9 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.html
@@ -20,104 +20,250 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
+ // Should not throw an error.
// dx
- _assert(new CanvasFilter({name: 'dropShadow', dx: 10}), "new CanvasFilter({name: 'dropShadow', dx: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: -1}), "new CanvasFilter({name: 'dropShadow', dx: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: 0.5}), "new CanvasFilter({name: 'dropShadow', dx: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: null}), "new CanvasFilter({name: 'dropShadow', dx: null})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: true}), "new CanvasFilter({name: 'dropShadow', dx: true})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: false}), "new CanvasFilter({name: 'dropShadow', dx: false})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: []}), "new CanvasFilter({name: 'dropShadow', dx: []})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: [20]}), "new CanvasFilter({name: 'dropShadow', dx: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: '30'}), "new CanvasFilter({name: 'dropShadow', dx: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: '30'});
// dy
- _assert(new CanvasFilter({name: 'dropShadow', dy: 10}), "new CanvasFilter({name: 'dropShadow', dy: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: -1}), "new CanvasFilter({name: 'dropShadow', dy: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: 0.5}), "new CanvasFilter({name: 'dropShadow', dy: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: null}), "new CanvasFilter({name: 'dropShadow', dy: null})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: true}), "new CanvasFilter({name: 'dropShadow', dy: true})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: false}), "new CanvasFilter({name: 'dropShadow', dy: false})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: []}), "new CanvasFilter({name: 'dropShadow', dy: []})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: [20]}), "new CanvasFilter({name: 'dropShadow', dy: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: '30'}), "new CanvasFilter({name: 'dropShadow', dy: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: '30'});
// floodOpacity
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: 10}), "new CanvasFilter({name: 'dropShadow', floodOpacity: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: -1}), "new CanvasFilter({name: 'dropShadow', floodOpacity: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: 0.5}), "new CanvasFilter({name: 'dropShadow', floodOpacity: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: null}), "new CanvasFilter({name: 'dropShadow', floodOpacity: null})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: true}), "new CanvasFilter({name: 'dropShadow', floodOpacity: true})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: false}), "new CanvasFilter({name: 'dropShadow', floodOpacity: false})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: []}), "new CanvasFilter({name: 'dropShadow', floodOpacity: []})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: [20]}), "new CanvasFilter({name: 'dropShadow', floodOpacity: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: '30'}), "new CanvasFilter({name: 'dropShadow', floodOpacity: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: '30'});
+ // dx
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: '30'});
+ // dy
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: '30'});
+ // floodOpacity
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: '30'});
// stdDeviation
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: 10}), "new CanvasFilter({name: 'dropShadow', stdDeviation: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: -1}), "new CanvasFilter({name: 'dropShadow', stdDeviation: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: 0.5}), "new CanvasFilter({name: 'dropShadow', stdDeviation: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: null}), "new CanvasFilter({name: 'dropShadow', stdDeviation: null})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: true}), "new CanvasFilter({name: 'dropShadow', stdDeviation: true})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: false}), "new CanvasFilter({name: 'dropShadow', stdDeviation: false})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: []}), "new CanvasFilter({name: 'dropShadow', stdDeviation: []})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [20]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: '30'}), "new CanvasFilter({name: 'dropShadow', stdDeviation: '30'})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [10, -1]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [10, -1]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [0.5, null]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [0.5, null]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [true, false]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [true, false]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [[], [20]]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [[], [\""+(20)+"\"]]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: ['30', ['40']]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: ['30', ['40']]})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: '30'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [10, -1]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [0.5, null]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [true, false]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [[], [20]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: ['30', ['40']]});
// floodColor
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'red'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'red'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'canvas'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'canvas'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: '#aabbccdd'}), "new CanvasFilter({name: 'dropShadow', floodColor: '#aabbccdd'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: '#abcd'}), "new CanvasFilter({name: 'dropShadow', floodColor: '#abcd'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'red'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'canvas'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: '#aabbccdd'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: '#abcd'});
+ // Should throw a TypeError.
// dx
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [1, 2]}); });
// dy
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [1, 2]}); });
// floodOpacity
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [1, 2]}); });
// stdDeviation
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, 2, 3]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, NaN]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, Infinity]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, -Infinity]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, undefined]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, 'test']}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, {}]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, [2, 3]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, 2, 3]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, NaN]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, -Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, undefined]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, 'test']}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, {}]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, [2, 3]]}); });
// floodColor
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 10}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 10}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: null}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: NaN}); });
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js
index bd18524f28b..1d56865e687 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.exceptions.tentative.worker.js
@@ -16,104 +16,250 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
+ // Should not throw an error.
// dx
- _assert(new CanvasFilter({name: 'dropShadow', dx: 10}), "new CanvasFilter({name: 'dropShadow', dx: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: -1}), "new CanvasFilter({name: 'dropShadow', dx: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: 0.5}), "new CanvasFilter({name: 'dropShadow', dx: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: null}), "new CanvasFilter({name: 'dropShadow', dx: null})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: true}), "new CanvasFilter({name: 'dropShadow', dx: true})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: false}), "new CanvasFilter({name: 'dropShadow', dx: false})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: []}), "new CanvasFilter({name: 'dropShadow', dx: []})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: [20]}), "new CanvasFilter({name: 'dropShadow', dx: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', dx: '30'}), "new CanvasFilter({name: 'dropShadow', dx: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: '30'});
// dy
- _assert(new CanvasFilter({name: 'dropShadow', dy: 10}), "new CanvasFilter({name: 'dropShadow', dy: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: -1}), "new CanvasFilter({name: 'dropShadow', dy: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: 0.5}), "new CanvasFilter({name: 'dropShadow', dy: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: null}), "new CanvasFilter({name: 'dropShadow', dy: null})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: true}), "new CanvasFilter({name: 'dropShadow', dy: true})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: false}), "new CanvasFilter({name: 'dropShadow', dy: false})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: []}), "new CanvasFilter({name: 'dropShadow', dy: []})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: [20]}), "new CanvasFilter({name: 'dropShadow', dy: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', dy: '30'}), "new CanvasFilter({name: 'dropShadow', dy: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: '30'});
// floodOpacity
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: 10}), "new CanvasFilter({name: 'dropShadow', floodOpacity: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: -1}), "new CanvasFilter({name: 'dropShadow', floodOpacity: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: 0.5}), "new CanvasFilter({name: 'dropShadow', floodOpacity: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: null}), "new CanvasFilter({name: 'dropShadow', floodOpacity: null})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: true}), "new CanvasFilter({name: 'dropShadow', floodOpacity: true})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: false}), "new CanvasFilter({name: 'dropShadow', floodOpacity: false})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: []}), "new CanvasFilter({name: 'dropShadow', floodOpacity: []})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: [20]}), "new CanvasFilter({name: 'dropShadow', floodOpacity: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', floodOpacity: '30'}), "new CanvasFilter({name: 'dropShadow', floodOpacity: '30'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: '30'});
+ // dx
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: '30'});
+ // dy
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: '30'});
+ // floodOpacity
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: '30'});
// stdDeviation
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: 10}), "new CanvasFilter({name: 'dropShadow', stdDeviation: 10})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: -1}), "new CanvasFilter({name: 'dropShadow', stdDeviation: -1})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: 0.5}), "new CanvasFilter({name: 'dropShadow', stdDeviation: 0.5})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: null}), "new CanvasFilter({name: 'dropShadow', stdDeviation: null})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: true}), "new CanvasFilter({name: 'dropShadow', stdDeviation: true})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: false}), "new CanvasFilter({name: 'dropShadow', stdDeviation: false})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: []}), "new CanvasFilter({name: 'dropShadow', stdDeviation: []})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [20]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [\""+(20)+"\"]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: '30'}), "new CanvasFilter({name: 'dropShadow', stdDeviation: '30'})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [10, -1]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [10, -1]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [0.5, null]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [0.5, null]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [true, false]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [true, false]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: [[], [20]]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: [[], [\""+(20)+"\"]]})");
- _assert(new CanvasFilter({name: 'dropShadow', stdDeviation: ['30', ['40']]}), "new CanvasFilter({name: 'dropShadow', stdDeviation: ['30', ['40']]})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 10});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: -1});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 0.5});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: null});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: true});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: false});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: []});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [20]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: '30'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [10, -1]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [0.5, null]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [true, false]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [[], [20]]});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: ['30', ['40']]});
// floodColor
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'red'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'red'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'canvas'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'canvas'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'}), "new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: '#aabbccdd'}), "new CanvasFilter({name: 'dropShadow', floodColor: '#aabbccdd'})");
- _assert(new CanvasFilter({name: 'dropShadow', floodColor: '#abcd'}), "new CanvasFilter({name: 'dropShadow', floodColor: '#abcd'})");
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'red'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'canvas'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: '#aabbccdd'});
+ ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: '#abcd'});
+ // Should throw a TypeError.
// dx
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dx: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dx: [1, 2]}); });
// dy
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', dy: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', dy: [1, 2]}); });
// floodOpacity
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodOpacity: [1, 2]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodOpacity: [1, 2]}); });
// stdDeviation
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: NaN}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: -Infinity}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: {}}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, 2, 3]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, NaN]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, Infinity]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, -Infinity]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, undefined]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, 'test']}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, {}]}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', stdDeviation: [1, [2, 3]]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: -Infinity}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: {}}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, 2, 3]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, NaN]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, -Infinity]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, undefined]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, 'test']}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, {}]}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', stdDeviation: [1, [2, 3]]}); });
// floodColor
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 'test'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: 10}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: undefined}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: null}); });
- assert_throws_js(TypeError, function() { new CanvasFilter({name: 'dropShadow', floodColor: NaN}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'test'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: 10}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: undefined}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: null}); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(
+ {name: 'dropShadow', floodColor: NaN}); });
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
index 81eb1eae453..7569304b95a 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
@@ -22,86 +22,58 @@
// Parameter defaults.
ctx.filter = new CanvasFilter({name: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
-
// All parameters specified.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
-
// Named color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
-
// System color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
-
// Numerical color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(210, 110, 80, 80);
-
// Transparent floodColor.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(310, 110, 80, 80);
-
// Transparent floodColor and floodOpacity.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(410, 110, 80, 80);
-
// No blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
floodColor: 'purple'});
ctx.fillRect(10, 210, 80, 80);
-
// Single float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
floodColor: 'purple'});
ctx.fillRect(110, 210, 80, 80);
-
// Single negative float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
floodColor: 'purple'});
ctx.fillRect(210, 210, 80, 80);
-
// Two floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
floodColor: 'purple'});
ctx.fillRect(310, 210, 80, 80);
-
// Two negative floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
floodColor: 'purple'});
ctx.fillRect(410, 210, 80, 80);
-
// Degenerate parameter values.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 310, 80, 80);
-
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 310, 80, 80);
-
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 310, 80, 80);
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
index fe9087244a0..2a26af4ec3e 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
@@ -24,86 +24,58 @@
// Parameter defaults.
ctx.filter = new CanvasFilter({name: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
-
// All parameters specified.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
-
// Named color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
-
// System color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
-
// Numerical color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(210, 110, 80, 80);
-
// Transparent floodColor.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(310, 110, 80, 80);
-
// Transparent floodColor and floodOpacity.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(410, 110, 80, 80);
-
// No blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
floodColor: 'purple'});
ctx.fillRect(10, 210, 80, 80);
-
// Single float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
floodColor: 'purple'});
ctx.fillRect(110, 210, 80, 80);
-
// Single negative float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
floodColor: 'purple'});
ctx.fillRect(210, 210, 80, 80);
-
// Two floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
floodColor: 'purple'});
ctx.fillRect(310, 210, 80, 80);
-
// Two negative floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
floodColor: 'purple'});
ctx.fillRect(410, 210, 80, 80);
-
// Degenerate parameter values.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 310, 80, 80);
-
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 310, 80, 80);
-
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ ctx.filter = new CanvasFilter({name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 310, 80, 80);
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
index 040c62a96bb..8ad2a5ccfb0 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
@@ -117,12 +117,12 @@ t.step(function() {
for (testCase of errorTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(filterOptions); });
}
for (testCase of workingTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- _assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null");
+ ctx.filter = new CanvasFilter(filterOptions);
}
t.done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js
index 1a950a9207b..16199cb0ecf 100644
--- a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js
@@ -113,12 +113,12 @@ t.step(function() {
for (testCase of errorTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); });
+ assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter(filterOptions); });
}
for (testCase of workingTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- _assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null");
+ ctx.filter = new CanvasFilter(filterOptions);
}
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html
new file mode 100644
index 00000000000..36dd856456c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.filter.layers.blur.exceptions</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.filter.layers.blur.exceptions</h1>
+<p class="desc">Test exceptions on gaussianBlur filter</p>
+
+
+<script>
+var t = async_test("Test exceptions on gaussianBlur filter");
+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_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: undefined}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: 'foo'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: [1,2,3]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: NaN}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: {}}}); });
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js
new file mode 100644
index 00000000000..a053b8113c4
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.blur.exceptions.worker.js
@@ -0,0 +1,33 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.filter.layers.blur.exceptions
+// Description:Test exceptions on gaussianBlur filter
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Test exceptions on gaussianBlur filter");
+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_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: undefined}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: 'foo'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: [1,2,3]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: NaN}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'gaussianBlur', stdDeviation: {}}}); });
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html
new file mode 100644
index 00000000000..9e12acbbe0b
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.filter.layers.colorMatrix</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.filter.layers.colorMatrix</h1>
+<p class="desc">Test the functionality of ColorMatrix filters</p>
+
+
+<script>
+var t = async_test("Test the functionality of ColorMatrix filters");
+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_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: undefined}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: 'foo'}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: null}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: [1, 2, 3]}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}}); });
+
+ ctx.fillStyle = '#f00';
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 0}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 90}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 180}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 270}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'saturate', values: 0.5}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
+
+ ctx.clearRect(0, 0, 100, 50);
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'luminanceToAlpha'}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]}});
+ ctx.fillRect(0, 0, 50, 25);
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(50, 0, 50, 25);
+ ctx.fillStyle = '#00f';
+ ctx.fillRect(0, 25, 50, 25);
+ ctx.fillStyle = '#fff';
+ ctx.fillRect(50, 25, 50, 25);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 60,10, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 10,30, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 60,30, 0,255,0,255, 2);
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js
new file mode 100644
index 00000000000..12cdff38688
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.colorMatrix.worker.js
@@ -0,0 +1,100 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.filter.layers.colorMatrix
+// Description:Test the functionality of ColorMatrix filters
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Test the functionality of ColorMatrix filters");
+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_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: undefined}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: 'foo'}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: null}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: [1, 2, 3]}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}}); });
+
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}}); });
+
+ ctx.fillStyle = '#f00';
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 0}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 90}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 180}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'hueRotate', values: 270}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'saturate', values: 0.5}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
+
+ ctx.clearRect(0, 0, 100, 50);
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', type: 'luminanceToAlpha'}});
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
+
+ ctx.beginLayer({filter:
+ {name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]}});
+ ctx.fillRect(0, 0, 50, 25);
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(50, 0, 50, 25);
+ ctx.fillStyle = '#00f';
+ ctx.fillRect(0, 25, 50, 25);
+ ctx.fillStyle = '#fff';
+ ctx.fillRect(50, 25, 50, 25);
+ ctx.endLayer();
+ _assertPixelApprox(canvas, 10,10, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 60,10, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 10,30, 0,255,0,255, 2);
+ _assertPixelApprox(canvas, 60,30, 0,255,0,255, 2);
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete-expected.html
new file mode 100644
index 00000000000..8419953b3d2
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete-expected.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.discrete</title>
+<h1>2d.filter.layers.componentTransfer.discrete</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k];
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html
new file mode 100644
index 00000000000..459c2f28504
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.discrete-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.discrete</title>
+<h1>2d.filter.layers.componentTransfer.discrete</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html
new file mode 100644
index 00000000000..86e1d54fb7c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.discrete.w.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.layers.componentTransfer.discrete-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.discrete</title>
+<h1>2d.filter.layers.componentTransfer.discrete</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with discrete type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma-expected.html
new file mode 100644
index 00000000000..3e5d9808967
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma-expected.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.gamma</title>
+<h1>2d.filter.layers.componentTransfer.gamma</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, amplitude, exponent, offset) {
+ return [
+ Math.max(0, Math.min(1, Math.pow(inputColor[0]/255,
+ exponent[0]) * amplitude[0] + offset[0])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[1]/255,
+ exponent[1]) * amplitude[1] + offset[1])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[2]/255,
+ exponent[2]) * amplitude[2] + offset[2])) * 255,
+ ];
+ }
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, amplitudes, exponents, offsets);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html
new file mode 100644
index 00000000000..9012115adfc
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.gamma-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.gamma</title>
+<h1>2d.filter.layers.componentTransfer.gamma</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html
new file mode 100644
index 00000000000..767bcc58e5f
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.gamma.w.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.layers.componentTransfer.gamma-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.gamma</title>
+<h1>2d.filter.layers.componentTransfer.gamma</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with gamma type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity-expected.html
new file mode 100644
index 00000000000..9f1439f37b6
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity-expected.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.identity</title>
+<h1>2d.filter.layers.componentTransfer.identity</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ let outputColor = inputColors[i];
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html
new file mode 100644
index 00000000000..901dae3bed4
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.identity-expected.html">
+<title>Canvas test: 2d.filter.layers.componentTransfer.identity</title>
+<h1>2d.filter.layers.componentTransfer.identity</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html
new file mode 100644
index 00000000000..2e45018755a
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.identity.w.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.layers.componentTransfer.identity-expected.html">
+<title>Canvas test: 2d.filter.layers.componentTransfer.identity</title>
+<h1>2d.filter.layers.componentTransfer.identity</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with identity type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear-expected.html
new file mode 100644
index 00000000000..f922055ff26
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear-expected.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.linear</title>
+<h1>2d.filter.layers.componentTransfer.linear</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getColor(inputColor, slopes, intercepts) {
+ return [
+ Math.max(0, Math.min(1,
+ inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
+ ];
+ }
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(color, slopes, intercepts);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html
new file mode 100644
index 00000000000..f418b72ad55
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.linear-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.linear</title>
+<h1>2d.filter.layers.componentTransfer.linear</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html
new file mode 100644
index 00000000000..fbc29c86c17
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.linear.w.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.layers.componentTransfer.linear-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.linear</title>
+<h1>2d.filter.layers.componentTransfer.linear</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with linear type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table-expected.html
new file mode 100644
index 00000000000..0f6736d87d4
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table-expected.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.componentTransfer.table</title>
+<h1>2d.filter.layers.componentTransfer.table</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = document.getElementById("canvas");
+ const ctx = canvas.getContext('2d');
+
+ // From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
+ function getTransformedValue(C, V) {
+ // Get the right interval
+ const n = V.length - 1;
+ const k = C == 1 ? n - 1 : Math.floor(C * n);
+ return V[k] + (C - k/n) * n * (V[k + 1] - V[k]);
+ }
+
+ function getColor(inputColor, tableValues) {
+ const result = [0, 0, 0];
+ for (const i in inputColor) {
+ const C = inputColor[i]/255;
+ const Cprime = getTransformedValue(C, tableValues[i]);
+ result[i] = Math.max(0, Math.min(1, Cprime)) * 255;
+ }
+ return result;
+ }
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html
new file mode 100644
index 00000000000..ef5e0f847ba
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.componentTransfer.table-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.table</title>
+<h1>2d.filter.layers.componentTransfer.table</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html
new file mode 100644
index 00000000000..b11f0ef6f30
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.componentTransfer.table.w.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.layers.componentTransfer.table-expected.html">
+<meta name=fuzzy content="maxDifference=0-2; totalPixels=0-500">
+<title>Canvas test: 2d.filter.layers.componentTransfer.table</title>
+<h1>2d.filter.layers.componentTransfer.table</h1>
+<p class="desc">Test pixels on CanvasFilter() componentTransfer with table type</p>
+<canvas id="canvas" width="100" height="100">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(100, 100);
+ const ctx = canvas.getContext('2d');
+
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ ctx.beginLayer({filter: {name: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
+ }});
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ ctx.endLayer();
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html
new file mode 100644
index 00000000000..798822f1042
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.filter.layers.convolveMatrix.exceptions</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.filter.layers.convolveMatrix.exceptions</h1>
+<p class="desc">Test exceptions on CanvasFilter() convolveMatrix</p>
+
+
+<script>
+var t = async_test("Test exceptions on CanvasFilter() convolveMatrix");
+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_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', divisor: 2}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: null}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: 1}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: []}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [1]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[], []]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}}); });
+ // This should not throw an error
+ ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[]]}});
+ ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1]]}});
+ ctx.endLayer();
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js
new file mode 100644
index 00000000000..fa3be89ba2f
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.convolveMatrix.exceptions.worker.js
@@ -0,0 +1,56 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.filter.layers.convolveMatrix.exceptions
+// Description:Test exceptions on CanvasFilter() convolveMatrix
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Test exceptions on CanvasFilter() convolveMatrix");
+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_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix'}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', divisor: 2}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: null}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: 1}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: []}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [1]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[], []]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}}); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}}); });
+ // This should not throw an error
+ ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[]]}});
+ ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'convolveMatrix', kernelMatrix: [[1]]}});
+ ctx.endLayer();
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow-expected.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow-expected.html
new file mode 100644
index 00000000000..1719d99b4a7
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow-expected.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.filter.layers.dropShadow</title>
+<h1>2d.filter.layers.dropShadow</h1>
+<p class="desc">Test CanvasFilter() dropShadow object.</p>
+
+<svg xmlns="http://www.w3.org/2000/svg"
+ width=520 height=420
+ color-interpolation-filters="sRGB">
+ <rect x=0 y=0 width=100% height=50 fill="teal" />
+ <rect x=0 y=100 width=100% height=50 fill="teal" />
+ <rect x=0 y=200 width=100% height=50 fill="teal" />
+ <rect x=0 y=300 width=100% height=50 fill="teal" />
+
+ <rect x=10 y=10 width=80 height=80 fill="crimson"
+ filter="drop-shadow(2px 2px 2px black)"/>
+ <rect x=110 y=10 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 5px rgba(128, 0, 128, 0.7))"/>
+
+ <rect x=10 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px purple)"/>
+ <rect x=110 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px LinkText)"/>
+ <rect x=210 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/>
+ <rect x=310 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px rgba(20, 50, 130, 0.7))"/>
+ <rect x=410 y=110 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 3px rgba(20, 50, 130, 0.49))"/>
+
+ <rect x=10 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 0px purple)"/>
+ <rect x=110 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 5px purple)"/>
+ <rect x=210 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 0px purple)"/>
+ <filter id="separable-filter"
+ x="-100%" y="-100%" width="300%" height="300%">
+ <feDropShadow dx=9 dy=12 stdDeviation="3 5" flood-color="purple"/>
+ </filter>
+ <rect x=310 y=210 width=80 height=80 fill="crimson"
+ filter="url(#separable-filter)"/>
+ <rect x=410 y=210 width=80 height=80 fill="crimson"
+ filter="drop-shadow(9px 12px 0px purple)"/>
+
+ <rect x=10 y=310 width=80 height=80 fill="crimson"
+ filter="drop-shadow(-5px 0px 0px purple)"/>
+ <filter id="separable-filter-degenerate"
+ x="-100%" y="-100%" width="300%" height="300%">
+ <feDropShadow dx=0 dy=5 stdDeviation="0 3"
+ flood-color="rgba(128, 0, 128, 0.8)"/>
+ </filter>
+ <rect x=110 y=310 width=80 height=80 fill="crimson"
+ filter="url(#separable-filter-degenerate)"/>
+ <rect x=210 y=310 width=80 height=80 fill="crimson"
+ filter="drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/>
+</svg>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html
new file mode 100644
index 00000000000..10392dea5ac
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.html
@@ -0,0 +1,270 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.filter.layers.dropShadow.exceptions</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.filter.layers.dropShadow.exceptions</h1>
+<p class="desc">Test exceptions on CanvasFilter() dropShadow object</p>
+
+
+<script>
+var t = async_test("Test exceptions on CanvasFilter() dropShadow object");
+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');
+
+ // Should not throw an error.
+ // dx
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: '30'}}); ctx.endLayer();
+ // dy
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: '30'}}); ctx.endLayer();
+ // floodOpacity
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: '30'}}); ctx.endLayer();
+ // dx
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: '30'}}); ctx.endLayer();
+ // dy
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: '30'}}); ctx.endLayer();
+ // floodOpacity
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: '30'}}); ctx.endLayer();
+ // stdDeviation
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: '30'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [10, -1]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [0.5, null]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [true, false]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [[], [20]]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: ['30', ['40']]}}); ctx.endLayer();
+ // floodColor
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'red'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'canvas'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: '#aabbccdd'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: '#abcd'}}); ctx.endLayer();
+
+ // Should throw a TypeError.
+ // dx
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [1, 2]}}); ctx.endLayer(); });
+ // dy
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [1, 2]}}); ctx.endLayer(); });
+ // floodOpacity
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [1, 2]}}); ctx.endLayer(); });
+ // stdDeviation
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, 2, 3]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, NaN]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, Infinity]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, -Infinity]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, undefined]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, 'test']}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, {}]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, [2, 3]]}}); ctx.endLayer(); });
+ // floodColor
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 10}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: null}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: NaN}}); ctx.endLayer(); });
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js
new file mode 100644
index 00000000000..86b8c56af69
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.exceptions.worker.js
@@ -0,0 +1,265 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.filter.layers.dropShadow.exceptions
+// Description:Test exceptions on CanvasFilter() dropShadow object
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Test exceptions on CanvasFilter() dropShadow object");
+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');
+
+ // Should not throw an error.
+ // dx
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: '30'}}); ctx.endLayer();
+ // dy
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: '30'}}); ctx.endLayer();
+ // floodOpacity
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: '30'}}); ctx.endLayer();
+ // dx
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: '30'}}); ctx.endLayer();
+ // dy
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: '30'}}); ctx.endLayer();
+ // floodOpacity
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: '30'}}); ctx.endLayer();
+ // stdDeviation
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 10}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: -1}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 0.5}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: null}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: true}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: false}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: []}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [20]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: '30'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [10, -1]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [0.5, null]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [true, false]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [[], [20]]}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: ['30', ['40']]}}); ctx.endLayer();
+ // floodColor
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'red'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'canvas'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'rgba(4, -3, 0.5, 1)'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: '#aabbccdd'}}); ctx.endLayer();
+ ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: '#abcd'}}); ctx.endLayer();
+
+ // Should throw a TypeError.
+ // dx
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dx: [1, 2]}}); ctx.endLayer(); });
+ // dy
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', dy: [1, 2]}}); ctx.endLayer(); });
+ // floodOpacity
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodOpacity: [1, 2]}}); ctx.endLayer(); });
+ // stdDeviation
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: NaN}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: -Infinity}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: {}}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, 2, 3]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, NaN]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, Infinity]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, -Infinity]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, undefined]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, 'test']}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, {}]}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', stdDeviation: [1, [2, 3]]}}); ctx.endLayer(); });
+ // floodColor
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'test'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 'rgba(NaN, 3, 2, 1)'}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: 10}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: undefined}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: null}}); ctx.endLayer(); });
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter:
+ {name: 'dropShadow', floodColor: NaN}}); ctx.endLayer(); });
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.html
new file mode 100644
index 00000000000..1ecf309fc4e
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<link rel="match" href="2d.filter.layers.dropShadow-expected.html">
+<title>Canvas test: 2d.filter.layers.dropShadow</title>
+<h1>2d.filter.layers.dropShadow</h1>
+<p class="desc">Test CanvasFilter() dropShadow object.</p>
+<canvas id="canvas" width="520" height="420">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script>
+ const canvas = new OffscreenCanvas(520, 420);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'teal';
+ ctx.fillRect(0, 0, 520, 50);
+ ctx.fillRect(0, 100, 520, 50);
+ ctx.fillRect(0, 200, 520, 50);
+ ctx.fillRect(0, 300, 520, 50);
+
+ ctx.fillStyle = 'crimson';
+
+ // Parameter defaults.
+ ctx.beginLayer({filter: {name: 'dropShadow'}});
+ ctx.fillRect(10, 10, 80, 80);
+ ctx.endLayer();
+ // All parameters specified.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7}});
+ ctx.fillRect(110, 10, 80, 80);
+ ctx.endLayer();
+ // Named color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'purple'}});
+ ctx.fillRect(10, 110, 80, 80);
+ ctx.endLayer();
+ // System color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'LinkText'}});
+ ctx.fillRect(110, 110, 80, 80);
+ ctx.endLayer();
+ // Numerical color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'}});
+ ctx.fillRect(210, 110, 80, 80);
+ ctx.endLayer();
+ // Transparent floodColor.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'}});
+ ctx.fillRect(310, 110, 80, 80);
+ ctx.endLayer();
+ // Transparent floodColor and floodOpacity.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}});
+ ctx.fillRect(410, 110, 80, 80);
+ ctx.endLayer();
+ // No blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ floodColor: 'purple'}});
+ ctx.fillRect(10, 210, 80, 80);
+ ctx.endLayer();
+ // Single float blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple'}});
+ ctx.fillRect(110, 210, 80, 80);
+ ctx.endLayer();
+ // Single negative float blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ floodColor: 'purple'}});
+ ctx.fillRect(210, 210, 80, 80);
+ ctx.endLayer();
+ // Two floats (X&Y) blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ floodColor: 'purple'}});
+ ctx.fillRect(310, 210, 80, 80);
+ ctx.endLayer();
+ // Two negative floats (X&Y) blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ floodColor: 'purple'}});
+ ctx.fillRect(410, 210, 80, 80);
+ ctx.endLayer();
+ // Degenerate parameter values.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]}});
+ ctx.fillRect(10, 310, 80, 80);
+ ctx.endLayer();
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ floodColor: 'purple', floodOpacity: '0.8'}});
+ ctx.fillRect(110, 310, 80, 80);
+ ctx.endLayer();
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']}});
+ ctx.fillRect(210, 310, 80, 80);
+ ctx.endLayer();
+
+ const outputCanvas = document.getElementById("canvas");
+ outputCanvas.getContext('2d').drawImage(canvas, 0, 0);
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html
new file mode 100644
index 00000000000..e73b573779e
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.w.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<html class="reftest-wait">
+<link rel="match" href="2d.filter.layers.dropShadow-expected.html">
+<title>Canvas test: 2d.filter.layers.dropShadow</title>
+<h1>2d.filter.layers.dropShadow</h1>
+<p class="desc">Test CanvasFilter() dropShadow object.</p>
+<canvas id="canvas" width="520" height="420">
+ <p class="fallback">FAIL (fallback content)</p>
+</canvas>
+<script id='myWorker' type='text/worker'>
+ self.onmessage = function(e) {
+ const canvas = new OffscreenCanvas(520, 420);
+ const ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'teal';
+ ctx.fillRect(0, 0, 520, 50);
+ ctx.fillRect(0, 100, 520, 50);
+ ctx.fillRect(0, 200, 520, 50);
+ ctx.fillRect(0, 300, 520, 50);
+
+ ctx.fillStyle = 'crimson';
+
+ // Parameter defaults.
+ ctx.beginLayer({filter: {name: 'dropShadow'}});
+ ctx.fillRect(10, 10, 80, 80);
+ ctx.endLayer();
+ // All parameters specified.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7}});
+ ctx.fillRect(110, 10, 80, 80);
+ ctx.endLayer();
+ // Named color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'purple'}});
+ ctx.fillRect(10, 110, 80, 80);
+ ctx.endLayer();
+ // System color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'LinkText'}});
+ ctx.fillRect(110, 110, 80, 80);
+ ctx.endLayer();
+ // Numerical color.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'}});
+ ctx.fillRect(210, 110, 80, 80);
+ ctx.endLayer();
+ // Transparent floodColor.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'}});
+ ctx.fillRect(310, 110, 80, 80);
+ ctx.endLayer();
+ // Transparent floodColor and floodOpacity.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}});
+ ctx.fillRect(410, 110, 80, 80);
+ ctx.endLayer();
+ // No blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ floodColor: 'purple'}});
+ ctx.fillRect(10, 210, 80, 80);
+ ctx.endLayer();
+ // Single float blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple'}});
+ ctx.fillRect(110, 210, 80, 80);
+ ctx.endLayer();
+ // Single negative float blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ floodColor: 'purple'}});
+ ctx.fillRect(210, 210, 80, 80);
+ ctx.endLayer();
+ // Two floats (X&Y) blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ floodColor: 'purple'}});
+ ctx.fillRect(310, 210, 80, 80);
+ ctx.endLayer();
+ // Two negative floats (X&Y) blur.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ floodColor: 'purple'}});
+ ctx.fillRect(410, 210, 80, 80);
+ ctx.endLayer();
+ // Degenerate parameter values.
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]}});
+ ctx.fillRect(10, 310, 80, 80);
+ ctx.endLayer();
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ floodColor: 'purple', floodOpacity: '0.8'}});
+ ctx.fillRect(110, 310, 80, 80);
+ ctx.endLayer();
+ ctx.beginLayer({filter: {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']}});
+ ctx.fillRect(210, 310, 80, 80);
+ ctx.endLayer();
+
+ const bitmap = canvas.transferToImageBitmap();
+ self.postMessage(bitmap, bitmap);
+ };
+</script>
+<script>
+ const blob = new Blob([document.getElementById('myWorker').textContent]);
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', msg => {
+ const outputCtx = document.getElementById("canvas").getContext('2d');
+ outputCtx.drawImage(msg.data, 0, 0);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ worker.postMessage(null);
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html
new file mode 100644
index 00000000000..27f7748c847
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.filter.layers.turbulence.inputTypes</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.filter.layers.turbulence.inputTypes</h1>
+<p class="desc">Test exceptions on CanvasFilter() turbulence object</p>
+
+
+<script>
+var t = async_test("Test exceptions on CanvasFilter() turbulence object");
+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');
+
+ const errorTestCases = [
+ {baseFrequency: {}},
+ {baseFrequency: -1},
+ {baseFrequency: [0, -1]},
+ {baseFrequency: NaN},
+ {baseFrequency: Infinity},
+ {baseFrequency: undefined},
+ {baseFrequency: -Infinity},
+ {baseFrequency: 'test'},
+
+ {numOctaves: {}},
+ {numOctaves: -1},
+ {numOctaves: NaN},
+ {numOctaves: Infinity},
+ {numOctaves: undefined},
+ {numOctaves: -Infinity},
+ {numOctaves: [1, 1]},
+ {numOctaves: 'test'},
+
+ {seed: {}},
+ {seed: NaN},
+ {seed: Infinity},
+ {seed: undefined},
+ {seed: -Infinity},
+ {seed: [1, 1]},
+ {seed: 'test'},
+
+ {stitchTiles: {}},
+ {stitchTiles: NaN},
+ {stitchTiles: Infinity},
+ {stitchTiles: undefined},
+ {stitchTiles: -Infinity},
+ {stitchTiles: [1, 1]},
+ {stitchTiles: 'test'},
+ {stitchTiles: null},
+ {stitchTiles: []},
+ {stitchTiles: [10]},
+ {stitchTiles: 30},
+ {stitchTiles: false},
+ {stitchTiles: true},
+ {stitchTiles: '10'},
+ {stitchTiles: -1},
+
+ {type: {}},
+ {type: NaN},
+ {type: Infinity},
+ {type: undefined},
+ {type: -Infinity},
+ {type: [1, 1]},
+ {type: 'test'},
+ {type: null},
+ {type: []},
+ {type: [10]},
+ {type: 30},
+ {type: false},
+ {type: true},
+ {type: '10'},
+ {type: -1},
+ ]
+
+ // null and [] = 0 when parsed as number
+ const workingTestCases = [
+ {baseFrequency: null},
+ {baseFrequency: []},
+ {baseFrequency: [10]},
+ {baseFrequency: [10, 3]},
+ {baseFrequency: 30},
+ {baseFrequency: false},
+ {baseFrequency: true},
+ {baseFrequency: '10'},
+
+ {numOctaves: null},
+ {numOctaves: []},
+ {numOctaves: [10]},
+ {numOctaves: 30},
+ {numOctaves: false},
+ {numOctaves: true},
+ {numOctaves: '10'},
+
+ {seed: null},
+ {seed: []},
+ {seed: [10]},
+ {seed: 30},
+ {seed: false},
+ {seed: true},
+ {seed: '10'},
+ {seed: -1},
+
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
+
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
+ ]
+
+ for (testCase of errorTestCases) {
+ const filterOptions = {...{name: 'turbulence'}, ...testCase};
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter: filterOptions}); });
+ }
+
+ for (testCase of workingTestCases) {
+ const filterOptions = {...{name: 'turbulence'}, ...testCase};
+ ctx.beginLayer({filter: filterOptions});
+ ctx.endLayer();
+ }
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js
new file mode 100644
index 00000000000..3728566c997
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/filters/2d.filter.layers.turbulence.inputTypes.worker.js
@@ -0,0 +1,126 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.filter.layers.turbulence.inputTypes
+// Description:Test exceptions on CanvasFilter() turbulence object
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Test exceptions on CanvasFilter() turbulence object");
+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');
+
+ const errorTestCases = [
+ {baseFrequency: {}},
+ {baseFrequency: -1},
+ {baseFrequency: [0, -1]},
+ {baseFrequency: NaN},
+ {baseFrequency: Infinity},
+ {baseFrequency: undefined},
+ {baseFrequency: -Infinity},
+ {baseFrequency: 'test'},
+
+ {numOctaves: {}},
+ {numOctaves: -1},
+ {numOctaves: NaN},
+ {numOctaves: Infinity},
+ {numOctaves: undefined},
+ {numOctaves: -Infinity},
+ {numOctaves: [1, 1]},
+ {numOctaves: 'test'},
+
+ {seed: {}},
+ {seed: NaN},
+ {seed: Infinity},
+ {seed: undefined},
+ {seed: -Infinity},
+ {seed: [1, 1]},
+ {seed: 'test'},
+
+ {stitchTiles: {}},
+ {stitchTiles: NaN},
+ {stitchTiles: Infinity},
+ {stitchTiles: undefined},
+ {stitchTiles: -Infinity},
+ {stitchTiles: [1, 1]},
+ {stitchTiles: 'test'},
+ {stitchTiles: null},
+ {stitchTiles: []},
+ {stitchTiles: [10]},
+ {stitchTiles: 30},
+ {stitchTiles: false},
+ {stitchTiles: true},
+ {stitchTiles: '10'},
+ {stitchTiles: -1},
+
+ {type: {}},
+ {type: NaN},
+ {type: Infinity},
+ {type: undefined},
+ {type: -Infinity},
+ {type: [1, 1]},
+ {type: 'test'},
+ {type: null},
+ {type: []},
+ {type: [10]},
+ {type: 30},
+ {type: false},
+ {type: true},
+ {type: '10'},
+ {type: -1},
+ ]
+
+ // null and [] = 0 when parsed as number
+ const workingTestCases = [
+ {baseFrequency: null},
+ {baseFrequency: []},
+ {baseFrequency: [10]},
+ {baseFrequency: [10, 3]},
+ {baseFrequency: 30},
+ {baseFrequency: false},
+ {baseFrequency: true},
+ {baseFrequency: '10'},
+
+ {numOctaves: null},
+ {numOctaves: []},
+ {numOctaves: [10]},
+ {numOctaves: 30},
+ {numOctaves: false},
+ {numOctaves: true},
+ {numOctaves: '10'},
+
+ {seed: null},
+ {seed: []},
+ {seed: [10]},
+ {seed: 30},
+ {seed: false},
+ {seed: true},
+ {seed: '10'},
+ {seed: -1},
+
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
+
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
+ ]
+
+ for (testCase of errorTestCases) {
+ const filterOptions = {...{name: 'turbulence'}, ...testCase};
+ assert_throws_js(TypeError, function() { ctx.beginLayer({filter: filterOptions}); });
+ }
+
+ for (testCase of workingTestCases) {
+ const filterOptions = {...{name: 'turbulence'}, ...testCase};
+ ctx.beginLayer({filter: filterOptions});
+ ctx.endLayer();
+ }
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html
index 1e5c6ad8b75..0e48cb49f79 100644
--- a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html
+++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<link rel="match" href="2d.layer.global-states.filter.alpha.blending-expected.html">
-<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-2440">
+<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-2453">
<title>Canvas test: 2d.layer.global-states.filter.alpha.blending</title>
<h1>2d.layer.global-states.filter.alpha.blending</h1>
<p class="desc">Checks that layers with filters correctly use global render states.</p>
diff --git a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html
index 142e900fd1b..3887ed4485b 100644
--- a/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html
+++ b/tests/wpt/tests/html/canvas/offscreen/layers/2d.layer.global-states.filter.alpha.blending.w.html
@@ -2,7 +2,7 @@
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<html class="reftest-wait">
<link rel="match" href="2d.layer.global-states.filter.alpha.blending-expected.html">
-<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-2440">
+<meta name=fuzzy content="maxDifference=0-1; totalPixels=0-2453">
<title>Canvas test: 2d.layer.global-states.filter.alpha.blending</title>
<h1>2d.layer.global-states.filter.alpha.blending</h1>
<p class="desc">Checks that layers with filters correctly use global render states.</p>
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
new file mode 100644
index 00000000000..cd478e666fd
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.html
@@ -0,0 +1,27 @@
+<!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
new file mode 100644
index 00000000000..f24b8aa8504
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba16f.tentative.https.worker.js
@@ -0,0 +1,22 @@
+// 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
new file mode 100644
index 00000000000..d77a2984087
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.html
@@ -0,0 +1,27 @@
+<!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
new file mode 100644
index 00000000000..4d4137e2d3c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/webgpu-access/2d.webgpuaccess.getTextureFormat.rgba8.tentative.https.worker.js
@@ -0,0 +1,22 @@
+// 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/gentestutilsunion.py b/tests/wpt/tests/html/canvas/tools/gentestutilsunion.py
index 4fe7f2bd42e..d7042810be8 100644
--- a/tests/wpt/tests/html/canvas/tools/gentestutilsunion.py
+++ b/tests/wpt/tests/html/canvas/tools/gentestutilsunion.py
@@ -184,6 +184,10 @@ def _remove_extra_newlines(text: str) -> str:
return text
def _expand_test_code(code: str) -> str:
+ code = re.sub(r' @moz-todo', '', code)
+
+ code = re.sub(r'@moz-UniversalBrowserRead;', '', code)
+
code = _remove_extra_newlines(code)
# Unroll expressions with a cross-product-style parameter expansion.
@@ -202,11 +206,13 @@ def _expand_test_code(code: str) -> str:
code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);',
r'_assertPixelApprox(canvas, \1, \2, \3);', code)
- code = re.sub(r'@assert throws (\S+_ERR) (.*);',
- r'assert_throws_dom("\1", function() { \2; });', code)
+ code = re.sub(r'@assert throws (\S+_ERR) (.*?);$',
+ r'assert_throws_dom("\1", function() { \2; });', code,
+ flags=re.MULTILINE | re.DOTALL)
- code = re.sub(r'@assert throws (\S+Error) (.*);',
- r'assert_throws_js(\1, function() { \2; });', code)
+ code = re.sub(r'@assert throws (\S+Error) (.*?);$',
+ r'assert_throws_js(\1, function() { \2; });', code,
+ flags=re.MULTILINE | re.DOTALL)
code = re.sub(
r'@assert (.*) === (.*);', lambda m: '_assertSame(%s, %s, "%s", "%s");'
@@ -226,10 +232,6 @@ def _expand_test_code(code: str) -> str:
r'@assert (.*);', lambda m: '_assert(%s, "%s");' % (m.group(
1), _escapeJS(m.group(1))), code)
- code = re.sub(r' @moz-todo', '', code)
-
- code = re.sub(r'@moz-UniversalBrowserRead;', '', code)
-
assert ('@' not in code)
return code
diff --git a/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml b/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml
index 1e0caff5b98..79b5fb61f28 100644
--- a/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml
+++ b/tests/wpt/tests/html/canvas/tools/name2dir-canvas.yaml
@@ -24,3 +24,4 @@
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 c52acb793ba..3f59fd8eead 100644
--- a/tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml
+++ b/tests/wpt/tests/html/canvas/tools/name2dir-offscreen.yaml
@@ -19,4 +19,5 @@
2d.missingargs: "conformance-requirements"
2d.voidreturn: "conformance-requirements"
2d.canvas.host: "canvas-host"
-2d.canvas.context: "canvas-context" \ No newline at end of file
+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 ae69c153780..b0e541289f5 100644
--- a/tests/wpt/tests/html/canvas/tools/name2dir.yaml
+++ b/tests/wpt/tests/html/canvas/tools/name2dir.yaml
@@ -23,3 +23,4 @@
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/drawing-images-to-the-canvas.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/drawing-images-to-the-canvas.yaml
index 93c556288d7..09e9e001867 100644
--- a/tests/wpt/tests/html/canvas/tools/yaml-new/drawing-images-to-the-canvas.yaml
+++ b/tests/wpt/tests/html/canvas/tools/yaml-new/drawing-images-to-the-canvas.yaml
@@ -638,3 +638,11 @@
@nonfinite ctx.drawImage(<bitmap>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <0 Infinity -Infinity NaN>, <100 Infinity -Infinity NaN>, <50 Infinity -Infinity NaN>);
@assert pixel 50,25 == 0,255,0,255;
expected: green
+
+- name: 2d.drawImage.detachedcanvas
+ desc: drawImage with detached OffscreenCanvas as the source should throw exception
+ canvasType: ['HTMLCanvas']
+ code: |
+ var canvas2 = new OffscreenCanvas(80, 80);
+ (new MessageChannel()).port1.postMessage(canvas2, [canvas2]);
+ @assert throws INVALID_STATE_ERR ctx.drawImage(canvas2, 0, 0);
diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml
index e18ab61b41e..f327b9fe949 100644
--- a/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml
+++ b/tests/wpt/tests/html/canvas/tools/yaml-new/filters.yaml
@@ -89,51 +89,102 @@
ctx.filter = 'this string is not a filter and should do nothing';
@assert ctx.filter.toString() == '[object CanvasFilter]';
-- name: 2d.filter.canvasFilterObject.blur.exceptions.tentative
- desc: Test exceptions on CanvasFilter() blur.object
+- name: 2d.filter.{{ variant_names[0] }}.blur.exceptions{{ tentative }}
+ desc: Test exceptions on gaussianBlur filter
code: |
- @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur'});
- @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: undefined});
- @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: 'foo'});
- @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: [1,2,3]});
- @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: NaN});
- @assert throws TypeError ctx.filter = new CanvasFilter({name: 'gaussianBlur', stdDeviation: {}});
-
-- name: 2d.filter.canvasFilterObject.colorMatrix.tentative
- desc: Test the functionality of ColorMatrix filters in CanvasFilter objects
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'gaussianBlur'}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'gaussianBlur', stdDeviation: undefined}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'gaussianBlur', stdDeviation: 'foo'}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'gaussianBlur', stdDeviation: [1,2,3]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'gaussianBlur', stdDeviation: NaN}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'gaussianBlur', stdDeviation: {}}") }};
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter:
+ param})
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(
+ param)
+ tentative: .tentative
+
+- name: 2d.filter.{{ variant_names[0] }}.colorMatrix{{ tentative }}
+ desc: Test the functionality of ColorMatrix filters
code: |
- @assert throws TypeError new CanvasFilter({name: 'colorMatrix', values: undefined});
- @assert throws TypeError new CanvasFilter({name: 'colorMatrix', values: 'foo'});
- @assert throws TypeError new CanvasFilter({name: 'colorMatrix', values: null});
- @assert throws TypeError new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3]});
- @assert throws TypeError new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']});
- @assert throws TypeError new CanvasFilter({name: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]});
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', values: undefined}") }};
+
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', values: 'foo'}") }};
+
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', values: null}") }};
+
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', values: [1, 2, 3]}") }};
+
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 'a']}") }};
+
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix',
+ values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, Infinity]}") }};
+
ctx.fillStyle = '#f00';
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 0});
+ {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', type: 'hueRotate', values: 0}") }};
ctx.fillRect(0, 0, 100, 50);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 255,0,0,255;
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 90});
+
+ {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', type: 'hueRotate', values: 90}") }};
ctx.fillRect(0, 0, 100, 50);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 0,91,0,255;
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 180});
+
+ {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', type: 'hueRotate', values: 180}") }};
ctx.fillRect(0, 0, 100, 50);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 0,109,109,255;
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'hueRotate', values: 270});
+
+ {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', type: 'hueRotate', values: 270}") }};
ctx.fillRect(0, 0, 100, 50);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 109,18,255,255;
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'saturate', values: 0.5});
+
+ {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', type: 'saturate', values: 0.5}") }};
ctx.fillRect(0, 0, 100, 50);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 155,27,27,255;
+
ctx.clearRect(0, 0, 100, 50);
- ctx.filter = new CanvasFilter({name: 'colorMatrix', type: 'luminanceToAlpha'});
+ {{ filter_declaration | replace("param",
+ "{name: 'colorMatrix', type: 'luminanceToAlpha'}") }};
ctx.fillRect(0, 0, 100, 50);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 0,0,0,54;
- ctx.filter = new CanvasFilter({name: 'colorMatrix', values: [
- 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0
- ]});
+
+ {{ filter_declaration | replace("param", "{name: 'colorMatrix', values: [
+ 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0
+ ]}") }};
ctx.fillRect(0, 0, 50, 25);
ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
@@ -141,51 +192,120 @@
ctx.fillRect(0, 25, 50, 25);
ctx.fillStyle = '#fff';
ctx.fillRect(50, 25, 50, 25);
+ {{ close_layer -}}
@assert pixel 10,10 ==~ 0,255,0,255;
@assert pixel 60,10 ==~ 0,255,0,255;
@assert pixel 10,30 ==~ 0,255,0,255;
@assert pixel 60,30 ==~ 0,255,0,255;
-
-- name: 2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter:
+ param})
+ close_layer: |
+ ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(
+ param)
+ tentative: .tentative
+
+- name: 2d.filter.{{ variant_names[0] }}.convolveMatrix.exceptions{{ tentative }}
desc: Test exceptions on CanvasFilter() convolveMatrix
code: |
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix'});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', divisor: 2});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: null});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: 1});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: []});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], []]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1, 2], []]});
- @assert throws TypeError new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]});
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix'}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', divisor: 2}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: null}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: 1}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: []}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [1]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[], []]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[1, 2], []]}") }};
+ @assert throws TypeError {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}") }};
// This should not throw an error
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[]]});
- ctx.filter = new CanvasFilter({name: 'convolveMatrix', kernelMatrix: [[1]]});
+ {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[]]}") }};
+ {{ close_layer -}}
+ {{ filter_declaration | replace("param",
+ "{name: 'convolveMatrix', kernelMatrix: [[1]]}") }};
+ {{ close_layer -}}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter:
+ param})
+ close_layer: |
+ ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(
+ param)
+ tentative: .tentative
-- name: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative
+- name: >-
+ 2d.filter.{{ variant_names[0] }}.componentTransfer.linear{{ tentative }}
desc: Test pixels on CanvasFilter() componentTransfer with linear type
+ size: [100, 100]
+ fuzzy: maxDifference=0-2; totalPixels=0-500
code: |
+ const slopes = [0.5, 1.2, -0.2];
+ const intercepts = [0.25, 0, 0.5];
+ {{ filter_declaration | replace("param", "{name: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
+ }") }};
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ {{ close_layer }}
+ reference: |
// From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
function getColor(inputColor, slopes, intercepts) {
return [
- Math.max(0, Math.min(1, inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
- Math.max(0, Math.min(1, inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
- Math.max(0, Math.min(1, inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[0]/255 * slopes[0] + intercepts[0])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[1]/255 * slopes[1] + intercepts[1])) * 255,
+ Math.max(0, Math.min(1,
+ inputColor[2]/255 * slopes[2] + intercepts[2])) * 255,
];
}
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
- funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
- funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
- });
const inputColors = [
[255, 255, 255],
@@ -195,22 +315,51 @@
[50, 68, 87],
];
- for (const color of inputColors) {
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
let outputColor = getColor(color, slopes, intercepts);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
+ {{ close_layer }}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param})
+ close_layer: ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param)
+ tentative: .tentative
-- name: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative
+- name: >-
+ 2d.filter.{{ variant_names[0] }}.componentTransfer.identity{{ tentative }}
desc: Test pixels on CanvasFilter() componentTransfer with identity type
+ size: [100, 100]
code: |
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
+ {{ filter_declaration | replace("param", "{name: 'componentTransfer',
funcR: {type: 'identity'},
funcG: {type: 'identity'},
funcB: {type: 'identity'},
- });
+ }") }};
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ {{ close_layer }}
+ reference: |
const inputColors = [
[255, 255, 255],
[0, 0, 0],
@@ -219,32 +368,71 @@
[50, 68, 87],
];
- for (const color of inputColors) {
- ctx.fillStyle = `rgba(${color[0]}, ${color[1]}, ${color[2]}, 1)`,
- ctx.fillRect(0, 0, 10, 10);
- _assertPixel(canvas, 5, 5, color[0],color[1],color[2],255);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ let outputColor = inputColors[i];
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param})
+ close_layer: ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param)
+ tentative: .tentative
-- name: 2d.filter.canvasFilterObject.componentTransfer.gamma.tentative
+- name: >-
+ 2d.filter.{{ variant_names[0] }}.componentTransfer.gamma{{ tentative }}
desc: Test pixels on CanvasFilter() componentTransfer with gamma type
+ size: [100, 100]
+ fuzzy: maxDifference=0-2; totalPixels=0-500
code: |
+ const amplitudes = [2, 1.1, 0.5];
+ const exponents = [5, 3, 1];
+ const offsets = [0.25, 0, 0.5];
+ {{ filter_declaration | replace("param", "{name: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0],
+ exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1],
+ exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2],
+ exponent: exponents[2], offset: offsets[2]},
+ }") }};
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ {{ close_layer }}
+ reference: |
// From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
function getColor(inputColor, amplitude, exponent, offset) {
return [
- Math.max(0, Math.min(1, Math.pow(inputColor[0]/255, exponent[0]) * amplitude[0] + offset[0])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[1]/255, exponent[1]) * amplitude[1] + offset[1])) * 255,
- Math.max(0, Math.min(1, Math.pow(inputColor[2]/255, exponent[2]) * amplitude[2] + offset[2])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[0]/255,
+ exponent[0]) * amplitude[0] + offset[0])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[1]/255,
+ exponent[1]) * amplitude[1] + offset[1])) * 255,
+ Math.max(0, Math.min(1, Math.pow(inputColor[2]/255,
+ exponent[2]) * amplitude[2] + offset[2])) * 255,
];
}
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
- });
const inputColors = [
[255, 255, 255],
@@ -254,16 +442,54 @@
[50, 68, 87],
];
- for (const color of inputColors) {
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
let outputColor = getColor(color, amplitudes, exponents, offsets);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param})
+ close_layer: ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param)
+ tentative: .tentative
-- name: 2d.filter.canvasFilterObject.componentTransfer.table.tentative
+- name: >-
+ 2d.filter.{{ variant_names[0] }}.componentTransfer.table{{ tentative }}
desc: Test pixels on CanvasFilter() componentTransfer with table type
+ size: [100, 100]
+ fuzzy: maxDifference=0-2; totalPixels=0-500
code: |
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ {{ filter_declaration | replace("param", "{name: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
+ }") }};
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ {{ close_layer }}
+ reference: |
// From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
function getTransformedValue(C, V) {
// Get the right interval
@@ -285,11 +511,6 @@
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'table', tableValues: tableValuesR},
- funcG: {type: 'table', tableValues: tableValuesG},
- funcB: {type: 'table', tableValues: tableValuesB},
- });
const inputColors = [
[255, 255, 255],
@@ -299,16 +520,55 @@
[50, 68, 87],
];
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param})
+ close_layer: ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param)
+ tentative: .tentative
-- name: 2d.filter.canvasFilterObject.componentTransfer.discrete.tentative
+- name: >-
+ 2d.filter.{{ variant_names[0] }}.componentTransfer.discrete{{ tentative }}
desc: Test pixels on CanvasFilter() componentTransfer with discrete type
+ size: [100, 100]
+ fuzzy: maxDifference=0-2; totalPixels=0-500
code: |
+ tableValuesR = [0, 0, 1, 1];
+ tableValuesG = [2, 0, 0.5, 3];
+ tableValuesB = [1, -1, 5, 0];
+ {{ filter_declaration | replace("param", "{name: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
+ }") }};
+
+ const inputColors = [
+ [255, 255, 255],
+ [0, 0, 0],
+ [127, 0, 34],
+ [252, 186, 3],
+ [50, 68, 87],
+ ];
+
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
+ }
+ {{ close_layer }}
+ reference: |
// From https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement
function getTransformedValue(C, V) {
// Get the right interval
@@ -330,11 +590,6 @@
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
- ctx.filter = new CanvasFilter({name: 'componentTransfer',
- funcR: {type: 'discrete', tableValues: tableValuesR},
- funcG: {type: 'discrete', tableValues: tableValuesG},
- funcB: {type: 'discrete', tableValues: tableValuesB},
- });
const inputColors = [
[255, 255, 255],
@@ -343,13 +598,24 @@
[252, 186, 3],
[50, 68, 87],
];
-
- for (const color of inputColors) {
- let outputColor = getColor(color, [tableValuesR, tableValuesG, tableValuesB]);
- ctx.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
- ctx.fillRect(0, 0, 10, 10);
- _assertPixelApprox(canvas, 5, 5, outputColor[0],outputColor[1],outputColor[2],255, 2);
+ for (let i = 0 ; i < inputColors.length ; ++i) {
+ const color = inputColors[i];
+ let outputColor = getColor(
+ color, [tableValuesR, tableValuesG, tableValuesB]);
+ ctx.fillStyle = `rgb(${outputColor[0]}, ${outputColor[1]},
+ ${outputColor[2]})`;
+ ctx.fillRect(i * 10, i * 10, 10, 10);
}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param})
+ close_layer: ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param)
+ tentative: .tentative
- name: >-
2d.filter.{{ variant_names[0] }}.gaussianBlur.{{ variant_names[1] }}{{
@@ -400,7 +666,7 @@
blur_x: 0
blur_y: 4
-- name: 2d.filter.canvasFilterObject.dropShadow.tentative
+- name: 2d.filter.{{ variant_names[0] }}.dropShadow{{ tentative }}
desc: Test CanvasFilter() dropShadow object.
size: [520, 420]
code: |
@@ -413,90 +679,91 @@
ctx.fillStyle = 'crimson';
// Parameter defaults.
- ctx.filter = new CanvasFilter({name: 'dropShadow'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow'}") }}
ctx.fillRect(10, 10, 80, 80);
+ {{ close_layer -}}
// All parameters specified.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
- floodColor: 'purple', floodOpacity: 0.7});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7}") }}
ctx.fillRect(110, 10, 80, 80);
+ {{ close_layer -}}
// Named color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
- floodColor: 'purple'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'purple'}") }}
ctx.fillRect(10, 110, 80, 80);
+ {{ close_layer -}}
// System color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
- floodColor: 'LinkText'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'LinkText'}") }}
ctx.fillRect(110, 110, 80, 80);
+ {{ close_layer -}}
// Numerical color.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
- floodColor: 'rgba(20, 50, 130, 1)'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'}") }}
ctx.fillRect(210, 110, 80, 80);
+ {{ close_layer -}}
// Transparent floodColor.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
- floodColor: 'rgba(20, 50, 130, 0.7)'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'}") }}
ctx.fillRect(310, 110, 80, 80);
+ {{ close_layer -}}
// Transparent floodColor and floodOpacity.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
- floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}") }}
ctx.fillRect(410, 110, 80, 80);
+ {{ close_layer -}}
// No blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
- floodColor: 'purple'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 0,
+ floodColor: 'purple'}") }}
ctx.fillRect(10, 210, 80, 80);
+ {{ close_layer -}}
// Single float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
- floodColor: 'purple'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: 5,
+ floodColor: 'purple'}") }}
ctx.fillRect(110, 210, 80, 80);
+ {{ close_layer -}}
// Single negative float blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
- floodColor: 'purple'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: -5,
+ floodColor: 'purple'}") }}
ctx.fillRect(210, 210, 80, 80);
+ {{ close_layer -}}
// Two floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
- floodColor: 'purple'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [3, 5],
+ floodColor: 'purple'}") }}
ctx.fillRect(310, 210, 80, 80);
+ {{ close_layer -}}
// Two negative floats (X&Y) blur.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
- floodColor: 'purple'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: 9, dy: 12, stdDeviation: [-3, -5],
+ floodColor: 'purple'}") }}
ctx.fillRect(410, 210, 80, 80);
+ {{ close_layer -}}
// Degenerate parameter values.
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
- floodColor: 'purple', floodOpacity: [2]});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]}") }}
ctx.fillRect(10, 310, 80, 80);
+ {{ close_layer -}}
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
- floodColor: 'purple', floodOpacity: '0.8'});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: null, dy: '5', stdDeviation: [[-5], ['3']],
+ floodColor: 'purple', floodOpacity: '0.8'}") }}
ctx.fillRect(110, 310, 80, 80);
+ {{ close_layer -}}
- ctx.filter = new CanvasFilter(
- {name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
- floodColor: 'purple', floodOpacity: ['0.4']});
+ {{ filter_declaration | replace("param", "{name: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']}") }}
ctx.fillRect(210, 310, 80, 80);
+ {{ close_layer -}}
html_reference: |
<svg xmlns="http://www.w3.org/2000/svg"
width={{ size[0] }} height={{ size[1] }}
@@ -549,41 +816,70 @@
<rect x=210 y=310 width=80 height=80 fill="crimson"
filter="drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/>
</svg>
-
-- name: 2d.filter.canvasFilterObject.dropShadow.exceptions.tentative
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param});
+ close_layer: |
+ ctx.endLayer();
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param);
+ tentative: .tentative
+
+- name: 2d.filter.{{ variant_names[0] }}.dropShadow.exceptions{{ tentative }}
desc: Test exceptions on CanvasFilter() dropShadow object
code: |
- @unroll @assert new CanvasFilter({\-
+ // Should not throw an error.
+ @unroll {{ filter_declaration | replace("param", "{\-
name: 'dropShadow', \-
<dx | dy | floodOpacity>: \-
- <10 | -1 | 0.5 | null | true | false | [] | [20] | '30'>});
- @unroll @assert new CanvasFilter({\-
+ <10 | -1 | 0.5 | null | true | false | [] | [20] | '30'>}") }};
+ @unroll {{ filter_declaration | replace("param", "{\-
+ name: 'dropShadow', \-
+ <dx | dy | floodOpacity>: \-
+ <10 | -1 | 0.5 | null | true | false | [] | [20] | '30'>}") }};
+ @unroll {{ filter_declaration | replace("param", "{\-
name: 'dropShadow', \-
<stdDeviation>: \-
<10 | -1 | 0.5 | null | true | false | [] | [20] | '30' | \-
[10, -1] | [0.5, null] | [true, false] | [[], [20]] | \-
- ['30', ['40']]>});
- @unroll @assert new CanvasFilter({\-
+ ['30', ['40']]>}") }};
+ @unroll {{ filter_declaration | replace("param", "{\-
name: 'dropShadow', \-
<floodColor>: \-
- <'red' | 'canvas' | 'rgba(4, -3, 0.5, 1)' | '#aabbccdd' | '#abcd'>});
+ <'red' | 'canvas' | 'rgba(4, -3, 0.5, 1)' | '#aabbccdd' |
+ '#abcd'>}") }};
- @unroll @assert throws TypeError new CanvasFilter({\-
- name: 'dropShadow', \-
+ // Should throw a TypeError.
+ @unroll @assert throws TypeError {{ filter_declaration | replace("param", \-
+ "{name: 'dropShadow', \-
<dx | dy | floodOpacity>: \-
- <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2]>});
- @unroll @assert throws TypeError new CanvasFilter({\-
- name: 'dropShadow', \-
+ <NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2]>}") }};
+ @unroll @assert throws TypeError {{ filter_declaration | replace("param", \-
+ "{name: 'dropShadow', \-
<stdDeviation>: \-
<NaN | Infinity | -Infinity | undefined | 'test' | {} | [1, 2, 3] | \-
[1, NaN] | [1, Infinity] | [1, -Infinity] | [1, undefined] | \-
- [1, 'test'] | [1, {}] | [1, [2, 3]]>});
- @unroll @assert throws TypeError new CanvasFilter({\-
- name: 'dropShadow', \-
+ [1, 'test'] | [1, {}] | [1, [2, 3]]>}") }};
+ @unroll @assert throws TypeError {{ filter_declaration | replace("param", \-
+ "{name: 'dropShadow', \-
<floodColor>: \-
- <'test' | 'rgba(NaN, 3, 2, 1)' | 10 | undefined | null | NaN>});
-
-- name: 2d.filter.canvasFilterObject.turbulence.inputTypes.tentative
+ <'test' | 'rgba(NaN, 3, 2, 1)' | 10 | undefined | null | NaN>}") }};
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter:
+ param}); ctx.endLayer()
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(
+ param)
+ tentative: .tentative
+
+- name: 2d.filter.{{ variant_names[0] }}.turbulence.inputTypes{{ tentative }}
desc: Test exceptions on CanvasFilter() turbulence object
code: |
const errorTestCases = [
@@ -683,10 +979,22 @@
for (testCase of errorTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- @assert throws TypeError new CanvasFilter(filterOptions);
+ @assert throws TypeError {{ filter_declaration |
+ replace("param", "filterOptions") }};
}
for (testCase of workingTestCases) {
const filterOptions = {...{name: 'turbulence'}, ...testCase};
- @assert new CanvasFilter(filterOptions) != null;
+ {{ filter_declaration | replace("param", "filterOptions") }};
+ {{- close_layer }}
}
+ append_variants_to_name: false
+ variants:
+ layers:
+ filter_declaration: |-
+ ctx.beginLayer({filter: param})
+ close_layer: "\n ctx.endLayer();"
+ canvasFilterObject:
+ filter_declaration: |-
+ ctx.filter = new CanvasFilter(param)
+ tentative: .tentative
diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml
index 938cc74d214..437a70c3f7a 100644
--- a/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml
+++ b/tests/wpt/tests/html/canvas/tools/yaml-new/layers.yaml
@@ -174,7 +174,7 @@
fuzzy: maxDifference=0-2; totalPixels=0-6766
alpha.blending:
<<: *global-state-alpha-blending
- fuzzy: maxDifference=0-1; totalPixels=0-2440
+ fuzzy: maxDifference=0-1; totalPixels=0-2453
alpha.composite:
<<: *global-state-alpha-composite
fuzzy: maxDifference=0-1; totalPixels=0-5204
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
new file mode 100644
index 00000000000..fcf38d1f3d0
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/tools/yaml-new/webgpu-access.yaml
@@ -0,0 +1,10 @@
+- 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/dom/render-blocking/element-render-blocking-001.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.html
index 36567f9d54a..36567f9d54a 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-001.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.html
index 3c907597f7a..3c907597f7a 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-002.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.html
index 2858798a35f..2858798a35f 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-003.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.html
index f45f5587204..f45f5587204 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-004.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.html
index 098a3c57676..098a3c57676 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-005.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.html
index 223e42109e5..223e42109e5 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-006.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.html
index 9aa0aeea798..9aa0aeea798 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-007.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.html
index e671dda19c4..e671dda19c4 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-008.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.html
index 8498816ea5c..8498816ea5c 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-009.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.html
index ef6f709012e..ef6f709012e 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-010.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.html
index dee82d8c595..dee82d8c595 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-011.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.html
index 4110e54c5f2..4110e54c5f2 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-012.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.html
index ecd97be86a6..ecd97be86a6 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-013.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.html
index ea8948de42d..ea8948de42d 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-014.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.html
index a775ee41740..a775ee41740 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-015.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.html
index 8968c5dacd3..8968c5dacd3 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-016.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.html
index 2d3b5747216..2d3b5747216 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-017.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.html
index 76e6394b5b1..76e6394b5b1 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-018.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.html
index 80a7019edc4..80a7019edc4 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-019.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.html
index 10019c943f4..10019c943f4 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-020.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.html
index 1ca2114689a..1ca2114689a 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-021.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.html
index 5dfbcac30a4..5dfbcac30a4 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-022.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.html
index 8fe8b6a8c8e..8fe8b6a8c8e 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-023.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.html
index 19e4020fb76..19e4020fb76 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-024.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.html
index 689ae69f452..689ae69f452 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-025.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.html
index 6abfc43b8b2..6abfc43b8b2 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-026.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.html
index 56f88e0fc2b..56f88e0fc2b 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-027.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.html
index a64d542c4ac..a64d542c4ac 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-028.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-029.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-029.html
index 44dff3cb842..44dff3cb842 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-029.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-029.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-030.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-030.html
index 307c2d303d0..307c2d303d0 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-030.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-030.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-031.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-031.html
index 2098483a060..2098483a060 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-031.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-031.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-032.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-032.html
index 307c2d303d0..307c2d303d0 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-032.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-032.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-033.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-033.html
index 59d41c08c0a..59d41c08c0a 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-033.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-033.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-034.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-034.html
index 92d4a06b1a9..a505de48756 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-034.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-034.html
@@ -5,7 +5,7 @@
<script src="support/utils.js"></script>
<title>link rel=expect should allow relative URLs</title>
-<link rel=expect href="../render-blocking/element-render-blocking-034.tentative.html#second" blocking="render">
+<link rel=expect href="../render-blocking/element-render-blocking-034.html#second" blocking="render">
<script>
async_test((t) => {
requestAnimationFrame(() => {
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-035.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-035.html
index fd3b6b1759f..050244c7a69 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-035.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-035.html
@@ -6,7 +6,7 @@
<title>link rel=expect: base URL should be OK with relative URLs</title>
<base href="dummy.html">
-<link rel=expect href="../render-blocking/element-render-blocking-035.tentative.html#second" blocking="render">
+<link rel=expect href="../render-blocking/element-render-blocking-035.html#second" blocking="render">
<script>
async_test((t) => {
requestAnimationFrame(() => {
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-036.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-036.html
index 83637b3a08b..83637b3a08b 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-036.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-036.html
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-037.tentative.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-037.html
index 885d64604fe..5fe469a2fdd 100644
--- a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-037.tentative.html
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-037.html
@@ -3,10 +3,10 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/utils.js"></script>
-<title>link rel=expect: base URL should be ignored when after link</title>
+<title>link rel=expect: base URL should be OK with relative URLs</title>
-<link rel=expect href="#second" blocking="render">
<base href="dummy.html">
+<link rel=expect href="../render-blocking/element-render-blocking-037.html#second" blocking="render">
<script>
async_test((t) => {
requestAnimationFrame(() => {
diff --git a/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-038.html b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-038.html
new file mode 100644
index 00000000000..c7fabe7f320
--- /dev/null
+++ b/tests/wpt/tests/html/dom/render-blocking/element-render-blocking-038.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/utils.js"></script>
+<title>link rel=expect: only connected elements are eligible</title>
+
+<link rel=expect href="#second" blocking="render">
+<script>
+async_test((t) => {
+ requestAnimationFrame(() => {
+ t.step(() => assert_true(!!document.getElementById("second"), "The second element should be there"));
+ t.step(() => assert_false(!!document.getElementById("last"), "The last element should not be there yet, even though it's created (in a shadow root)"));
+ t.done();
+ });
+}, "");
+</script>
+</head>
+<body>
+ <div id="first"></div>
+ <script>
+ generateParserDelay();
+ </script>
+ <div id="second">
+ <custom-element>
+ <template shadowrootmode="open">
+ <div id="last"></div>
+ </template>
+ </custom-element>
+ </div>
+ <script>
+ generateParserDelay();
+ </script>
+ <div id="last"></div>
+</body>
diff --git a/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea.html b/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea.html
index f8d90dc659b..114d60c72d0 100644
--- a/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea.html
+++ b/tests/wpt/tests/html/rendering/widgets/field-sizing-textarea.html
@@ -3,6 +3,10 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
+textarea {
+ font-family: monospace;
+}
+
.disable-default {
field-sizing: content;
}
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/302-no-Location-header-text-css.asis b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/302-no-Location-header-text-css.asis
new file mode 100644
index 00000000000..ddf4898d3f0
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/302-no-Location-header-text-css.asis
@@ -0,0 +1,4 @@
+HTTP/1.1 302 Found
+Content-Type: text/css
+
+body { background-color: red; }
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css.headers b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css.headers
new file mode 100644
index 00000000000..156209f9c81
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type-empty.css.headers
@@ -0,0 +1 @@
+Content-Type: text/html
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css
new file mode 100644
index 00000000000..e1b2552ffea
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css
@@ -0,0 +1,3 @@
+body {
+ background-color: green;
+}
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css.headers b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css.headers
new file mode 100644
index 00000000000..156209f9c81
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/resources/stylesheet-bad-mime-type.css.headers
@@ -0,0 +1 @@
+Content-Type: text/html
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html
new file mode 100644
index 00000000000..08176d6cd25
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-bad-mime-type.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>stylesheets served with bad MIME types</title>
+<link rel="author" title="Michael[tm] Smith" href="mailto:mike@w3.org">
+<link rel="help" href="https://html.spec.whatwg.org/#link-type-stylesheet:process-the-linked-resource">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ async_test((t) => {
+ const link = document.createElement("link");
+ link.rel = "stylesheet";
+ link.href = "resources/stylesheet-bad-mime-type.css";
+ link.onload = t.unreached_func();
+ link.onerror = t.step_func_done();
+ document.head.append(link);
+ }, "'load' event does not fire at link@rel=stylesheet having non-empty resource with bad MIME type");
+ async_test((t) => {
+ t.step_timeout(() => {
+ const link = document.createElement("link");
+ link.rel = "stylesheet";
+ link.href = "resources/stylesheet-bad-mime-type-empty.css";
+ link.onload = t.unreached_func();
+ link.onerror = t.step_func_done();
+ document.head.append(link);
+ }, 2000);
+ }, "'load' event does not fire at link@rel=stylesheet having empty resource with bad MIME type");
+</script>
diff --git a/tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-non-OK-status.html b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-non-OK-status.html
new file mode 100644
index 00000000000..28ac55ff1a4
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/document-metadata/the-link-element/stylesheet-non-OK-status.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>stylesheet served with non-OK status</title>
+<link rel="author" title="Michael[tm] Smith" href="mailto:mike@w3.org">
+<link rel="help" href="https://html.spec.whatwg.org/#fetching-and-processing-a-resource-from-a-link-element:processresponseconsumebody">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ async_test((t) => {
+ const link = document.createElement("link");
+ link.rel = "stylesheet";
+ link.href = "resources/302-no-Location-header-text-css.asis";
+ link.onload = t.unreached_func();
+ link.onerror = t.step_func_done();
+ document.head.append(link);
+ }, "'load' event does not fire at link@rel=stylesheet having resource with non-OK response status");
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html
index 6b3b3104ef3..6b3b3104ef3 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.https.html
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html
index 158fc4f947b..158fc4f947b 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.html
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_window_open_download_allow_downloads.tentative.https.html
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.js
index 413f392dfc6..e38334f4148 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.js
@@ -34,6 +34,17 @@ async function createNestedIframe(parent, origin, frame_sandbox, header_sandbox)
}, iframe_attributes);
}
+async function navigateFrameTo(frame, origin) {
+ return frame.navigateToNew({
+ origin: origin,
+ scripts: [
+ '/resources/testdriver.js',
+ '/resources/testdriver-driver.js',
+ '/resources/testdriver-vendor.js'
+ ],
+ });
+}
+
async function attemptTopNavigation(iframe, should_succeed) {
let did_succeed;
try {
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
new file mode 100644
index 00000000000..fa71972222b
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-cross-origin.tentative.sub.window.js
@@ -0,0 +1,28 @@
+// META: title=Top-level navigation tests with cross origin & user activated child frames
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// 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
+
+'use strict';
+
+// /* ---------------------- CROSS ORIGIN (A -> B) TESTS ---------------------- */
+
+promise_test(async t => {
+ const main = await setupTest();
+ const iframe_1 = await createNestedIframe(main,
+ "HTTP_REMOTE_ORIGIN", "allow-top-navigation", "");
+
+ await attemptTopNavigation(iframe_1, true);
+}, "A cross-origin frame with frame sandbox flags can navigate top");
+
+promise_test(async t => {
+ const main = await setupTest();
+ const iframe_1 = await createNestedIframe(main,
+ "HTTP_REMOTE_ORIGIN", "", "allow-top-navigation");
+
+ await attemptTopNavigation(iframe_1, false);
+}, "A cross-origin frame with delivered sandbox flags can not navigate top");
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
new file mode 100644
index 00000000000..fcd53e0780e
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-cross-site.tentative.sub.window.js
@@ -0,0 +1,43 @@
+// META: title=Top-level navigation tests with cross origin & user activated child frames
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testdriver.js
+// 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
+
+'use strict';
+
+promise_test(async t => {
+ const main = await setupTest();
+
+ const iframe = await createNestedIframe(main, "HTTP_ORIGIN", "", "");
+ await activate(iframe);
+
+ const new_iframe = await navigateFrameTo(iframe, "HTTPS_REMOTE_ORIGIN");
+ await attemptTopNavigation(new_iframe, false);
+}, "A cross-site unsandboxed iframe navigation consumes user activation and " +
+ "disallows top-level navigation.");
+
+promise_test(async t => {
+ const main = await setupTest();
+
+ const iframe = await createNestedIframe(main, "HTTP_ORIGIN", "", "");
+ await activate(iframe);
+
+ const new_iframe = await navigateFrameTo(iframe, "HTTP_REMOTE_ORIGIN");
+ await attemptTopNavigation(new_iframe, true);
+}, "A same-site unsandboxed iframe navigation does not consume user " +
+ "activation and allows top-level navigation.");
+
+promise_test(async t => {
+ const main = await setupTest();
+
+ const iframe = await createNestedIframe(main, "HTTP_ORIGIN", "", "");
+
+ const new_iframe = await navigateFrameTo(iframe, "HTTP_REMOTE_ORIGIN");
+ await attemptTopNavigation(new_iframe, false);
+}, "A same-site unsandboxed iframe navigation without sticky user activation " +
+ "does not allow top-level navigation.");
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.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 8681411dd71..9e0ea57a99e 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-child-special-cases.tentative.sub.window.js
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-user-activation.tentative.sub.window.js
@@ -3,6 +3,7 @@
// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=/resources/testdriver.js
+// 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
@@ -27,21 +28,3 @@ promise_test(async t => {
await attemptTopNavigation(iframe_1, false);
}, "allow-top-navigation-by-user-activation set but no sticky activation");
-
-/* ---------------------- CROSS ORIGIN (A -> B) TESTS ---------------------- */
-
-promise_test(async t => {
- const main = await setupTest();
- const iframe_1 = await createNestedIframe(main,
- "HTTP_REMOTE_ORIGIN", "allow-top-navigation", "");
-
- await attemptTopNavigation(iframe_1, true);
-}, "A cross-origin frame with frame sandbox flags can navigate top");
-
-promise_test(async t => {
- const main = await setupTest();
- const iframe_1 = await createNestedIframe(main,
- "HTTP_REMOTE_ORIGIN", "", "allow-top-navigation");
-
- await attemptTopNavigation(iframe_1, false);
-}, "A cross-origin frame with delivered sandbox flags can not navigate top");
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html
new file mode 100644
index 00000000000..f71c1e52fc6
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist-invalidation.tentative.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/issues/9799">
+<link rel=match href="select-child-button-and-datalist-ref.html">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<select>
+ <button type=popover>button</button>
+ <datalist>
+ <option>one</option>
+ <option>two</option>
+ </datalist>
+</select>
+
+<script>
+requestAnimationFrame(() => {
+ document.querySelector('select').style = 'appearance:bikeshed';
+ document.querySelector('button').click();
+ document.documentElement.classList.remove('reftest-wait');
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist.tentative.html
index b74957feed8..54785ace951 100644
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist.tentative.html
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/select-child-button-and-datalist.tentative.html
@@ -5,7 +5,7 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
-<select>
+<select style="appearance:bikeshed">
<button type=popover>button</button>
<datalist>
<option>one</option>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html
new file mode 100644
index 00000000000..993f6e126ce
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/select-datalist-options-idl.tentative.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/issues/9799">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<select>
+ <datalist>
+ <option class=one>one</option>
+ <div>
+ <option class=two>two</option>
+ </div>
+ <option class=three>three</option>
+ </datalist>
+</select>
+
+<script>
+const select = document.querySelector('select');
+
+function runTest() {
+ const datalist = select.querySelector('datalist');
+ const firstOption = select.querySelector('option.one');
+ const secondOption = select.querySelector('option.two');
+ const thirdOption = select.querySelector('option.three');
+ const datalistChildDiv = datalist.querySelector('div');
+
+ let selectChildDiv = document.querySelector('select > div');
+ if (!selectChildDiv) {
+ selectChildDiv = document.createElement('div');
+ select.appendChild(selectChildDiv);
+ }
+
+ assert_equals(select.length, 3, 'select.length');
+ assert_equals(select.options.length, 3, 'select.options.length');
+ assert_equals(select.options[0], firstOption, 'select.options[0]');
+ assert_equals(select.options[1], secondOption, 'select.options[1]');
+ assert_equals(select.options[2], thirdOption, 'select.options[2]');
+
+ assert_equals(select.value, 'one', 'initial select.value');
+ select.value = 'two';
+ assert_equals(select.value, 'two', 'select.value after modifying');
+
+ secondOption.remove();
+ assert_equals(select.length, 2, 'select.length after removing an option');
+ assert_equals(select.options.length, 2, 'select.options.length after removing an option');
+ assert_equals(select.options[0], firstOption, 'select.options[0] after removing an option');
+ assert_equals(select.options[1], thirdOption, 'select.options[1] after removing an option');
+
+ datalist.appendChild(secondOption);
+ assert_equals(select.length, 3, 'select.length after re-adding an option');
+ assert_equals(select.options.length, 3, 'select.options.length after re-adding an option');
+ assert_equals(select.options[0], firstOption, 'select.options[0] after re-adding an option');
+ assert_equals(select.options[1], thirdOption, 'select.options[1] after re-adding an option');
+ assert_equals(select.options[2], secondOption, 'select.options[2] after re-adding an option');
+
+ selectChildDiv.appendChild(secondOption);
+ assert_equals(select.length, 2, 'select.length after moving option to child div');
+ assert_equals(select.options.length, 2, 'select.options.length after moving option to child div');
+ assert_equals(select.options[0], firstOption, 'select.options[0] after moving option to child div');
+ assert_equals(select.options[1], thirdOption, 'select.options[1] after moving option to child div');
+
+ // reset back to normal for the next test
+ datalistChildDiv.appendChild(secondOption);
+ select.value = 'one';
+}
+
+test(() => {
+ runTest();
+}, 'Option elements should work if they are a descendant of a selects datalist.');
+
+test(() => {
+ select.setAttribute('multiple', '');
+ runTest();
+}, 'Options in datalist should still work when the multiple attribute is added.');
+
+test(() => {
+ select.innerHTML = select.innerHTML;
+ select.value = 'one';
+ runTest();
+}, 'Options in datalist in multiple should work after re-parsing and re-attaching.');
+</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-canceling.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-canceling.html
index e368bde6fb3..db757861e79 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-canceling.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-canceling.html
@@ -66,6 +66,7 @@ promise_test(async () => {
event.preventDefault();
});
+ await test_driver.bless();
bottomDialog.showModal();
await blessTopLayer(bottomDialog);
topDialog.showModal();
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-summary-element/interactive-content.html b/tests/wpt/tests/html/semantics/interactive-elements/the-summary-element/interactive-content.html
new file mode 100644
index 00000000000..94869dc9b69
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-summary-element/interactive-content.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>summary element: interactive content</title>
+<link rel="author" title="Michael[tm] Smith" href="mailto:mike@w3.org">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interactive-elements.html#the-summary-element">
+<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>
+
+<details>
+ <summary id=summary>
+ <a id=a href="#">anchor element</a>
+ <svg style="width: 160px; height: 100px" viewBox="0 0 100 100">
+ <a href="#" id="svg_a"><text id="svg_text" x="50" y="90" text-anchor="middle">SVG anchor element</text></a>
+ </svg>
+ <svg style="width: 100px; height: 200px" viewBox="0 0 100 100">
+ <foreignObject x="0" y="60" width="100" height="200" text-anchor="middle">
+ <a xmlns="http://www.w3.org/1999/xhtml" href="#" id="svg_foreignObject_a">SVG foreignObject with HTML anchor element</a>
+ </foreignObject>
+ </svg>
+ <audio id="audio" controls src=/media/sound_5.mp3></audio>
+ <button id=button>button element</button>
+ <embed id=embed src="/images/blue.png" height="100" width="100">
+ <iframe id=iframe srcdoc="iframe element"></iframe>
+ <img id=img_usemap usemap src=/media/poster.png></img>
+ <img id=img src=/media/poster.png></img>
+ <input type="text" value="input@type=text" id="input_text">
+ <input type="search" value="input@type=search" id="input_search">
+ <input type="tel" value="input@type=tel" id="input_tel">
+ <input type="url" value="input@type=url" id="input_url">
+ <input type="email" value="input@type=email" id="input_email">
+ <input type="password" value="input@type=password" id="input_password">
+ <input type="button" value="input@type=button" id="input_button">
+ <input type="reset" id="input_reset">
+ <input type="submit" id="input_submit">
+ <input type="date" value="input@type=date" id="input_date">
+ <input type="month" value="input@type=month" id="input_month">
+ <input type="week" value="input@type=week" id="input_week">
+ <input type="time" id="input_time">
+ <input type="datetime-local" id="input_datetime-local">
+ <input type="color" id="input_color">
+ <input type="number" value="1337" id="input_number">
+ <input type="range" id="input_range">
+ <input type="checkbox" id="input_checkbox">
+ <input type="radio" id="input_radio" disabled>
+ <input type="file" id="input_file">
+ <input type="image" id="input_image" src=/media/poster.png>
+ <label id=label style="display: block">label element</label>
+ <textarea value="textarea" id="textarea">textarea element</textarea>
+ <video id="video" controls>
+ <source src="/media/test-1s.mp4" type="video/mp4">
+ <source src="/media/test-1s.webm" type="video/webm">
+ </video>
+ <div id="non-interactive">This is clickable summary text</div>
+ </summary>
+</details>
+
+<script>
+const details = document.querySelector("details");
+
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("non-interactive"));
+ assert_true(details.open)
+}, "Clicking on non-interactive child of a <summary> opens its <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("a"));
+ assert_false(details.open)
+}, "Clicking an <a> link doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("svg_a"));
+ assert_false(details.open)
+}, "Clicking an SVG <a> link doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("svg_foreignObject_a"));
+ assert_false(details.open)
+}, "Clicking an HTML <a> link in an SVG <foreignObject> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("audio"));
+ assert_false(details.open)
+}, "Clicking an <audio> element doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("button"));
+ assert_false(details.open)
+}, "Clicking a <button> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("embed"));
+ assert_false(details.open)
+}, "Clicking the content of an <embed> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("iframe"));
+ assert_false(details.open)
+}, "Clicking in an <iframe> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("img_usemap"));
+ assert_false(details.open)
+}, "Clicking an <img> with a 'usemap' attribute doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("img"));
+ assert_true(details.open)
+}, "Clicking an <img> without a 'usemap' attribute opens <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_button"));
+ assert_false(details.open)
+}, "Clicking an <input type=button> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_reset"));
+ assert_false(details.open)
+}, "Clicking an <input type=reset> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_submit"));
+ assert_false(details.open)
+}, "Clicking an <input type=submit> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_text"));
+ assert_false(details.open)
+}, "Clicking an <input type=text> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_search"));
+ assert_false(details.open)
+}, "Clicking an <input type=search> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_tel"));
+ assert_false(details.open)
+}, "Clicking an <input type=tel> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_url"));
+ assert_false(details.open)
+}, "Clicking an <input type=url> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_email"));
+ assert_false(details.open)
+}, "Clicking an <input type=email> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_password"));
+ assert_false(details.open)
+}, "Clicking an <input type=password> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_date"));
+ assert_false(details.open)
+}, "Clicking an <input type=date> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_month"));
+ assert_false(details.open)
+}, "Clicking an <input type=month> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_week"));
+ assert_false(details.open)
+}, "Clicking an <input type=week> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_time"));
+ assert_false(details.open)
+}, "Clicking an <input type=time> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_datetime-local"));
+ assert_false(details.open)
+}, "Clicking an <input type=datetime-local> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_number"));
+ assert_false(details.open)
+}, "Clicking an <input type=number> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_range"));
+ assert_false(details.open)
+}, "Clicking an <input type=range> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_color"));
+ assert_false(details.open)
+}, "Clicking an <input type=color> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_checkbox"));
+ assert_false(details.open)
+}, "Clicking an <input type=checkbox> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_radio"));
+ assert_false(details.open)
+}, "Clicking an <input type=radio> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_file"));
+ assert_false(details.open)
+}, "Clicking an <input type=file> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("input_image"));
+ assert_false(details.open)
+}, "Clicking an <input type=image> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("label"));
+ assert_false(details.open)
+}, "Clicking a <label> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("textarea"));
+ assert_false(details.open)
+}, "Clicking in a <textarea> doesn't open <details>");
+promise_test(async () => {
+ details.open = false;
+ await test_driver.click(document.getElementById("video"));
+ assert_false(details.open)
+}, "Clicking a <video> doesn't open <details>");
+</script>
diff --git a/tests/wpt/tests/html/semantics/invokers/interestelement-interface.tentative.html b/tests/wpt/tests/html/semantics/invokers/interestelement-interface.tentative.html
index 531bf0e1a62..dc119de8338 100644
--- a/tests/wpt/tests/html/semantics/invokers/interestelement-interface.tentative.html
+++ b/tests/wpt/tests/html/semantics/invokers/interestelement-interface.tentative.html
@@ -83,4 +83,82 @@
"interestTargetElement attribute value must be an instance of Element",
);
}, "interestTargetElement throws error on assignment of non Element");
+
+ test(function () {
+ assert_false(buttonInvoker.hasAttribute("interestaction"));
+ assert_equals(buttonInvoker.interestAction, "");
+ assert_false(aInvoker.hasAttribute("interestaction"));
+ assert_equals(aInvoker.interestAction, "");
+ assert_false(inputInvoker.hasAttribute("interestaction"));
+ assert_equals(inputInvoker.interestAction, "");
+ }, "interestAction reflects '' when attribute not present");
+
+ test(function () {
+ buttonInvoker.setAttribute("interestaction", "");
+ assert_equals(buttonInvoker.getAttribute("interestaction"), "");
+ assert_equals(buttonInvoker.interestAction, "");
+ aInvoker.setAttribute("interestaction", "");
+ assert_equals(aInvoker.getAttribute("interestaction"), "");
+ assert_equals(aInvoker.interestAction, "");
+ inputInvoker.setAttribute("interestaction", "");
+ assert_equals(inputInvoker.getAttribute("interestaction"), "");
+ assert_equals(inputInvoker.interestAction, "");
+ }, "interestAction reflects '' when attribute empty, setAttribute version");
+
+ test(function () {
+ buttonInvoker.interestAction = "";
+ assert_equals(buttonInvoker.getAttribute("interestaction"), "");
+ assert_equals(buttonInvoker.interestAction, "");
+ aInvoker.interestAction = "";
+ assert_equals(aInvoker.getAttribute("interestaction"), "");
+ assert_equals(aInvoker.interestAction, "");
+ inputInvoker.interestAction = "";
+ assert_equals(inputInvoker.getAttribute("interestaction"), "");
+ assert_equals(inputInvoker.interestAction, "");
+ }, "interestAction reflects '' when attribute empty, IDL setter version");
+
+ test(function () {
+ buttonInvoker.interestAction = "fooBarBaz";
+ assert_equals(buttonInvoker.getAttribute("interestaction"), "fooBarBaz");
+ assert_equals(buttonInvoker.interestAction, "fooBarBaz");
+ aInvoker.interestAction = "fooBarBaz";
+ assert_equals(aInvoker.getAttribute("interestaction"), "fooBarBaz");
+ assert_equals(aInvoker.interestAction, "fooBarBaz");
+ inputInvoker.interestAction = "fooBarBaz";
+ assert_equals(inputInvoker.getAttribute("interestaction"), "fooBarBaz");
+ assert_equals(inputInvoker.interestAction, "fooBarBaz");
+ }, "interestAction reflects same casing");
+
+ test(function () {
+ buttonInvoker.interestAction = [];
+ assert_equals(buttonInvoker.getAttribute("interestaction"), "");
+ assert_equals(buttonInvoker.interestAction, "");
+ aInvoker.interestAction = [];
+ assert_equals(aInvoker.getAttribute("interestaction"), "");
+ assert_equals(aInvoker.interestAction, "");
+ inputInvoker.interestAction = [];
+ assert_equals(inputInvoker.getAttribute("interestaction"), "");
+ assert_equals(inputInvoker.interestAction, "");
+ }, "interestAction reflects '' when attribute set to []");
+
+ test(function () {
+ buttonInvoker.interestAction = [1, 2, 3];
+ assert_equals(buttonInvoker.getAttribute("interestaction"), "1,2,3");
+ assert_equals(buttonInvoker.interestAction, "1,2,3");
+ aInvoker.interestAction = [1, 2, 3];
+ assert_equals(aInvoker.getAttribute("interestaction"), "1,2,3");
+ assert_equals(aInvoker.interestAction, "1,2,3");
+ inputInvoker.interestAction = [1, 2, 3];
+ assert_equals(inputInvoker.getAttribute("interestaction"), "1,2,3");
+ assert_equals(inputInvoker.interestAction, "1,2,3");
+ }, "interestAction reflects tostring value");
+
+ test(function () {
+ buttonInvoker.interestAction = {};
+ assert_equals(buttonInvoker.interestAction, "[object Object]");
+ aInvoker.interestAction = {};
+ assert_equals(aInvoker.interestAction, "[object Object]");
+ inputInvoker.interestAction = {};
+ assert_equals(inputInvoker.interestAction, "[object Object]");
+ }, "interestAction reflects tostring value 2");
</script>
diff --git a/tests/wpt/tests/html/semantics/invokers/invokeelement-interface.tentative.html b/tests/wpt/tests/html/semantics/invokers/invokeelement-interface.tentative.html
index b003daf20d4..5a2854fe318 100644
--- a/tests/wpt/tests/html/semantics/invokers/invokeelement-interface.tentative.html
+++ b/tests/wpt/tests/html/semantics/invokers/invokeelement-interface.tentative.html
@@ -53,14 +53,14 @@
test(function () {
assert_false(invoker.hasAttribute("invokeaction"));
- assert_equals(invoker.invokeAction, "auto");
- }, "invokeAction reflects 'auto' when attribute not present");
+ assert_equals(invoker.invokeAction, "");
+ }, "invokeAction reflects '' when attribute not present");
test(function () {
invoker.setAttribute("invokeaction", "");
assert_equals(invoker.getAttribute("invokeaction"), "");
- assert_equals(invoker.invokeAction, "auto");
- }, "invokeAction reflects 'auto' when attribute empty");
+ assert_equals(invoker.invokeAction, "");
+ }, "invokeAction reflects '' when attribute empty, setAttribute version");
test(function () {
invoker.invokeAction = "fooBarBaz";
@@ -71,8 +71,8 @@
test(function () {
invoker.invokeAction = "";
assert_equals(invoker.getAttribute("invokeaction"), "");
- assert_equals(invoker.invokeAction, "auto");
- }, "invokeAction reflects 'auto' when attribute empty 2");
+ assert_equals(invoker.invokeAction, "");
+ }, "invokeAction reflects '' when attribute empty, IDL version");
test(function () {
invoker.invokeAction = [1, 2, 3];
@@ -83,8 +83,8 @@
test(function () {
invoker.invokeAction = [];
assert_equals(invoker.getAttribute("invokeaction"), "");
- assert_equals(invoker.invokeAction, "auto");
- }, "invokeAction reflects 'auto' when attribute set to []");
+ assert_equals(invoker.invokeAction, "");
+ }, "invokeAction reflects '' when attribute set to []");
test(function () {
invoker.invokeAction = {};
diff --git a/tests/wpt/tests/html/semantics/invokers/invokeevent-interface.tentative.html b/tests/wpt/tests/html/semantics/invokers/invokeevent-interface.tentative.html
index 82910b3d441..382f8080716 100644
--- a/tests/wpt/tests/html/semantics/invokers/invokeevent-interface.tentative.html
+++ b/tests/wpt/tests/html/semantics/invokers/invokeevent-interface.tentative.html
@@ -15,9 +15,9 @@
<script>
test(function () {
const event = new InvokeEvent("test");
- assert_equals(event.action, "auto");
+ assert_equals(event.action, "");
assert_readonly(event, "action", "readonly attribute value");
- }, "action is a readonly defaulting to 'auto'");
+ }, "action is a readonly defaulting to ''");
test(function () {
const event = new InvokeEvent("test");
@@ -32,7 +32,7 @@
test(function () {
const event = new InvokeEvent("test", { action: undefined });
- assert_equals(event.action, "auto");
+ assert_equals(event.action, "");
}, "action set to undefined");
test(function () {
diff --git a/tests/wpt/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html b/tests/wpt/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
index 5150499bcf0..d8d9c04022c 100644
--- a/tests/wpt/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
+++ b/tests/wpt/tests/html/semantics/invokers/invoketarget-button-event-dispatch.tentative.html
@@ -22,7 +22,7 @@
assert_equals(event.bubbles, false, "bubbles");
assert_equals(event.composed, true, "composed");
assert_equals(event.isTrusted, true, "isTrusted");
- assert_equals(event.action, "auto", "action");
+ assert_equals(event.action, "", "action");
assert_equals(event.target, invokee, "target");
assert_equals(event.invoker, invokerbutton, "invoker");
}, "event dispatches on click");
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html
index 50933da2c1d..3645279d61c 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Parse errors in different files should be reported " +
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
index 51adb09d11a..d40aaba8dfd 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Instantiation errors in different files should be reported " +
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
index bc52119bfe4..2d74af864ba 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Evaluation errors are cached in intermediate module scripts");
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-1.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-1.html
index 2480a60d6d4..0484b614ab0 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-1.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-1.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"network error has higher priority than parse error");
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-2.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-2.html
index 673bf28ca20..7303a838a5e 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-2.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-2.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"parse error has higher priority than instantiation error");
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-3.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-3.html
index 8a16266f4cd..f80f74cbe45 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-3.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/error-type-3.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"instantiation error has higher priority than evaluation error");
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html
index 3f2bb35f4e2..b12d178fb59 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Test that exceptions during evaluation lead to error events on " +
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html
index 4f2b3c5a745..a890ca64578 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Test that ill-founded cyclic dependencies cause ReferenceError " +
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html
index 9bfb5df2cf0..4062bc8a3a3 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Test that exceptions during evaluation lead to error events on " +
diff --git a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html
index 0b4b7d16622..256aea508e5 100644
--- a/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html
+++ b/tests/wpt/tests/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html
@@ -9,7 +9,7 @@
window.log = [];
window.addEventListener("error", ev => log.push(ev.error));
- window.addEventListener("onunhandledrejection", unreachable);
+ window.addEventListener("unhandledrejection", unreachable);
const test_load = async_test(
"Test that exceptions during evaluation lead to error events on " +
diff --git a/tests/wpt/tests/inert/inert-with-fullscreen-element.html b/tests/wpt/tests/inert/inert-with-fullscreen-element.html
new file mode 100644
index 00000000000..e5ea4138a3a
--- /dev/null
+++ b/tests/wpt/tests/inert/inert-with-fullscreen-element.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Interaction of 'inert' attribute with fullscreen element</title>
+<link rel="author" title="Peng Zhou" href="mailto:zhoupeng.1996@bytedance.com">
+<meta name="assert" content="Checks that fullscreen element inertness from ancestors.">
+<div id="wrapper">
+ wrapper
+ <span>
+ wrapper-child element
+ </span>
+ <div id="fullscreen">
+ fullscreen
+ <span id="child">
+ child
+ </span>
+ </div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script>
+async function cleanup() {
+ if (document.fullscreenElement) {
+ await document.exitFullscreen();
+ }
+ getSelection().removeAllRanges();
+}
+
+async function setupTest(element, context) {
+ element.inert = true;
+ await test_driver.bless("request full screen");
+ await fullscreen.requestFullscreen();
+ context.add_cleanup(async () => {
+ element.inert = false;
+ await cleanup();
+ });
+}
+
+add_completion_callback(cleanup);
+
+promise_test(async function() {
+ await setupTest(child, this);
+ assert_false(window.find("wrapper"));
+ assert_false(window.find("wrapper-child"));
+ assert_true(window.find("fullscreen"));
+ assert_false(window.find("child"));
+}, "Inner nodes with 'inert' attribute become inert anyways");
+
+promise_test(async function() {
+ await setupTest(fullscreen, this);
+ assert_false(window.find("wrapper"));
+ assert_false(window.find("wrapper-child"));
+ assert_false(window.find("fullscreen"));
+ assert_false(window.find("child"));
+}, "If the fullscreen element has the 'inert' attribute, everything becomes inert");
+
+promise_test(async function() {
+ await setupTest(wrapper, this);
+ assert_false(window.find("wrapper"));
+ assert_false(window.find("wrapper-child"));
+ assert_true(window.find("fullscreen"));
+ assert_true(window.find("child"));
+}, "If an ancestor of the fullscreen element has the 'inert' attribute, the fullscreen element escapes inertness");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/inert/inert-with-modal-dialog-003.html b/tests/wpt/tests/inert/inert-with-modal-dialog-003.html
new file mode 100644
index 00000000000..2984aa43628
--- /dev/null
+++ b/tests/wpt/tests/inert/inert-with-modal-dialog-003.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Interaction of 'inert' attribute with modal dialog</title>
+<link rel="author" title="Peng Zhou" href="mailto:zhoupeng.1996@bytedance.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#inert">
+<meta name="assert" content="Checks that a modal dialog escapes inertness from ancestors.">
+<div id="log"></div>
+<div id="wrapper">
+ find wrapper
+ <dialog id="dialog">
+ find dialog
+ <span id="child">
+ find child
+ </span>
+ </dialog>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+function cleanup() {
+ dialog.close();
+ getSelection().removeAllRanges();
+}
+
+function setupTest(element, context) {
+ element.inert = true;
+ dialog.showModal();
+ context.add_cleanup(() => {
+ element.inert = false;
+ cleanup();
+ });
+}
+
+setup(() => {
+ dialog.showModal();
+ add_completion_callback(cleanup);
+});
+
+test(function() {
+ setupTest(child, this);
+ assert_false(window.find("wrapper"));
+ assert_true(window.find("dialog"));
+ assert_false(window.find("child"));
+}, "Inner nodes with 'inert' attribute become inert anyways");
+
+test(function() {
+ setupTest(dialog, this);
+ assert_false(window.find("wrapper"));
+ assert_false(window.find("dialog"));
+ assert_false(window.find("child"));
+}, "If the modal dialog has the 'inert' attribute, everything becomes inert");
+
+test(function() {
+ setupTest(wrapper, this);
+ assert_false(window.find("wrapper"));
+ assert_true(window.find("dialog"));
+ assert_true(window.find("child"));
+}, "If an ancestor of the dialog has the 'inert' attribute, the dialog escapes inertness");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/infrastructure/expected-fail/user-prompt.html b/tests/wpt/tests/infrastructure/expected-fail/user-prompt.html
new file mode 100644
index 00000000000..adac0bc909b
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/expected-fail/user-prompt.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Unhandled user prompt dismisses and notifies</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="variant" content="?type=alert">
+<meta name="variant" content="?type=confirm">
+<meta name="variant" content="?type=prompt">
+<meta name="variant" content="?type=alert&wait">
+<meta name="variant" content="?type=confirm&wait">
+<meta name="variant" content="?type=prompt&wait">
+<script>
+ let params = new URL(location).searchParams;
+ setup({ single_test: true });
+ // Waiting exercises the case where a user prompt appears while waiting for
+ // the next testdriver event. The WebDriver-specified behavior is to resolve
+ // with `null` [1, 2], which the WebDriver executor should ignore. The
+ // testdriver event loop will handle the open prompt on its next cycle. For
+ // the default "dismiss and notify" handler, this throws an unexpected alert
+ // open error in the executor.
+ //
+ // [1]: Step 5.3 of https://www.w3.org/TR/webdriver/#execute-async-script
+ // [2]: https://www.w3.org/TR/webdriver/#dfn-execute-a-function-body
+ step_timeout(() => {
+ let type = params.get("type");
+ window[type]("this user prompt should be dismissed");
+ done();
+ }, params.has("wait") ? 1000 : 0);
+</script>
diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/expected-fail/user-prompt.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/expected-fail/user-prompt.html.ini
new file mode 100644
index 00000000000..45ebf7acc33
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/expected-fail/user-prompt.html.ini
@@ -0,0 +1,17 @@
+[user-prompt.html?type=alert]
+ expected: ERROR
+
+[user-prompt.html?type=confirm]
+ expected: ERROR
+
+[user-prompt.html?type=prompt]
+ expected: ERROR
+
+[user-prompt.html?type=alert&wait]
+ expected: ERROR
+
+[user-prompt.html?type=confirm&wait]
+ expected: ERROR
+
+[user-prompt.html?type=prompt&wait]
+ expected: ERROR
diff --git a/tests/wpt/tests/interfaces/css-view-transitions-2.idl b/tests/wpt/tests/interfaces/css-view-transitions-2.idl
index 7435605cdaf..89e57e251b1 100644
--- a/tests/wpt/tests/interfaces/css-view-transitions-2.idl
+++ b/tests/wpt/tests/interfaces/css-view-transitions-2.idl
@@ -21,5 +21,5 @@ enum ViewTransitionNavigation { "auto", "none" };
[Exposed=Window]
interface CSSViewTransitionRule : CSSRule {
attribute ViewTransitionNavigation navigation;
- attribute DOMTokenList type;
+ attribute DOMTokenList typeList;
};
diff --git a/tests/wpt/tests/interfaces/html.idl b/tests/wpt/tests/interfaces/html.idl
index 8992ceab1ee..7211231980f 100644
--- a/tests/wpt/tests/interfaces/html.idl
+++ b/tests/wpt/tests/interfaces/html.idl
@@ -2062,6 +2062,18 @@ dictionary HashChangeEventInit : EventInit {
};
[Exposed=Window]
+interface PageSwapEvent : Event {
+ constructor(DOMString type, optional PageSwapEventInit eventInitDict = {});
+ readonly attribute NavigationActivation? activation;
+ readonly attribute ViewTransition? viewTransition;
+};
+
+dictionary PageSwapEventInit : EventInit {
+ NavigationActivation? activation = null;
+ ViewTransition? viewTransition = null;
+};
+
+[Exposed=Window]
interface PageRevealEvent : Event {
constructor(DOMString type, optional PageRevealEventInit eventInitDict = {});
readonly attribute ViewTransition? viewTransition;
@@ -2239,6 +2251,7 @@ interface mixin WindowEventHandlers {
attribute EventHandler onpagehide;
attribute EventHandler onpagereveal;
attribute EventHandler onpageshow;
+ attribute EventHandler onpageswap;
attribute EventHandler onpopstate;
attribute EventHandler onrejectionhandled;
attribute EventHandler onstorage;
diff --git a/tests/wpt/tests/interfaces/invokers.tentative.idl b/tests/wpt/tests/interfaces/invokers.tentative.idl
index 62f7398b827..eb1b8247f06 100644
--- a/tests/wpt/tests/interfaces/invokers.tentative.idl
+++ b/tests/wpt/tests/interfaces/invokers.tentative.idl
@@ -1,6 +1,6 @@
interface mixin InvokerElement {
[CEReactions,Reflect=invoketarget] attribute Element? invokeTargetElement;
- [CEReactions,Reflect,ReflectMissing="auto",ReflectEmpty="auto"] attribute DOMString invokeAction;
+ [CEReactions,Reflect=invokeaction] attribute DOMString invokeAction;
};
interface InvokeEvent : Event {
@@ -11,5 +11,5 @@ interface InvokeEvent : Event {
dictionary InvokeEventInit : EventInit {
Element? invoker = null;
- DOMString action = "auto";
+ DOMString action = "";
};
diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl
index cafba9de5e1..50ee64b185a 100644
--- a/tests/wpt/tests/interfaces/webnn.idl
+++ b/tests/wpt/tests/interfaces/webnn.idl
@@ -31,21 +31,15 @@ interface ML {
Promise<MLContext> createContext(GPUDevice gpuDevice);
};
-[SecureContext, Exposed=(Window, DedicatedWorker)]
-interface MLActivation {
-};
-
typedef record<DOMString, ArrayBufferView> MLNamedArrayBufferViews;
-[SecureContext, Exposed=(Window, DedicatedWorker)]
-interface MLContext {};
-
dictionary MLComputeResult {
MLNamedArrayBufferViews inputs;
MLNamedArrayBufferViews outputs;
};
-partial interface MLContext {
+[SecureContext, Exposed=(Window, DedicatedWorker)]
+interface MLContext {
Promise<MLComputeResult> compute(
MLGraph graph, MLNamedArrayBufferViews inputs, MLNamedArrayBufferViews outputs);
};
@@ -53,6 +47,40 @@ partial interface MLContext {
[SecureContext, Exposed=(Window, DedicatedWorker)]
interface MLGraph {};
+enum MLInputOperandLayout {
+ "nchw",
+ "nhwc"
+};
+
+enum MLOperandDataType {
+ "float32",
+ "float16",
+ "int32",
+ "uint32",
+ "int64",
+ "uint64",
+ "int8",
+ "uint8"
+};
+
+dictionary MLOperandDescriptor {
+ // The operand type.
+ required MLOperandDataType dataType;
+
+ // The dimensions field is empty for scalar operands,
+ // and non-empty for tensor operands.
+ sequence<unsigned long> dimensions = [];
+};
+
+[SecureContext, Exposed=(Window, DedicatedWorker)]
+interface MLOperand {
+ MLOperandDataType dataType();
+ sequence<unsigned long> shape();
+};
+
+[SecureContext, Exposed=(Window, DedicatedWorker)]
+interface MLActivation {};
+
typedef record<DOMString, MLOperand> MLNamedOperands;
[SecureContext, Exposed=(Window, DedicatedWorker)]
@@ -122,17 +150,10 @@ enum MLConv2dFilterOperandLayout {
"ihwo"
};
-enum MLAutoPad {
- "explicit",
- "same-upper",
- "same-lower"
-};
-
dictionary MLConv2dOptions {
sequence<unsigned long> padding;
sequence<unsigned long> strides;
sequence<unsigned long> dilations;
- MLAutoPad autoPad = "explicit";
unsigned long groups = 1;
MLInputOperandLayout inputLayout = "nchw";
MLConv2dFilterOperandLayout filterLayout = "oihw";
@@ -156,7 +177,6 @@ dictionary MLConvTranspose2dOptions {
sequence<unsigned long> dilations;
sequence<unsigned long> outputPadding;
sequence<unsigned long> outputSizes;
- MLAutoPad autoPad = "explicit";
unsigned long groups = 1;
MLInputOperandLayout inputLayout = "nchw";
MLConvTranspose2dFilterOperandLayout filterLayout = "iohw";
@@ -406,7 +426,6 @@ dictionary MLPool2dOptions {
sequence<unsigned long> padding;
sequence<unsigned long> strides;
sequence<unsigned long> dilations;
- MLAutoPad autoPad = "explicit";
MLInputOperandLayout layout = "nchw";
MLRoundingType roundingType = "floor";
sequence<unsigned long> outputSizes;
@@ -528,38 +547,3 @@ partial interface MLGraphBuilder {
partial interface MLGraphBuilder {
MLOperand where(MLOperand condition, MLOperand input, MLOperand other);
};
-
-[SecureContext, Exposed=(Window, DedicatedWorker)]
-interface MLOperand {};
-
-partial interface MLOperand {
- MLOperandDataType dataType();
-};
-
-partial interface MLOperand {
- sequence<unsigned long> shape();
-};
-
-enum MLInputOperandLayout {
- "nchw",
- "nhwc"
-};
-
-enum MLOperandDataType {
- "float32",
- "float16",
- "int32",
- "uint32",
- "int64",
- "uint64",
- "int8",
- "uint8"
-};
-
-dictionary MLOperandDescriptor {
- // The operand type.
- required MLOperandDataType dataType;
-
- // The dimensions field is only required for tensor operands.
- sequence<unsigned long> dimensions = [];
-};
diff --git a/tests/wpt/tests/interfaces/webtransport.idl b/tests/wpt/tests/interfaces/webtransport.idl
index 7421dcb432c..e598059c93e 100644
--- a/tests/wpt/tests/interfaces/webtransport.idl
+++ b/tests/wpt/tests/interfaces/webtransport.idl
@@ -23,6 +23,9 @@ interface WebTransport {
readonly attribute Promise<undefined> ready;
readonly attribute WebTransportReliabilityMode reliability;
readonly attribute WebTransportCongestionControl congestionControl;
+ [EnforceRange] attribute unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams;
+ [EnforceRange] attribute unsigned short? anticipatedConcurrentIncomingBidirectionalStreams;
+
readonly attribute Promise<WebTransportCloseInfo> closed;
readonly attribute Promise<undefined> draining;
undefined close(optional WebTransportCloseInfo closeInfo = {});
@@ -59,6 +62,8 @@ dictionary WebTransportOptions {
boolean requireUnreliable = false;
sequence<WebTransportHash> serverCertificateHashes;
WebTransportCongestionControl congestionControl = "default";
+ [EnforceRange] unsigned short? anticipatedConcurrentIncomingUnidirectionalStreams = null;
+ [EnforceRange] unsigned short? anticipatedConcurrentIncomingBidirectionalStreams = null;
};
enum WebTransportCongestionControl {
diff --git a/tests/wpt/tests/mathml/crashtests/mozilla/1092053.html b/tests/wpt/tests/mathml/crashtests/mozilla/1092053.html
new file mode 100644
index 00000000000..51b5858b6f3
--- /dev/null
+++ b/tests/wpt/tests/mathml/crashtests/mozilla/1092053.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Largeop stretching</title>
+ <meta charset="utf-8"/>
+ </head>
+ <body>
+ <p>
+ <!-- &bigotimes; allows to check for an assertion involving
+ the direction of the largeop pre-stretch -->
+ <math displaystyle="true">
+ <mrow>
+ <mo id="mo4">(</mo>
+ <mo>&bigotimes;</mo>
+ <mo id="mo5">)</mo>
+ </mrow>
+ </math>
+ </p>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html b/tests/wpt/tests/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html
index 2463c404765..0b14ac5334b 100644
--- a/tests/wpt/tests/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/legacy-mstyle-attributes.html
@@ -35,11 +35,12 @@
</head>
<body>
<div id="log"></div>
- <!-- Note: mpadded attributes are not tested since MathML3 did not allow to
- set them from mstyle. Also, it is not clear whether munderover's
- accent/accentunder could be applied from mstyle, given that the former
- clashes with mo@accent. Other legacy mstyle attributes not in MathML
- Core or without visual effect are not tested.
+ <!-- Note: In earlier versions of MathML, putting some attributes on the
+ mstyle element was supposed to produce the same rendering as putting them
+ on the all descendants (with some exceptions). In MathML Core, relevant
+ style attributes are implemented as CSS properties and are no longer
+ specific to the mstyle element. The tests below verify that attributes
+ on mstyle that are not mapped to CSS have no effect.
-->
<p class="TestContainer" id="mspace">
<math>
@@ -84,12 +85,12 @@
<mn>3</mn>
</munder>
</mstyle>
- <mstyle accent="false">
- <mover>
- <mn>4</mn>
- <mo>⇀</mo>
- </mover>
- </mstyle>
+ <!-- Note: accent was a shared attribute name for mover and mo, so
+ make mstyle an ancestor of mo but not of mover. -->
+ <mover>
+ <mn>4</mn>
+ <mstyle accent="false"><mo>⇀</mo></mstyle>
+ </mover>
<mstyle stretchy="false" symmetric="false" maxsize="20px">
<mrow>
<mo>|</mo>
@@ -102,6 +103,15 @@
<mn>4</mn>
</mrow>
</mstyle>
+ <mstyle form="prefix">
+ <mrow>
+ <mn>1</mn>
+ <!-- Infix and prefix forms of − do not have the same lspace/rspace
+ values in the operator dictionary -->
+ <mo>−</mo>
+ <mn>2</mn>
+ </mrow>
+ </mstyle>
</math>
<math displaystyle="true">
<mstyle>
@@ -115,12 +125,10 @@
<mn>3</mn>
</munder>
</mstyle>
- <mstyle>
- <mover>
- <mn>4</mn>
- <mo>⇀</mo>
- </mover>
- </mstyle>
+ <mover>
+ <mn>4</mn>
+ <mstyle><mo>⇀</mo></mstyle>
+ </mover>
<mstyle>
<mrow>
<mo>|</mo>
@@ -133,6 +141,13 @@
<mn>4</mn>
</mrow>
</mstyle>
+ <mstyle>
+ <mrow>
+ <mn>1</mn>
+ <mo>−</mo>
+ <mn>2</mn>
+ </mrow>
+ </mstyle>
</math>
</p>
<!-- notation attribute is from MathML3's menclose element -->
@@ -160,5 +175,92 @@
</mstyle>
</math>
</p>
+ <p class="TestContainer" id="mpadded">
+ <math>
+ <mstyle width="100px" height="50px" depth="50px"
+ lspace="10px" voffset="15px">
+ <mpadded style="background: lightblue">
+ <mspace width="10px" height="10px" style="background: black"></mspace>
+ </mpadded>
+ </mstyle>
+ </math>
+ <math>
+ <mstyle>
+ <mpadded style="background: lightblue">
+ <mspace width="10px" height="10px" style="background: black"></mspace>
+ </mpadded>
+ </mstyle>
+ </math>
+ </p>
+ <p class="TestContainer" id="mover">
+ <math>
+ <mstyle accent="true">
+ <mover>
+ <mn>1</mn>
+ <mn>2</mn>
+ </mover>
+ </mstyle>
+ </math>
+ <math>
+ <mstyle>
+ <mover>
+ <mn>1</mn>
+ <mn>2</mn>
+ </mover>
+ </mstyle>
+ </math>
+ </p>
+ <p class="TestContainer" id="munder">
+ <math>
+ <mstyle accentunder="true">
+ <munder>
+ <mn>1</mn>
+ <mn>2</mn>
+ </munder>
+ </mstyle>
+ </math>
+ <math>
+ <mstyle>
+ <munder>
+ <mn>1</mn>
+ <mn>2</mn>
+ </munder>
+ </mstyle>
+ </math>
+ </p>
+ <p class="TestContainer" id="munderover">
+ <math>
+ <mstyle accent="true">
+ <munderover>
+ <mn>1</mn>
+ <mn>2</mn>
+ <mn>3</mn>
+ </munderover>
+ </mstyle>
+ <mstyle accentunder="true">
+ <munderover>
+ <mn>1</mn>
+ <mn>2</mn>
+ <mn>3</mn>
+ </munderover>
+ </mstyle>
+ </math>
+ <math>
+ <mstyle>
+ <munderover>
+ <mn>1</mn>
+ <mn>2</mn>
+ <mn>3</mn>
+ </munderover>
+ </mstyle>
+ <mstyle>
+ <munderover>
+ <mn>1</mn>
+ <mn>2</mn>
+ <mn>3</mn>
+ </munderover>
+ </mstyle>
+ </math>
+ </p>
</body>
</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001-ref.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001-ref.html
new file mode 100644
index 00000000000..7d99e48c928
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>&lt;semantics&gt - mozilla bug 468059 (reference)</title>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+ math, p {
+ font: 25px Ahem;
+ }
+</style>
+<p>
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+ <semantics>
+ <mstyle displaystyle="true">
+ <munderover>
+ <mo movablelimits="true">pXp</mo>
+ <mtext>XpXpXp</mtext>
+ <mtext>XpXpXp</mtext>
+ </munderover>
+ </mstyle>
+ </semantics>
+ </math>
+</p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001.html
new file mode 100644
index 00000000000..63aa9a4da88
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-001.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>&lt;semantics&gt - mozilla bug 468059</title>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=468059">
+<link rel="help" href="https://w3c.github.io/mathml-core/#semantics-and-presentation">
+<link rel="match" href="semantics-001-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<meta name="assert" content="MathML inside a semantics element inherits displaystyle.">
+<style>
+ math, p {
+ font: 25px Ahem;
+ }
+</style>
+<p>
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+ <semantics>
+ <munderover>
+ <mo movablelimits="true">pXp</mo>
+ <mtext>XpXpXp</mtext>
+ <mtext>XpXpXp</mtext>
+ </munderover>
+ </semantics>
+ </math>
+</p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002-ref.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002-ref.html
new file mode 100644
index 00000000000..8abdad93dea
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>semantics element and legacy rendering rules (reference)</title>
+<meta charset="utf-8"/>
+<p>Empty semantics: <math><mrow></mrow></math></p>
+<p>annotation: <math><mrow><annotation>annotation</annotation></mrow></math></p>
+<p>annotation-xml: <math><mrow><annotation-xml encoding="MathML-Presentation"><mtext>annotation-xml</mtext></annotation-xml></mrow></math></p>
+<p>presentation MathML (no annotations): <math><mrow><mtext>presentation MathML</mtext></mrow></math></p>
+<p>content MathML (no annotations): <math><mrow><csymbol>content MathML</csymbol></mrow></math></p>
+<p>presentation MathML ; annotation: <math><mrow><mtext>presentation MathML</mtext></mrow></math></p>
+<p>presentation MathML ; annotation-xml: <math><mrow><mtext>presentation MathML</mtext></mrow></math></p>
+<p>content MathML ; annotation: <math><mrow><csymbol>content MathML</csymbol></mrow></math></p>
+<p>content MathML ; annotation-xml: <math><mrow><csymbol>content MathML</csymbol></mrow></math></p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002.html
new file mode 100644
index 00000000000..62028fb863e
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-002.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>semantics element and legacy rendering rules</title>
+<meta charset="utf-8"/>
+<link rel="help" href="https://developer.mozilla.org/en-US/docs/Web/MathML/Element/semantics">
+<link rel="help" href="https://w3c.github.io/mathml-core/#semantics-and-presentation">
+<link rel="match" href="semantics-002-ref.html">
+<meta name="assert" content="semantics element rendered as an mrow with only the first child displayed and does not rely on legacy rules to choose another child to display instead.">
+<p>Empty semantics: <math><semantics></semantics></math></p>
+<p>annotation: <math><semantics><annotation>annotation</annotation></semantics></math></p>
+<p>annotation-xml: <math><semantics><annotation-xml encoding="MathML-Presentation"><mtext>annotation-xml</mtext></annotation-xml></semantics></math></p>
+<p>presentation MathML (no annotations): <math><semantics><mtext>presentation MathML</mtext></semantics></math></p>
+<p>content MathML (no annotations): <math><semantics><csymbol>content MathML</csymbol></semantics></math></p>
+<p>presentation MathML ; annotation: <math><semantics><mtext>presentation MathML</mtext><annotation>annotation</annotation></semantics></math></p>
+<p>presentation MathML ; annotation-xml: <math><semantics><mtext>presentation MathML</mtext><annotation-xml encoding="application/mathml-presentation+xml"><mtext>annotation-xml</mtext></annotation-xml></semantics></math></p>
+<p>content MathML ; annotation: <math><semantics><csymbol>content MathML</csymbol><annotation>annotation</annotation></semantics></math></p>
+<p>content MathML ; annotation-xml: <math><semantics><csymbol>content MathML</csymbol><annotation-xml encoding="application/mathml-presentation+xml"><mtext>annotation-xml</mtext></annotation-xml></semantics></math></p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003-ref.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003-ref.html
new file mode 100644
index 00000000000..7b6e21a3eb8
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>semantics element and legacy rendering rules (reference)</title>
+<meta charset="utf-8"/>
+<p>annotation 1: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation 2: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation 3: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 1: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 2: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 3: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 4: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 5: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 6: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
+<p>annotation-xml 7: <math><mrow><csymbol>Content MathML</csymbol></mrow></math></p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003.html
new file mode 100644
index 00000000000..83572f4c8c3
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-003.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>semantics element and legacy rendering rules</title>
+<meta charset="utf-8"/>
+<link rel="help" href="https://developer.mozilla.org/en-US/docs/Web/MathML/Element/semantics">
+<link rel="help" href="https://w3c.github.io/mathml-core/#semantics-and-presentation">
+<link rel="match" href="semantics-003-ref.html">
+<meta name="assert" content="semantics element rendered as an mrow with only the first child displayed and does not rely on legacy rules to choose another child to display instead.">
+<p>annotation 1: <math><semantics><csymbol>Content MathML</csymbol><annotation>annotation</annotation><annotation>error</annotation><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml></semantics></math></p>
+<p>annotation 2: <math><semantics><csymbol>Content MathML</csymbol><annotation encoding="application/x-tex">\sin x + 5</annotation><annotation>error</annotation><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml></semantics></math></p>
+<p>annotation 3: <math><semantics><csymbol>Content MathML</csymbol><annotation src="external-resource">error</annotation><annotation>annotation</annotation><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml></semantics></math></p>
+<p>annotation-xml 1: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="application/mathml-presentation+xml"><mtext>application/mathml-presentation+xml</mtext></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml><annotation>error</annotation></semantics></math></p>
+<p>annotation-xml 2: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="MathML-Presentation"><mtext>MathML-Presentation</mtext></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml><annotation>error</annotation></semantics></math></p>
+<p>annotation-xml 3: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="image/svg+xml"><svg xmlns="http://www.w3.org/2000/svg" height="2em"><text y="1em">image/svg+xml</text></svg></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml><annotation>error</annotation></semantics></math></p>
+<p>annotation-xml 4: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="SVG1.1"><svg xmlns="http://www.w3.org/2000/svg" height="2em"><text y="1em">SVG1.1</text></svg></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml><annotation>error</annotation></semantics></math></p>
+<p>annotation-xml 5: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="application/xhtml+xml"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>application/xhtml+xml</title></head><body><p>application/xhtml+xml</p></body></html></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml><annotation>error</annotation></math></p>
+<p>annotation-xml 6: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="text/html"><html><head><title>text/html</title></head><body><p>text/html</p></body></html></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>error</mtext></annotation-xml><annotation>error</annotation></semantics></math></p>
+<p>annotation-xml 7: <math><semantics><csymbol>Content MathML</csymbol><annotation-xml encoding="unknown"><mtext>error</mtext></annotation-xml><annotation-xml encoding="application/mathml-presentation+xml"><mtext>annotation-xml</mtext></annotation-xml><annotation>error</annotation></semantics></math></p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004-ref.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004-ref.html
new file mode 100644
index 00000000000..855d887bbca
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004-ref.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>&lt;semantics&gt - mozilla bug 512418 (reference)</title>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+ math, p {
+ font: 25px Ahem;
+ }
+</style>
+<p>
+ XpXpXp<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mrow>
+ <mrow>
+ <mo>lcm</mo>
+ <mo>(</mo>
+ <mn>a</mn>
+ <mo>,</mo>
+ <mn>b</mn>
+ <mo>)</mo>
+ </mrow>
+ <mo>=</mo>
+ <mfrac>
+ <mrow>
+ <mo>(</mo>
+ <mn>a</mn>
+ <mo>&#x2062;</mo>
+ <mn>b</mn>
+ <mo>)</mo>
+ </mrow>
+ <mrow>
+ <mo>gcd</mo>
+ <mo>(</mo>
+ <mn>a</mn>
+ <mo>,</mo>
+ <mn>b</mn>
+ <mo>)</mo>
+ </mrow>
+ </mfrac>
+ </mrow>
+ </math>XpXpXp
+</p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004.html
new file mode 100644
index 00000000000..17f0f1ecd09
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-004.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>&lt;semantics&gt - mozilla bug 512418</title>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=512418">
+<link rel="help" href="https://w3c.github.io/mathml-core/#semantics-and-presentation">
+<link rel="match" href="semantics-004-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<meta name="assert" content="The semantics element shouldn't add space around it.">
+<style>
+ math, p {
+ font: 25px Ahem;
+ }
+</style>
+<p>
+ XpXpXp<math xmlns="http://www.w3.org/1998/Math/MathML">
+ <semantics>
+ <mrow>
+ <mrow>
+ <mo>lcm</mo>
+ <mo>(</mo>
+ <mn>a</mn>
+ <mo>,</mo>
+ <mn>b</mn>
+ <mo>)</mo>
+ </mrow>
+ <mo>=</mo>
+ <mfrac>
+ <mrow>
+ <mo>(</mo>
+ <mn>a</mn>
+ <mo>&#x2062;</mo>
+ <mn>b</mn>
+ <mo>)</mo>
+ </mrow>
+ <mrow>
+ <mo>gcd</mo>
+ <mo>(</mo>
+ <mn>a</mn>
+ <mo>,</mo>
+ <mn>b</mn>
+ <mo>)</mo>
+ </mrow>
+ </mfrac>
+ </mrow>
+ </semantics>
+ </math>XpXpXp
+</p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html
new file mode 100644
index 00000000000..cf722603e1d
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>&lt;semantics&gt - mozilla bug 21479 (reference)</title>
+<meta charset="utf-8"/>
+<p>
+ <math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mover>
+ <mspace width="300px" height="10px" mathbackground="black"></mspace>
+ <mo>&#xaf;</mo>
+ </mover>
+ </math>
+</p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html
new file mode 100644
index 00000000000..e4fe611c475
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/mrow/semantics-005.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>&lt;semantics&gt - mozilla bug 21479</title>
+<meta charset="utf-8"/>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=21479">
+<link rel="help" href="https://w3c.github.io/mathml-core/#semantics-and-presentation">
+<link rel="match" href="semantics-005-ref.html">
+<meta name="assert" content="The embellished operator made of a single mo inside a semantics element is treated the same as the mo alone.">
+<p>
+ <math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mover>
+ <mspace width="300px" height="10px" mathbackground="black"></mspace>
+ <semantics><mo>&#xaf;</mo></semantics>
+ </mover>
+ </math>
+</p>
diff --git a/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-1.html b/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-1.html
new file mode 100644
index 00000000000..9f37cddc398
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-1.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Stretchy/Largeop with default fonts</title>
+ <meta charset="utf-8"/>
+ <link rel="help" href="https://www.w3.org/TR/mathml-core/#layout-of-operators">
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1092053">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript">
+ function heightOf(aElement) {
+ return document.getElementById(aElement).getBoundingClientRect().height;
+ }
+ promise_test(() => {
+ return new Promise(resolve => {
+ window.addEventListener("load", resolve);
+ }).then(() => {
+ assert_greater_than(heightOf("mo0"), heightOf("mo0a"));
+ assert_greater_than(heightOf("mo1"), heightOf("mo1a"));
+ assert_greater_than(heightOf("mo2"), heightOf("mo2a"));
+ assert_greater_than(heightOf("mo3"), heightOf("mo3a"));
+ });
+ }, "The size of displaystyle largeops is taken into account when stretching fences.");
+ </script>
+ </head>
+ <body>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mo id="mo0">(</mo>
+ <mo>∫</mo>
+ <mo id="mo1">)</mo>
+ <mrow>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mrow>
+ <mo id="mo0a">(</mo>
+ <mo>∫</mo>
+ <mo id="mo1a">)</mo>
+ <mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mo id="mo2">(</mo>
+ <mo>&Product;</mo>
+ <mo id="mo3">)</mo>
+ <mrow>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mrow>
+ <mo id="mo2a">(</mo>
+ <mo>&Product;</mo>
+ <mo id="mo3a">)</mo>
+ <mrow>
+ </math>
+ </p>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-2.html b/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-2.html
new file mode 100644
index 00000000000..7c43c80acc0
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-2.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Stretchy/Largeop with default fonts</title>
+ <meta charset="utf-8"/>
+ <link rel="help" href="https://www.w3.org/TR/mathml-core/#layout-of-operators">
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1092053">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript">
+ function contentOf(aElement) {
+ return document.getElementById(aElement).textContent;
+ }
+ function heightOf(aElement) {
+ return document.getElementById(aElement).getBoundingClientRect().height;
+ }
+ promise_test(() => {
+ return new Promise(resolve => {
+ window.addEventListener("load", resolve);
+ }).then(() => {
+ const numTests = 10; // zero indexed
+ for (let i = 0; i < numTests; i++) {
+ const operatorName = contentOf(`mo${i}`);
+ assert_greater_than(heightOf(`mo${i}`), heightOf(`moRef${i}`), `size of largeop '${operatorName}'`);
+ }
+ });
+ }, "Test that non-stretchy largeops are bigger in display mode.");
+ </script>
+ </head>
+ <body>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo0">&bigodot;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo1">&bigoplus;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo2">&#x2a03;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo3">&#x2a05;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo4">&#x2a07;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo5">&#x2a08;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo6">&#x2a09;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo7">&#x2a0a;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo8">&#x2afc;</mo>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="mo9">&#x2aff;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef0">&bigodot;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef1">&bigoplus;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef2">&#x2a03;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef3">&#x2a05;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef4">&#x2a07;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef5">&#x2a08;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef6">&#x2a09;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef7">&#x2a0a;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef8">&#x2afc;</mo>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mo id="moRef9">&#x2aff;</mo>
+ </math>
+ </p>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-3.html b/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-3.html
new file mode 100644
index 00000000000..d588b9d4e07
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/operators/stretchy-largeop-with-default-font-3.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Stretchy/Largeop with default fonts</title>
+ <meta charset="utf-8"/>
+ <link rel="help" href="https://www.w3.org/TR/mathml-core/#layout-of-operators">
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1092053">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript">
+ function contentOf(aElement) {
+ return document.getElementById(aElement).textContent;
+ }
+ promise_test(() => {
+ return new Promise(resolve => {
+ window.addEventListener("load", resolve);
+ }).then(() => {
+ const numTests = 10; // zero indexed
+ const epsilon = 2;
+ for (let i = 0; i < numTests; i++) {
+ const operatorName = contentOf(`mo${i}`);
+ const box = document.getElementById(`mo${i}`).getBoundingClientRect();
+ const ref = document.getElementById(`moRef${i}`).getBoundingClientRect();
+ assert_approx_equals(box.width, ref.width, epsilon, `width of largeop '${operatorName}'`);
+ assert_approx_equals(box.height, ref.height, epsilon, `height of largeop '${operatorName}'`);
+ }
+ });
+ }, "Test that non-stretchy largeops do not stretch.");
+ </script>
+ </head>
+ <body>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo0">&bigodot;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo1">&bigoplus;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo2">&#x2a03;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo3">&#x2a05;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo4">&#x2a07;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo5">&#x2a08;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo6">&#x2a09;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo7">&#x2a0a;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo8">&#x2afc;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mrow>
+ <mspace height="3em" />
+ <mo id="mo9">&#x2aff;</mo>
+ </mrow>
+ </math>
+ </p>
+ <p>
+ <math displaystyle="true">
+ <mo id="moRef0">&bigodot;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef1">&bigoplus;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef2">&#x2a03;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef3">&#x2a05;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef4">&#x2a07;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef5">&#x2a08;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef6">&#x2a09;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef7">&#x2a0a;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef8">&#x2afc;</mo>
+ </math>
+ <math displaystyle="true">
+ <mo id="moRef9">&#x2aff;</mo>
+ </math>
+ </p>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001-ref.html
new file mode 100644
index 00000000000..d814944f531
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>mmultiscript with no scripts (reference)</title>
+ </head>
+ <body>
+ <math>
+ <mmultiscripts>
+ <mtext>base</mtext>
+ <none/>
+ <none/>
+ </mmultiscripts>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001.html b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001.html
new file mode 100644
index 00000000000..e55a04e1286
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-001.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>mmultiscript with no scripts</title>
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=208309">
+ <link rel="help" href="https://w3c.github.io/mathml-core/#base-with-prescripts-and-postscripts">
+ <link rel="match" href="mmultiscript-001-ref.html">
+ <meta name="assert" content="mmultiscript with no scripts renders the same as if it had two none post-scripts">
+ </head>
+ <body>
+ <math>
+ <mmultiscripts>
+ <mtext>base</mtext>
+ </mmultiscripts>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002-ref.html
new file mode 100644
index 00000000000..33f12d7cdfa
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>mmultiscript with mprescripts (reference)</title>
+ </head>
+ <body>
+ <math>
+ <mmultiscripts>
+ <mtext>base</mtext>
+ <none/>
+ <none/>
+ <mprescripts/>
+ </mmultiscripts>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002.html b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002.html
new file mode 100644
index 00000000000..c5e426008f9
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-002.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>mmultiscript with mprescripts</title>
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=208309">
+ <link rel="help" href="https://w3c.github.io/mathml-core/#base-with-prescripts-and-postscripts">
+ <link rel="match" href="mmultiscript-002-ref.html">
+ <meta name="assert" content="mmultiscript with no scripts and a mprescripts child renders the same as if it had two none pre-scripts">
+ </head>
+ <body>
+ <math>
+ <mmultiscripts>
+ <mtext>base</mtext>
+ <mprescripts/>
+ </mmultiscripts>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003-ref.html
new file mode 100644
index 00000000000..daac6b33467
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>alignment of mmultiscript sub/superscripts</title>
+ </head>
+ <body>
+ <math>
+ <mmultiscripts>
+ <mspace width="50px" height="50px" mathbackground="red"/>
+ <mrow>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ <mspace width="50px" height="10px"/>
+ </mrow>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ <mprescripts/>
+ <mrow>
+ <mspace width="50px" height="10px"/>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ </mrow>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ </mmultiscripts>
+ </math>
+ <br/>
+ <br/>
+ <math>
+ <mmultiscripts>
+ <mspace width="50px" height="50px" mathbackground="red"/>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ <mrow>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ <mspace width="50px" height="10px"/>
+ </mrow>
+ <mprescripts/>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ <mrow>
+ <mspace width="50px" height="10px"/>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ </mrow>
+ </mmultiscripts>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003.html b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003.html
new file mode 100644
index 00000000000..7de3e98b8ab
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/mmultiscript-003.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>alignment of mmultiscript sub/superscripts</title>
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=928675">
+ <link rel="help" href="https://w3c.github.io/mathml-core/#base-with-prescripts-and-postscripts">
+ <link rel="match" href="mmultiscript-003-ref.html">
+ <meta name="assert" content="In LTR mode, pre-scripts are right-aligned and post-scripts are left-aligned.">
+ </head>
+ <body>
+ <math>
+ <mmultiscripts>
+ <mspace width="50px" height="50px" mathbackground="red"/>
+ <mrow>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ </mrow>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ <mprescripts/>
+ <mrow>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ </mrow>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ </mmultiscripts>
+ </math>
+ <br/>
+ <br/>
+ <math>
+ <mmultiscripts>
+ <mspace width="50px" height="50px" mathbackground="red"/>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ <mrow>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ </mrow>
+ <mprescripts/>
+ <mspace width="100px" height="10px" mathbackground="green"/>
+ <mrow>
+ <mspace width="50px" height="10px" mathbackground="blue"/>
+ </mrow>
+ </mmultiscripts>
+ </math>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false-ref.html
new file mode 100644
index 00000000000..db72d0c5e2f
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false-ref.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="false")</title>
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="2">mover</th>
+ <th colspan="2">munder</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base</td>
+ <td align="center">Over &gt; Base</td>
+ <td align="center">Under &lt; Base</td>
+ <td align="center">Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <mover>
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <mover>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder>
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </munder>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munder>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false.html
new file mode 100644
index 00000000000..0d4205410a9
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-false.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="false")</title>
+ <link rel="help" href="https://w3c.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="match" href="munder-mover-align-accent-false-ref.html">
+ <meta name="assert" content="base, underscript and overscript should be horizontally aligned.">
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="2">mover</th>
+ <th colspan="2">munder</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base</td>
+ <td align="center">Over &gt; Base</td>
+ <td align="center">Under &lt; Base</td>
+ <td align="center">Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <mover>
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <mover>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder>
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </munder>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munder>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true-ref.html
new file mode 100644
index 00000000000..da1033563eb
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true-ref.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="true")</title>
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="2">mover</th>
+ <th colspan="2">munder</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base</td>
+ <td align="center">Over &gt; Base</td>
+ <td align="center">Under &lt; Base</td>
+ <td align="center">Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <mover accent="true">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <mover accent="true">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder accentunder="true">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </munder>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder accentunder="true">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munder>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true.html
new file mode 100644
index 00000000000..aa70d244f33
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munder-mover-align-accent-true.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="true")</title>
+ <link rel="help" href="https://w3c.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="match" href="munder-mover-align-accent-true-ref.html">
+ <meta name="assert" content="base, underscript and overscript should be horizontally aligned.">
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="2">mover</th>
+ <th colspan="2">munder</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base</td>
+ <td align="center">Over &gt; Base</td>
+ <td align="center">Under &lt; Base</td>
+ <td align="center">Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <mover accent="true">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <mover accent="true">
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </mover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder accentunder="true">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </munder>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munder accentunder="true">
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munder>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false-ref.html
new file mode 100644
index 00000000000..c339149c256
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false-ref.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="false")</title>
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="6">munderover</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base &lt; Under</td>
+ <td align="center">Over &gt; Base &gt; Under</td>
+ <td align="center">Over = Under &lt; Base</td>
+ <td align="center">Over = Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <munderover accent="false" accentunder="false">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="false" accentunder="false">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="false" accentunder="false">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="false" accentunder="false">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false.html
new file mode 100644
index 00000000000..2c082612a25
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-false.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="false")</title>
+ <link rel="help" href="https://w3c.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="match" href="munderover-align-accent-false-ref.html">
+ <meta name="assert" content="base, underscript and overscript should be horizontally aligned.">
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="4">munderover</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base &lt; Under</td>
+ <td align="center">Over &gt; Base &gt; Under</td>
+ <td align="center">Over = Under &lt; Base</td>
+ <td align="center">Over = Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <munderover>
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover>
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover>
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true-ref.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true-ref.html
new file mode 100644
index 00000000000..aababcb17bb
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true-ref.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="true")</title>
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="6">munderover</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base &lt; Under</td>
+ <td align="center">Over &gt; Base &gt; Under</td>
+ <td align="center">Over = Under &lt; Base</td>
+ <td align="center">Over = Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mrow>
+ <mspace height="15px" width="25px"/>
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="25px"/>
+ </mrow>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true.html b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true.html
new file mode 100644
index 00000000000..e6578ade523
--- /dev/null
+++ b/tests/wpt/tests/mathml/presentation-markup/scripts/munderover-align-accent-true.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Horizontal alignment of base with munder/mover scripts (accent="true")</title>
+ <link rel="help" href="https://w3c.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover">
+ <link rel="match" href="munderover-align-accent-true-ref.html">
+ <meta name="assert" content="base, underscript and overscript should be horizontally aligned.">
+ </head>
+ <body>
+ <table border="1">
+ <tr>
+ <th colspan="4">munderover</th>
+ </tr>
+ <tr>
+ <td align="center">Over &lt; Base &lt; Under</td>
+ <td align="center">Over &gt; Base &gt; Under</td>
+ <td align="center">Over = Under &lt; Base</td>
+ <td align="center">Over = Under &gt; Base</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mspace height="15px" width="50px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mspace height="15px" width="75px" mathbackground="blue"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ <mspace height="15px" width="25px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ <td align="center">
+ <math>
+ <munderover accent="true" accentunder="true">
+ <mspace height="15px" width="25px" mathbackground="blue"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ <mspace height="15px" width="75px" mathbackground="red"/>
+ </munderover>
+ </math>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/relations/html5-tree/tabindex-focus-001.tentative.html b/tests/wpt/tests/mathml/relations/html5-tree/tabindex-focus-001.tentative.html
new file mode 100644
index 00000000000..2ea0390eabd
--- /dev/null
+++ b/tests/wpt/tests/mathml/relations/html5-tree/tabindex-focus-001.tentative.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<title>Invalid tabindex</title>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1128054">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- Test default focusability -->
+<math></math>
+<math href="#" data-focusable=true></math>
+<!-- Test tabindex=0 focusability -->
+<math tabindex="0" data-focusable=true></math>
+<!-- Test tabindex=-1 focusability -->
+<math tabindex="-1" data-focusable=true></math>
+<!-- Test tabindex=invalid focusability -->
+<math tabindex="invalid"></math>
+<math href="#" tabindex="invalid" data-focusable=true></math>
+
+<script>
+ test(() => {
+ for (let element of document.querySelectorAll("math")) {
+ let focusable = element.dataset && element.dataset.focusable;
+ let desc = "<math";
+ for (let attr of ["href", "tabindex"]) {
+ if (element.hasAttribute(attr)) {
+ desc += ` ${attr}=${element.getAttribute(attr)}`;
+ }
+ }
+ desc += ">";
+ element.focus();
+ focusable ? assert_equals(document.activeElement, element, desc + " should be focusable")
+ : assert_not_equals(document.activeElement, element, desc + " should not be focusable");
+ }
+ }, "invalid tabindex attribute does not make the element focusable");
+</script>
diff --git a/tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font-ref.html b/tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font-ref.html
new file mode 100644
index 00000000000..5c295152ba0
--- /dev/null
+++ b/tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <title>mo glyph height with default font (reference)</title>
+ </head>
+ <body>
+ <div id="hider"
+ style="position:absolute; top:0; left:0; background-color:green;
+ height:1em; width:100%; z-index:1; padding-top:5px;
+ padding-bottom:5px;" />
+ </body>
+</html>
diff --git a/tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font.html b/tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font.html
new file mode 100644
index 00000000000..262d3b92777
--- /dev/null
+++ b/tests/wpt/tests/mathml/relations/text-and-math/mo-glyph-height-with-default-font.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+ <head>
+ <meta charset="UTF-8">
+ <title>mo glyph height with default font</title>
+ <meta name="assert" content="Verify operators with default fonts are not too tall.">
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1219068"/>
+ <link rel="match" href="mo-glyph-height-with-default-font-ref.html"/>
+ </head>
+ <body>
+ <math style="position:absolute; top: 0; font-size:1em; z-index: 0;" display="block">
+ <mrow>
+ <mo>|</mo>
+ <mrow>
+ <mi>f</mi>
+ <mrow>
+ <mn>(</mn>
+ <mi>x</mi>
+ <mn>)</mn>
+ </mrow>
+ <mn>−</mn>
+ <mrow>
+ <mi>f</mi>
+ <mrow>
+ <mn>(</mn>
+ <msub>
+ <mi>x</mi>
+ <mn>0</mn>
+ </msub>
+ <mn>)</mn>
+ </mrow>
+ </mrow>
+ </mrow>
+ <mo>|</mo>
+ </mrow>
+ </math>
+ <div id="hider"
+ style="position:absolute; top:0; left:0; background-color:green;
+ height:1em; width:100%; z-index:1; padding-top:5px;
+ padding-bottom:5px; visibility:hidden" />
+ <script>
+ function obscureMathML() {
+ var hider = document.getElementById("hider");
+ hider.style.visibility="visible";
+ // The math should now be completely obscured
+
+ document.documentElement.removeAttribute("class");
+ }
+ window.addEventListener("TestRendered", obscureMathML);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/mediacapture-streams/historical.https.html b/tests/wpt/tests/mediacapture-streams/historical.https.html
index 84326cec0a6..402bc9e957a 100644
--- a/tests/wpt/tests/mediacapture-streams/historical.https.html
+++ b/tests/wpt/tests/mediacapture-streams/historical.https.html
@@ -9,6 +9,10 @@ test(function() {
}, "webkitMediaStream interface should not exist");
test(function() {
+ assert_false("getUserMedia" in navigator);
+}, "navigator.getUserMedia should not exist");
+
+test(function() {
assert_false("webkitGetUserMedia" in navigator);
}, "navigator.webkitGetUserMedia should not exist");
diff --git a/tests/wpt/tests/notifications/resources/helpers.js b/tests/wpt/tests/notifications/resources/helpers.js
index 8c30173336e..ca44e32f7f4 100644
--- a/tests/wpt/tests/notifications/resources/helpers.js
+++ b/tests/wpt/tests/notifications/resources/helpers.js
@@ -12,9 +12,24 @@ async function getActiveServiceWorker(script) {
return reg;
}
-
async function closeAllNotifications() {
for (const n of await registration.getNotifications()) {
n.close();
}
}
+
+async function trySettingPermission(perm) {
+ try {
+ await test_driver.set_permission({ name: "notifications" }, perm);
+ } catch {
+ // Not all implementations support this yet, but the permission may already be set to be able to continue
+ }
+
+ // Using Notification.permission instead of permissions.query() as
+ // some implementation without set_permission support overrides
+ // Notification.permission.
+ const permission = Notification.permission === "default" ? "prompt" : Notification.permission;
+ if (permission !== perm) {
+ throw new Error(`Should have the permission ${perm} to continue`);
+ }
+}
diff --git a/tests/wpt/tests/notifications/resources/shownotification-window-iframe.html b/tests/wpt/tests/notifications/resources/shownotification-window-iframe.html
new file mode 100644
index 00000000000..2a45e794656
--- /dev/null
+++ b/tests/wpt/tests/notifications/resources/shownotification-window-iframe.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script>
+ async function showNotification() {
+ const registration = await navigator.serviceWorker.ready;
+ await registration.showNotification('foo');
+ }
+</script>
diff --git a/tests/wpt/tests/notifications/shownotification-window.https.html b/tests/wpt/tests/notifications/shownotification-window.https.html
new file mode 100644
index 00000000000..b21a5621df7
--- /dev/null
+++ b/tests/wpt/tests/notifications/shownotification-window.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/helpers.js"></script>
+<iframe id="iframe" src="resources/shownotification-window-iframe.html"></iframe>
+<script>
+/** @type {ServiceWorkerRegistration} */
+let registration;
+
+promise_setup(async (t) => {
+ await trySettingPermission("granted");
+ registration = await getActiveServiceWorker("noop-sw.js");
+ await closeAllNotifications();
+});
+
+promise_test(async (t) => {
+ t.add_cleanup(closeAllNotifications);
+
+ if (iframe.contentDocument.readyState !== "complete") {
+ await new Promise(resolve => iframe.onload = resolve);
+ }
+
+ await iframe.contentWindow.showNotification();
+ let notifications = await registration.getNotifications();
+ assert_equals(notifications.length, 1, "Should persist the notification");
+
+ iframe.contentWindow.location.reload();
+ // Wait for some time for potential notification close requests to be sent
+ await new Promise(resolve => iframe.onload = resolve);
+ notifications = await registration.getNotifications();
+ assert_equals(notifications.length, 1, "Should keep the notification");
+}, 'Refreshing window does not clear persistent notifications');
+</script>
+</body>
diff --git a/tests/wpt/tests/notifications/shownotification-without-permission.https.window.js b/tests/wpt/tests/notifications/shownotification-without-permission.https.window.js
index 37b3dbbef66..b09c0460fbd 100644
--- a/tests/wpt/tests/notifications/shownotification-without-permission.https.window.js
+++ b/tests/wpt/tests/notifications/shownotification-without-permission.https.window.js
@@ -8,20 +8,14 @@
let registration;
promise_setup(async () => {
+ await trySettingPermission("prompt");
registration = await getActiveServiceWorker("noop-sw.js");
+ await closeAllNotifications();
});
-promise_test(async (t) => {
+promise_test(async t => {
t.add_cleanup(closeAllNotifications);
- try {
- await test_driver.set_permission({ name: "notifications" }, "prompt");
- } catch {
- // Not all implementations support this yet, but it may already be "prompt" to be able to continue
- }
-
- assert_equals(Notification.permission, "default", "Should have the default permission to continue");
-
await promise_rejects_js(t, TypeError, registration.showNotification(""), "Should throw TypeError");
const notifications = await registration.getNotifications();
assert_equals(notifications.length, 0, "Should return zero notification");
diff --git a/tests/wpt/tests/png/errors/support/invalid-unknown-ancillary-after-IDAT.png b/tests/wpt/tests/png/errors/support/invalid-unknown-ancillary-after-IDAT.png
new file mode 100644
index 00000000000..e9c9e7ee025
--- /dev/null
+++ b/tests/wpt/tests/png/errors/support/invalid-unknown-ancillary-after-IDAT.png
Binary files differ
diff --git a/tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2-ref.html b/tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2-ref.html
new file mode 100644
index 00000000000..cfa2cbb6f14
--- /dev/null
+++ b/tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>PNG Third Edition: Decoder error recovery, invalid ancillary</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<style>
+ .test {
+ width: 32px;
+ height: 32px;
+ background-color: green;
+ }
+</style>
+<body>
+ <p>Test passes if you see a rainbow square, and not a red one.</p>
+ <div class="test"><img src="support/no-invalid-chunks.png" alt=""></div>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2.html b/tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2.html
new file mode 100644
index 00000000000..23191fe39f7
--- /dev/null
+++ b/tests/wpt/tests/png/errors/unknown-ancillary-error-recovery-2.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>PNG Third Edition: Decoder error recovery, invalid ancillary after IDAT</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://www.w3.org/TR/png-3/#13Decoders.Errors">
+<link rel="help" href="https://github.com/w3c/PNG-spec/issues/320">
+<link rel="match" href="unknown-ancillary-error-recovery-2-ref.html">
+<meta name="assert" content="Encountering an unknown ancillary chunk is never an error. The chunk can simply be ignored.">
+<style>
+ .test {
+ width: 32px;
+ height: 32px;
+ background-color: red;
+ }
+</style>
+<body>
+ <p>Test passes if you see a rainbow square, and not a red one.</p>
+ <div class="test"><img src="support/invalid-unknown-ancillary-after-IDAT.png" alt=""></div>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/resources/chromium/fake-serial.js b/tests/wpt/tests/resources/chromium/fake-serial.js
index 29c8168fb59..8614b4d64f9 100644
--- a/tests/wpt/tests/resources/chromium/fake-serial.js
+++ b/tests/wpt/tests/resources/chromium/fake-serial.js
@@ -356,6 +356,10 @@ class FakeSerialService {
portInfo.hasUsbProductId = true;
portInfo.usbProductId = info.usbProductId;
}
+ portInfo.connected = true;
+ if (info?.connected !== undefined) {
+ portInfo.connected = info.connected;
+ }
let token = ++this.nextToken_;
portInfo.token = {high: 0n, low: BigInt(token)};
@@ -366,8 +370,10 @@ class FakeSerialService {
};
this.ports_.set(token, record);
- for (let client of this.clients_) {
- client.onPortAdded(portInfo);
+ if (portInfo.connected) {
+ for (let client of this.clients_) {
+ client.onPortConnectedStateChanged(portInfo);
+ }
}
return token;
@@ -381,8 +387,26 @@ class FakeSerialService {
this.ports_.delete(token);
+ record.portInfo.connected = false;
+ for (let client of this.clients_) {
+ client.onPortConnectedStateChanged(record.portInfo);
+ }
+ }
+
+ setPortConnectedState(token, connected) {
+ let record = this.ports_.get(token);
+ if (record === undefined) {
+ return;
+ }
+
+ let was_connected = record.portInfo.connected;
+ if (was_connected === connected) {
+ return;
+ }
+
+ record.portInfo.connected = connected;
for (let client of this.clients_) {
- client.onPortRemoved(record.portInfo);
+ client.onPortConnectedStateChanged(record.portInfo);
}
}
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 4e6f8bb9559..5a1c53671b9 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
@@ -39,6 +39,19 @@ const routerRules = {
condition: {requestMethod: String.fromCodePoint(0x3042)},
source: 'network'
}],
+ 'condition-invalid-or-condition-depth': (() => {
+ const max = 10;
+ const addOrCondition = (obj, depth) => {
+ if (depth > max) {
+ return obj;
+ }
+ return {
+ urlPattern: `/foo-${depth}`,
+ or: [addOrCondition(obj, depth + 1)]
+ };
+ };
+ return {condition: addOrCondition({}, 0), 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 4ed4ad4b3c0..86a50215f2e 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
@@ -15,8 +15,8 @@
const ROUTER_RULE_KEY_INVALID_REQUEST_METHOD =
'condition-invalid-request-method';
-const ROUTER_RULE_KEY_SOURCE_FETCH_EVENT =
- 'condition-request-source-fetch-event';
+const ROUTER_RULE_KEY_INVALID_OR_CONDITION_DEPTH =
+ 'condition-invalid-or-condition-depth';
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_REQUEST_METHOD);
@@ -25,5 +25,12 @@ promise_test(async t => {
assert_equals(errors.length, 1);
}, 'addRoutes should raise for invalid request method.');
+promise_test(async t => {
+ const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_OR_CONDITION_DEPTH);
+ 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 or condition exceeds the depth limit');
+
</script>
</body>
diff --git a/tests/wpt/tests/svg-aam/role/role-img.tentative.html b/tests/wpt/tests/svg-aam/role/role-img.tentative.html
new file mode 100644
index 00000000000..57fd17cddfc
--- /dev/null
+++ b/tests/wpt/tests/svg-aam/role/role-img.tentative.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<html>
+<head>
+ <title>SVG-AAM Image Role Verification Tests</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/wai-aria/scripts/aria-utils.js"></script>
+</head>
+<body>
+
+
+<p>Currently tentative due to <a href="https://github.com/w3c/svg-aam/issues/32">SVG-AAM #32: SVG image role should align with HTML on missing versus empty alt</a>.</p>
+
+<!-- [sic] included here b/c the spec says unlabeled, unrendered images are generic, but the spec may be wrong. -->
+<!-- Once https://github.com/w3c/svg-aam/issues/32 is resolved, this test can be moved to another file or have `.tentative` removed. -->
+<image data-testname="el-image (empty label due to missing image>title element)" data-expectedrole="image" data-expectedlabel="" class="ex-role-label"></image>
+
+<!-- Additional tests -->
+<image data-testname="el-image (label from w/ aria-label)" aria-label="x" data-expectedrole="image" data-expectedlabel="x" class="ex-role-label"></image>
+<image data-testname="el-image (label from image>title element)" data-expectedrole="image" data-expectedlabel="x" class="ex-role-label"><title>x</title></image>
+<image data-testname="el-image (generic, explicitly empty image>title element)" class="ex-generic"><title></title></image>
+
+<script>
+AriaUtils.verifyRolesAndLabelsBySelector(".ex-role-label");
+AriaUtils.verifyGenericRolesBySelector(".ex-generic");
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/tests/svg-aam/role/roles-generic.html b/tests/wpt/tests/svg-aam/role/roles-generic.html
index e7fe9f33de5..d8ad4f9ea1c 100644
--- a/tests/wpt/tests/svg-aam/role/roles-generic.html
+++ b/tests/wpt/tests/svg-aam/role/roles-generic.html
@@ -22,11 +22,7 @@
<ellipse data-testname="el-ellipse" class="ex-generic"></ellipse>
<foreignObject data-testname="el-foreignObject" class="ex-generic"></foreignObject>
<g data-testname="el-g" class="ex-generic"></g>
-
- <!-- [sic] included here b/c the spec says unlabeled, unrendered images are generic, but the spec is wrong. -->
- <!-- Once https://github.com/w3c/svg-aam/issues/32 is resolved, this test can be moved to another file. -->
- <image data-testname="el-image" data-expectedrole="image" class="ex"></image>
-
+ <!-- image -> in ./role-img.tentative.html -->
<line data-testname="el-line" class="ex-generic"></line>
<!-- skipped: mesh -->
<path data-testname="el-path" class="ex-generic"></path>
diff --git a/tests/wpt/tests/svg/animations/repeatcount-attribute-mutation.html b/tests/wpt/tests/svg/animations/repeatcount-attribute-mutation.html
new file mode 100644
index 00000000000..fd4952b4bab
--- /dev/null
+++ b/tests/wpt/tests/svg/animations/repeatcount-attribute-mutation.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<title>Mutating the 'repeatCount' attribute after the element has been inserted</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<svg height="0">
+ <rect width="10" height="100" fill="blue">
+ <animate id="anim" attributeName="width" from="10" to="100" dur="10ms"
+ repeatCount="indefinite"/>
+ </rect>
+</svg>
+<script>
+ promise_test(t => {
+ const anim = document.getElementById("anim");
+ anim.removeAttribute('repeatCount');
+
+ const watcher = new EventWatcher(t, anim, ['endEvent', 'repeatEvent']);
+ return watcher.wait_for('endEvent');
+ });
+</script>
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-001.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-001.svg
index fd58d9b790a..7be33cb20fb 100644
--- a/tests/wpt/tests/svg/painting/reftests/paint-context-001.svg
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-001.svg
@@ -35,7 +35,7 @@
<defs>
<rect id="rectangle" width="2" height="2" style="fill:context-stroke;stroke:context-fill" />
<marker id="marker" style="overflow:visible" markerWidth="2" markerHeight="2" orient="auto" viewBox="0 0 2 2" refX="1" refY="1">
- <use xlink:href="#rectangle"/>
+ <use xlink:href="#rectangle" style="fill:context-fill;stroke:context-stroke"/>
</marker>
<path id="path" d="m -25,-25 0,50 50,0 0,-50 z"/>
</defs>
@@ -44,4 +44,4 @@
<path d="m 120,220 c 120,120 120,-120 240,0"/>
</g>
-</svg>
+</svg> \ No newline at end of file
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-003-ref.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-003-ref.svg
new file mode 100644
index 00000000000..69ba36f4482
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-003-ref.svg
@@ -0,0 +1,17 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Paint: 'context-fill' and 'context-stroke' vis-a-vis 'currentcolor'</title>
+ <html:link rel="author"
+ title="Stefan Zager"
+ href="mailto:szager@chromium.org"/>
+ </g>
+
+ <g style="stroke-width:15px">
+ <rect x="25" y="25" width="100" height="100" fill="green" stroke="none"/>
+ <rect x="150" y="25" width="100" height="100" fill="none" stroke="green"/>
+ </g>
+</svg>
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-003.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-003.svg
new file mode 100644
index 00000000000..be1f378bf82
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-003.svg
@@ -0,0 +1,26 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Paint: 'context-fill' and 'context-stroke' vis-a-vis 'currentcolor'</title>
+ <html:link rel="author"
+ title="Stefan Zager"
+ href="mailto:szager@chromium.org"/>
+ <html:link rel="help"
+ href="https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint"/>
+ <html:link rel="match" href="paint-context-003-ref.svg"/>
+ </g>
+
+ <defs>
+ <g id="g" color="green">
+ <rect width="100" height="100" fill="context-fill" stroke="context-stroke"/>
+ </g>
+ </defs>
+
+ <g id="test-body-content" color="red" style="stroke-width:15px">
+ <use x="25" y="25" href="#g" stroke="none" fill="currentcolor"/>
+ <use x="150" y="25" href="#g" stroke="currentcolor" fill="none"/>
+ </g>
+</svg> \ No newline at end of file
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-004-ref.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-004-ref.svg
new file mode 100644
index 00000000000..25acb75ba00
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-004-ref.svg
@@ -0,0 +1,30 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 120 90"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Paint: 'context-fill' and 'context-stroke' with paint server</title>
+ <html:link rel="author"
+ title="Stefan Zager"
+ href="mailto:szager@chromium.org"/>
+ <html:link rel="help"
+ href="https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint"/>
+ </g>
+
+ <defs>
+ <pattern id="grid-ref" x="0" y="0" width="8" height="8" stroke="blue" stroke-width="2" patternUnits="userSpaceOnUse">
+ <path d="M 0,4 h 8"/>
+ <path d="M 4,0 v 8"/>
+ </pattern>
+
+ <g id="rects-ref" fill="url(#grid-ref)">
+ <rect x="0" y="0" width="32" height="64"/>
+ <rect x="32" y="6" width="32" height="58"/>
+ </g>
+ </defs>
+
+ <g id="ref-content">
+ <use x="18" y="18" xlink:href="#rects-ref"/>
+ </g>
+</svg> \ No newline at end of file
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-004.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-004.svg
new file mode 100644
index 00000000000..669d44de46b
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-004.svg
@@ -0,0 +1,31 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 120 90"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Paint: 'context-fill' and 'context-stroke' with paint server</title>
+ <html:link rel="author"
+ title="Stefan Zager"
+ href="mailto:szager@chromium.org"/>
+ <html:link rel="help"
+ href="https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint"/>
+ <html:link rel="match" href="paint-context-004-ref.svg" />
+ </g>
+
+ <defs>
+ <pattern id="grid" x="0" y="0" width="0.125" height="0.125" stroke="blue" stroke-width="0.03125" patternContentUnits="objectBoundingBox">
+ <path d="M 0,0.0625 h 0.125"/>
+ <path d="M 0.0625,0 v 0.125"/>
+ </pattern>
+
+ <g id="rects">
+ <rect x="0" y="0" width="32" height="64" fill="context-fill"/>
+ <rect x="32" y="6" width="32" height="58" fill="context-fill"/>
+ </g>
+ </defs>
+
+ <g id="test-body-content">
+ <use x="18" y="18" fill="url(#grid)" xlink:href="#rects"/>
+ </g>
+</svg> \ No newline at end of file
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-005-ref.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-005-ref.svg
new file mode 100644
index 00000000000..fa30a5361cb
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-005-ref.svg
@@ -0,0 +1,22 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Paint: 'paint-order'</title>
+ <html:link rel="author"
+ title="Stefan Zager"
+ href="mailto:szager@chromium.org"/>
+ </g>
+
+ <defs>
+ <rect id="rectangle" width="120" height="120" />
+ </defs>
+
+ <g id="test-reference" font-size="16" style="fill:lime;stroke:blue;stroke-width:15px">
+ <use xlink:href="#rectangle" transform="translate(60,120)"/>
+ <use xlink:href="#rectangle" transform="translate(300,120)" style="fill:lightblue;stroke:green"/>
+ </g>
+
+</svg>
diff --git a/tests/wpt/tests/svg/painting/reftests/paint-context-005.svg b/tests/wpt/tests/svg/painting/reftests/paint-context-005.svg
new file mode 100644
index 00000000000..8bbfff8d474
--- /dev/null
+++ b/tests/wpt/tests/svg/painting/reftests/paint-context-005.svg
@@ -0,0 +1,39 @@
+<svg id="svg-root"
+ width="100%" height="100%" viewBox="0 0 480 360"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <g id="testmeta">
+ <title>Paint: 'context-fill' and 'context-stroke' invalidation test</title>
+ <html:link rel="author"
+ title="Stefan Zager"
+ href="mailto:szager@chromium.org"/>
+ <html:link rel="help"
+ href="https://www.w3.org/TR/SVG2/painting.html#SpecifyingPaint"/>
+ <html:link rel="match" href="paint-context-005-ref.svg" />
+ </g>
+
+ <html:script src="/resources/testharness.js"/>
+ <html:script src="/resources/testharnessreport.js"/>
+
+ <defs>
+ <rect id="rectangle" width="120" height="120" style="fill:context-fill;stroke:context-stroke" />
+ </defs>
+
+ <g id="test-body-content" font-size="16" style="fill:blue;stroke:lime;stroke-width:15px">
+ <use xlink:href="#rectangle" transform="translate(60,120)"/>
+ <use id="use" xlink:href="#rectangle" transform="translate(300,120)" style="fill:green;stroke:lightblue"/>
+ </g>
+
+ <html:script>
+ async_test(t => {
+ onload = () => {
+ requestAnimationFrame(() => { requestAnimationFrame(() => {
+ let use = document.getElementById("use");
+ use.style = "fill:lightblue;stroke:green";
+ requestAnimationFrame(() => { t.done() });
+ })});
+ };
+ });
+ </html:script>
+</svg>
diff --git a/tests/wpt/tests/tools/wpt/browser.py b/tests/wpt/tests/tools/wpt/browser.py
index c7f67d334e1..2f9c4531315 100644
--- a/tests/wpt/tests/tools/wpt/browser.py
+++ b/tests/wpt/tests/tools/wpt/browser.py
@@ -1282,6 +1282,11 @@ class Chrome(ChromeChromiumBase):
version = self.version(browser_binary)
if version is None:
+ # Check if the user has given a Chromium binary.
+ chromium = Chromium(self.logger)
+ if chromium.version(browser_binary):
+ raise ValueError("Provided binary is a Chromium binary and should be run using "
+ "\"./wpt run chromium\" or similar.")
raise ValueError(f"Unable to detect browser version from binary at {browser_binary}. "
" Cannot install ChromeDriver without a valid version to match.")
diff --git a/tests/wpt/tests/tools/wpt/update.py b/tests/wpt/tests/tools/wpt/update.py
index 4dba7e69df8..06fe9bfbadd 100644
--- a/tests/wpt/tests/tools/wpt/update.py
+++ b/tests/wpt/tests/tools/wpt/update.py
@@ -43,7 +43,6 @@ def update_expectations(_, **kwargs):
update_properties = metadata.get_properties(properties_file=kwargs["properties_file"],
extra_properties=kwargs["extra_property"],
- config=kwargs["config"],
product=kwargs["product"])
manifest_update(kwargs["test_paths"])
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
index 05f81461e2a..7cb46783fc3 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -97,6 +97,8 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data,
chrome_options["args"].append("--use-fake-ui-for-media-stream")
# Use a fake UI for FedCM to allow testing it.
chrome_options["args"].append("--use-fake-ui-for-fedcm")
+ # Use a fake UI for digital identity to allow testing it.
+ chrome_options["args"].append("--use-fake-ui-for-digital-identity")
# Shorten delay for Reporting <https://w3c.github.io/reporting/>.
chrome_options["args"].append("--short-reporting-delay")
# Point all .test domains to localhost for Chrome
@@ -148,6 +150,7 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data,
# set. '--headless' should always mean the new headless mode, as the old
# headless mode is not used anyway.
if kwargs["headless"] and ("--headless=new" not in chrome_options["args"] and
+ "--headless=old" not in chrome_options["args"] and
"--headless" not in chrome_options["args"]):
chrome_options["args"].append("--headless=new")
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py
index 23f4e99da62..6df8671e0ac 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py
@@ -1,29 +1,17 @@
# mypy: allow-untyped-defs
-import contextlib
-import os
-import subprocess
-from multiprocessing import Queue, Event
-from threading import Thread
-from urllib.parse import urljoin
-
from . import chrome_spki_certs
-from .base import (
- Browser,
- ExecutorBrowser,
- OutputHandler,
- browser_command,
-)
+from .base import cmd_arg, require_arg
from .base import get_timeout_multiplier # noqa: F401
-from .chrome import debug_args
+from .chrome import ChromeBrowser, debug_args
from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.base import server_url
-from ..executors.executorcontentshell import ( # noqa: F401
- ContentShellCrashtestExecutor,
- ContentShellPrintRefTestExecutor,
- ContentShellRefTestExecutor,
- ContentShellTestharnessExecutor,
+from ..executors.base import WdspecExecutor # noqa: F401
+from ..executors.executorchrome import ( # noqa: F401
+ ChromeDriverPrintRefTestExecutor,
+ ChromeDriverRefTestExecutor,
+ ChromeDriverTestharnessExecutor,
)
+from ..executors.executorwebdriver import WebDriverCrashtestExecutor # noqa: F401
ENABLE_THREADED_COMPOSITING_FLAG = '--enable-threaded-compositing'
DISABLE_THREADED_COMPOSITING_FLAG = '--disable-threaded-compositing'
@@ -34,10 +22,11 @@ __wptrunner__ = {"product": "content_shell",
"check_args": "check_args",
"browser": "ContentShellBrowser",
"executor": {
- "crashtest": "ContentShellCrashtestExecutor",
- "print-reftest": "ContentShellPrintRefTestExecutor",
- "reftest": "ContentShellRefTestExecutor",
- "testharness": "ContentShellTestharnessExecutor",
+ "crashtest": "WebDriverCrashtestExecutor",
+ "print-reftest": "ChromeDriverPrintRefTestExecutor",
+ "reftest": "ChromeDriverRefTestExecutor",
+ "testharness": "ChromeDriverTestharnessExecutor",
+ "wdspec": "WdspecExecutor",
},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
@@ -48,54 +37,79 @@ __wptrunner__ = {"product": "content_shell",
def check_args(**kwargs):
- pass
+ require_arg(kwargs, "webdriver_binary")
+
+
+def browser_kwargs(logger, test_type, run_info_data, config, **kwargs):
+ return {"binary": kwargs["binary"],
+ "webdriver_binary": kwargs["webdriver_binary"],
+ "webdriver_args": kwargs.get("webdriver_args"),
+ "debug_info": kwargs["debug_info"]}
-def browser_kwargs(logger, test_type, run_info_data, config, subsuite, **kwargs):
- args = []
- args.append("--ignore-certificate-errors-spki-list=%s" %
+def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite,
+ **kwargs):
+ sanitizer_enabled = kwargs.get("sanitizer_enabled")
+ if sanitizer_enabled:
+ test_type = "crashtest"
+ executor_kwargs = base_executor_kwargs(test_type, test_environment, run_info_data,
+ subsuite, **kwargs)
+ executor_kwargs["sanitizer_enabled"] = sanitizer_enabled
+ executor_kwargs["close_after_done"] = True
+ executor_kwargs["reuse_window"] = kwargs.get("reuse_window", False)
+
+ capabilities = {
+ "goog:chromeOptions": {
+ "prefs": {
+ "profile": {
+ "default_content_setting_values": {
+ "popups": 1
+ }
+ }
+ },
+ "excludeSwitches": ["enable-automation"],
+ "w3c": True,
+ }
+ }
+
+ chrome_options = capabilities["goog:chromeOptions"]
+ if kwargs["binary"] is not None:
+ chrome_options["binary"] = kwargs["binary"]
+
+ chrome_options["args"] = []
+ chrome_options["args"].append("--ignore-certificate-errors-spki-list=%s" %
','.join(chrome_spki_certs.IGNORE_CERTIFICATE_ERRORS_SPKI_LIST))
# For WebTransport tests.
- args.append("--webtransport-developer-mode")
+ chrome_options["args"].append("--webtransport-developer-mode")
+ chrome_options["args"].append("--enable-blink-test-features")
- if not kwargs["headless"]:
- args.append("--disable-headless-mode")
+ # always run in headful mode for content_shell
if kwargs["debug_info"]:
- args.extend(debug_args(kwargs["debug_info"]))
+ chrome_options["args"].extend(debug_args(kwargs["debug_info"]))
- # `--run-web-tests -` are specific to content_shell - they activate web
- # test protocol mode.
- args.append("--run-web-tests")
for arg in kwargs.get("binary_args", []):
- if arg not in args:
- args.append(arg)
+ # skip empty --user-data-dir args, and allow chromedriver to pick one.
+ # Do not pass in --run-web-tests, otherwise content_shell will hang.
+ if arg in ['--user-data-dir', '--run-web-tests']:
+ continue
+ if arg not in chrome_options["args"]:
+ chrome_options["args"].append(arg)
# Temporary workaround to align with RWT behavior. Unless a vts explicitly
# enables threaded compositing, we should use single threaded compositing
- if ENABLE_THREADED_COMPOSITING_FLAG not in subsuite.config.get("binary_args", []):
- args.extend([DISABLE_THREADED_COMPOSITING_FLAG,
- DISABLE_THREADED_ANIMATION_FLAG])
+ # Do not pass in DISABLE_THREADED_COMPOSITING_FLAG or
+ # DISABLE_THREADED_ANIMATION_FLAG. Content shell will hang due to that.
+ #if ENABLE_THREADED_COMPOSITING_FLAG not in subsuite.config.get("binary_args", []):
+ # chrome_options["args"].extend([DISABLE_THREADED_COMPOSITING_FLAG,
+ # DISABLE_THREADED_ANIMATION_FLAG])
for arg in subsuite.config.get("binary_args", []):
- if arg not in args:
- args.append(arg)
- args.append("-")
-
- return {"binary": kwargs["binary"],
- "binary_args": args,
- "debug_info": kwargs["debug_info"],
- "pac_origin": server_url(config, "http")}
+ if arg not in chrome_options["args"]:
+ chrome_options["args"].append(arg)
+ executor_kwargs["capabilities"] = capabilities
-def executor_kwargs(logger, test_type, test_environment, run_info_data,
- **kwargs):
- sanitizer_enabled = kwargs.get("sanitizer_enabled")
- if sanitizer_enabled:
- test_type = "crashtest"
- executor_kwargs = base_executor_kwargs(test_type, test_environment, run_info_data,
- **kwargs)
- executor_kwargs["sanitizer_enabled"] = sanitizer_enabled
return executor_kwargs
@@ -105,7 +119,6 @@ def env_extras(**kwargs):
def env_options():
return {"server_host": "127.0.0.1",
- "testharnessreport": "testharnessreport-content-shell.js",
"supports_debugger": True}
@@ -113,187 +126,9 @@ def update_properties():
return (["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]})
-class ContentShellBrowser(Browser):
- """Class that represents an instance of content_shell.
-
- Upon startup, the stdout, stderr, and stdin pipes of the underlying content_shell
- process are connected to multiprocessing Queues so that the runner process can
- interact with content_shell through its protocol mode.
-
- See Also:
- Protocol Mode: https://chromium.googlesource.com/chromium/src.git/+/HEAD/content/web_test/browser/test_info_extractor.h
- """
- # Seconds to wait for the process to stop after it was sent a `QUIT`
- # command, after which `SIGTERM` or `TerminateProcess()` forces termination.
- # The timeout is ported from:
- # https://chromium.googlesource.com/chromium/src/+/b175d48d3ea4ea66eea35c88c11aa80d233f3bee/third_party/blink/tools/blinkpy/web_tests/port/base.py#476
- termination_timeout: float = 3
-
- def __init__(self, logger, binary="content_shell", binary_args=None,
- debug_info=None, pac_origin=None, **kwargs):
- super().__init__(logger)
- self._debug_cmd_prefix, self._browser_cmd = browser_command(
- binary, binary_args or [], debug_info)
- self._output_handler = None
- self._proc = None
- self._pac_origin = pac_origin
- self._pac = None
-
- def start(self, group_metadata, **settings):
- browser_cmd, pac = list(self._browser_cmd), settings.get("pac")
- if pac:
- browser_cmd.insert(1, f"--proxy-pac-url={pac}")
- self.logger.debug(f"Starting content shell: {browser_cmd[0]}...")
- args = [*self._debug_cmd_prefix, *browser_cmd]
- self._output_handler = OutputHandler(self.logger, args)
- if os.name == "posix":
- close_fds, preexec_fn = True, lambda: os.setpgid(0, 0)
- else:
- close_fds, preexec_fn = False, None
- self._proc = subprocess.Popen(args,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- close_fds=close_fds,
- preexec_fn=preexec_fn)
- self._output_handler.after_process_start(self._proc.pid)
-
- self._stdout_queue = Queue()
- self._stderr_queue = Queue()
- self._stdin_queue = Queue()
- self._io_stopped = Event()
-
- self._stdout_reader = self._create_reader_thread("stdout-reader",
- self._proc.stdout,
- self._stdout_queue,
- prefix=b"OUT: ")
- self._stderr_reader = self._create_reader_thread("stderr-reader",
- self._proc.stderr,
- self._stderr_queue,
- prefix=b"ERR: ")
- self._stdin_writer = self._create_writer_thread("stdin-writer",
- self._proc.stdin,
- self._stdin_queue)
-
- # Content shell is likely still in the process of initializing. The actual waiting
- # for the startup to finish is done in the ContentShellProtocol.
- self.logger.debug("Content shell has been started.")
- self._output_handler.start(group_metadata=group_metadata, **settings)
-
- def stop(self, force=False):
- self.logger.debug("Stopping content shell...")
-
- clean_shutdown = stopped = True
- if self.is_alive():
- clean_shutdown = self._terminate_process(force=force)
-
- # Close these queues cleanly to avoid broken pipe error spam in the logs.
- self._stdin_queue.put(None)
- for thread in [self._stdout_reader, self._stderr_reader, self._stdin_writer]:
- thread.join(2)
- if thread.is_alive():
- self.logger.warning(f"Content shell IO thread {thread.name} did not shut down gracefully.")
- stopped = False
-
- if not self.is_alive():
- self.logger.debug(
- "Content shell has been stopped "
- f"(PID: {self._proc.pid}, exit code: {self._proc.returncode})")
- else:
- stopped = False
- self.logger.warning(f"Content shell failed to stop (PID: {self._proc.pid})")
- if stopped and self._output_handler is not None:
- self._output_handler.after_process_stop(clean_shutdown)
- self._output_handler = None
- return stopped
-
- def _terminate_process(self, force: bool = False) -> bool:
- self._stdin_queue.put(b"QUIT\n")
- with contextlib.suppress(subprocess.TimeoutExpired):
- self._proc.wait(timeout=self.termination_timeout)
- return True
- self.logger.warning(
- "Content shell failed to respond to QUIT command "
- f"(PID: {self._proc.pid}, timeout: {self.termination_timeout}s)")
- # Skip `terminate()` on Windows, which is an alias for `kill()`, and
- # only `kill()` for `force=True`.
- #
- # [1]: https://docs.python.org/3/library/subprocess.html#subprocess.Popen.kill
- if os.name == "posix":
- self._proc.terminate()
- with contextlib.suppress(subprocess.TimeoutExpired):
- self._proc.wait(timeout=1)
- return False
- if force:
- self._proc.kill()
- return False
-
- def is_alive(self):
- return self._proc is not None and self._proc.poll() is None
-
- def pid(self):
- return self._proc.pid if self._proc else None
-
- def executor_browser(self):
- """This function returns the `ExecutorBrowser` object that is used by other
- processes to interact with content_shell. In our case, this consists of the three
- multiprocessing Queues as well as an `io_stopped` event to signal when the
- underlying pipes have reached EOF.
- """
- return ExecutorBrowser, {"stdout_queue": self._stdout_queue,
- "stderr_queue": self._stderr_queue,
- "stdin_queue": self._stdin_queue,
- "io_stopped": self._io_stopped}
-
- def check_crash(self, process, test):
- return not self.is_alive()
-
- def settings(self, test):
- pac_path = test.environment.get("pac")
- if self._pac_origin and pac_path:
- self._pac = urljoin(self._pac_origin, pac_path)
- return {"pac": self._pac}
- return {}
-
- def _create_reader_thread(self, name, stream, queue, prefix=b""):
- """This creates (and starts) a background thread which reads lines from `stream` and
- puts them into `queue` until `stream` reports EOF.
- """
- def reader_thread(stream, queue, stop_event):
- while True:
- line = stream.readline()
- if not line:
- break
- self._output_handler(prefix + line.rstrip())
- queue.put(line)
-
- stop_event.set()
- queue.close()
- queue.join_thread()
-
- result = Thread(name=name,
- target=reader_thread,
- args=(stream, queue, self._io_stopped),
- daemon=True)
- result.start()
- return result
-
- def _create_writer_thread(self, name, stream, queue):
- """This creates (and starts) a background thread which gets items from `queue` and
- writes them into `stream` until it encounters a None item in the queue.
- """
- def writer_thread(stream, queue):
- while True:
- line = queue.get()
- if not line:
- break
-
- stream.write(line)
- stream.flush()
-
- result = Thread(name=name,
- target=writer_thread,
- args=(stream, queue),
- daemon=True)
- result.start()
- return result
+class ContentShellBrowser(ChromeBrowser):
+ def make_command(self):
+ return [self.webdriver_binary,
+ cmd_arg("port", str(self.port)),
+ cmd_arg("url-base", self.base_path),
+ cmd_arg("enable-chrome-logs")] + self.webdriver_args
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorcontentshell.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorcontentshell.py
deleted file mode 100644
index 82a6aebcdb1..00000000000
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorcontentshell.py
+++ /dev/null
@@ -1,328 +0,0 @@
-# mypy: allow-untyped-defs
-
-from .base import RefTestExecutor, RefTestImplementation, CrashtestExecutor, TestharnessExecutor
-from .executorchrome import make_sanitizer_mixin
-from .protocol import Protocol, ProtocolPart
-from time import time
-from queue import Empty
-from base64 import b64encode
-import json
-
-
-class CrashError(BaseException):
- pass
-
-class LeakError(BaseException):
- pass
-
-def _read_line(io_queue, deadline=None, encoding=None, errors="strict", raise_crash_leak=True):
- """Reads a single line from the io queue. The read must succeed before `deadline` or
- a TimeoutError is raised. The line is returned as a bytestring or optionally with the
- specified `encoding`. If `raise_crash_leak` is set, a CrashError is raised if the line
- happens to be a crash message, or a LeakError is raised if the line happens to be a
- leak message.
- """
- current_time = time()
-
- if deadline and current_time > deadline:
- raise TimeoutError()
-
- try:
- line = io_queue.get(True, deadline - current_time if deadline else None)
- if raise_crash_leak and line.startswith(b"#CRASHED"):
- raise CrashError()
- if raise_crash_leak and line.startswith(b"#LEAK"):
- raise LeakError()
- except Empty as e:
- raise TimeoutError() from e
-
- return line.decode(encoding, errors) if encoding else line
-
-
-class ContentShellTestPart(ProtocolPart):
- """This protocol part is responsible for running tests via content_shell's protocol mode.
-
- For more details, see:
- https://chromium.googlesource.com/chromium/src.git/+/HEAD/content/web_test/browser/test_info_extractor.h
- """
- name = "content_shell_test"
- eof_marker = '#EOF\n' # Marker sent by content_shell after blocks.
-
- def __init__(self, parent):
- super().__init__(parent)
- self.stdout_queue = parent.browser.stdout_queue
- self.stdin_queue = parent.browser.stdin_queue
-
- def do_test(self, command, timeout=None):
- """Send a command to content_shell and return the resulting outputs.
-
- A command consists of a URL to navigate to, followed by an optional
- expected image hash and 'print' mode specifier. The syntax looks like:
- http://web-platform.test:8000/test.html['<hash>['print]]
- """
- self._send_command(command)
-
- deadline = time() + timeout if timeout else None
- # The first block can also contain audio data but not in WPT.
- text = self._read_block(deadline)
- image = self._read_block(deadline)
-
- return text, image
-
- def _send_command(self, command):
- """Sends a single `command`, i.e. a URL to open, to content_shell.
- """
- self.stdin_queue.put((command + "\n").encode("utf-8"))
-
- def _read_block(self, deadline=None):
- """Tries to read a single block of content from stdout before the `deadline`.
- """
- while True:
- line = _read_line(self.stdout_queue, deadline, "latin-1").rstrip()
-
- if line == "Content-Type: text/plain":
- return self._read_text_block(deadline)
-
- if line == "Content-Type: image/png":
- return self._read_image_block(deadline)
-
- if line == "#EOF":
- return None
-
- def _read_text_block(self, deadline=None):
- """Tries to read a plain text block in utf-8 encoding before the `deadline`.
- """
- result = ""
-
- while True:
- line = _read_line(self.stdout_queue, deadline, "utf-8", "replace", False)
-
- if line.endswith(self.eof_marker):
- result += line[:-len(self.eof_marker)]
- break
- elif line.endswith('#EOF\r\n'):
- result += line[:-len('#EOF\r\n')]
- self.logger.warning('Got a CRLF-terminated #EOF - this is a driver bug.')
- break
-
- result += line
-
- return result
-
- def _read_image_block(self, deadline=None):
- """Tries to read an image block (as a binary png) before the `deadline`.
- """
- content_length_line = _read_line(self.stdout_queue, deadline, "utf-8")
- assert content_length_line.startswith("Content-Length:")
- content_length = int(content_length_line[15:])
-
- result = bytearray()
-
- while True:
- line = _read_line(self.stdout_queue, deadline, raise_crash_leak=False)
- excess = len(line) + len(result) - content_length
-
- if excess > 0:
- # This is the line that contains the EOF marker.
- assert excess == len(self.eof_marker)
- result += line[:-excess]
- break
-
- result += line
-
- return result
-
-
-class ContentShellErrorsPart(ProtocolPart):
- """This protocol part is responsible for collecting the errors reported by content_shell.
- """
- name = "content_shell_errors"
-
- def __init__(self, parent):
- super().__init__(parent)
- self.stderr_queue = parent.browser.stderr_queue
-
- def read_errors(self):
- """Reads the entire content of the stderr queue as is available right now (no blocking).
- """
- result = ""
-
- while not self.stderr_queue.empty():
- # There is no potential for race conditions here because this is the only place
- # where we read from the stderr queue.
- result += _read_line(self.stderr_queue, None, "utf-8", "replace", False)
-
- return result
-
-
-class ContentShellBasePart(ProtocolPart):
- """This protocol part provides functionality common to all executors.
-
- In particular, this protocol part implements `wait()`, which, when
- `--pause-after-test` is enabled, test runners block on until the next test
- should run.
- """
- name = "base"
-
- def __init__(self, parent):
- super().__init__(parent)
- self.io_stopped = parent.browser.io_stopped
-
- def wait(self):
- # This worker is unpaused when the browser window is closed, which this
- # `multiprocessing.Event` signals.
- self.io_stopped.wait()
- # Never rerun the test.
- return False
-
-
-class ContentShellProtocol(Protocol):
- implements = [
- ContentShellBasePart,
- ContentShellTestPart,
- ContentShellErrorsPart,
- ]
- init_timeout = 10 # Timeout (seconds) to wait for #READY message.
-
- def connect(self):
- """Waits for content_shell to emit its "#READY" message which signals that it is fully
- initialized. We wait for a maximum of self.init_timeout seconds.
- """
- deadline = time() + self.init_timeout
-
- while True:
- if _read_line(self.browser.stdout_queue, deadline).rstrip() == b"#READY":
- break
-
- def after_connect(self):
- pass
-
- def teardown(self):
- # Close the queue properly to avoid broken pipe spam in the log.
- self.browser.stdin_queue.close()
- self.browser.stdin_queue.join_thread()
-
- def is_alive(self):
- """Checks if content_shell is alive by determining if the IO pipes are still
- open. This does not guarantee that the process is responsive.
- """
- return self.browser.io_stopped.is_set()
-
-
-def _convert_exception(test, exception, errors):
- """Converts our TimeoutError and CrashError exceptions into test results.
- """
- if isinstance(exception, TimeoutError):
- return (test.make_result("EXTERNAL-TIMEOUT", errors), [])
- if isinstance(exception, CrashError):
- return (test.make_result("CRASH", errors), [])
- if isinstance(exception, LeakError):
- # TODO: the internal error is to force a restart, but it doesn't correctly
- # describe what the issue is. Need to find a way to return a "FAIL",
- # and restart the content_shell after the test run.
- return (test.make_result("INTERNAL-ERROR", errors), [])
- raise exception
-
-
-def timeout_for_test(executor, test):
- if executor.debug_info and executor.debug_info.interactive:
- return None
- return test.timeout * executor.timeout_multiplier
-
-
-class ContentShellCrashtestExecutor(CrashtestExecutor):
- def __init__(self, logger, browser, server_config, timeout_multiplier=1, debug_info=None,
- **kwargs):
- super().__init__(logger, browser, server_config, timeout_multiplier, debug_info, **kwargs)
- self.protocol = ContentShellProtocol(self, browser)
-
- def do_test(self, test):
- try:
- _ = self.protocol.content_shell_test.do_test(self.test_url(test),
- timeout_for_test(self, test))
- self.protocol.content_shell_errors.read_errors()
- return self.convert_result(test, {"status": "PASS", "message": None})
- except BaseException as exception:
- return _convert_exception(test, exception, self.protocol.content_shell_errors.read_errors())
-
-
-_SanitizerMixin = make_sanitizer_mixin(ContentShellCrashtestExecutor)
-
-
-class ContentShellRefTestExecutor(RefTestExecutor, _SanitizerMixin): # type: ignore
- def __init__(self, logger, browser, server_config, timeout_multiplier=1, screenshot_cache=None,
- debug_info=None, reftest_screenshot="unexpected", **kwargs):
- super().__init__(logger, browser, server_config, timeout_multiplier, screenshot_cache,
- debug_info, reftest_screenshot, **kwargs)
- self.implementation = RefTestImplementation(self)
- self.protocol = ContentShellProtocol(self, browser)
-
- def reset(self):
- self.implementation.reset()
-
- def do_test(self, test):
- try:
- result = self.implementation.run_test(test)
- self.protocol.content_shell_errors.read_errors()
- return self.convert_result(test, result)
- except BaseException as exception:
- return _convert_exception(test, exception, self.protocol.content_shell_errors.read_errors())
-
- def screenshot(self, test, viewport_size, dpi, page_ranges):
- # Currently, the page size and DPI are hardcoded for print-reftests:
- # https://chromium.googlesource.com/chromium/src/+/4e1b7bc33d42b401d7d9ad1dcba72883add3e2af/content/web_test/renderer/test_runner.cc#100
- # Content shell has an internal `window.testRunner.setPrintingSize(...)`
- # API, but it's not callable with protocol mode.
- assert dpi is None
- command = self.test_url(test)
- if self.is_print:
- # Currently, `content_shell` uses the expected image hash to avoid
- # dumping a matching image as an optimization. In Chromium, the
- # hash can be computed from an expected screenshot checked into the
- # source tree (i.e., without looking at a reference). This is not
- # possible in `wpt`, so pass an empty hash here to force a dump.
- command += "''print"
-
- _, image = self.protocol.content_shell_test.do_test(command,
- timeout_for_test(self, test))
- if not image:
- return False, ("ERROR", self.protocol.content_shell_errors.read_errors())
- return True, b64encode(image).decode()
-
-
-class ContentShellPrintRefTestExecutor(ContentShellRefTestExecutor):
- is_print = True
-
-
-class ContentShellTestharnessExecutor(TestharnessExecutor, _SanitizerMixin): # type: ignore
- # Chromium's `testdriver-vendor.js` partially implements testdriver support
- # with internal APIs [1].
- #
- # [1]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Relying-on-Blink_Specific-Testing-APIs
- supports_testdriver = True
-
- def __init__(self, logger, browser, server_config, timeout_multiplier=1, debug_info=None,
- **kwargs):
- super().__init__(logger, browser, server_config, timeout_multiplier, debug_info, **kwargs)
- self.protocol = ContentShellProtocol(self, browser)
-
- def do_test(self, test):
- try:
- text, _ = self.protocol.content_shell_test.do_test(self.test_url(test),
- timeout_for_test(self, test))
- errors = self.protocol.content_shell_errors.read_errors()
- if not text:
- return (test.make_result("ERROR", errors), [])
-
- result_url, status, message, stack, subtest_results = json.loads(text)
- if result_url != test.url:
- # Suppress `convert_result`'s URL validation.
- # See `testharnessreport-content-shell.js` for details.
- self.logger.warning('Got results from %s, expected %s' % (result_url, test.url))
- self.logger.warning('URL mismatch may be a false positive '
- 'if the test navigates')
- result_url = test.url
- raw_result = result_url, status, message, stack, subtest_results
- return self.convert_result(test, raw_result)
- except BaseException as exception:
- return _convert_exception(test, exception, self.protocol.content_shell_errors.read_errors())
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index b49b9e2b574..6df2d964616 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -614,7 +614,7 @@ class WebDriverTestharnessExecutor(TestharnessExecutor):
# cases where the browser crashes during script execution:
#
# https://github.com/w3c/webdriver/issues/1308
- if not isinstance(result, list) or len(result) != 2:
+ if not isinstance(result, list) or len(result) != 3:
try:
is_alive = self.is_alive()
except error.WebDriverException:
@@ -623,6 +623,16 @@ class WebDriverTestharnessExecutor(TestharnessExecutor):
if not is_alive:
raise Exception("Browser crashed during script execution.")
+ # A user prompt created after starting execution of the resume
+ # script will resolve the script with `null` [1, 2]. In that case,
+ # cycle this event loop and handle the prompt the next time the
+ # resume script executes.
+ #
+ # [1]: Step 5.3 of https://www.w3.org/TR/webdriver/#execute-async-script
+ # [2]: https://www.w3.org/TR/webdriver/#dfn-execute-a-function-body
+ if result is None:
+ continue
+
done, rv = handler(result)
if done:
break
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/metadata.py b/tests/wpt/tests/tools/wptrunner/wptrunner/metadata.py
index b9cb61eb07f..5d7ea2b011a 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/metadata.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/metadata.py
@@ -10,7 +10,6 @@ from six import ensure_str, ensure_text
from sys import intern
from . import manifestupdate
-from . import products
from . import testloader
from . import wptmanifest
from . import wpttest
@@ -57,12 +56,15 @@ def get_properties(properties_file=None, extra_properties=None, config=None, pro
:param properties_file: Path to a JSON file containing properties.
:param extra_properties: List of extra properties to use
- :param config: (deprecated) wptrunner config
- :param Product: (deprecated) product name (requires a config argument to be used)
+ :param config: (deprecated, unused) wptrunner config
+ :param Product: (deprecated) product name
"""
properties = []
dependents = {}
+ if config is not None:
+ logger.warning("Got `config` in metadata.get_properties; this is ignored")
+
if properties_file is not None:
logger.debug(f"Reading update properties from {properties_file}")
try:
@@ -99,12 +101,8 @@ def get_properties(properties_file=None, extra_properties=None, config=None, pro
elif product is not None:
logger.warning("Falling back to getting metadata update properties from wptrunner browser "
"product file, this will be removed")
- if config is None:
- msg = "Must provide a config together with a product"
- logger.critical(msg)
- raise ValueError(msg)
- properties, dependents = products.load_product_update(config, product)
+ properties, dependents = product.update_properties
if extra_properties is not None:
properties.extend(extra_properties)
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/products.py b/tests/wpt/tests/tools/wptrunner/wptrunner/products.py
index c81396f3dd3..9657bde5f5a 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/products.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/products.py
@@ -39,22 +39,11 @@ class Product:
cls = getattr(module, cls_name)
self.executor_classes[test_type] = cls
+ self.update_properties = (getattr(module, data["update_properties"])()
+ if "update_properties" in data else (["product"], {}))
+
+
def get_browser_cls(self, test_type):
if test_type in self._browser_cls:
return self._browser_cls[test_type]
return self._browser_cls[None]
-
-
-def load_product_update(config, product):
- """Return tuple of (property_order, boolean_properties) indicating the
- run_info properties to use when constructing the expectation data for
- this product. None for either key indicates that the default keys
- appropriate for distinguishing based on platform will be used."""
-
- module = product_module(config, product)
- data = module.__wptrunner__
-
- update_properties = (getattr(module, data["update_properties"])()
- if "update_properties" in data else (["product"], {}))
-
- return update_properties
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/update/metadata.py b/tests/wpt/tests/tools/wptrunner/wptrunner/update/metadata.py
index 48519900e7d..f1ab74accfe 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/update/metadata.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/update/metadata.py
@@ -2,25 +2,18 @@
import os
-from .. import metadata, products
+from .. import metadata
from .base import Step, StepRunner
-class GetUpdatePropertyList(Step):
- provides = ["update_properties"]
-
- def create(self, state):
- state.update_properties = products.load_product_update(state.config, state.product.name)
-
-
class UpdateExpected(Step):
"""Do the metadata update on the local checkout"""
def create(self, state):
metadata.update_expected(state.paths,
state.run_log,
- update_properties=state.update_properties,
+ update_properties=state.product.update_properties,
full_update=state.full_update,
disable_intermittent=state.disable_intermittent,
update_intermittent=state.update_intermittent,
@@ -57,6 +50,5 @@ class CreateMetadataPatch(Step):
class MetadataUpdateRunner(StepRunner):
"""(Sub)Runner for updating metadata"""
- steps = [GetUpdatePropertyList,
- UpdateExpected,
+ steps = [UpdateExpected,
CreateMetadataPatch]
diff --git a/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttribute.html b/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttribute.html
index 1d39a804f39..295890f319a 100644
--- a/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttribute.html
+++ b/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttribute.html
@@ -13,10 +13,10 @@
// TrustedScriptURL Assignments
const scriptURLTestCases = [
- [ 'embed', 'src' ],
- [ 'object', 'data' ],
- [ 'object', 'codeBase' ],
- [ 'script', 'src' ]
+ [ 'embed', 'src', INPUTS.SCRIPTURL, RESULTS.SCRIPTURL],
+ [ 'object', 'data', INPUTS.SCRIPTURL, RESULTS.SCRIPTURL ],
+ [ 'object', 'codeBase', INPUTS.SCRIPTURL, RESULTS.SCRIPTURL ],
+ [ 'script', 'src', INPUTS.SCRIPTURL, RESULTS.SCRIPTURL ]
];
scriptURLTestCases.forEach(c => {
@@ -31,12 +31,12 @@
// TrustedHTML Assignments
const HTMLTestCases = [
- [ 'iframe', 'srcdoc' ]
+ [ 'iframe', 'srcdoc' , INPUTS.HTML, RESULTS.HTML]
];
HTMLTestCases.forEach(c => {
test(t => {
- assert_element_accepts_trusted_html_explicit_set(window, c[0] + "-" + c[1], t, c[0], c[1], RESULTS.HTML);
+ assert_element_accepts_trusted_html_explicit_set(window, c[0] + "-" + c[1], t, c[0], c[1], c[3]);
assert_throws_no_trusted_type_explicit_set(c[0], c[1], 'A string');
assert_throws_no_trusted_type_explicit_set(c[0], c[1], null);
assert_throws_no_trusted_type_explicit_set(c[0], c[1], nullPolicy.createScript('script'));
@@ -45,12 +45,12 @@
// TrustedScript Assignments
const ScriptTestCases = [
- [ 'div', 'onclick' ]
+ [ 'div', 'onclick' , INPUTS.SCRIPT, RESULTS.SCRIPT]
];
ScriptTestCases.forEach(c => {
test(t => {
- assert_element_accepts_trusted_script_explicit_set(window, c[0] + "-" + c[1], t, c[0], c[1], RESULTS.SCRIPT);
+ assert_element_accepts_trusted_script_explicit_set(window, c[0] + "-" + c[1], t, c[0], c[1], c[3]);
assert_throws_no_trusted_type_explicit_set(c[0], c[1], 'A string');
assert_throws_no_trusted_type_explicit_set(c[0], c[1], null);
}, c[0] + "." + c[1] + " accepts only TrustedScript");
@@ -70,21 +70,37 @@
let p = window.trustedTypes.createPolicy("default", { createScriptURL: createScriptURLJS, createHTML: createHTMLJS, createScript: createScriptJS }, true);
scriptURLTestCases.forEach(c => {
test(t => {
- assert_element_accepts_trusted_type(c[0], c[1], INPUTS.SCRIPTURL, RESULTS.SCRIPTURL);
+ assert_element_accepts_trusted_type(c[0], c[1], c[2], c[3]);
assert_element_accepts_trusted_type(c[0], c[1], null, window.location.toString().replace(/[^\/]*$/, "null"));
}, c[0] + "." + c[1] + " accepts string and null after default policy was created.");
});
+ scriptURLTestCases.concat(HTMLTestCases).concat(ScriptTestCases).forEach(c => {
+ async_test(t => {
+ const testElement = document.createElement(c[0]);
+
+ const observer = new MutationObserver(t.step_func_done((aMutations, aObserver) => {
+ assert_equals(aMutations.length, 1);
+ const newValue = aMutations[0].target.getAttribute(c[1]);
+ assert_equals(newValue, c[3]);
+ }));
+
+ observer.observe(testElement, { attributes: true});
+
+ testElement.setAttribute(c[1], c[2]);
+ }, c[0] + "." + c[1] + "'s mutationobservers receive the default policy's value.");
+ });
+
HTMLTestCases.forEach(c => {
test(t => {
- assert_element_accepts_trusted_type(c[0], c[1], INPUTS.HTML, RESULTS.HTML);
+ assert_element_accepts_trusted_type(c[0], c[1], c[2], c[3]);
assert_element_accepts_trusted_type(c[0], c[1], null, "null");
}, c[0] + "." + c[1] + " accepts string and null after default policy was created.");
});
ScriptTestCases.forEach(c => {
test(t => {
- assert_element_accepts_trusted_type_explicit_set(c[0], c[1], INPUTS.SCRIPT, RESULTS.SCRIPT);
+ assert_element_accepts_trusted_type_explicit_set(c[0], c[1], c[2], c[3]);
assert_element_accepts_trusted_type_explicit_set(c[0], c[1], null, "null");
}, c[0] + "." + c[1] + " accepts string and null after default policy was created.");
});
diff --git a/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttributeNS.html b/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttributeNS.html
index 346e077a666..b7f74be6b7d 100644
--- a/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttributeNS.html
+++ b/tests/wpt/tests/trusted-types/block-string-assignment-to-Element-setAttributeNS.html
@@ -21,13 +21,15 @@
assert_element_accepts_trusted_script_url_set_ns(window, '2', t, 'a', 'b', RESULTS.SCRIPTURL);
}, "Element.setAttributeNS assigned via policy (successful ScriptURL transformation)");
- // Unknown, namespaced attributes should not be TT checked:
+ const htmlNamespace = "http://www.w3.org/1999/xhtml";
+
+ // Unknown attributes should not be TT checked:
test(t => {
- assert_element_accepts_non_trusted_type_set_ns('a', 'b', 'A string', 'A string');
+ assert_element_accepts_non_trusted_type_set_ns('a', 'b', 'A string', 'A string', htmlNamespace, null);
}, "Element.setAttributeNS accepts untrusted string for non-specced accessor");
test(t => {
- assert_element_accepts_non_trusted_type_set_ns('a', 'b', null, 'null');
+ assert_element_accepts_non_trusted_type_set_ns('a', 'b', null, 'null', htmlNamespace, null);
}, "Element.setAttributeNS accepts null for non-specced accessor");
// Setup trusted values for use in subsequent tests.
@@ -35,26 +37,49 @@
const html = createHTML_policy(window, '6').createHTML(INPUTS.HTML);
const script = createScript_policy(window, '7').createScript(INPUTS.Script);
- const xlink = "http://www.w3.org/1999/xlink";
- const svg = "http://www.w3.org/2000/svg";
+ const xlinkNamespace = "http://www.w3.org/1999/xlink";
+ const svgNamespace = "http://www.w3.org/2000/svg";
// svg:script xlink:href=... expects a TrustedScriptURL.
// Assigning a TrustedScriptURL works.
test(t => {
- let elem = document.createElementNS(svg, "script");
- elem.setAttributeNS(xlink, "href", script_url);
+ let elem = document.createElementNS(svgNamespace, "script");
+ elem.setAttributeNS(xlinkNamespace, "href", script_url);
assert_equals("" + RESULTS.ScriptURL,
- elem.getAttributeNodeNS(xlink, "href").value);
+ elem.getAttributeNodeNS(xlinkNamespace, "href").value);
}, "Assigning TrustedScriptURL to <svg:script xlink:href=...> works");
// Assigning things that ought to not work.
test(t => {
- let elem = document.createElementNS(svg, "script");
+ let elem = document.createElementNS(svgNamespace, "script");
const values = [ "abc", null, html, script ];
for (const v of values) {
assert_throws_js(TypeError, _ => {
- elem.setAttributeNS(xlink, "href", v);
+ elem.setAttributeNS(xlinkNamespace, "href", v);
});
}
}, "Blocking non-TrustedScriptURL assignment to <svg:script xlink:href=...> works");
+
+ // <https://w3c.github.io/trusted-types/dist/spec/#validate-attribute-mutation>.
+ const nonLowerCaseTests = [
+ { element: "iframe", attribute: "SRCDOC", elementNamespace: htmlNamespace },
+ { element: "embed", attribute: "SRC", elementNamespace: htmlNamespace },
+ { element: "script", attribute: "SRC", elementNamespace: htmlNamespace },
+ { element: "object", attribute: "DATA", elementNamespace: htmlNamespace },
+ { element: "object", attribute: "CODEBASE", elementNamespace: htmlNamespace },
+ { element: "script", attribute: "HREF", elementNamespace: svgNamespace },
+ { element: "script", attribute: "HREF", elementNamespace: svgNamespace,
+ attributeNamespace: xlinkNamespace },
+ ];
+
+ for (const testData of nonLowerCaseTests) {
+ const attributeNamespace = testData.attributeNamespace ?? null;
+
+ test(t => {
+ assert_element_accepts_non_trusted_type_set_ns(testData.element, testData.attribute, "v",
+ "v", testData.elementNamespace, attributeNamespace);
+ }, "Check `setAttributeNS` allows setting non-trusted string for non-lowercase attribute \"" +
+ testData.attribute + "\" (ns=" + attributeNamespace + ") for \"" + testData.element +
+ "\" element (ns=" + testData.elementNamespace + ").");
+ }
</script>
diff --git a/tests/wpt/tests/trusted-types/support/helper.sub.js b/tests/wpt/tests/trusted-types/support/helper.sub.js
index 2d1bd436bdf..1775cd985c2 100644
--- a/tests/wpt/tests/trusted-types/support/helper.sub.js
+++ b/tests/wpt/tests/trusted-types/support/helper.sub.js
@@ -125,7 +125,7 @@ function assert_element_accepts_non_trusted_type_explicit_set(tag, attribute, va
assert_equals(elem.getAttribute(attribute), expected);
}
-let namespace = 'http://www.w3.org/1999/xhtml';
+let namespace = null;
function assert_element_accepts_trusted_html_set_ns(win, c, t, tag, attribute, expected) {
let p = createHTML_policy(win, c);
let html = p.createHTML(INPUTS.HTML);
@@ -158,9 +158,10 @@ function assert_throws_no_trusted_type_set_ns(tag, attribute, value) {
});
}
-function assert_element_accepts_non_trusted_type_set_ns(tag, attribute, value, expected) {
- let elem = document.createElement(tag);
- elem.setAttributeNS(namespace, attribute, value);
- let attr_node = elem.getAttributeNodeNS(namespace, attribute);
+function assert_element_accepts_non_trusted_type_set_ns(tag, attribute, value, expected,
+ elementNamespace, attributeNamespace) {
+ let elem = document.createElementNS(elementNamespace, tag);
+ elem.setAttributeNS(attributeNamespace, attribute, value);
+ let attr_node = elem.getAttributeNodeNS(attributeNamespace, attribute);
assert_equals(attr_node.value + "", expected);
}
diff --git a/tests/wpt/tests/trusted-types/support/navigation-report-only-support.html b/tests/wpt/tests/trusted-types/support/navigation-report-only-support.html
index 5f7856fabb7..a16995ba903 100644
--- a/tests/wpt/tests/trusted-types/support/navigation-report-only-support.html
+++ b/tests/wpt/tests/trusted-types/support/navigation-report-only-support.html
@@ -31,7 +31,7 @@
// Navigate to the non-report-only version of the test. That has the same
// event listening setup as this, but is a different target URI.
const target_script = `location.href='${location.href.replace("-report-only", "") + "#continue"}';`;
- const target = `javascript:"<script>${target_script}</scri${""}pt>"`;
+ const target = `javascript:${target_script}`;
// Navigate the anchor, but only after the content is loaded (so that we
// won't disturb delivery of that event to the opener.
diff --git a/tests/wpt/tests/trusted-types/support/navigation-support.html b/tests/wpt/tests/trusted-types/support/navigation-support.html
index 5e02e6d4bf5..c2c8a82f514 100644
--- a/tests/wpt/tests/trusted-types/support/navigation-support.html
+++ b/tests/wpt/tests/trusted-types/support/navigation-support.html
@@ -32,7 +32,7 @@
// re-use the messageing mechanisms above. In order to not end up in a loop,
// we'll only click if we don't find fragment in the current URL.
const target_script = `location.href='${location.href}&continue';`;
- const target = `javascript:"<script>${target_script}</scri${""}pt>"`;
+ const target = `javascript:${target_script}`;
const anchor = document.getElementById("anchor");
anchor.href = target;
diff --git a/tests/wpt/tests/web-animations/testcommon.js b/tests/wpt/tests/web-animations/testcommon.js
index 5b22c658d5c..b431b213dbe 100644
--- a/tests/wpt/tests/web-animations/testcommon.js
+++ b/tests/wpt/tests/web-animations/testcommon.js
@@ -331,7 +331,7 @@ function assert_phase(animation, phase) {
// crbug.com/1378671
async function waitForCompositorReady() {
const animation =
- document.body.animate({ opacity: [ 1, 1 ] }, {duration: 1 });
+ document.body.animate({ opacity: [ 0, 1 ] }, {duration: 1 });
return animation.finished;
}
diff --git a/tests/wpt/tests/webaudio/the-audio-api/the-oscillatornode-interface/crashtests/stop-before-start.html b/tests/wpt/tests/webaudio/the-audio-api/the-oscillatornode-interface/crashtests/stop-before-start.html
new file mode 100644
index 00000000000..89d22c0d18b
--- /dev/null
+++ b/tests/wpt/tests/webaudio/the-audio-api/the-oscillatornode-interface/crashtests/stop-before-start.html
@@ -0,0 +1,16 @@
+<html class="test-wait">
+<head>
+ <title>
+ Test stop() time before start() time on OscillatorNode with AudioParam
+ </title>
+</head>
+<script>
+ const ac = new OfflineAudioContext({length: 136, sampleRate: 48000});
+ const osc = new OscillatorNode(ac);
+ osc.start(61/ac.sampleRate);
+ osc.stop(31/ac.sampleRate);
+ osc.detune.setValueAtTime(2.0, 1/ac.sampleRate);
+ ac.startRendering().then(
+ () => document.documentElement.removeAttribute("class"));
+</script>
+</html>
diff --git a/tests/wpt/tests/webcodecs/audio-data.any.js b/tests/wpt/tests/webcodecs/audio-data.any.js
index 4c2d96ab80e..d5d95064776 100644
--- a/tests/wpt/tests/webcodecs/audio-data.any.js
+++ b/tests/wpt/tests/webcodecs/audio-data.any.js
@@ -2,19 +2,20 @@
// META: script=/common/media.js
// META: script=/webcodecs/utils.js
-var defaultInit =
- {
- timestamp: 1234,
- channels: 2,
- sampleRate: 8000,
- frames: 100,
- }
-
-function
-createDefaultAudioData() {
+var defaultInit = {
+ timestamp: 1234,
+ channels: 2,
+ sampleRate: 8000,
+ frames: 100,
+};
+
+function createDefaultAudioData() {
return make_audio_data(
- defaultInit.timestamp, defaultInit.channels, defaultInit.sampleRate,
- defaultInit.frames);
+ defaultInit.timestamp,
+ defaultInit.channels,
+ defaultInit.sampleRate,
+ defaultInit.frames
+ );
}
test(t => {
@@ -128,230 +129,302 @@ test(t => {
data.close();
}, 'Test we can construct AudioData with a negative timestamp.');
-
-// Each test vector represents two channels of data in the following arbitrary
-// layout: <min, zero, max, min, max / 2, min / 2, zero, max, zero, zero>.
-const testVectorFrames = 5;
-const testVectorChannels = 2;
-const testVectorInterleavedResult =
- [[-1.0, 1.0, 0.5, 0.0, 0.0], [0.0, -1.0, -0.5, 1.0, 0.0]];
-const testVectorPlanarResult =
- [[-1.0, 0.0, 1.0, -1.0, 0.5], [-0.5, 0.0, 1.0, 0.0, 0.0]];
-
-test(t => {
- const INT8_MIN = (-0x7f - 1);
- const INT8_MAX = 0x7f;
- const UINT8_MAX = 0xff;
-
- const testVectorUint8 = [
- 0, -INT8_MIN, UINT8_MAX, 0, INT8_MAX / 2 + 128, INT8_MIN / 2 + 128,
- -INT8_MIN, UINT8_MAX, -INT8_MIN, -INT8_MIN
- ];
-
- let data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Uint8Array(testVectorUint8),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 'u8'
- });
-
- const epsilon = 1.0 / (UINT8_MAX - 1);
-
- let dest = new Float32Array(data.numberOfFrames);
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[0], epsilon, 'interleaved channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[1], epsilon, 'interleaved channel 1');
-
- data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Uint8Array(testVectorUint8),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 'u8-planar'
- });
-
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[0], epsilon, 'planar channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[1], epsilon, 'planar channel 1');
-}, 'Test conversion of uint8 data to float32');
-
-test(t => {
- const INT16_MIN = (-0x7fff - 1);
- const INT16_MAX = 0x7fff;
- const testVectorInt16 = [
- INT16_MIN, 0, INT16_MAX, INT16_MIN, INT16_MAX / 2, INT16_MIN / 2, 0,
- INT16_MAX, 0, 0
- ];
-
- let data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Int16Array(testVectorInt16),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 's16'
- });
-
- const epsilon = 1.0 / (INT16_MAX + 1);
-
- let dest = new Float32Array(data.numberOfFrames);
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[0], epsilon, 'interleaved channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[1], epsilon, 'interleaved channel 1');
-
- data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Int16Array(testVectorInt16),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 's16-planar'
- });
-
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[0], epsilon, 'planar channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[1], epsilon, 'planar channel 1');
-}, 'Test conversion of int16 data to float32');
-
-test(t => {
- const INT32_MIN = (-0x7fffffff - 1);
- const INT32_MAX = 0x7fffffff;
- const testVectorInt32 = [
- INT32_MIN, 0, INT32_MAX, INT32_MIN, INT32_MAX / 2, INT32_MIN / 2, 0,
- INT32_MAX, 0, 0
- ];
-
- let data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Int32Array(testVectorInt32),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 's32'
- });
-
- const epsilon = 1.0 / INT32_MAX;
-
- let dest = new Float32Array(data.numberOfFrames);
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[0], epsilon, 'interleaved channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[1], epsilon, 'interleaved channel 1');
-
- data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Int32Array(testVectorInt32),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 's32-planar'
- });
-
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[0], epsilon, 'planar channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[1], epsilon, 'planar channel 1');
-}, 'Test conversion of int32 data to float32');
-
test(t => {
- const testVectorFloat32 =
- [-1.0, 0.0, 1.0, -1.0, 0.5, -0.5, 0.0, 1.0, 0.0, 0.0];
-
- let data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Float32Array(testVectorFloat32),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 'f32'
- });
-
- const epsilon = 0;
-
- let dest = new Float32Array(data.numberOfFrames);
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[0], epsilon, 'interleaved channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorInterleavedResult[1], epsilon, 'interleaved channel 1');
-
- data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Float32Array(testVectorFloat32),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 'f32-planar'
- });
+ let audio_data_init = {
+ timestamp: 0,
+ data: new Float32Array([1,2,3,4,5,6,7,8]),
+ numberOfFrames: 4,
+ numberOfChannels: 2,
+ sampleRate: 44100,
+ format: 'f32',
+ };
+ let audioData = new AudioData(audio_data_init);
+ let dest = new Float32Array(8);
+ assert_throws_js(
+ RangeError, () => audioData.copyTo(dest, {planeIndex: 1}),
+ 'copyTo from interleaved data with non-zero planeIndex throws');
+ audioData.close();
+}, 'Test that copyTo throws if copying from interleaved with a non-zero planeIndex');
+
+// Indices to pick a particular specific value in a specific sample-format
+const MIN = 0; // Minimum sample value, max amplitude
+const MAX = 1; // Maximum sample value, max amplitude
+const HALF = 2; // Half the maximum sample value, positive
+const NEGATIVE_HALF = 3; // Half the maximum sample value, negative
+const BIAS = 4; // Center of the range, silence
+const DISCRETE_STEPS = 5; // Number of different value for a type.
+
+function pow2(p) {
+ return 2 ** p;
+}
+// Rounding operations for conversion, currently always floor (round towards
+// zero).
+let r = Math.floor.bind(this);
+
+const TEST_VALUES = {
+ u8: [0, 255, 191, 64, 128, 256],
+ s16: [
+ -pow2(15),
+ pow2(15) - 1,
+ r((pow2(15) - 1) / 2),
+ r(-pow2(15) / 2),
+ 0,
+ pow2(16),
+ ],
+ s32: [
+ -pow2(31),
+ pow2(31) - 1,
+ r((pow2(31) - 1) / 2),
+ r(-pow2(31) / 2),
+ 0,
+ pow2(32),
+ ],
+ f32: [-1.0, 1.0, 0.5, -0.5, 0, pow2(24)],
+};
+
+const TEST_TEMPLATE = {
+ channels: 2,
+ frames: 5,
+ // Each test is run with an element of the cartesian product of a pair of
+ // elements of the set of type in [u8, s16, s32, f32]
+ // For each test, this template is copied and the values replaced with the
+ // appropriate values for this particular type.
+ // For each test, copy this template and replace the number by the appropriate
+ // number for this type
+ testInput: [MIN, BIAS, MAX, MIN, HALF, NEGATIVE_HALF, BIAS, MAX, BIAS, BIAS],
+ testVectorInterleavedResult: [
+ [MIN, MAX, HALF, BIAS, BIAS],
+ [BIAS, MIN, NEGATIVE_HALF, MAX, BIAS],
+ ],
+ testVectorPlanarResult: [
+ [MIN, BIAS, MAX, MIN, HALF],
+ [NEGATIVE_HALF, BIAS, MAX, BIAS, BIAS],
+ ],
+};
+
+function isInteger(type) {
+ switch (type) {
+ case "u8":
+ case "s16":
+ case "s32":
+ return true;
+ case "f32":
+ return false;
+ default:
+ throw "invalid type";
+ }
+}
- data.copyTo(dest, {planeIndex: 0, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[0], epsilon, 'planar channel 0');
- data.copyTo(dest, {planeIndex: 1, format: 'f32-planar'});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[1], epsilon, 'planar channel 1');
-}, 'Test conversion of float32 data to float32');
+// This is the complex part: carefully select an acceptable error value
+// depending on various factors: expected destination value, source type,
+// destination type. This is designed to be strict but reachable with simple
+// sample format transformation (no dithering or complex transformation).
+function epsilon(expectedDestValue, sourceType, destType) {
+ // Strict comparison if not converting
+ if (sourceType == destType) {
+ return 0.0;
+ }
+ // There are three cases in which the maximum value cannot be reached, when
+ // converting from a smaller integer sample type to a wider integer sample
+ // type:
+ // - u8 to s16
+ // - u8 to s32
+ // - s16 to u32
+ if (expectedDestValue == TEST_VALUES[destType][MAX]) {
+ if (sourceType == "u8" && destType == "s16") {
+ return expectedDestValue - 32511; // INT16_MAX - 2 << 7 + 1
+ } else if (sourceType == "u8" && destType == "s32") {
+ return expectedDestValue - 2130706432; // INT32_MAX - (2 << 23) + 1
+ } else if (sourceType == "s16" && destType == "s32") {
+ return expectedDestValue - 2147418112; // INT32_MAX - UINT16_MAX
+ }
+ }
+ // Min and bias value are correctly mapped for all integer sample-types
+ if (isInteger(sourceType) && isInteger(destType)) {
+ if (expectedDestValue == TEST_VALUES[destType][MIN] ||
+ expectedDestValue == TEST_VALUES[destType][BIAS]) {
+ return 0.0;
+ }
+ }
+ // If converting from float32 to u8 or s16, allow choosing the rounding
+ // direction. s32 has higher resolution than f32 in [-1.0,1.0] (24 bits of
+ // mantissa)
+ if (!isInteger(sourceType) && isInteger(destType) && destType != "s32") {
+ return 1.0;
+ }
+ // In all other cases, expect an accuracy that depends on the source type and
+ // the destination type.
+ // The resolution of the source type.
+ var sourceResolution = TEST_VALUES[sourceType][DISCRETE_STEPS];
+ // The resolution of the destination type.
+ var destResolution = TEST_VALUES[destType][DISCRETE_STEPS];
+ // Computations should be exact if going from high resolution to low resolution.
+ if (sourceResolution > destResolution) {
+ return 0.0;
+ } else {
+ // Something that approaches the precision imbalance
+ return destResolution / sourceResolution;
+ }
+}
-test(t => {
- const testVectorFloat32 =
- [-1.0, 0.0, 1.0, -1.0, 0.5, -0.5, 0.0, 1.0, 0.0, 0.0];
+// Fill the template above with the values for a particular type
+function get_type_values(type) {
+ let cloned = structuredClone(TEST_TEMPLATE);
+ cloned.testInput = Array.from(
+ cloned.testInput,
+ idx => TEST_VALUES[type][idx]
+ );
+ cloned.testVectorInterleavedResult = Array.from(
+ cloned.testVectorInterleavedResult,
+ c => {
+ return Array.from(c, idx => {
+ return TEST_VALUES[type][idx];
+ });
+ }
+ );
+ cloned.testVectorPlanarResult = Array.from(
+ cloned.testVectorPlanarResult,
+ c => {
+ return Array.from(c, idx => {
+ return TEST_VALUES[type][idx];
+ });
+ }
+ );
+ return cloned;
+}
- let data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Float32Array(testVectorFloat32),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 'f32'
- });
+function typeToArrayType(type) {
+ switch (type) {
+ case "u8":
+ return Uint8Array;
+ case "s16":
+ return Int16Array;
+ case "s32":
+ return Int32Array;
+ case "f32":
+ return Float32Array;
+ default:
+ throw "Unexpected";
+ }
+}
- const epsilon = 0;
+function arrayTypeToType(array) {
+ switch (array.constructor) {
+ case Uint8Array:
+ return "u8";
+ case Int16Array:
+ return "s16";
+ case Int32Array:
+ return "s32";
+ case Float32Array:
+ return "f32";
+ default:
+ throw "Unexpected";
+ }
+}
- // Call copyTo() without specifying a format, for interleaved data.
- let dest = new Float32Array(data.numberOfFrames * testVectorChannels);
- data.copyTo(dest, {planeIndex: 0});
- assert_array_approx_equals(
- dest, testVectorFloat32, epsilon, 'interleaved data');
+function check_array_equality(values, expected, sourceType, message, assert_func) {
+ if (values.length != expected.length) {
+ throw "Array not of the same length";
+ }
+ for (var i = 0; i < values.length; i++) {
+ var eps = epsilon(expected[i], sourceType, arrayTypeToType(values));
+ assert_func(
+ Math.abs(expected[i] - values[i]) <= eps,
+ `Got ${values[i]} but expected result ${
+ expected[i]
+ } at index ${i} when converting from ${sourceType} to ${arrayTypeToType(
+ values
+ )}, epsilon ${eps}`
+ );
+ }
+ assert_func(
+ true,
+ `${values} is equal to ${expected} when converting from ${sourceType} to ${arrayTypeToType(
+ values
+ )}`
+ );
+}
- assert_throws_js(RangeError, () => {
- data.copyTo(dest, {planeIndex: 1});
- }, 'Interleaved AudioData cannot copy out planeIndex > 0');
+function conversionTest(sourceType, destinationType) {
+ test(function (t) {
+ var test = get_type_values(sourceType);
+ var result = get_type_values(destinationType);
+
+ var sourceArrayCtor = typeToArrayType(sourceType);
+ var destArrayCtor = typeToArrayType(destinationType);
+
+ let data = new AudioData({
+ timestamp: defaultInit.timestamp,
+ data: new sourceArrayCtor(test.testInput),
+ numberOfFrames: test.frames,
+ numberOfChannels: test.channels,
+ sampleRate: defaultInit.sampleRate,
+ format: sourceType,
+ });
+
+ // All conversions can be supported, but conversion of any type to f32-planar
+ // MUST be supported.
+ var assert_func = destinationType == "f32" ? assert_true : assert_implements_optional;
+ let dest = new destArrayCtor(data.numberOfFrames);
+ data.copyTo(dest, { planeIndex: 0, format: destinationType + "-planar" });
+ check_array_equality(
+ dest,
+ result.testVectorInterleavedResult[0],
+ sourceType,
+ "interleaved channel 0",
+ assert_func
+ );
+ data.copyTo(dest, { planeIndex: 1, format: destinationType + "-planar" });
+ check_array_equality(
+ dest,
+ result.testVectorInterleavedResult[1],
+ sourceType,
+ "interleaved channel 0",
+ assert_func
+ );
+ let destInterleaved = new destArrayCtor(data.numberOfFrames * data.numberOfChannels);
+ data.copyTo(destInterleaved, { planeIndex: 0, format: destinationType });
+ check_array_equality(
+ destInterleaved,
+ result.testInput,
+ sourceType,
+ "copyTo from interleaved to interleaved (conversion only)",
+ assert_implements_optional
+ );
+
+ data = new AudioData({
+ timestamp: defaultInit.timestamp,
+ data: new sourceArrayCtor(test.testInput),
+ numberOfFrames: test.frames,
+ numberOfChannels: test.channels,
+ sampleRate: defaultInit.sampleRate,
+ format: sourceType + "-planar",
+ });
+
+ data.copyTo(dest, { planeIndex: 0, format: destinationType + "-planar" });
+ check_array_equality(
+ dest,
+ result.testVectorPlanarResult[0],
+ sourceType,
+ "planar channel 0",
+ assert_func,
+ );
+ data.copyTo(dest, { planeIndex: 1, format: destinationType + "-planar" });
+ check_array_equality(
+ dest,
+ result.testVectorPlanarResult[1],
+ sourceType,
+ "planar channel 1",
+ assert_func
+ );
+ // Planar to interleaved isn't supported
+ }, `Test conversion of ${sourceType} to ${destinationType}`);
+}
- data = new AudioData({
- timestamp: defaultInit.timestamp,
- data: new Float32Array(testVectorFloat32),
- numberOfFrames: testVectorFrames,
- numberOfChannels: testVectorChannels,
- sampleRate: defaultInit.sampleRate,
- format: 'f32-planar'
+const TYPES = ["u8", "s16", "s32", "f32"];
+ TYPES.forEach(sourceType => {
+ TYPES.forEach(destinationType => {
+ conversionTest(sourceType, destinationType);
});
-
- // Call copyTo() without specifying a format, for planar data.
- dest = new Float32Array(data.numberOfFrames);
- data.copyTo(dest, {planeIndex: 0});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[0], epsilon, 'planar channel 0');
- data.copyTo(dest, {planeIndex: 1});
- assert_array_approx_equals(
- dest, testVectorPlanarResult[1], epsilon, 'planar channel 1');
-}, 'Test copying out planar and interleaved data');
+});
diff --git a/tests/wpt/tests/webdriver/tests/bidi/external/permissions/set_permission/set_permission.py b/tests/wpt/tests/webdriver/tests/bidi/external/permissions/set_permission/set_permission.py
index dc6ca14a8d5..92ebed1e634 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/external/permissions/set_permission/set_permission.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/external/permissions/set_permission/set_permission.py
@@ -96,7 +96,22 @@ async def test_set_permission_new_context(bidi_session, new_tab, url):
@pytest.mark.parametrize("origin", ['UNKNOWN', ''])
-async def test_set_permission_origin_unknown(bidi_session, new_tab, origin):
+async def test_set_permission_origin_unknown(bidi_session, new_tab, origin, url):
+ test_url = url("/common/blank.html", protocol="https")
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=test_url,
+ wait="complete",
+ )
+
+ # Ensure permission for the tab is prompt.
+ tab_origin = await get_context_origin(bidi_session, new_tab)
+ await bidi_session.permissions.set_permission(
+ descriptor={"name": "geolocation"},
+ state="prompt",
+ origin=tab_origin,
+ )
+
await bidi_session.permissions.set_permission(
descriptor={"name": "geolocation"},
state="granted",
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/invalid.py
index 187fd9890e1..0821ba7782e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/invalid.py
@@ -147,7 +147,8 @@ async def test_params_url_patterns_pattern_protocol_file_invalid_value(bidi_sess
with pytest.raises(error.InvalidArgumentException):
await bidi_session.network.add_intercept(
phases=["beforeRequestSent"],
- url_patterns=[{"type": "pattern", "protocol": value, "hostname": "example.com"}],
+ url_patterns=[
+ {"type": "pattern", "protocol": value, "hostname": "example.com"}],
)
@@ -190,13 +191,17 @@ async def test_params_url_patterns_pattern_search_invalid_value(bidi_session, va
@pytest.mark.parametrize("value", [False, 42, {}, ""])
async def test_params_contexts_invalid_type(bidi_session, value):
with pytest.raises(error.InvalidArgumentException):
- await bidi_session.network.add_intercept(phases=[value])
+ await bidi_session.network.add_intercept(phases=["beforeRequestSent"], contexts=value)
-@pytest.mark.parametrize("value", [[], ["does not exist"]])
-async def test_params_contexts_invalid_value(bidi_session, value):
+async def test_params_contexts_empty_list(bidi_session):
with pytest.raises(error.InvalidArgumentException):
- await bidi_session.network.add_intercept(phases=["beforeRequestSent"], contexts=value)
+ await bidi_session.network.add_intercept(phases=["beforeRequestSent"], contexts=[])
+
+
+async def test_params_contexts_context_invalid_value(bidi_session):
+ with pytest.raises(error.NoSuchFrameException):
+ await bidi_session.network.add_intercept(phases=["beforeRequestSent"], contexts=["does not exist"])
async def test_params_contexts_context_non_top_level(bidi_session, new_tab, test_page_same_origin_frame):
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py
index dd322a23405..0df3e9e86af 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/add_intercept/phase_auth_required.py
@@ -1,9 +1,6 @@
import pytest
-from .. import (
- assert_before_request_sent_event,
- assert_response_event,
-)
+import asyncio
from .. import (
assert_before_request_sent_event,
@@ -26,7 +23,14 @@ async def test_basic_authentication(
url,
setup_network_test,
add_intercept,
+ fetch,
):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=url(PAGE_EMPTY_TEXT),
+ wait="complete",
+ )
+
network_events = await setup_network_test(
events=[
BEFORE_REQUEST_SENT_EVENT,
@@ -49,11 +53,8 @@ async def test_basic_authentication(
assert isinstance(intercept, str)
on_auth_required = wait_for_event(AUTH_REQUIRED_EVENT)
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"],
- url=auth_url,
- wait="none",
- )
+ # The fetch should fails as there is no authentication
+ asyncio.ensure_future(fetch(url=auth_url, context=new_tab))
await wait_for_future_safe(on_auth_required)
expected_request = {"method": "GET", "url": auth_url}
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py
index 9a24946cde9..4f5c836280d 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/auth_required.py
@@ -1,12 +1,20 @@
import pytest
+import asyncio
+
from .. import assert_response_event, AUTH_REQUIRED_EVENT, PAGE_EMPTY_HTML
@pytest.mark.asyncio
async def test_subscribe_status(
- bidi_session, new_tab, subscribe_events, wait_for_event, wait_for_future_safe, url
+ bidi_session, new_tab, subscribe_events, wait_for_event, wait_for_future_safe, url, fetch
):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=url(PAGE_EMPTY_HTML),
+ wait="complete",
+ )
+
await subscribe_events(events=[AUTH_REQUIRED_EVENT])
# Track all received network.authRequired events in the events array.
@@ -15,7 +23,8 @@ async def test_subscribe_status(
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener(AUTH_REQUIRED_EVENT, on_event)
+ remove_listener = bidi_session.add_event_listener(
+ AUTH_REQUIRED_EVENT, on_event)
auth_url = url(
"/webdriver/tests/support/http_handlers/authentication.py?realm=testrealm"
@@ -23,13 +32,7 @@ async def test_subscribe_status(
on_auth_required = wait_for_event(AUTH_REQUIRED_EVENT)
- # navigate using wait="none" as other wait conditions would hang because of
- # the authentication prompt.
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"],
- url=auth_url,
- wait="none",
- )
+ asyncio.ensure_future(fetch(url=auth_url, context=new_tab))
await wait_for_future_safe(on_auth_required)
@@ -63,7 +66,8 @@ async def test_no_authentication(
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener(AUTH_REQUIRED_EVENT, on_event)
+ remove_listener = bidi_session.add_event_listener(
+ AUTH_REQUIRED_EVENT, on_event)
# Navigate to a page which should not trigger any authentication.
await bidi_session.browsing_context.navigate(
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py
index cf818fee6f5..0bbf8df2667 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/auth_required/unsubscribe.py
@@ -1,15 +1,22 @@
-import asyncio
-
import pytest
-pytestmark = pytest.mark.asyncio
+import asyncio
+
+from webdriver.bidi.modules.script import ScriptEvaluateResultException
from .. import AUTH_REQUIRED_EVENT, PAGE_EMPTY_HTML
+pytestmark = pytest.mark.asyncio
# This test can be moved back to `auth_required.py` when all implementations
# support handing of HTTP auth prompt.
-async def test_unsubscribe(bidi_session, new_tab, url):
+async def test_unsubscribe(bidi_session, new_tab, url, fetch):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=url(PAGE_EMPTY_HTML),
+ wait="complete",
+ )
+
await bidi_session.session.subscribe(events=[AUTH_REQUIRED_EVENT])
await bidi_session.session.unsubscribe(events=[AUTH_REQUIRED_EVENT])
@@ -19,17 +26,13 @@ async def test_unsubscribe(bidi_session, new_tab, url):
async def on_event(method, data):
events.append(data)
- remove_listener = bidi_session.add_event_listener(AUTH_REQUIRED_EVENT, on_event)
+ remove_listener = bidi_session.add_event_listener(
+ AUTH_REQUIRED_EVENT, on_event)
+
+ asyncio.ensure_future(fetch(url=url(
+ "/webdriver/tests/support/http_handlers/authentication.py?realm=testrealm"
+ ), context=new_tab))
- # Navigate to authentication.py again and check no event is received.
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"],
- url=url(
- "/webdriver/tests/support/http_handlers/authentication.py?realm=testrealm"
- ),
- wait="none",
- )
- await asyncio.sleep(0.5)
assert len(events) == 0
remove_listener()
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py b/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py
index 40fe20ddfe9..7813530c4cc 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/conftest.py
@@ -144,6 +144,7 @@ async def setup_blocked_request(
add_intercept,
fetch,
wait_for_event,
+ wait_for_future_safe,
top_context,
):
"""Creates an intercept for the provided phase, sends a fetch request that
@@ -190,16 +191,17 @@ async def setup_blocked_request(
],
)
+ network_event = wait_for_event(f"network.{phase}")
if navigate:
asyncio.ensure_future(
bidi_session.browsing_context.navigate(
- context=top_context["context"], url=blocked_url, wait="complete"
+ context=context["context"], url=blocked_url, wait="complete"
)
)
else:
- asyncio.ensure_future(fetch(blocked_url))
+ asyncio.ensure_future(fetch(blocked_url, context=context))
- event = await wait_for_event(f"network.{phase}")
+ event = await wait_for_future_safe(network_event)
request = event["request"]["request"]
return request
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/credentials.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/credentials.py
index 3e595722cc3..499c8a28c12 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/credentials.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_response/credentials.py
@@ -11,7 +11,7 @@ pytestmark = pytest.mark.asyncio
@pytest.mark.parametrize("navigate", [False, True], ids=["fetch", "navigate"])
async def test_wrong_credentials(
- 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
):
username = f"test_missing_credentials_{navigate}"
password = f"test_missing_credentials_password_{navigate}"
@@ -27,12 +27,12 @@ async def test_wrong_credentials(
await bidi_session.network.continue_response(
request=request, credentials=wrong_credentials
)
- await on_auth_required
+ await wait_for_future_safe(on_auth_required)
@pytest.mark.parametrize("navigate", [False, True], ids=["fetch", "navigate"])
async def test_correct_credentials(
- 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_wrong_credentials_{navigate}"
@@ -64,15 +64,17 @@ async def test_correct_credentials(
await bidi_session.network.continue_response(
request=request, credentials=correct_credentials
)
- await on_response_completed
+ await wait_for_future_safe(on_response_completed)
if navigate:
- await on_load
-
- # Wait until 2 responseCompleted events have been emitted:
- # - one for the initial request
- # - one for the continue with correct credentials
- wait = AsyncPoll(bidi_session, timeout=2)
- await wait.until(lambda _: len(response_completed_events) >= 2)
- assert len(response_completed_events) == 2
+ await wait_for_future_safe(on_load)
+
+ # TODO: At the moment, the specification does not expect to receive a
+ # responseCompleted event for each authentication attempt, so only assert
+ # the last event. See https://github.com/w3c/webdriver-bidi/issues/627
+
+ # Wait until a a responseCompleted event with status 200 OK is received.
+ wait = AsyncPoll(
+ bidi_session, message="Didn't receive response completed events")
+ await wait.until(lambda _: len(response_completed_events) > 0 and response_completed_events[-1]["response"]["status"] == 200)
remove_listener()
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/action.py b/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/action.py
index a122ce0e492..e4cf6da08f4 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/action.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/continue_with_auth/action.py
@@ -7,7 +7,6 @@ from tests.support.sync import AsyncPoll
from .. import (
assert_response_event,
AUTH_REQUIRED_EVENT,
- PAGE_EMPTY_TEXT,
RESPONSE_COMPLETED_EVENT,
)
@@ -15,7 +14,7 @@ pytestmark = pytest.mark.asyncio
async def test_cancel(
- setup_blocked_request, subscribe_events, wait_for_event, bidi_session, url
+ setup_blocked_request, subscribe_events, wait_for_event, bidi_session, wait_for_future_safe
):
request = await setup_blocked_request("authRequired")
await subscribe_events(events=[RESPONSE_COMPLETED_EVENT])
@@ -24,7 +23,7 @@ async def test_cancel(
await bidi_session.network.continue_with_auth(request=request, action="cancel")
await on_response_completed
- response_event = await on_response_completed
+ response_event = await wait_for_future_safe(on_response_completed)
assert_response_event(
response_event,
expected_response={
@@ -35,7 +34,7 @@ async def test_cancel(
async def test_default(
- setup_blocked_request, subscribe_events, wait_for_event, bidi_session, url
+ setup_blocked_request, subscribe_events, bidi_session
):
request = await setup_blocked_request("authRequired")
@@ -64,7 +63,7 @@ async def test_default(
async def test_provideCredentials(
- setup_blocked_request, subscribe_events, bidi_session, url
+ setup_blocked_request, subscribe_events, bidi_session
):
# Setup unique username / password because browsers cache credentials.
username = "test_provideCredentials"
@@ -101,7 +100,7 @@ async def test_provideCredentials(
async def test_provideCredentials_wrong_credentials(
- setup_blocked_request, subscribe_events, bidi_session, wait_for_event, url
+ setup_blocked_request, subscribe_events, bidi_session, wait_for_event, wait_for_future_safe
):
# Setup unique username / password because browsers cache credentials.
username = "test_provideCredentials_wrong_credentials"
@@ -129,7 +128,7 @@ async def test_provideCredentials_wrong_credentials(
)
# We expect to get another authRequired event after providing wrong credentials
- await on_auth_required
+ await wait_for_future_safe(on_auth_required)
# Continue with the correct credentials
correct_credentials = AuthCredentials(username=username, password=password)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py
index dec743e1755..fb99073fb33 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py
@@ -245,6 +245,11 @@ async def test_response_mime_type_file(
async def test_www_authenticate(
bidi_session, url, fetch, new_tab, wait_for_event, wait_for_future_safe, setup_network_test
):
+ await bidi_session.browsing_context.navigate(
+ context=new_tab["context"],
+ url=url(PAGE_EMPTY_HTML),
+ wait="complete",
+ )
auth_url = url(
"/webdriver/tests/support/http_handlers/authentication.py?realm=testrealm"
)
@@ -253,11 +258,8 @@ async def test_www_authenticate(
events = network_events[RESPONSE_STARTED_EVENT]
on_response_started = wait_for_event(RESPONSE_STARTED_EVENT)
- await bidi_session.browsing_context.navigate(
- context=new_tab["context"],
- url=auth_url,
- wait="none",
- )
+
+ asyncio.ensure_future(fetch(url=auth_url, context=new_tab))
await wait_for_future_safe(on_response_started)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py
index 0d7cea96bce..4ca0f7bdd7e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/__init__.py
@@ -1,7 +1,7 @@
from datetime import datetime, timedelta, timezone
from typing import Optional
from webdriver.bidi.modules.network import NetworkBytesValue, NetworkStringValue
-from webdriver.bidi.modules.storage import PartialCookie, PartitionDescriptor
+from webdriver.bidi.modules.storage import PartialCookie, PartitionDescriptor, BrowsingContextPartitionDescriptor
from .. import any_int, recursive_compare
COOKIE_NAME = 'SOME_COOKIE_NAME'
@@ -88,3 +88,11 @@ def format_expiry_string(date):
# same formatting as Date.toUTCString() in javascript
utc_string_format = "%a, %d %b %Y %H:%M:%S GMT"
return date.strftime(utc_string_format)
+
+
+async def get_default_partition_key(bidi_session, context=None):
+ if context is None:
+ result = await bidi_session.storage.get_cookies()
+ else:
+ result = await bidi_session.storage.get_cookies(partition=BrowsingContextPartitionDescriptor(context))
+ return result['partitionKey']
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py
index eff2f00dd32..7bfb743cfcf 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/filter.py
@@ -7,6 +7,7 @@ from .. import (
assert_cookie_is_set,
create_cookie,
format_expiry_string,
+ get_default_partition_key,
generate_expiry_date,
)
@@ -51,7 +52,9 @@ async def test_filter(
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -100,7 +103,9 @@ async def test_filter_domain(
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -174,7 +179,9 @@ async def test_filter_expiry(
result = await bidi_session.storage.delete_cookies(
filter=CookieFilter(expiry=expiry_to_delete),
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -218,7 +225,9 @@ async def test_filter_name(bidi_session, new_tab, test_page, add_cookie, domain_
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -285,7 +294,9 @@ async def test_filter_same_site(
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -347,7 +358,9 @@ async def test_filter_secure(
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -412,7 +425,9 @@ async def test_filter_path(
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
@@ -482,7 +497,9 @@ async def test_filter_http_only(
result = await bidi_session.storage.delete_cookies(
filter=filter,
)
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, filter)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py
index 0b3726142cb..bf23abb720c 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/delete_cookies/partition.py
@@ -8,7 +8,7 @@ from webdriver.bidi.modules.storage import (
)
from . import assert_cookies_are_not_present
-from .. import assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_set, create_cookie, get_default_partition_key
from ... import recursive_compare
pytestmark = pytest.mark.asyncio
@@ -63,7 +63,9 @@ async def test_default_partition(
)
result = await bidi_session.storage.delete_cookies()
- assert result == {"partitionKey": {}}
+ assert result == {
+ "partitionKey": (await get_default_partition_key(bidi_session))
+ }
await assert_cookies_are_not_present(bidi_session)
@@ -102,9 +104,7 @@ async def test_partition_context(
)
result = await bidi_session.storage.delete_cookies(partition=partition)
- # `partitionKey` here might contain `sourceOrigin` for certain browser implementation,
- # so use `recursive_compare` to allow additional fields to be present.
- recursive_compare({"partitionKey": {}}, result)
+ assert result == {"partitionKey": (await get_default_partition_key(bidi_session, new_tab["context"]))}
await assert_cookies_are_not_present(bidi_session, partition)
@@ -135,9 +135,7 @@ async def test_partition_context_iframe(
)
result = await bidi_session.storage.delete_cookies(partition=frame_partition)
- # `partitionKey` here might contain `sourceOrigin` for certain browser implementation,
- # so use `recursive_compare` to allow additional fields to be present.
- recursive_compare({"partitionKey": {}}, result)
+ assert result == {"partitionKey": (await get_default_partition_key(bidi_session, new_tab["context"]))}
await assert_cookies_are_not_present(bidi_session, frame_partition)
@@ -201,7 +199,12 @@ async def test_partition_source_origin(
)
result = await bidi_session.storage.delete_cookies(partition=cookie1_partition)
- recursive_compare({"partitionKey": {"sourceOrigin": cookie1_source_origin}}, result)
+ assert result == {
+ "partitionKey": {
+ **(await get_default_partition_key(bidi_session)),
+ "sourceOrigin": cookie1_source_origin
+ }
+ }
await assert_cookies_are_not_present(bidi_session, partition=cookie1_partition)
@@ -284,7 +287,12 @@ async def test_partition_user_context(
result = await bidi_session.storage.delete_cookies(
partition=StorageKeyPartitionDescriptor(user_context=user_context_1)
)
- recursive_compare({"partitionKey": {"userContext": user_context_1}}, result)
+ assert result == {
+ "partitionKey": {
+ **(await get_default_partition_key(bidi_session)),
+ "userContext": user_context_1
+ }
+ }
# Make sure that deleted cookies are not present.
await assert_cookies_are_not_present(bidi_session, partition=cookie1_partition)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py
index b244ef86ac2..efa22f7dc9a 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/get_cookies/filter.py
@@ -2,7 +2,7 @@ import pytest
from webdriver.bidi.modules.network import NetworkBase64Value, NetworkStringValue
from webdriver.bidi.modules.storage import CookieFilter
-from .. import create_cookie, format_expiry_string, generate_expiry_date
+from .. import create_cookie, format_expiry_string, get_default_partition_key, generate_expiry_date
from ... import recursive_compare
pytestmark = pytest.mark.asyncio
@@ -37,7 +37,9 @@ async def test_filter(
filter=filter,
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
# Provide consistent cookies order.
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
@@ -102,7 +104,9 @@ async def test_filter_domain(
filter=CookieFilter(domain=domain),
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
# Provide consistent cookies order.
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
@@ -191,7 +195,9 @@ async def test_filter_expiry(
filter=CookieFilter(expiry=cookie1_expiry),
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
# Provide consistent cookies order.
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
@@ -303,7 +309,9 @@ async def test_filter_same_site(
filter=CookieFilter(same_site=same_site_1),
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
# Provide consistent cookies order.
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
@@ -371,7 +379,9 @@ async def test_filter_secure(
filter=CookieFilter(secure=secure_1),
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
# Provide consistent cookies order.
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
@@ -449,7 +459,9 @@ async def test_filter_path(
filter=CookieFilter(path=path_1),
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
recursive_compare(
@@ -528,7 +540,9 @@ async def test_filter_http_only(
filter=CookieFilter(http_only=http_only_1),
)
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["name"])
recursive_compare(
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 fb1755421ec..1af0cfb759c 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
@@ -6,7 +6,7 @@ from webdriver.bidi.modules.storage import (
StorageKeyPartitionDescriptor,
)
-from .. import create_cookie
+from .. import create_cookie, get_default_partition_key
from ... import recursive_compare
pytestmark = pytest.mark.asyncio
@@ -38,7 +38,9 @@ async def test_default_partition(
cookies = await bidi_session.storage.get_cookies()
- assert cookies["partitionKey"] == {}
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session)),
+ }
assert len(cookies["cookies"]) == 2
# Provide consistent cookies order.
(cookie_1, cookie_2) = sorted(cookies["cookies"], key=lambda c: c["domain"])
@@ -101,10 +103,10 @@ async def test_partition_context(
partition=BrowsingContextPartitionDescriptor(new_tab["context"])
)
- # `partitionKey` here might contain `sourceOrigin` for certain browser implementation,
- # so use `recursive_compare` to allow additional fields to be present.
- recursive_compare({"partitionKey": {"userContext": "default"}}, cookies)
-
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session, new_tab["context"])),
+ "userContext": "default"
+ }
assert len(cookies["cookies"]) == 1
recursive_compare(
{
@@ -125,9 +127,10 @@ async def test_partition_context(
partition=BrowsingContextPartitionDescriptor(new_context["context"])
)
- # `partitionKey` here might contain `sourceOrigin` for certain browser implementation,
- # so use `recursive_compare` to allow additional fields to be present.
- recursive_compare({"partitionKey": {"userContext": user_context}}, cookies)
+ assert cookies["partitionKey"] == {
+ **(await get_default_partition_key(bidi_session, new_context["context"])),
+ "userContext": user_context
+ }
assert len(cookies["cookies"]) == 0
@@ -362,13 +365,3 @@ async def test_partition_user_context(
},
result,
)
-
- # Check that added cookies will also be returned when partition is not specified.
- result = await bidi_session.storage.get_cookies()
- recursive_compare(
- {
- "cookies": expected_cookies,
- "partitionKey": {},
- },
- result,
- )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py
index 4e49479a871..7aac38da695 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_expiry.py
@@ -1,5 +1,5 @@
import pytest
-from .. import assert_cookie_is_not_set, assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_not_set, assert_cookie_is_set, create_cookie, get_default_partition_key
from datetime import datetime, timedelta
import time
@@ -13,7 +13,7 @@ async def test_cookie_expiry_unset(bidi_session, set_cookie, test_page, domain_v
expiry=None))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
await assert_cookie_is_set(bidi_session, expiry=None, domain=domain_value())
@@ -29,7 +29,7 @@ async def test_cookie_expiry_future(bidi_session, set_cookie, test_page, domain_
expiry=tomorrow_timestamp))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
await assert_cookie_is_set(bidi_session, expiry=tomorrow_timestamp, domain=domain_value())
@@ -45,7 +45,7 @@ async def test_cookie_expiry_past(bidi_session, set_cookie, test_page, domain_va
expiry=yesterday_timestamp))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
await assert_cookie_is_not_set(bidi_session)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py
index 4473fbf576c..b2155d1ac20 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_http_only.py
@@ -1,5 +1,5 @@
import pytest
-from .. import assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_set, create_cookie, get_default_partition_key
pytestmark = pytest.mark.asyncio
@@ -16,7 +16,7 @@ async def test_cookie_http_only(bidi_session, set_cookie, test_page, domain_valu
cookie=create_cookie(domain=domain_value(), http_only=http_only))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
# `httpOnly` defaults to `false`.
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py
index 727d24348a5..70084dee6e5 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_path.py
@@ -1,5 +1,5 @@
import pytest
-from .. import assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_set, create_cookie, get_default_partition_key
pytestmark = pytest.mark.asyncio
@@ -17,7 +17,7 @@ async def test_cookie_path(bidi_session, test_page, set_cookie, domain_value, pa
set_cookie_result = await set_cookie(cookie=create_cookie(domain=domain_value(), path=path))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
# `path` defaults to "/".
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py
index dfc94c57270..27640bb9a6a 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_same_site.py
@@ -1,5 +1,5 @@
import pytest
-from .. import assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_set, create_cookie, get_default_partition_key
pytestmark = pytest.mark.asyncio
@@ -18,7 +18,7 @@ async def test_cookie_secure(bidi_session, set_cookie, test_page, domain_value,
cookie=create_cookie(domain=domain_value(), same_site=same_site))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
# `same_site` defaults to "none".
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py
index ef1060cb46e..81e462c87cc 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/cookie_secure.py
@@ -1,5 +1,5 @@
import pytest
-from .. import assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_set, create_cookie, get_default_partition_key
pytestmark = pytest.mark.asyncio
@@ -17,7 +17,7 @@ async def test_cookie_secure(bidi_session, set_cookie, test_page, domain_value,
cookie=create_cookie(domain=domain_value(), secure=secure))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
# `secure` defaults to `false`.
diff --git a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py
index 4cb712b3724..295b09c10e9 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/storage/set_cookie/page_protocols.py
@@ -1,6 +1,6 @@
import pytest
from urllib.parse import urlparse
-from .. import assert_cookie_is_set, create_cookie
+from .. import assert_cookie_is_set, create_cookie, get_default_partition_key
pytestmark = pytest.mark.asyncio
@@ -18,7 +18,7 @@ async def test_page_protocols(bidi_session, set_cookie, get_test_page, protocol)
set_cookie_result = await set_cookie(cookie=create_cookie(domain=domain))
assert set_cookie_result == {
- 'partitionKey': {},
+ 'partitionKey': (await get_default_partition_key(bidi_session)),
}
# Assert the cookie is actually set.
diff --git a/tests/wpt/tests/webdriver/tests/classic/new_session/response.py b/tests/wpt/tests/webdriver/tests/classic/new_session/response.py
index 43a8d579311..fa8d56c4493 100644
--- a/tests/wpt/tests/webdriver/tests/classic/new_session/response.py
+++ b/tests/wpt/tests/webdriver/tests/classic/new_session/response.py
@@ -42,3 +42,10 @@ def test_capability_default_value(session, capability, default_value):
assert isinstance(session.capabilities, dict)
assert capability in session.capabilities
assert session.capabilities[capability] == default_value
+
+
+def test_capability_user_agent(session):
+ assert isinstance(session.capabilities, dict)
+ assert "userAgent" in session.capabilities
+ assert type(session.capabilities["userAgent"]) == str
+ assert len(session.capabilities["userAgent"]) > 0
diff --git a/tests/wpt/tests/webmidi/idlharness.https.window.js b/tests/wpt/tests/webmidi/idlharness.https.window.js
index 8fbd6a903c4..ed7e461603c 100644
--- a/tests/wpt/tests/webmidi/idlharness.https.window.js
+++ b/tests/wpt/tests/webmidi/idlharness.https.window.js
@@ -20,7 +20,8 @@ idl_test(
MIDIConnectionEvent: ['new MIDIConnectionEvent("type")'],
})
- await test_driver.set_permission({name: 'midi'}, 'granted');
+ // Chromium requires the sysex permission to allow any type of MIDI
+ await test_driver.set_permission({name: 'midi', sysex: true}, 'granted');
self.access = await navigator.requestMIDIAccess();
self.inputs = access.inputs;
diff --git a/tests/wpt/tests/webnn/conformance_tests/buffer.https.any.js b/tests/wpt/tests/webnn/conformance_tests/buffer.https.any.js
new file mode 100644
index 00000000000..5b0f46dae02
--- /dev/null
+++ b/tests/wpt/tests/webnn/conformance_tests/buffer.https.any.js
@@ -0,0 +1,12 @@
+// META: title=test WebNN API buffer operations
+// META: global=window,dedicatedworker
+// META: script=../resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+// https://webmachinelearning.github.io/webnn/#api-mlbuffer
+
+testCreateWebNNBuffer("create", 4);
+
+testDestroyWebNNBuffer("destroyTwice"); \ No newline at end of file
diff --git a/tests/wpt/tests/webnn/conformance_tests/gpu/buffer.https.any.js b/tests/wpt/tests/webnn/conformance_tests/gpu/buffer.https.any.js
new file mode 100644
index 00000000000..66bba9ef4af
--- /dev/null
+++ b/tests/wpt/tests/webnn/conformance_tests/gpu/buffer.https.any.js
@@ -0,0 +1,12 @@
+// META: title=test WebNN API buffer operations
+// META: global=window,dedicatedworker
+// META: script=../../resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+// https://webmachinelearning.github.io/webnn/#api-mlbuffer
+
+testCreateWebNNBuffer("create", 4, 'gpu');
+
+testDestroyWebNNBuffer("destroyTwice", 'gpu'); \ 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 002ddbd706c..0e404dbcd07 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -825,6 +825,10 @@ const run = async (operationName, context, builder, resources, buildFunc) => {
* @param {String} deviceType - The execution device type for this test
*/
const testWebNNOperation = (operationName, buildFunc, deviceType = 'cpu') => {
+ test(() => assert_not_equals(navigator.ml, undefined, "ml property is defined on navigator"));
+ if (navigator.ml === undefined) {
+ return;
+ }
let operationNameArray;
if (typeof operationName === 'string') {
operationNameArray = [operationName];
@@ -893,4 +897,60 @@ const toHalf = (value) => {
* the exponent, which is OK. */
bits += m & 1;
return bits;
+};
+
+
+/**
+ * WebNN buffer creation.
+ * @param {MLContext} context - the context used to create the buffer.
+ * @param {Number} bufferSize - Size of the buffer to create, in bytes.
+ */
+const createBuffer = (context, bufferSize) => {
+ let buffer;
+ try {
+ buffer = context.createBuffer({size: bufferSize});
+ assert_equals(buffer.size, bufferSize);
+ } catch (e) {
+ assert_true(e instanceof DOMException);
+ assert_equals(e.name, "NotSupportedError");
+ }
+ return buffer;
+};
+
+/**
+ * WebNN destroy buffer twice test.
+ * @param {String} testName - The name of the test operation.
+ * @param {String} deviceType - The execution device type for this test.
+ */
+const testDestroyWebNNBuffer = (testName, deviceType = 'cpu') => {
+ let context;
+ let buffer;
+ promise_setup(async () => {
+ context = await navigator.ml.createContext({deviceType});
+ buffer = createBuffer(context, 4);
+ });
+ promise_test(async () => {
+ // MLBuffer is not supported for this deviceType.
+ if (buffer === undefined) {
+ return;
+ }
+ buffer.destroy();
+ buffer.destroy();
+ }, `${testName}`);
+};
+
+/**
+ * WebNN create buffer test.
+ * @param {String} testName - The name of the test operation.
+ * @param {Number} bufferSize - Size of the buffer to create, in bytes.
+ * @param {String} deviceType - The execution device type for this test.
+ */
+const testCreateWebNNBuffer = (testName, bufferSize, deviceType = 'cpu') => {
+ let context;
+ promise_setup(async () => {
+ context = await navigator.ml.createContext({deviceType});
+ });
+ promise_test(async () => {
+ createBuffer(context, bufferSize);
+ }, `${testName} / ${bufferSize}`);
}; \ No newline at end of file
diff --git a/tests/wpt/tests/webnn/resources/utils_validation.js b/tests/wpt/tests/webnn/resources/utils_validation.js
index 10c704384f4..7f1d4a4a945 100644
--- a/tests/wpt/tests/webnn/resources/utils_validation.js
+++ b/tests/wpt/tests/webnn/resources/utils_validation.js
@@ -189,12 +189,20 @@ let inputAIndex = 0;
let inputBIndex = 0;
let context, builder;
+test(() => assert_not_equals(navigator.ml, undefined, "ml property is defined on navigator"));
+
promise_setup(async () => {
+ if (navigator.ml === undefined) {
+ return;
+ }
context = await navigator.ml.createContext();
builder = new MLGraphBuilder(context);
}, {explicit_timeout: true});
function validateTwoInputsBroadcastable(operationName) {
+ if (navigator.ml === undefined) {
+ return;
+ }
promise_test(async t => {
for (let dataType of allWebNNOperandDataTypes) {
for (let dimensions of allWebNNDimensionsArray) {
@@ -213,6 +221,9 @@ function validateTwoInputsBroadcastable(operationName) {
}
function validateTwoInputsOfSameDataType(operationName) {
+ if (navigator.ml === undefined) {
+ return;
+ }
let operationNameArray;
if (typeof operationName === 'string') {
operationNameArray = [operationName];
@@ -245,6 +256,9 @@ function validateTwoInputsOfSameDataType(operationName) {
* @param {Number} [inputRank]
*/
function validateOptionsAxes(operationName, inputRank) {
+ if (navigator.ml === undefined) {
+ return;
+ }
let operationNameArray;
if (typeof operationName === 'string') {
operationNameArray = [operationName];
diff --git a/tests/wpt/tests/webnn/validation_tests/gru.https.any.js b/tests/wpt/tests/webnn/validation_tests/gru.https.any.js
new file mode 100644
index 00000000000..295baab9c28
--- /dev/null
+++ b/tests/wpt/tests/webnn/validation_tests/gru.https.any.js
@@ -0,0 +1,398 @@
+// META: title=validation tests for WebNN API gru operation
+// META: global=window,dedicatedworker
+// META: script=../resources/utils_validation.js
+// META: timeout=long
+
+'use strict';
+
+const steps = 2, batchSize = 3, inputSize = 4, hiddenSize = 5,
+ numDirections = 1;
+
+const tests = [
+ {
+ name: '[gru] Test with default options',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ outputs: [
+ { dataType: 'float32', dimensions: [numDirections, batchSize, hiddenSize] }
+ ]
+ },
+ {
+ name: '[gru] Test with given options',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ bias: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 3 * hiddenSize]
+ },
+ recurrentBias: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 3 * hiddenSize]
+ },
+ initialHiddenState: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, batchSize, hiddenSize]
+ },
+ restAfter: true,
+ returnSequence: true,
+ direction: 'both',
+ layout: 'rzn',
+ activations: ['sigmoid', 'relu']
+ },
+ outputs: [
+ {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, batchSize, hiddenSize]
+ },
+ {
+ dataType: 'float32',
+ dimensions: [steps, /*numDirections=*/ 2, batchSize, hiddenSize]
+ }
+ ]
+ },
+ {
+ name: '[gru] TypeError is expected if steps equals to zero',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: 0,
+ hiddenSize: hiddenSize,
+ },
+ {
+ name: '[gru] TypeError is expected if hiddenSize equals to zero',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: 0
+ },
+ {
+ name: '[gru] TypeError is expected if hiddenSize is too large',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: 4294967295,
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the data type of the inputs is not one of the floating point types',
+ input: { dataType: 'uint32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'uint32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'uint32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the rank of input is not 3',
+ input: { dataType: 'float32', dimensions: [steps, batchSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[gru] TypeError is expected if input.dimensions[0] is not equal to steps',
+ input: { dataType: 'float32', dimensions: [1000, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name: '[gru] TypeError is expected if weight.dimensions[1] is not 3 * hiddenSize',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the rank of recurrentWeight is not 3',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight:
+ { dataType: 'float32', dimensions: [numDirections, 3 * hiddenSize] },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the recurrentWeight.dimensions is invalid',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight:
+ { dataType: 'float32', dimensions: [numDirections, 4 * hiddenSize, inputSize] },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the size of options.activations is not 2',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: { activations: ['sigmoid', 'tanh', 'relu'] }
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the rank of options.bias is not 2',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: { bias: { dataType: 'float32', dimensions: [numDirections] } }
+ },
+ {
+ name:
+ '[gru] TypeError is expected if options.bias.dimensions[1] is not 3 * hiddenSize',
+ input: { dataType: 'float32', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: { bias: { dataType: 'float32', dimensions: [numDirections, hiddenSize] } }
+ },
+ {
+ name:
+ '[gru] TypeError is expected if options.recurrentBias.dimensions[1] is not 3 * hiddenSize',
+ input: { dataType: 'float16', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ recurrentBias: { dataType: 'float16', dimensions: [numDirections, 4 * hiddenSize] }
+ }
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the rank of options.initialHiddenState is not 3',
+ input: { dataType: 'float16', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ initialHiddenState: {
+ dataType: 'float16',
+ dimensions: [numDirections, batchSize]
+ }
+ }
+ },
+ {
+ name:
+ '[gru] TypeError is expected if options.initialHiddenState.dimensions[2] is not inputSize',
+ input: { dataType: 'float16', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ initialHiddenState: {
+ dataType: 'float16',
+ dimensions: [numDirections, batchSize, 3 * hiddenSize]
+ }
+ }
+ },
+ {
+ name:
+ '[gru] TypeError is expected if the dataType of options.initialHiddenState is incorrect',
+ input: { dataType: 'float16', dimensions: [steps, batchSize, inputSize] },
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 3 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ initialHiddenState: {
+ dataType: 'uint64',
+ dimensions: [numDirections, batchSize, hiddenSize]
+ }
+ }
+ }
+];
+
+tests.forEach(
+ test => promise_test(async t => {
+ const input = builder.input(
+ 'input',
+ { dataType: test.input.dataType, dimensions: test.input.dimensions });
+ const weight = builder.input(
+ 'weight',
+ { dataType: test.weight.dataType, dimensions: test.weight.dimensions });
+ const recurrentWeight = builder.input('recurrentWeight', {
+ dataType: test.recurrentWeight.dataType,
+ dimensions: test.recurrentWeight.dimensions
+ });
+
+ const options = {};
+ if (test.options) {
+ if (test.options.bias) {
+ options.bias = builder.input('bias', {
+ dataType: test.options.bias.dataType,
+ dimensions: test.options.bias.dimensions
+ });
+ }
+ if (test.options.recurrentBias) {
+ options.bias = builder.input('recurrentBias', {
+ dataType: test.options.recurrentBias.dataType,
+ dimensions: test.options.recurrentBias.dimensions
+ });
+ }
+ if (test.options.initialHiddenState) {
+ options.initialHiddenState = builder.input('initialHiddenState', {
+ dataType: test.options.initialHiddenState.dataType,
+ dimensions: test.options.initialHiddenState.dimensions
+ });
+ }
+ if (test.options.resetAfter) {
+ options.resetAfter = test.options.resetAfter;
+ }
+ if (test.options.returnSequence) {
+ options.returnSequence = test.options.returnSequence;
+ }
+ if (test.options.direction) {
+ options.direction = test.options.direction;
+ }
+ if (test.options.layout) {
+ options.layout = test.options.layout;
+ }
+ if (test.options.activations) {
+ options.activations = [];
+ test.options.activations.forEach(
+ activation => options.activations.push(builder[activation]()));
+ }
+ }
+
+ if (test.outputs) {
+ const outputs = builder.gru(
+ input, weight, recurrentWeight, test.steps, test.hiddenSize,
+ options);
+ assert_equals(outputs.length, test.outputs.length);
+ for (let i = 0; i < outputs.length; ++i) {
+ assert_equals(outputs[i].dataType(), test.outputs[i].dataType);
+ assert_array_equals(outputs[i].shape(), test.outputs[i].dimensions);
+ }
+ } else {
+ assert_throws_js(
+ TypeError,
+ () => builder.gru(
+ input, weight, recurrentWeight, test.steps, test.hiddenSize,
+ options));
+ }
+ }, test.name)); \ No newline at end of file
diff --git a/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js b/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js
new file mode 100644
index 00000000000..efa05090ca2
--- /dev/null
+++ b/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js
@@ -0,0 +1,386 @@
+// META: title=validation tests for WebNN API lstm operation
+// META: global=window,dedicatedworker
+// META: script=../resources/utils_validation.js
+// META: timeout=long
+
+'use strict';
+
+const steps = 10, batchSize = 5, inputSize = 3, hiddenSize = 8,
+ numDirections = 1;
+
+const tests = [
+ {
+ name: '[lstm] Test with default options',
+ input: {dataType: 'float16', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ outputs: [
+ {dataType: 'float16', dimensions: [numDirections, batchSize, hiddenSize]},
+ {dataType: 'float16', dimensions: [numDirections, batchSize, hiddenSize]}
+ ]
+ },
+ {
+ name: '[lstm] Test with given options',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ bias: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 4 * hiddenSize]
+ },
+ recurrentBias: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 4 * hiddenSize]
+ },
+ peepholeWeight: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, 3 * hiddenSize]
+ },
+ initialHiddenState: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, batchSize, hiddenSize]
+ },
+ initialCellState: {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, batchSize, hiddenSize]
+ },
+ returnSequence: true,
+ direction: 'both',
+ layout: 'ifgo',
+ activations: ['sigmoid', 'relu', 'tanh']
+ },
+ outputs: [
+ {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, batchSize, hiddenSize]
+ },
+ {
+ dataType: 'float32',
+ dimensions: [/*numDirections=*/ 2, batchSize, hiddenSize]
+ },
+ {
+ dataType: 'float32',
+ dimensions: [steps, /*numDirections=*/ 2, batchSize, hiddenSize]
+ }
+ ]
+ },
+ {
+ name: '[lstm] DataError is expected if hiddenSize equals to zero',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: 0
+ },
+ {
+ name: '[lstm] DataError is expected if hiddenSize is too large',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: 4294967295,
+ },
+ {
+ name: '[lstm] DataError is expected if steps equals to zero',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: 0,
+ hiddenSize: hiddenSize,
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the data type is not one of the floating point types',
+ input: {dataType: 'uint32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'uint32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'uint32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the rank of input is not 3',
+ input: {dataType: 'float32', dimensions: [steps, batchSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[lstm] DataError is expected if input.dimensions[0] is not equal to steps',
+ input: {dataType: 'float32', dimensions: [1000, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name: '[lstm] DataError is expected if the shape of weight is incorrect',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, 1000]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the rank of recurrentWeight is not 3',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight:
+ {dataType: 'float32', dimensions: [numDirections, 4 * hiddenSize]},
+ steps: steps,
+ hiddenSize: hiddenSize
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the size of options.activations is not 3',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {activations: ['sigmoid', 'tanh']}
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the rank of options.bias is not 2',
+ input: {dataType: 'float16', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {bias: {dataType: 'float16', dimensions: [numDirections]}}
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the shape of options.recurrentBias.dimensions is incorrect',
+ input: {dataType: 'float16', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ recurrentBias: {dataType: 'float16', dimensions: [numDirections, 1000]}
+ }
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the dataType of options.peepholeWeight is incorrect',
+ input: {dataType: 'float16', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ peepholeWeight:
+ {dataType: 'float32', dimensions: [numDirections, 3 * hiddenSize]}
+ }
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the dataType of options.initialHiddenState is incorrect',
+ input: {dataType: 'float16', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float16',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ initialHiddenState: {
+ dataType: 'uint64',
+ dimensions: [numDirections, batchSize, hiddenSize]
+ }
+ }
+ },
+ {
+ name:
+ '[lstm] DataError is expected if the shape of options.initialCellState is incorrect',
+ input: {dataType: 'float32', dimensions: [steps, batchSize, inputSize]},
+ weight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, inputSize]
+ },
+ recurrentWeight: {
+ dataType: 'float32',
+ dimensions: [numDirections, 4 * hiddenSize, hiddenSize]
+ },
+ steps: steps,
+ hiddenSize: hiddenSize,
+ options: {
+ initialCellState:
+ {dataType: 'float32', dimensions: [numDirections, batchSize, 1000]}
+ }
+ }
+];
+
+tests.forEach(
+ test => promise_test(async t => {
+ const input = builder.input(
+ 'input',
+ {dataType: test.input.dataType, dimensions: test.input.dimensions});
+ const weight = builder.input(
+ 'weight',
+ {dataType: test.weight.dataType, dimensions: test.weight.dimensions});
+ const recurrentWeight = builder.input('recurrentWeight', {
+ dataType: test.recurrentWeight.dataType,
+ dimensions: test.recurrentWeight.dimensions
+ });
+
+ const options = {};
+ if (test.options) {
+ if (test.options.bias) {
+ options.bias = builder.input('bias', {
+ dataType: test.options.bias.dataType,
+ dimensions: test.options.bias.dimensions
+ });
+ }
+ if (test.options.recurrentBias) {
+ options.bias = builder.input('recurrentBias', {
+ dataType: test.options.recurrentBias.dataType,
+ dimensions: test.options.recurrentBias.dimensions
+ });
+ }
+ if (test.options.peepholeWeight) {
+ options.peepholeWeight = builder.input('peepholeWeight', {
+ dataType: test.options.peepholeWeight.dataType,
+ dimensions: test.options.peepholeWeight.dimensions
+ });
+ }
+ if (test.options.initialHiddenState) {
+ options.initialHiddenState = builder.input('initialHiddenState', {
+ dataType: test.options.initialHiddenState.dataType,
+ dimensions: test.options.initialHiddenState.dimensions
+ });
+ }
+ if (test.options.initialCellState) {
+ options.initialCellState = builder.input('initialCellState', {
+ dataType: test.options.initialCellState.dataType,
+ dimensions: test.options.initialCellState.dimensions
+ });
+ }
+ if (test.options.returnSequence) {
+ options.returnSequence = test.options.returnSequence;
+ }
+ if (test.options.direction) {
+ options.direction = test.options.direction;
+ }
+ if (test.options.layout) {
+ options.layout = test.options.layout;
+ }
+ if (test.options.activations) {
+ options.activations = [];
+ test.options.activations.forEach(
+ activation => options.activations.push(builder[activation]()));
+ }
+ }
+
+ if (test.outputs) {
+ const outputs = builder.lstm(
+ input, weight, recurrentWeight, test.steps, test.hiddenSize,
+ options);
+ assert_equals(outputs.length, test.outputs.length);
+ for (let i = 0; i < outputs.length; ++i) {
+ assert_equals(outputs[i].dataType(), test.outputs[i].dataType);
+ assert_array_equals(outputs[i].shape(), test.outputs[i].dimensions);
+ }
+ } else {
+ assert_throws_dom(
+ 'DataError',
+ () => builder.lstm(
+ input, weight, recurrentWeight, test.steps, test.hiddenSize,
+ options));
+ }
+ }, test.name));
diff --git a/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js b/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js
new file mode 100644
index 00000000000..4e4c368f82b
--- /dev/null
+++ b/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js
@@ -0,0 +1,16 @@
+// META: title=validation tests for WebNN API triangular operation
+// META: global=window,dedicatedworker
+// META: script=../resources/utils_validation.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ // The input tensor which is at least 2-D.
+ for (let dimensions of allWebNNDimensionsArray.slice(0, 2)) {
+ for (let dataType of allWebNNOperandDataTypes) {
+ const input = builder.input(`input${++inputIndex}`, {dataType, dimensions});
+ assert_throws_js(TypeError, () => builder.triangular(input));
+ }
+ }
+}, "[triangular] DataError is expected if input's rank is less than 2");