aboutsummaryrefslogtreecommitdiffstats
path: root/tests/wpt
diff options
context:
space:
mode:
authorServo WPT Sync <32481905+servo-wpt-sync@users.noreply.github.com>2024-06-23 02:21:30 -0400
committerGitHub <noreply@github.com>2024-06-23 06:21:30 +0000
commit62b230e85d18cb3193dd5283aa3073cb161e5e6b (patch)
treeb037305e43ea3758cc32eb6f943806f20bd78417 /tests/wpt
parent130eef300bb71febf715683211323c1b551f5313 (diff)
downloadservo-62b230e85d18cb3193dd5283aa3073cb161e5e6b.tar.gz
servo-62b230e85d18cb3193dd5283aa3073cb161e5e6b.zip
Update web-platform-tests to revision b'f46bf6aa167e2838a8b93501a1a998ffde90d879' (#32581)
Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
Diffstat (limited to 'tests/wpt')
-rw-r--r--tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini18
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini12
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini12
-rw-r--r--tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini7
-rw-r--r--tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini4
-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/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini (renamed from tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini (renamed from tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js.ini)2
-rw-r--r--tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini7
-rw-r--r--tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini129
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini4
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini3
-rw-r--r--tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini6
-rw-r--r--tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini2
-rw-r--r--tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini (renamed from tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini)0
-rw-r--r--tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini4
-rw-r--r--tests/wpt/meta/MANIFEST.json2437
-rw-r--r--tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini4
-rw-r--r--tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini18
-rw-r--r--tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini18
-rw-r--r--tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini18
-rw-r--r--tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini18
-rw-r--r--tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini2
-rw-r--r--tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini2
-rw-r--r--tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini2
-rw-r--r--tests/wpt/meta/css/css-lists/details-open.html.ini2
-rw-r--r--tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini2
-rw-r--r--tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini2
-rw-r--r--tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini12
-rw-r--r--tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini12
-rw-r--r--tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini7
-rw-r--r--tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini2
-rw-r--r--tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini2
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini4
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini4
-rw-r--r--tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini (renamed from tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini)4
-rw-r--r--tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini (renamed from tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html.ini)2
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini3
-rw-r--r--tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini3
-rw-r--r--tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini3
-rw-r--r--tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini12
-rw-r--r--tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini15
-rw-r--r--tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini1
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini1
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini3
-rw-r--r--tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini6
-rw-r--r--tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini2
-rw-r--r--tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini4
-rw-r--r--tests/wpt/tests/.well-known/web-identity2
-rw-r--r--tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js12
-rw-r--r--tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js12
-rw-r--r--tests/wpt/tests/compression/decompression-buffersource.tentative.any.js12
-rw-r--r--tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py6
-rw-r--r--tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js100
-rw-r--r--tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account-button-flow.tentative.https.html2
-rw-r--r--tests/wpt/tests/credential-management/fedcm-button-and-other-account/fedcm-use-other-account.tentative.https.html2
-rw-r--r--tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html4
-rw-r--r--tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html2
-rw-r--r--tests/wpt/tests/credential-management/fedcm-error-basic.https.html2
-rw-r--r--tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html2
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm-helper.sub.js13
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js3
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html2
-rw-r--r--tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html2
-rw-r--r--tests/wpt/tests/css/css-break/overflowing-block-004.html16
-rw-r--r--tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html19
-rw-r--r--tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html18
-rw-r--r--tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html18
-rw-r--r--tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html17
-rw-r--r--tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html18
-rw-r--r--tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html18
-rw-r--r--tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html17
-rw-r--r--tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html6
-rw-r--r--tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.html (renamed from tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.tentative.html)6
-rw-r--r--tests/wpt/tests/css/css-grid/parsing/grid-template-important.html16
-rw-r--r--tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html2
-rw-r--r--tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html10
-rw-r--r--tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html15
-rw-r--r--tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.pngbin0 -> 15343 bytes
-rw-r--r--tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html47
-rw-r--r--tests/wpt/tests/css/css-lists/details-open-ref.html8
-rw-r--r--tests/wpt/tests/css/css-lists/details-open.html16
-rw-r--r--tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html10
-rw-r--r--tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html31
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html20
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html22
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html21
-rw-r--r--tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html23
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html75
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html39
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html73
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html127
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html65
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html115
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html69
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html147
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html20
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html47
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html28
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html40
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html30
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html68
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html34
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html48
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html52
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html123
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html42
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html82
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html49
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html149
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html53
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html138
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html58
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html66
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html45
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html69
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html48
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html67
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html48
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html91
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html51
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html80
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html92
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html157
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html150
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html18
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html33
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html70
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html127
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html93
-rw-r--r--tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html145
-rw-r--r--tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html4
-rw-r--r--tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html2
-rw-r--r--tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html24
-rw-r--r--tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html38
-rw-r--r--tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html38
-rw-r--r--tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html35
-rw-r--r--tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html41
-rw-r--r--tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html41
-rw-r--r--tests/wpt/tests/css/css-ui/transparent-accent-color-001.html46
-rw-r--r--tests/wpt/tests/css/css-ui/transparent-accent-color-002.html46
-rw-r--r--tests/wpt/tests/css/css-variables/revert-in-fallback.html6
-rw-r--r--tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html27
-rw-r--r--tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html63
-rw-r--r--tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html79
-rw-r--r--tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html4
-rw-r--r--tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html36
-rw-r--r--tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html56
-rw-r--r--tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js51
-rw-r--r--tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html99
-rw-r--r--tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html88
-rw-r--r--tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html80
-rw-r--r--tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html63
-rw-r--r--tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html80
-rw-r--r--tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html78
-rw-r--r--tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html42
-rw-r--r--tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html30
-rw-r--r--tests/wpt/tests/digital-credentials/identity-get.tentative.https.html67
-rw-r--r--tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html8
-rw-r--r--tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html12
-rw-r--r--tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html20
-rw-r--r--tests/wpt/tests/dom/parts/resources/domparts-utils.js16
-rw-r--r--tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html16
-rw-r--r--tests/wpt/tests/fedcm/support/accounts.py (renamed from tests/wpt/tests/credential-management/support/fedcm/accounts.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/accounts_check_same_site_strict.py (renamed from tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/accounts_no_approved_clients.py (renamed from tests/wpt/tests/credential-management/support/fedcm/accounts_no_approved_clients.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/client_metadata.py (renamed from tests/wpt/tests/credential-management/support/fedcm/client_metadata.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/client_metadata.py.headers (renamed from tests/wpt/tests/credential-management/support/fedcm/client_metadata.py.headers)0
-rw-r--r--tests/wpt/tests/fedcm/support/client_metadata_clear_count.py (renamed from tests/wpt/tests/credential-management/support/fedcm/client_metadata_clear_count.py)2
-rw-r--r--tests/wpt/tests/fedcm/support/continue_on.py (renamed from tests/wpt/tests/credential-management/support/fedcm/continue_on.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/disconnect.py (renamed from tests/wpt/tests/credential-management/support/fedcm/disconnect.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/disconnect_failure.py (renamed from tests/wpt/tests/credential-management/support/fedcm/disconnect_failure.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/error_with_code_and_url.py (renamed from tests/wpt/tests/credential-management/support/fedcm/error_with_code_and_url.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/login.html (renamed from tests/wpt/tests/credential-management/support/fedcm/login.html)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest-not-in-list.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest-not-in-list.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest-token-nocors.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest-token-nocors.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest.py (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_false.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_false.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_true.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_true.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_check_same_site_strict.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_id_assertion_endpoint_returns_error.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_id_assertion_endpoint_returns_error.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_no_login_url.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_no_login_url.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_redirect_accounts.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_accounts.json)2
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_redirect_token.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_token.json)2
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_token_with_http_error.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_token_with_http_error.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_auto_selected_flag.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_auto_selected_flag.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_continue_on.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_continue_on.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_cross_origin_disconnect.sub.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_cross_origin_disconnect.sub.json)2
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_disconnect_failure.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_disconnect_failure.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_no_accounts.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_no_accounts.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_rp_mode.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_rp_mode.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_single_account.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_single_account.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_two_accounts.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_two_accounts.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/manifest_with_variable_accounts.json (renamed from tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json)0
-rw-r--r--tests/wpt/tests/fedcm/support/no_accounts.py (renamed from tests/wpt/tests/credential-management/support/fedcm/no_accounts.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/resolve.html (renamed from tests/wpt/tests/credential-management/support/fedcm/resolve.html)0
-rw-r--r--tests/wpt/tests/fedcm/support/select_manifest_in_root_manifest.py (renamed from tests/wpt/tests/credential-management/support/fedcm/select_manifest_in_root_manifest.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/set_accounts_cookie.py (renamed from tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/single_account.py (renamed from tests/wpt/tests/credential-management/support/fedcm/single_account.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_check_disclosure_shown_false.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_false.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_check_disclosure_shown_true.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_true.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_check_same_site_strict.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_with_account_id.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_with_account_id.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_with_auto_selected_flag.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_with_auto_selected_flag.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_with_http_error.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_with_http_error.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/token_with_rp_mode.py (renamed from tests/wpt/tests/credential-management/support/fedcm/token_with_rp_mode.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/two_accounts.py (renamed from tests/wpt/tests/credential-management/support/fedcm/two_accounts.py)0
-rw-r--r--tests/wpt/tests/fedcm/support/variable_accounts.py (renamed from tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py)0
-rw-r--r--tests/wpt/tests/fenced-frame/resources/utils.js2
-rw-r--r--tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js23
-rw-r--r--tests/wpt/tests/fullscreen/api/permission.tentative.https.html39
-rw-r--r--tests/wpt/tests/geolocation/tojson.https.window.js51
-rw-r--r--tests/wpt/tests/html-aam/roles.tentative.html33
-rw-r--r--tests/wpt/tests/html-aam/table-roles.html6
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js40
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js40
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js60
-rw-r--r--tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html23
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html12
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html1
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.color.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.html)13
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.clip.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html)22
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.different.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.html)18
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.gradient.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.gradient.html)28
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html)20
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.pattern.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.pattern.html)28
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.same.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.html)20
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.transform.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.transform.html)20
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html10
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html4
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html2
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.default.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.extend.html)15
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.html37
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.set.zero.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.set.zero.html)13
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setcontent.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.html)19
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidl.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.html)19
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidlzero.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidlzero.html)17
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.removed.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.html)15
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html33
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html30
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.delete.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.delete.html)11
-rw-r--r--tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.name.html (renamed from tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.name.html)7
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html3
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js3
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js4
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html35
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js30
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html28
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js23
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html (renamed from tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html)13
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js (renamed from tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js)11
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html34
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js29
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html36
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js31
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html35
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js30
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html3
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js3
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html28
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js23
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html10
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js10
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html16
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js16
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html30
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js25
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html (renamed from tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html)12
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js (renamed from tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js)10
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html (renamed from tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html)11
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js (renamed from tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js)9
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml416
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml143
-rw-r--r--tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml269
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html12
-rw-r--r--tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers1
-rw-r--r--tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html55
-rw-r--r--tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html11
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.pngbin117 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.pngbin107 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.pngbin117 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.pngbin117 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html30
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.pngbin272 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.pngbin125 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html50
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.pngbin125 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.pngbin125 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.pngbin168 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.pngbin125 -> 0 bytes
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html36
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html28
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html33
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html33
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html28
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html26
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html26
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html24
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html26
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html24
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html28
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html25
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html24
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html25
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html26
-rw-r--r--tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html2
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js25
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js25
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js25
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js25
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js25
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js25
-rw-r--r--tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js4
-rw-r--r--tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html28
-rw-r--r--tests/wpt/tests/screen-capture/getdisplaymedia.https.html1
-rw-r--r--tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html25
-rw-r--r--tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html25
-rw-r--r--tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html35
-rw-r--r--tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html28
-rw-r--r--tests/wpt/tests/shadow-dom/declarative/gethtml.html22
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-flow.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-flow.html)12
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-visual-order.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-visual-order.html)14
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-columns.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-columns.html)8
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-across-scopes.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-across-scopes.html)6
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-on-shadow-host.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-on-shadow-host.html)6
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-iframe.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-iframe.html)6
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-nested-grids.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-nested-grids.html)6
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-popover.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-popover.html)10
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-slots.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-slots.html)26
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order.html)6
-rw-r--r--tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-rows.html (renamed from tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-rows.html)8
-rw-r--r--tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html35
-rw-r--r--tests/wpt/tests/shared-storage/resources/util.sub.js42
-rw-r--r--tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html35
-rw-r--r--tests/wpt/tests/svg/animations/conditional-processing-01.html18
-rw-r--r--tests/wpt/tests/svg/animations/switch-animation-01.html19
-rw-r--r--tests/wpt/tests/svg/animations/switch-animation-02.html23
-rw-r--r--tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html4
-rw-r--r--tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg5
-rw-r--r--tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html14
-rw-r--r--tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html17
-rw-r--r--tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt2
-rw-r--r--tests/wpt/tests/tools/ci/requirements_tc.txt2
-rw-r--r--tests/wpt/tests/tools/docker/requirements.txt2
-rw-r--r--tests/wpt/tests/tools/requirements_mypy.txt4
-rw-r--r--tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py3
-rw-r--r--tests/wpt/tests/tools/webdriver/webdriver/transport.py4
-rw-r--r--tests/wpt/tests/tools/wpt/browser.py31
-rw-r--r--tests/wpt/tests/tools/wpt/requirements.txt2
-rw-r--r--tests/wpt/tests/tools/wpt/run.py20
-rw-r--r--tests/wpt/tests/tools/wptrunner/requirements.txt2
-rw-r--r--tests/wpt/tests/tools/wptrunner/requirements_sauce.txt2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py29
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py11
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py18
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py134
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py62
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py13
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py12
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py4
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py12
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py4
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py9
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py116
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py22
-rw-r--r--tests/wpt/tests/touch-events/single-touch-vertical-rl.html2
-rw-r--r--tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html2
-rw-r--r--tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html38
-rw-r--r--tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js37
-rw-r--r--tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js107
-rw-r--r--tests/wpt/tests/webcodecs/videoFrame-construction.any.js257
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py45
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py65
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py106
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py47
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py82
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py45
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py32
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/__init__.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py54
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py76
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/response_started/response_started.py76
-rw-r--r--tests/wpt/tests/webdriver/tests/classic/close_window/close.py19
-rw-r--r--tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py13
-rw-r--r--tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py117
-rw-r--r--tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py44
-rw-r--r--tests/wpt/tests/webnn/validation_tests/lstm.https.any.js32
-rw-r--r--tests/wpt/tests/webnn/validation_tests/triangular.https.any.js2
-rw-r--r--tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html28
-rw-r--r--tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html40
-rw-r--r--tests/wpt/tests/webusb/usbDevice.https.any.js50
496 files changed, 11266 insertions, 2327 deletions
diff --git a/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini b/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini
index 787c5c993ed..ba980c5df77 100644
--- a/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/FileAPI/blob/Blob-constructor.any.js.ini
@@ -2,7 +2,7 @@
[options properties should be accessed in lexicographic order.]
expected: FAIL
- [Passing typed arrays as elements of the blobParts array should work.]
+ [Passing a Float16Array as element of the blobParts array should work.]
expected: FAIL
@@ -10,5 +10,5 @@
[options properties should be accessed in lexicographic order.]
expected: FAIL
- [Passing typed arrays as elements of the blobParts array should work.]
+ [Passing a Float16Array as element of the blobParts array should work.]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini b/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini
index 4671cc872fe..b45205c6462 100644
--- a/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini
+++ b/tests/wpt/meta-legacy-layout/WebCryptoAPI/getRandomValues.any.js.ini
@@ -17,7 +17,7 @@
[Null arrays: BigUint64Array]
expected: FAIL
- [Float arrays]
+ [Float16 arrays]
expected: FAIL
@@ -40,5 +40,5 @@
[Null arrays: BigUint64Array]
expected: FAIL
- [Float arrays]
+ [Float16 arrays]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini b/tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini
deleted file mode 100644
index 0ee92f312ba..00000000000
--- a/tests/wpt/meta-legacy-layout/css/CSS2/text/text-transform-bicameral-018.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[text-transform-bicameral-018.xht]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini
deleted file mode 100644
index eb3cf41a070..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-color/animation/opacity-animation-ending-correctly-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[opacity-animation-ending-correctly-002.html]
- expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini
new file mode 100644
index 00000000000..98d15fdb816
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini
@@ -0,0 +1,18 @@
+[reading-flow-computed.html]
+ [Property reading-flow value 'normal']
+ expected: FAIL
+
+ [Property reading-flow value 'flex-visual']
+ expected: FAIL
+
+ [Property reading-flow value 'flex-flow']
+ expected: FAIL
+
+ [Property reading-flow value 'grid-rows']
+ expected: FAIL
+
+ [Property reading-flow value 'grid-columns']
+ expected: FAIL
+
+ [Property reading-flow value 'grid-order']
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini
new file mode 100644
index 00000000000..9b3ebfaee3a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini
@@ -0,0 +1,18 @@
+[reading-flow-valid.html]
+ [e.style['reading-flow'\] = "normal" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "flex-visual" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "flex-flow" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "grid-rows" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "grid-columns" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "grid-order" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini
deleted file mode 100644
index bfbb8d57dbd..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-computed.html.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[reading-order-items-computed.html]
- [Property reading-order-items value 'normal']
- expected: FAIL
-
- [Property reading-order-items value 'flex-visual']
- expected: FAIL
-
- [Property reading-order-items value 'flex-flow']
- expected: FAIL
-
- [Property reading-order-items value 'grid-rows']
- expected: FAIL
-
- [Property reading-order-items value 'grid-columns']
- expected: FAIL
-
- [Property reading-order-items value 'grid-order']
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini b/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini
deleted file mode 100644
index 8fa1c144a47..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-display/reading-order/reading-order-items-valid.html.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[reading-order-items-valid.html]
- [e.style['reading-order-items'\] = "normal" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "flex-visual" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "flex-flow" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "grid-rows" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "grid-columns" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "grid-order" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini b/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini
new file mode 100644
index 00000000000..58588e322c0
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.html.ini
@@ -0,0 +1,2 @@
+[font-size-adjust-ic-height.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini b/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini
deleted file mode 100644
index 69a38ce77ee..00000000000
--- a/tests/wpt/meta-legacy-layout/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[font-size-adjust-ic-height.tentative.html]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini
new file mode 100644
index 00000000000..4d1405fd38b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-exif-png-2.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini
new file mode 100644
index 00000000000..a5e9153e1b2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-exif-png-3.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini b/tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini
new file mode 100644
index 00000000000..c8587942f36
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-lists/details-open.html.ini
@@ -0,0 +1,2 @@
+[details-open.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini b/tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini
new file mode 100644
index 00000000000..7a0dea87709
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-lists/implicit-and-explicit-list-item-counters.html.ini
@@ -0,0 +1,2 @@
+[implicit-and-explicit-list-item-counters.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini
new file mode 100644
index 00000000000..784929fa209
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini
@@ -0,0 +1,2 @@
+[hyphens-vs-float-clearance-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini
new file mode 100644
index 00000000000..6214b59d4c3
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini
@@ -0,0 +1,2 @@
+[hyphens-vs-float-clearance-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini
new file mode 100644
index 00000000000..83e7d9ca15d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple-nested.html.ini
@@ -0,0 +1,12 @@
+[scrollIntoView-multiple-nested.html]
+ [Simultaneous smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous smooth,instant scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant,smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant scrollIntoViews run to completion]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini
new file mode 100644
index 00000000000..2e26c21bf51
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/cssom-view/scrollIntoView-multiple.html.ini
@@ -0,0 +1,12 @@
+[scrollIntoView-multiple.html]
+ [Simultaneous smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous smooth,instant scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant,smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant scrollIntoViews run to completion]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini b/tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini
new file mode 100644
index 00000000000..321dc54f98d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini
@@ -0,0 +1,7 @@
+[smooth-scrollIntoView-with-smooth-fragment-scroll.html]
+ expected: TIMEOUT
+ [Smooth scroll to hash fragment (on pageload) alongside smooth scrollIntoView runs to completion.]
+ expected: TIMEOUT
+
+ [Smooth scroll to hash fragment (on click) alongside smooth scrollIntoView runs to completion.]
+ expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini b/tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini
new file mode 100644
index 00000000000..51318cbb1d2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/css/filter-effects/backdrop-filter-edge-mirror.html.ini
@@ -0,0 +1,2 @@
+[backdrop-filter-edge-mirror.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini b/tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini
new file mode 100644
index 00000000000..2ca05f57bb0
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/custom-elements/reactions/customized-builtins/HTMLMediaElement.html.ini
@@ -0,0 +1,2 @@
+[HTMLMediaElement.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini
new file mode 100644
index 00000000000..518e7cde25d
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini
@@ -0,0 +1,4 @@
+[addEmbed.window.html]
+ expected: TIMEOUT
+ [RemoteContextWrapper addEmbed]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini
new file mode 100644
index 00000000000..426a2fdf64e
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini
@@ -0,0 +1,4 @@
+[addObject.window.html]
+ expected: TIMEOUT
+ [RemoteContextWrapper addObject]
+ expected: TIMEOUT
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/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini
index c3a13fbf59e..e12e364d828 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini
@@ -1,3 +1,3 @@
-[initial.reset.path.html]
+[2d.canvas.host.initial.reset.path.html]
[Resetting the canvas state resets the current path]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini
new file mode 100644
index 00000000000..f6455f9bd76
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini
@@ -0,0 +1,2 @@
+[2d.canvas.host.size.large.html]
+ expected: CRASH
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini
new file mode 100644
index 00000000000..b942e4f7dc2
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.invalid.args.html]
+ [Calling getContext with invalid arguments.]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini
new file mode 100644
index 00000000000..cb833a67760
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.invalid.args.worker.html]
+ [Calling getContext with invalid arguments.]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini
deleted file mode 100644
index 61f40bc0e2a..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badname.html]
- [getContext with unrecognised context name returns null]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini
deleted file mode 100644
index ba433ddb153..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badname.worker.html]
- [getContext with unrecognised context name returns null]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini
deleted file mode 100644
index 42e7640cc34..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badsuffix.html]
- [Context name "2d" plus a suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini
deleted file mode 100644
index 89c114b0e1d..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badsuffix.worker.html]
- [Context name "2d" plus a suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini
deleted file mode 100644
index 8cd6b8b614c..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.nullsuffix.html]
- [Context name "2d" plus a "\\0" suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini
deleted file mode 100644
index e850767487e..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.nullsuffix.worker.html]
- [Context name "2d" plus a "\\0" suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini
deleted file mode 100644
index 88eff7740fd..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.unicode.html]
- [Context name which kind of looks like "2d" is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini
deleted file mode 100644
index 7cf8fcb7e38..00000000000
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.unicode.worker.html]
- [Context name which kind of looks like "2d" is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini
index 0946b523e8a..672798f3f81 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js.ini
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini
@@ -1,3 +1,3 @@
-[2d.canvas.host.size.attributes.idl.worker.html]
+[2d.canvas.host.size.invalid.attributes.idl.html]
[Getting/setting width/height IDL attributes]
expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini
new file mode 100644
index 00000000000..acf2210f82b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.host.size.invalid.attributes.idl.worker.html]
+ [Getting/setting width/height IDL attributes]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index 09c25efb089..d169bd2e9fa 100644
--- a/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,5 +1,4 @@
[supported-elements.html]
- expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
@@ -7,10 +6,10 @@
expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped]
- expected: NOTRUN
+ expected: FAIL
[Area element should support autofocus]
- expected: NOTRUN
+ expected: FAIL
[Host element with delegatesFocus should support autofocus]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini b/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini
new file mode 100644
index 00000000000..126758f242b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/rendering/the-details-element/details-display.tentative.html.ini
@@ -0,0 +1,6 @@
+[details-display.tentative.html]
+ [default display of first summary child of details is list-item]
+ expected: FAIL
+
+ [display of details element can be changed]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini b/tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini
new file mode 100644
index 00000000000..a4978181305
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/rendering/widgets/input-checkbox-zero-size.html.ini
@@ -0,0 +1,2 @@
+[input-checkbox-zero-size.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini
new file mode 100644
index 00000000000..2790024adc1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-history-pushState.html]
+ [History state change for iframe loading='lazy' before it is loaded: history.pushState]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini
new file mode 100644
index 00000000000..72fd909874f
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-history-replaceState.html]
+ [History state change for iframe loading='lazy' before it is loaded: history.replaceState]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini
new file mode 100644
index 00000000000..ce58a9da176
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-link-click-fragment.html]
+ [Navigating iframe loading='lazy' before it is loaded: link click (fragment)]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini
new file mode 100644
index 00000000000..50155ba1c77
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-location-replace-set-src.html]
+ [Navigating iframe loading='lazy' and then setting src: location.replace]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini
new file mode 100644
index 00000000000..7cdcf205066
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-meta-refresh.optional.html]
+ [Navigating iframe loading='lazy' before it is loaded: meta refresh]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini
new file mode 100644
index 00000000000..396370a990c
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-navigation-navigate.html]
+ [Navigating iframe loading='lazy' before it is loaded: navigation.navigate]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini
new file mode 100644
index 00000000000..0c94be22223
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-reload-navigation-reload.html]
+ [Reloading iframe loading='lazy' before it is loaded: location.reload]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index 53b0601e68c..f9138fb999a 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-1.html]
type: testharness
- expected: CRASH
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index f2378357bcc..76e34322dca 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
- expected: CRASH
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini
new file mode 100644
index 00000000000..5a4a021662b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/calculate-depth-for-node.html.ini
@@ -0,0 +1,3 @@
+[calculate-depth-for-node.html]
+ ["Calculate depth for node" algorithm with Shadow DOM]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini
new file mode 100644
index 00000000000..046a61718d3
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/callback-cross-realm-report-exception.html.ini
@@ -0,0 +1,3 @@
+[callback-cross-realm-report-exception.html]
+ [ResizeObserver reports the exception from its callback in the callback's global object]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini
new file mode 100644
index 00000000000..5d07f60e0b6
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/change-layout-in-error.html.ini
@@ -0,0 +1,3 @@
+[change-layout-in-error.html]
+ [Changing layout in window error handler should not result in lifecyle loop when resize observer loop limit is reached.]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini
new file mode 100644
index 00000000000..c1cb9e98ff1
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/devicepixel.html.ini
@@ -0,0 +1,2 @@
+[devicepixel.html]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini
new file mode 100644
index 00000000000..a464a714b03
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/eventloop.html.ini
@@ -0,0 +1,3 @@
+[eventloop.html]
+ [ResizeObserver implemented]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini
new file mode 100644
index 00000000000..34d13fc8473
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/fragments.html.ini
@@ -0,0 +1,2 @@
+[fragments.html]
+ expected: ERROR
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini b/tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini
new file mode 100644
index 00000000000..15dfbd6f021
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/idlharness.window.js.ini
@@ -0,0 +1,129 @@
+[idlharness.window.html]
+ [idl_test setup]
+ expected: FAIL
+
+ [ResizeObserver interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ResizeObserver interface object length]
+ expected: FAIL
+
+ [ResizeObserver interface object name]
+ expected: FAIL
+
+ [ResizeObserver interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ResizeObserver interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ResizeObserver interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ResizeObserver interface: operation observe(Element, optional ResizeObserverOptions)]
+ expected: FAIL
+
+ [ResizeObserver interface: operation unobserve(Element)]
+ expected: FAIL
+
+ [ResizeObserver interface: operation disconnect()]
+ expected: FAIL
+
+ [ResizeObserver must be primary interface of observer]
+ expected: FAIL
+
+ [Stringification of observer]
+ expected: FAIL
+
+ [ResizeObserver interface: observer must inherit property "observe(Element, optional ResizeObserverOptions)" with the proper type]
+ expected: FAIL
+
+ [ResizeObserver interface: calling observe(Element, optional ResizeObserverOptions) on observer with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [ResizeObserver interface: observer must inherit property "unobserve(Element)" with the proper type]
+ expected: FAIL
+
+ [ResizeObserver interface: calling unobserve(Element) on observer with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [ResizeObserver interface: observer must inherit property "disconnect()" with the proper type]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ResizeObserverEntry interface object length]
+ expected: FAIL
+
+ [ResizeObserverEntry interface object name]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: attribute target]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: attribute contentRect]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: attribute borderBoxSize]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: attribute contentBoxSize]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: attribute devicePixelContentBoxSize]
+ expected: FAIL
+
+ [ResizeObserverEntry must be primary interface of entry]
+ expected: FAIL
+
+ [Stringification of entry]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: entry must inherit property "target" with the proper type]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: entry must inherit property "contentRect" with the proper type]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: entry must inherit property "borderBoxSize" with the proper type]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: entry must inherit property "contentBoxSize" with the proper type]
+ expected: FAIL
+
+ [ResizeObserverEntry interface: entry must inherit property "devicePixelContentBoxSize" with the proper type]
+ expected: FAIL
+
+ [ResizeObserverSize interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ResizeObserverSize interface object length]
+ expected: FAIL
+
+ [ResizeObserverSize interface object name]
+ expected: FAIL
+
+ [ResizeObserverSize interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ResizeObserverSize interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ResizeObserverSize interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ResizeObserverSize interface: attribute inlineSize]
+ expected: FAIL
+
+ [ResizeObserverSize interface: attribute blockSize]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini
new file mode 100644
index 00000000000..bec8e80bb54
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/iframe-same-origin.html.ini
@@ -0,0 +1,2 @@
+[iframe-same-origin.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini
new file mode 100644
index 00000000000..37ecd60f5cb
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/notify.html.ini
@@ -0,0 +1,4 @@
+[notify.html]
+ expected: ERROR
+ [ResizeObserver implemented]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini
new file mode 100644
index 00000000000..ac4858d5ec9
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/observe.html.ini
@@ -0,0 +1,4 @@
+[observe.html]
+ expected: ERROR
+ [ResizeObserver implemented]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini
new file mode 100644
index 00000000000..4dbdb1425e4
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/ordering.html.ini
@@ -0,0 +1,3 @@
+[ordering.html]
+ [ResizeObserver and IntersectionObserver ordering]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini
new file mode 100644
index 00000000000..659e8c5cdbb
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars-2.html.ini
@@ -0,0 +1,3 @@
+[scrollbars-2.html]
+ [ResizeObserver content-box size and scrollbars]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini
new file mode 100644
index 00000000000..d50311f8767
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/scrollbars.html.ini
@@ -0,0 +1,3 @@
+[scrollbars.html]
+ [ResizeObserver content-box size and scrollbars]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini
new file mode 100644
index 00000000000..b3f430f8726
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-001.html.ini
@@ -0,0 +1,4 @@
+[svg-with-css-box-001.html]
+ expected: ERROR
+ [ResizeObserver implemented]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini
new file mode 100644
index 00000000000..2800c85ddad
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/svg-with-css-box-002.svg.ini
@@ -0,0 +1,2 @@
+[svg-with-css-box-002.svg]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini b/tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini
new file mode 100644
index 00000000000..e335a90f4cf
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/resize-observer/svg.html.ini
@@ -0,0 +1,3 @@
+[svg.html]
+ [ResizeObserver implemented]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini b/tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini
new file mode 100644
index 00000000000..54f418b142b
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/selection/move-paragraph-cross-editing-boundary.tentative.html.ini
@@ -0,0 +1,6 @@
+[move-paragraph-cross-editing-boundary.tentative.html]
+ [cross editing boundary]
+ expected: FAIL
+
+ [not cross editing boundary]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini b/tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini
new file mode 100644
index 00000000000..d2480558e0a
--- /dev/null
+++ b/tests/wpt/meta-legacy-layout/selection/textcontrols/selectionchange-on-shadow-dom.html.ini
@@ -0,0 +1,2 @@
+[selectionchange-on-shadow-dom.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini
index 24daae4c2e7..24daae4c2e7 100644
--- a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini
+++ b/tests/wpt/meta-legacy-layout/workers/WorkerGlobalScope-close.html.ini
diff --git a/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini b/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini
index 93496d77322..7cfec1db884 100644
--- a/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini
+++ b/tests/wpt/meta/FileAPI/blob/Blob-constructor.any.js.ini
@@ -2,7 +2,7 @@
[options properties should be accessed in lexicographic order.]
expected: FAIL
- [Passing typed arrays as elements of the blobParts array should work.]
+ [Passing a Float16Array as element of the blobParts array should work.]
expected: FAIL
@@ -10,5 +10,5 @@
[options properties should be accessed in lexicographic order.]
expected: FAIL
- [Passing typed arrays as elements of the blobParts array should work.]
+ [Passing a Float16Array as element of the blobParts array should work.]
expected: FAIL
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 0625de8d1de..b320ff75811 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -1538,6 +1538,13 @@
{}
]
],
+ "chrome-bug-346264227-crash.html": [
+ "ae7809016e699fe8b3524b38109bc301a1e59477",
+ [
+ null,
+ {}
+ ]
+ ],
"chrome-custom-highlight-crash.html": [
"61e5075ed4e1b485019d96b402bbf17926bd1098",
[
@@ -2561,6 +2568,13 @@
{}
]
],
+ "firefox-bug-1901624-crash.html": [
+ "306bc15aa49ea3208353b954cb1367c01d36ce98",
+ [
+ null,
+ {}
+ ]
+ ],
"float-becomes-inflow-crash.html": [
"c820b093ce332abc2bce9c58456cb67fe268f637",
[
@@ -21738,7 +21752,7 @@
"element": {
"canvas-host": {
"2d.canvas.host.scaled-manual.html": [
- "acf3f9c7b344711b38326671a6a8edd332692606",
+ "930432a39fea0b16e4620aa8b4b8e1226c81c334",
[
null,
{}
@@ -32380,6 +32394,294 @@
{}
]
],
+ "margin-boxes": {
+ "alignment-001-print.html": [
+ "ad9c78baa6c0e9a392452d0f543c5511719f5d34",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/alignment-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "auto-margins-001-print.html": [
+ "cf2501385f10483999811024195a79f9f19225f7",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/auto-margins-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "auto-margins-002-print.html": [
+ "5b424941cadd75afad2083a619871a9d5aa80749",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/auto-margins-002-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "auto-margins-003-print.html": [
+ "4fe7192a56f2400c71342c3e6b3d6dd7dc62289c",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/auto-margins-003-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "content-001-print.html": [
+ "efaa71b8c848bc13733f191a3c1f004edca80f29",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/content-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-001-print.html": [
+ "20d4e3059e0df47c0e4f782bfce782c0184789f1",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-002-print.html": [
+ "4637a39ed516dc7b26d3bb11a634dc5e3f1262b5",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-002-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-003-print.html": [
+ "fe9f26da5d7c4dc008cd58539ba4ffc23adc309b",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-003-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-004-print.html": [
+ "80bcc43fb39b84fb291fb822de9a58bf26181a1c",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-004-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-005-print.html": [
+ "2823424f39a1ce99f39af781e830378bb62f738a",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-005-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-006-print.html": [
+ "6ea477f2c84d63b599d673ccbd943ae5ba62be26",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-006-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-007-print.html": [
+ "cf7e5f507543f0ea8b523e83493d91cdb5b0e94b",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-007-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-008-print.html": [
+ "8bdf0cdac0bb5796f3e6c99c0f3ded01f13527ee",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-008-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-009-print.html": [
+ "602cc5680ec315dc8335a8ed294a14f0286b580b",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-009-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-010-print.html": [
+ "1ebaa6d9288b89bb90c62fa5f99406e2e8fb91bb",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-010-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-011-print.html": [
+ "e51d1fbd75eea07e2b8bc3106b3a344b944181e6",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-011-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-012-print.html": [
+ "6b4ac2c28c723f6db09d16c50df301b0884b9af2",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-012-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-013-print.html": [
+ "4540b07190673da2fe0bbb616fb66a46512acae1",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-013-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "dimensions-014-print.html": [
+ "d126f2d0c91c5daba93e78c5075adb7499059c9f",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/dimensions-013-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "inapplicable-properties-print.html": [
+ "f5f7f8ea247a76726f74fcab0d3de187a91f8557",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/inapplicable-properties-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "overconstrained-001-print.html": [
+ "549443ebc3226a2a954c82719a3cf7b25f62230a",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/overconstrained-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "paint-order-001-print.html": [
+ "839762f0b9a7de87cba63e13be87d6af66bddd53",
+ [
+ null,
+ [
+ [
+ "/css/css-page/margin-boxes/paint-order-001-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"media-queries-001-print.html": [
"01b2a00e470263b6371313b5107c7add544d858c",
[
@@ -142230,6 +142532,19 @@
{}
]
],
+ "overflowing-block-004.html": [
+ "edf9e53439bdf46352e0c41480b1692a152927c6",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"parallel-flow-trailing-margin-001.html": [
"a6391cd9d4738676417f69223038f9f603ea83d1",
[
@@ -177062,8 +177377,8 @@
{}
]
],
- "font-size-adjust-ic-height.tentative.html": [
- "85aeb2683cbcae01e0c65923360b8719d8d7e738",
+ "font-size-adjust-ic-height.html": [
+ "5157d76847a8fdc63e51e2c34a4d945d3250e6e1",
[
null,
[
@@ -189070,7 +189385,7 @@
]
],
"css-target-text-decoration-001.html": [
- "fa76c0bc4e7636c416ac876530f11d9a4e40050a",
+ "14ba7111dce9a2cb6aebf8a7dec041e6d11ef864",
[
null,
[
@@ -189090,7 +189405,7 @@
],
[
0,
- 32
+ 38
]
]
]
@@ -191521,6 +191836,32 @@
}
]
],
+ "image-orientation-exif-png-2.html": [
+ "9c70b08ab814747ae0cc1f8aad3499f5087a8892",
+ [
+ null,
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-exif-png-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "image-orientation-exif-png-3.html": [
+ "536b7d2560c2fb1e595033b5397a654ff68533c2",
+ [
+ null,
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-exif-png-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"image-orientation-exif-png.html": [
"85d807e39869cfc5f847bb7454b2465de9eb8c40",
[
@@ -199714,6 +200055,19 @@
{}
]
],
+ "details-open.html": [
+ "8354d0122328b9dbeed2657c624354580152c551",
+ [
+ null,
+ [
+ [
+ "/css/css-lists/details-open-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"foo-counter-reversed-006a.html": [
"028f1fe19998c8eb70cc1d98d6d6f9ee852b7b03",
[
@@ -199857,6 +200211,19 @@
{}
]
],
+ "implicit-and-explicit-list-item-counters.html": [
+ "5b7a99481657032228e693b0804d79bd299eed44",
+ [
+ null,
+ [
+ [
+ "/css/css-lists/implicit-and-explicit-list-item-counters-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"inline-block-list-marker.html": [
"73a163fa9dbe472fb6223c42fd0075843faf4b51",
[
@@ -215838,6 +216205,32 @@
{}
]
],
+ "scrollbar-gutter-fixedpos-003.html": [
+ "cdffebb5c7b8db6557e901eee7acd651c273fe01",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scrollbar-gutter-fixedpos-004.html": [
+ "debb28d397f5f0377565f6fd157a8ac89f7cc1b2",
+ [
+ null,
+ [
+ [
+ "/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"scrollbar-gutter-rtl-002.html": [
"8d0376defdfc69ecb44fc2134c81573e553db2bb",
[
@@ -224799,6 +225192,19 @@
{}
]
],
+ "ruby-text-dynamic-style.html": [
+ "3adade2dd3cd4723774efe22352e3e9389f81e82",
+ [
+ null,
+ [
+ [
+ "/css/css-ruby/reference/ruby-text-dynamic-style-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"ruby-whitespace-001.html": [
"9072a8e6841925a5023730ad48b5a2f074b1d0dd",
[
@@ -237774,6 +238180,32 @@
{}
]
],
+ "hyphens-vs-float-clearance-001.html": [
+ "29b7c3c9fa595dd23d6cc7ee4aded6687feea8f3",
+ [
+ null,
+ [
+ [
+ "/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "hyphens-vs-float-clearance-002.html": [
+ "6b5b213cb71cb55930da8ef0058522667301f49e",
+ [
+ null,
+ [
+ [
+ "/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"i18n": {
"hyphens-i18n-auto-001.html": [
"bfcd2f1362f40dd932e5444eb38ff676a27e895f",
@@ -283144,6 +283576,32 @@
{}
]
],
+ "transparent-accent-color-001.html": [
+ "219e24c1689b11dca0f22670118439d10e6b8813",
+ [
+ null,
+ [
+ [
+ "/css/css-ui/reference/transparent-accent-color-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "transparent-accent-color-002.html": [
+ "46b9835d0c18313885e08e2d469111cb82fa841f",
+ [
+ null,
+ [
+ [
+ "/css/css-ui/reference/transparent-accent-color-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"webkit-appearance-auto-001.html": [
"fb0261b020f6fc2b1e3bfccb3da7d899f0337f79",
[
@@ -288075,6 +288533,19 @@
{}
]
],
+ "element-escapes-clip-with-abspos-child.html": [
+ "b16b02bd63214db23fa60e00aac8b3f1773909dd",
+ [
+ null,
+ [
+ [
+ "/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"element-is-grouping-during-animation.html": [
"b1ef745e0dba3e60022921cdf60deea4116791be",
[
@@ -291497,6 +291968,19 @@
{}
]
],
+ "transformed-element-scroll-transform.html": [
+ "8ff0780bbd3a2dd2b827599d1c486371da91638d",
+ [
+ null,
+ [
+ [
+ "/css/css-view-transitions/transformed-element-scroll-transform-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"transition-in-empty-iframe.html": [
"101f7c2a632f6b02ed285a0a73c46a3934b54667",
[
@@ -308022,6 +308506,35 @@
{}
]
],
+ "backdrop-filter-edge-mirror.html": [
+ "c11d2f2733e3cf452299dc0f088f4459c9f53910",
+ [
+ null,
+ [
+ [
+ "/css/filter-effects/backdrop-filter-edge-mirror-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 10000
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"backdrop-filter-edge-pixels.html": [
"5a70020890b619fd08f6546a4f3549568ce3856b",
[
@@ -327823,6 +328336,19 @@
{}
]
],
+ "input-checkbox-zero-size.html": [
+ "406f7da9547b4f7f1142fe5a8b129d150fd95ea4",
+ [
+ null,
+ [
+ [
+ "/css/reference/blank.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"input-date-baseline-min-height.html": [
"86b552ab809bb77e0edee713daacab8869351941",
[
@@ -337741,6 +338267,19 @@
},
"svg": {
"animations": {
+ "conditional-processing-01.html": [
+ "fe3958f71f3ba6fdc37b65afd02aeabe5dc88bb7",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"scripted": {
"animateMotion-animated-line.svg": [
"5e853dab03a547f2e963e0ecc51048a9ea3ea307",
@@ -337782,6 +338321,32 @@
{}
]
],
+ "switch-animation-01.html": [
+ "f33becbb6556a04ae4b3cde31e86d835dd416140",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "switch-animation-02.html": [
+ "c0b97a2cd2af0392ccfb284ccdef877f5941e2a0",
+ [
+ null,
+ [
+ [
+ "/svg/struct/reftests/reference/green-100x100.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"use-animate-display-none-symbol-2.html": [
"db06b641d9a60b094aee40a3930fd7229fcdb0d5",
[
@@ -345552,7 +346117,7 @@
]
},
"web-identity": [
- "6f1260dbc373c19505e5d6c9a7328d63ef4eef2f",
+ "c36f63e813868d095f578bb511a3e409e3051abd",
[]
]
},
@@ -368362,7 +368927,7 @@
],
"support": {
"echo-allow-csp-from.py": [
- "3a914379671ce91b6991750f5b7b9b6bf4afa02c",
+ "b025012ec8e982958ed9104cd83f618a8f4a98b3",
[]
],
"echo-policy-multiple.py": [
@@ -368386,7 +368951,7 @@
[]
],
"testharness-helper.sub.js": [
- "7d2307ebbc974446d59fd7b023fe9f7ce088c193",
+ "551ad0348a754c906778dbfb58459298530f48e5",
[]
]
}
@@ -370631,221 +371196,37 @@
[]
],
"fedcm": {
- "accounts.py": [
- "126f911a58c80a62de06b6062cdb4488549471b9",
- []
- ],
- "accounts_check_same_site_strict.py": [
- "796ac003cbc0bb34773b50c1c5de4351aae8dddd",
- []
- ],
- "accounts_no_approved_clients.py": [
- "faea06edc363067b83ce23391e75d254cf9eea76",
- []
- ],
- "client_metadata.py": [
- "72ddcc5cd62569fa280adcab9490e84b851e6780",
- []
- ],
- "client_metadata.py.headers": [
- "7164e5f81827da39996b033972a508e5b371de11",
- []
- ],
- "client_metadata_clear_count.py": [
- "3c31bf5077d73ac258f4a96bb6b4f5e95802f184",
- []
- ],
- "continue_on.py": [
- "2a580e0f3f4fd525c3826795f5bfd05eb0a55675",
- []
- ],
"disconnect-iframe.html": [
"f65763932b8c742debdbabbefc310613fe83f0e5",
[]
],
- "disconnect.py": [
- "cf62ceda22515dd036cdea9fec4de7305b4a51b4",
- []
- ],
- "disconnect_failure.py": [
- "f880218b2f6156817aeb7ac16c0e1e42f3ed5103",
- []
- ],
- "error_with_code_and_url.py": [
- "71bfea00f463051e7bd496cf1c28f25208e2b41e",
- []
- ],
"intercept_service_worker.js": [
- "773e38fd21b023b8314f732b6d1893ab6c65a3cd",
+ "fd0bb71a0c7ac405a7b1d148d6a08341c44117d7",
[]
],
"keys.py": [
"6b7d67e21e7eea7927a40ab094847b7224d49985",
[]
],
- "login.html": [
- "78d241cda952bccdeff05653f0cc7311afa73710",
- []
- ],
- "manifest-not-in-list.json": [
- "00700666675413d378bba7c3f8bed12f2b9b4849",
- []
- ],
- "manifest-token-nocors.json": [
- "77ba1b4702bc03c324d1af007eacb9d24df62c3b",
- []
- ],
- "manifest.py": [
- "a40fc100eee697ed7dcd451626409af18606442e",
- []
- ],
- "manifest_check_disclosure_shown_false.json": [
- "47ca63edc4fc96f4d563beba7e872ae5d47461c1",
- []
- ],
- "manifest_check_disclosure_shown_true.json": [
- "7d7004c3cffee4fdbdf824b28456fd20b617de8b",
- []
- ],
- "manifest_check_same_site_strict.json": [
- "d7304159834804c417f498acebc45f59e588dcbb",
- []
- ],
- "manifest_id_assertion_endpoint_returns_error.json": [
- "e098cc4511a1980392097d0a26c020db3243ae35",
- []
- ],
- "manifest_no_login_url.json": [
- "15a657c679df7b0dfb0be1058e7086b439781762",
- []
- ],
- "manifest_redirect_accounts.json": [
- "6a8972feebd6d139cb279d2f0446d4c3957bc5fc",
- []
- ],
- "manifest_redirect_token.json": [
- "867b4dffb76902ed20d2ec96e1f744851bbb5163",
- []
- ],
- "manifest_token_with_http_error.json": [
- "691a1e8d3a63a3695ec1fd29267506363871af71",
- []
- ],
- "manifest_with_auto_selected_flag.json": [
- "591c927153b9a78695ded0663fed600cbae5bcb6",
- []
- ],
- "manifest_with_continue_on.json": [
- "d7673c7e1b13e692ef59c091c32bf520663d058f",
- []
- ],
- "manifest_with_cross_origin_disconnect.sub.json": [
- "a1ad5c71ac3d2395c97d4aa387a6ec1de2b84b3e",
- []
- ],
- "manifest_with_disconnect_failure.json": [
- "96035e7e8b34d982c86e6555b384126e043e03fa",
- []
- ],
- "manifest_with_no_accounts.json": [
- "0d38f26d350c5064c3cd174d4af2c822c9d2ff97",
- []
- ],
- "manifest_with_rp_mode.json": [
- "5692fd91905cf37b4e2c301f55c129c21c691e56",
- []
- ],
- "manifest_with_single_account.json": [
- "5f9b7a81b9a4f9cdb1506dffc922bd15627a1222",
- []
- ],
- "manifest_with_two_accounts.json": [
- "6310fb0a0becfbe03b7fec666aea406a587b0858",
- []
- ],
- "manifest_with_variable_accounts.json": [
- "9e4af250045757a3ce7b58bc7d0347ecd2794a40",
- []
- ],
- "no_accounts.py": [
- "8767c50afb470d994b67b0486791b6835a8f558f",
- []
- ],
"pending-userinfo-iframe.html": [
- "0afe279bcc57a73210fb41739be69fa1fdb99fc1",
+ "da2cd26066abd87eaa04d5ade3845424d49de103",
[]
],
"request-params-check.py": [
"08c28e32b7942d6db83f7b9c2e4664c9cf47987f",
[]
],
- "resolve.html": [
- "dbdc28c3247a386976e0711d08369dedc69ba4a9",
- []
- ],
- "select_manifest_in_root_manifest.py": [
- "d4f1efff6a74c7636f60cba35b4eff010fccfd29",
- []
- ],
- "set_accounts_cookie.py": [
- "15adf11324ee6b7a0b03d402622e6dad82f677c5",
- []
- ],
"simple.html": [
"d62419ce8a0ac12a85f5b8e595a874714b038b44",
[]
],
- "single_account.py": [
- "7c8906ae7b97d281b22049266076c0ff72f62385",
- []
- ],
- "token.py": [
- "7ec81c390a9ea116e0a1809e08159a1d1c40e5a1",
- []
- ],
- "token_check_disclosure_shown_false.py": [
- "a25a14af694848e65ed7c2943b3482910d20c355",
- []
- ],
- "token_check_disclosure_shown_true.py": [
- "00b755b920cd999b4bc91af63ed70071a71c634a",
- []
- ],
- "token_check_same_site_strict.py": [
- "4e55bf27f610032b30eb3278ddd0f7db4716efef",
- []
- ],
- "token_with_account_id.py": [
- "04e7b5b56b9e560b8ebdaef150ef5037aeb18be0",
- []
- ],
- "token_with_auto_selected_flag.py": [
- "3e011ce788c88aae5363d367a6c653b655867354",
- []
- ],
- "token_with_http_error.py": [
- "05b9945ba80dad9fd3bf87a467d50a7f4e9d3071",
- []
- ],
- "token_with_rp_mode.py": [
- "add634c99bb959eefe821ffad9bb12d9e2a904a2",
- []
- ],
- "two_accounts.py": [
- "4022561ff78321d91605b07f76d03a1f8deb5297",
- []
- ],
"userinfo-iframe.html": [
- "45a1a34ce9e360e8eae13cb1e79c011c9b74db4a",
- []
- ],
- "variable_accounts.py": [
- "fc4446acc49e4e1538a10478e3aa744ccc495db2",
+ "64d5cb83a088db7dc8f3a9e7e2a65301eb0b64b1",
[]
]
},
"fedcm-helper.sub.js": [
- "308950e1e29c7cb0a10d366fb40f673e6befc28f",
+ "17ed5ce4468492368c3bf33e8d9462f9c87641e4",
[]
],
"fedcm-helper.sub.js.headers": [
@@ -397861,7 +398242,7 @@
[]
],
"font-size-adjust-ic-height-ref.html": [
- "2756e91774ccc28bfaf42a79a230a2b6faf1851e",
+ "1b364bd6d9de648f185d1cb7341964a14fcb7029",
[]
],
"font-size-adjust-metrics-override-ref.html": [
@@ -407066,6 +407447,10 @@
]
},
"support": {
+ "F-exif-chunk-early.png": [
+ "24bd924e9e71eaaee22961c26e87de314d90f719",
+ []
+ ],
"F-exif-early.png": [
"6714cec8253723237cfbe95b319e0ae2162120e6",
[]
@@ -408548,6 +408933,14 @@
"468739cfcb389638e9cc9880fcc31bd7022e12e6",
[]
],
+ "details-open-ref.html": [
+ "88903cb8bbe8287c7307d777414361c7e0e1b7fe",
+ []
+ ],
+ "implicit-and-explicit-list-item-counters-ref.html": [
+ "97cc7de15a377f2927524796831f19d94a48876a",
+ []
+ ],
"inline-block-list-marker-ref.html": [
"6deadbfc9b65c7f89d8c428e1da6c75f1adc3d82",
[]
@@ -411378,6 +411771,14 @@
"4019f3f2d3e12f6d7274372c0d691752b326e382",
[]
],
+ "scrollbar-gutter-fixedpos-003-ref.html": [
+ "72a6c087b31d90172a89cc45d99f88436d7dd6c8",
+ []
+ ],
+ "scrollbar-gutter-fixedpos-004-ref.html": [
+ "fe1b96fce8ac4faf2f67e40ca6fbbfd9dad4852e",
+ []
+ ],
"scrollbar-gutter-rtl-002-ref.html": [
"e6510a081353db996c4ead14ad6a167b90d48297",
[]
@@ -411490,6 +411891,92 @@
"a779b263c7d2d9a4be7109431798d86844694a51",
[]
],
+ "margin-boxes": {
+ "alignment-001-print-ref.html": [
+ "e91b2377db1ca232230e6c035a744db77b2e2e52",
+ []
+ ],
+ "auto-margins-001-print-ref.html": [
+ "70f4a41ab59830856ee7d6c5c8b0946a6b06d40a",
+ []
+ ],
+ "auto-margins-002-print-ref.html": [
+ "56adf2a5401944e58bab8382a14879bd1b655bc3",
+ []
+ ],
+ "auto-margins-003-print-ref.html": [
+ "252633b0581a6b2cd09244b0b000b7e7f7effdb8",
+ []
+ ],
+ "content-001-print-ref.html": [
+ "bd3ba7e0ccf47a6b18b548cccf0b01ae62e5212b",
+ []
+ ],
+ "dimensions-001-print-ref.html": [
+ "dca52cb8bc727c99bc941b24797255e89fbf1811",
+ []
+ ],
+ "dimensions-002-print-ref.html": [
+ "83e144fb3363262de938737671522faef5ca6043",
+ []
+ ],
+ "dimensions-003-print-ref.html": [
+ "c491cdde98ee56e98cfba9f15f91f1fbfe2f9952",
+ []
+ ],
+ "dimensions-004-print-ref.html": [
+ "3f45190e330d2df06ad3b6b4928d0239bdb2ca5e",
+ []
+ ],
+ "dimensions-005-print-ref.html": [
+ "1749b1c71471fcceb9599b8e09105b08921ff090",
+ []
+ ],
+ "dimensions-006-print-ref.html": [
+ "f6aa9e60f48b9949a4dabb5833b0590bef56fe81",
+ []
+ ],
+ "dimensions-007-print-ref.html": [
+ "b91c086879a1967dfcd83c2f433c10cdd8824ad2",
+ []
+ ],
+ "dimensions-008-print-ref.html": [
+ "5bd141a28e1cb394beffd81e656d8eaaa7802908",
+ []
+ ],
+ "dimensions-009-print-ref.html": [
+ "922d165efa1b4af7d2c86a4c074894f07eb0a16c",
+ []
+ ],
+ "dimensions-010-print-ref.html": [
+ "a4c0b4702d54007fbc036fd8f4a8e7ecd8196866",
+ []
+ ],
+ "dimensions-011-print-ref.html": [
+ "54983175e3db5052e46af701975393952853ff06",
+ []
+ ],
+ "dimensions-012-print-ref.html": [
+ "e62880031a164230240d334ffa6e370f0ffeb562",
+ []
+ ],
+ "dimensions-013-print-ref.html": [
+ "a131b564fd62fd9f7935bbd371e0298c74e2f68c",
+ []
+ ],
+ "inapplicable-properties-print-ref.html": [
+ "157cb8effa4d501dd3dab2c8535e8cc45f26b390",
+ []
+ ],
+ "overconstrained-001-print-ref.html": [
+ "de6b55257ca2ef63cb612dff61a3a1165e2874c1",
+ []
+ ],
+ "paint-order-001-print-ref.html": [
+ "2677aee123cba64e023d9be967f71a8d4caa5c20",
+ []
+ ]
+ },
"media-queries-001-print-ref.html": [
"35af04dc3c45b06a092d11569227a9a7014c2068",
[]
@@ -412859,7 +413346,7 @@
[]
],
"first-letter-hi-001-ref.html": [
- "d0decf8bf41d4516895f77ecf3462231d063f09e",
+ "0eaae755eb91fbb3983ff2caf9bbe4ac4f7bc9e1",
[]
],
"first-letter-hi-002-ref.html": [
@@ -413688,6 +414175,10 @@
"ruby-annotation-pairing-001-ref.html": [
"2a8f9a836fff9106e1430649cae3ad9a57aea241",
[]
+ ],
+ "ruby-text-dynamic-style-ref.html": [
+ "dd3ab2d445785b85fcec96236b26e4f32c15be41",
+ []
]
},
"root-ruby-ref.xhtml": [
@@ -416660,6 +417151,10 @@
"63c751165f873060027c809cb3fc165b8974fa99",
[]
],
+ "hyphens-vs-float-clearance-001-ref.html": [
+ "1fc7b3d521089f26501a74f8130b0a93ceb91b78",
+ []
+ ],
"shy-styling-001-alt-ref.html": [
"c86cb5002867c899f54a59d25c0a0572e7658cd7",
[]
@@ -423120,6 +423615,14 @@
"text-overflow-ellipsis-indent-001-ref.html": [
"660a7c4d52e7e2a763bfffc7582469896a5835b8",
[]
+ ],
+ "transparent-accent-color-001-ref.html": [
+ "c9d6eb720f1f8f17285014b0b7fa99f86ec6e4e7",
+ []
+ ],
+ "transparent-accent-color-002-ref.html": [
+ "819a5852460eeb295a65ac9acf8ce8683c93170f",
+ []
]
},
"resize-change-margin-ref.html": [
@@ -424894,6 +425397,10 @@
"029b0e9f86f7043ff92d17071ceca7544649b985",
[]
],
+ "element-escapes-clip-with-abspos-child-ref.html": [
+ "1e22d6f66d742b7a8c99b3ecb075356d2811b18b",
+ []
+ ],
"element-is-grouping-during-animation-ref.html": [
"38fca3c5288a444b959f1d5279056f8608798fa3",
[]
@@ -425524,6 +426031,10 @@
"e38cbb0ffeb8c0518bbfbede3b196e326014f78f",
[]
],
+ "transformed-element-scroll-transform-ref.html": [
+ "b6e89e28d5acabf6490adc5d5b6dc1e8d8985d6a",
+ []
+ ],
"transition-in-empty-iframe-ref.html": [
"29e4c32e5b22b26d6d7036a45468f6424e36bdaf",
[]
@@ -428462,6 +428973,10 @@
"matchMedia.js": [
"f8947e0472f489ca1a98a9e231b17e7d8ce6585e",
[]
+ ],
+ "simultaneousScrollIntoViews.js": [
+ "f3d02d2598d2624fc602e1a49b6afcbbb24017ed",
+ []
]
},
"scrollTop-display-change-ref.html": [
@@ -428476,6 +428991,10 @@
"c8a783980f8a36216f282f5873b9e161286ab3ac",
[]
],
+ "smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html": [
+ "26dbdd2053ae62efcb7710eecc8dc270119ffe00",
+ []
+ ],
"support": {
"1x1-green.png": [
"b98ca0ba0a03c580ac339e4a3653539cfa8edc71",
@@ -428744,6 +429263,10 @@
"b605e3251c5b91f50a8b001655884b28937e9bef",
[]
],
+ "backdrop-filter-edge-mirror-ref.html": [
+ "c80dcb04e5cd81b03535de87b0f305efe865fb0e",
+ []
+ ],
"backdrop-filter-edge-pixels-ref.html": [
"36c509ff95d9b667018d070f4c1c7d334437ce37",
[]
@@ -431962,7 +432485,7 @@
"parts": {
"resources": {
"domparts-utils.js": [
- "f8982de50f334fa7899385b27085434e4f97a6a7",
+ "d1da9fb0785f8b9551eacaa83606c84febf80ccd",
[]
]
}
@@ -434170,6 +434693,194 @@
]
}
},
+ "fedcm": {
+ "support": {
+ "accounts.py": [
+ "126f911a58c80a62de06b6062cdb4488549471b9",
+ []
+ ],
+ "accounts_check_same_site_strict.py": [
+ "796ac003cbc0bb34773b50c1c5de4351aae8dddd",
+ []
+ ],
+ "accounts_no_approved_clients.py": [
+ "faea06edc363067b83ce23391e75d254cf9eea76",
+ []
+ ],
+ "client_metadata.py": [
+ "72ddcc5cd62569fa280adcab9490e84b851e6780",
+ []
+ ],
+ "client_metadata.py.headers": [
+ "7164e5f81827da39996b033972a508e5b371de11",
+ []
+ ],
+ "client_metadata_clear_count.py": [
+ "0e52d99c1dd23a238daa64869ac0787d6010faba",
+ []
+ ],
+ "continue_on.py": [
+ "2a580e0f3f4fd525c3826795f5bfd05eb0a55675",
+ []
+ ],
+ "disconnect.py": [
+ "cf62ceda22515dd036cdea9fec4de7305b4a51b4",
+ []
+ ],
+ "disconnect_failure.py": [
+ "f880218b2f6156817aeb7ac16c0e1e42f3ed5103",
+ []
+ ],
+ "error_with_code_and_url.py": [
+ "71bfea00f463051e7bd496cf1c28f25208e2b41e",
+ []
+ ],
+ "login.html": [
+ "78d241cda952bccdeff05653f0cc7311afa73710",
+ []
+ ],
+ "manifest-not-in-list.json": [
+ "00700666675413d378bba7c3f8bed12f2b9b4849",
+ []
+ ],
+ "manifest-token-nocors.json": [
+ "77ba1b4702bc03c324d1af007eacb9d24df62c3b",
+ []
+ ],
+ "manifest.py": [
+ "a40fc100eee697ed7dcd451626409af18606442e",
+ []
+ ],
+ "manifest_check_disclosure_shown_false.json": [
+ "47ca63edc4fc96f4d563beba7e872ae5d47461c1",
+ []
+ ],
+ "manifest_check_disclosure_shown_true.json": [
+ "7d7004c3cffee4fdbdf824b28456fd20b617de8b",
+ []
+ ],
+ "manifest_check_same_site_strict.json": [
+ "d7304159834804c417f498acebc45f59e588dcbb",
+ []
+ ],
+ "manifest_id_assertion_endpoint_returns_error.json": [
+ "e098cc4511a1980392097d0a26c020db3243ae35",
+ []
+ ],
+ "manifest_no_login_url.json": [
+ "15a657c679df7b0dfb0be1058e7086b439781762",
+ []
+ ],
+ "manifest_redirect_accounts.json": [
+ "ed9b3c296928c9f177d06477fbd2793c341acf76",
+ []
+ ],
+ "manifest_redirect_token.json": [
+ "ba04e890770e925157826bd2f7fb8d7887ef71e5",
+ []
+ ],
+ "manifest_token_with_http_error.json": [
+ "691a1e8d3a63a3695ec1fd29267506363871af71",
+ []
+ ],
+ "manifest_with_auto_selected_flag.json": [
+ "591c927153b9a78695ded0663fed600cbae5bcb6",
+ []
+ ],
+ "manifest_with_continue_on.json": [
+ "d7673c7e1b13e692ef59c091c32bf520663d058f",
+ []
+ ],
+ "manifest_with_cross_origin_disconnect.sub.json": [
+ "77d27e33f26bbe466e678f17391850ab1bab4548",
+ []
+ ],
+ "manifest_with_disconnect_failure.json": [
+ "96035e7e8b34d982c86e6555b384126e043e03fa",
+ []
+ ],
+ "manifest_with_no_accounts.json": [
+ "0d38f26d350c5064c3cd174d4af2c822c9d2ff97",
+ []
+ ],
+ "manifest_with_rp_mode.json": [
+ "5692fd91905cf37b4e2c301f55c129c21c691e56",
+ []
+ ],
+ "manifest_with_single_account.json": [
+ "5f9b7a81b9a4f9cdb1506dffc922bd15627a1222",
+ []
+ ],
+ "manifest_with_two_accounts.json": [
+ "6310fb0a0becfbe03b7fec666aea406a587b0858",
+ []
+ ],
+ "manifest_with_variable_accounts.json": [
+ "9e4af250045757a3ce7b58bc7d0347ecd2794a40",
+ []
+ ],
+ "no_accounts.py": [
+ "8767c50afb470d994b67b0486791b6835a8f558f",
+ []
+ ],
+ "resolve.html": [
+ "dbdc28c3247a386976e0711d08369dedc69ba4a9",
+ []
+ ],
+ "select_manifest_in_root_manifest.py": [
+ "d4f1efff6a74c7636f60cba35b4eff010fccfd29",
+ []
+ ],
+ "set_accounts_cookie.py": [
+ "15adf11324ee6b7a0b03d402622e6dad82f677c5",
+ []
+ ],
+ "single_account.py": [
+ "7c8906ae7b97d281b22049266076c0ff72f62385",
+ []
+ ],
+ "token.py": [
+ "7ec81c390a9ea116e0a1809e08159a1d1c40e5a1",
+ []
+ ],
+ "token_check_disclosure_shown_false.py": [
+ "a25a14af694848e65ed7c2943b3482910d20c355",
+ []
+ ],
+ "token_check_disclosure_shown_true.py": [
+ "00b755b920cd999b4bc91af63ed70071a71c634a",
+ []
+ ],
+ "token_check_same_site_strict.py": [
+ "4e55bf27f610032b30eb3278ddd0f7db4716efef",
+ []
+ ],
+ "token_with_account_id.py": [
+ "04e7b5b56b9e560b8ebdaef150ef5037aeb18be0",
+ []
+ ],
+ "token_with_auto_selected_flag.py": [
+ "3e011ce788c88aae5363d367a6c653b655867354",
+ []
+ ],
+ "token_with_http_error.py": [
+ "05b9945ba80dad9fd3bf87a467d50a7f4e9d3071",
+ []
+ ],
+ "token_with_rp_mode.py": [
+ "add634c99bb959eefe821ffad9bb12d9e2a904a2",
+ []
+ ],
+ "two_accounts.py": [
+ "4022561ff78321d91605b07f76d03a1f8deb5297",
+ []
+ ],
+ "variable_accounts.py": [
+ "fc4446acc49e4e1538a10478e3aa744ccc495db2",
+ []
+ ]
+ }
+ },
"fenced-frame": {
"README.md": [
"3dc65fbc050b0596a1b23f4341c5192c41115fe0",
@@ -434961,7 +435672,7 @@
[]
],
"utils.js": [
- "218ac281f65242565bde58fee0ee8e2998e7e444",
+ "c4807c58aee02230e2d26950ed56c604a83e84ab",
[]
],
"web-bluetooth-inner.html": [
@@ -438924,7 +439635,7 @@
[]
],
"remote-context-helper.js": [
- "a7202656c860a2a3fbbfc3ce9d688db2cbe37127",
+ "fc04f950d286c26173aa670ccafc66b72d32c352",
[]
]
}
@@ -442772,20 +443483,12 @@
"meta.yaml": [
"358333d96e0c5a9b26ad65b5fedcb2a3ce604858",
[]
- ],
- "the-canvas-element.yaml": [
- "1ecf8ccdbf17b9d54798d64680fbc04c7c0135ed",
- []
]
},
"offscreen": {
"meta.yaml": [
"9c1cfbfd0fc80c0eeed751f7dff3bdff64d0df43",
[]
- ],
- "the-offscreen-canvas.yaml": [
- "ccabe094b8a7f8a187feac5d93faf9ad8569ea82",
- []
]
}
},
@@ -442854,6 +443557,10 @@
"230e45f80a5901cae395ed1c4c848556e333073d",
[]
],
+ "the-canvas.yaml": [
+ "4153b8e2dfb748dcf57f64356d0e147979dac9c8",
+ []
+ ],
"transformations.yaml": [
"0d2265be7aa0c94ccbddc41f4051dbf082bfc186",
[]
@@ -443624,6 +444331,10 @@
"bcc6f0734d580474a8bd25f25d4662f175cdc39b",
[]
],
+ "no-secure-context.tentative.html.headers": [
+ "bcc6f0734d580474a8bd25f25d4662f175cdc39b",
+ []
+ ],
"resources": {
"fetch-and-create-url.html": [
"6b0f96221dc47c367a53ffac3b07276070f71892",
@@ -449804,46 +450515,6 @@
]
},
"the-canvas-element": {
- "initial.colour.png": [
- "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c",
- []
- ],
- "initial.reset.different.png": [
- "d83fdd55b154fddb0be785f1f163e30bbd9b6a3a",
- []
- ],
- "initial.reset.path.png": [
- "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c",
- []
- ],
- "initial.reset.same.png": [
- "eeedd0ff05889ffd4468bf19a2e8e9e0a094201c",
- []
- ],
- "size.attributes.default.png": [
- "a72d047556a72dc83654077f88bd5ba271dc1a36",
- []
- ],
- "size.attributes.get.png": [
- "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7",
- []
- ],
- "size.attributes.reflect.setcontent.png": [
- "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7",
- []
- ],
- "size.attributes.reflect.setidl.png": [
- "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7",
- []
- ],
- "size.attributes.removed.png": [
- "1ebf30d8aaaad5e9da7e1db964a548ea6fc75138",
- []
- ],
- "size.attributes.set.png": [
- "47830c83ea9dfbcfdf6ea7aad64bce33097c06f7",
- []
- ],
"size.attributes.style.png": [
"eeedd0ff05889ffd4468bf19a2e8e9e0a094201c",
[]
@@ -465585,6 +466256,10 @@
[]
]
},
+ "scroll-to-text-fragment-after-DOMContentLoaded-target.html": [
+ "b7d517a7f6b2781f882d0f4804225354d8dd0ac8",
+ []
+ ],
"scroll-to-text-fragment-target.html": [
"b2be85132cb8f2f2c14c82bf1854c3130f375c96",
[]
@@ -468945,7 +469620,7 @@
[]
],
"util.sub.js": [
- "37b440da52a93ec2bea416de9ad61dc64f0c5e83",
+ "dc1ec780a24007d275fbfc751410a95f99073353",
[]
],
"verify-get-undefined-module.js": [
@@ -471096,7 +471771,17 @@
"blank.svg": [
"9e560bdc5feddc1ae76e3950e89efc1c31dc9269",
[]
- ]
+ ],
+ "support": {
+ "use-external-reload-in-iframe-child.html": [
+ "f027f5151fe9ebe2342ca6c152737f722eba2099",
+ []
+ ],
+ "use-external-reload-in-iframe-resource.svg": [
+ "8bc72975282e0034ccb46fac5baeac0d9cbf0fa5",
+ []
+ ]
+ }
}
},
"styling": {
@@ -471547,11 +472232,11 @@
[]
],
"requirements_macos_color_profile.txt": [
- "8e178d1d2c464d1ed69b3e4d21cffa482b5bc618",
+ "cd3e785aa47963c00137c5c94d55c8f3cb692d8e",
[]
],
"requirements_tc.txt": [
- "b3c1c51f129b07fc0383de30ab659142052404eb",
+ "a9128c02eb93c807bcb331e4ee09df9cbc4fd278",
[]
],
"run_tc.py": [
@@ -471683,7 +472368,7 @@
[]
],
"requirements.txt": [
- "6451b3a800432a5272bcbc635d34864455101618",
+ "b275ccfd8f1505c29cd1f29fc161e3b50f9af358",
[]
],
"retry.py": [
@@ -472154,7 +472839,7 @@
[]
],
"requirements_mypy.txt": [
- "3b1d3b03d6445c4324c298c7a034b42bb847be01",
+ "2addbba3b226b77cfdde985bf484582cc87000d2",
[]
],
"requirements_pytest.txt": [
@@ -479783,7 +480468,7 @@
[]
],
"request_handler.py": [
- "9d89b47c69b7eddfda6d7a13592204f531e701be",
+ "e02e2ccf28f6e435f51ac83b7b68825938ebd420",
[]
],
"server_util.py": [
@@ -482524,7 +483209,7 @@
[]
],
"transport.py": [
- "ca1ff74ef96767afa76c200b159671d99762cb84",
+ "e5ed3473ed4b0d1c3592040ee227002d1ddddc05",
[]
]
}
@@ -482579,7 +483264,7 @@
[]
],
"browser.py": [
- "4c42ffa4e82d22e316a235b93dcc29dee55c217f",
+ "ba716cd14f6d700325b956d1cadab2110402db43",
[]
],
"commands.json": [
@@ -482603,7 +483288,7 @@
[]
],
"requirements.txt": [
- "2c24336eb3167f69afa069e02a2e44f55162039d",
+ "d80d9fc2a3a2b61bfeaee0004be49f7a69cf8f63",
[]
],
"requirements_android.txt": [
@@ -482619,7 +483304,7 @@
[]
],
"run.py": [
- "2fb7f97f498c4a47235c286da8fee3035a459da9",
+ "9c6acbc2a465235d0cf708076736defd6fd9017b",
[]
],
"testfiles.py": [
@@ -482775,7 +483460,7 @@
]
},
"requirements.txt": [
- "fba8e42ebe2fb68869916fa4a3b1844c39f2cfec",
+ "ae71bbbad6d9ca1d82e65046c18d2e06559460b4",
[]
],
"requirements_chromium.txt": [
@@ -482795,7 +483480,7 @@
[]
],
"requirements_sauce.txt": [
- "806352e87e2471e760e2c2e5916353e2ec34dfa1",
+ "f6f1581d858b3de002c3972b854d0323acd95a7e",
[]
],
"setup.py": [
@@ -482813,7 +483498,7 @@
],
"browsers": {
"__init__.py": [
- "d54a9be943008fb2b02a8918649f3dae573fcf8e",
+ "aaf91a1dc86efc84eb77b8f83f194596ad9f0217",
[]
],
"android_webview.py": [
@@ -482821,11 +483506,11 @@
[]
],
"base.py": [
- "dd4fc314fc0449a35bfe6a58e9fa4921dcd62d64",
+ "fee8895ef3a060421d83ba0ccfffb0d3b53eac94",
[]
],
"chrome.py": [
- "c0a176743defc1f9ef8d506e13e3776afb4d2096",
+ "3b1bd6411e235af721c6ce6901f1f60e10be97b7",
[]
],
"chrome_android.py": [
@@ -482833,7 +483518,7 @@
[]
],
"chrome_ios.py": [
- "db81b91957b0639097ce33dd666716c13efced90",
+ "e559a5d7573e0000a09776d12475879249ea25e3",
[]
],
"chrome_spki_certs.py": [
@@ -482844,10 +483529,6 @@
"13cb49aed21087dc9371c3c559c9143a49fc6936",
[]
],
- "content_shell.py": [
- "6df8671e0ac32ae7e4b51e31b96fde3a4b8c3b35",
- []
- ],
"edge.py": [
"82597c9312a4ad655aa9cb9a223179e55d74975d",
[]
@@ -482857,13 +483538,17 @@
[]
],
"firefox.py": [
- "d22da8568adbe91e2c3379683e249507a908a35a",
+ "d977930a289b614caf4e0c598876500b20630497",
[]
],
"firefox_android.py": [
"526f83d595f23d6fb5c30381bf885670498b807f",
[]
],
+ "headless_shell.py": [
+ "e7da3e64548669f373aca6c1a350ebf1d4330581",
+ []
+ ],
"ladybird.py": [
"4738a71f1946d46bcf2b70e7502016153865ce96",
[]
@@ -482925,19 +483610,19 @@
[]
],
"base.py": [
- "20bddaa4bc9e40e1253a0d06ac293aca1e91a862",
+ "f0264173b18580a33d0b403fb32f3b2acf1c47e1",
[]
],
"executorchrome.py": [
- "46d38f14c55ee4ddc4452eec972df30ee07ed354",
+ "d972a0eea5f3ff021c16d262764730b5400cf9ee",
[]
],
"executoredge.py": [
- "ad546b7e84062b1cecd6fb42e96f4d4e3af4a0b8",
+ "75a3313c55c3dff4f63104953204b6095949703d",
[]
],
"executormarionette.py": [
- "05a9fc1ae4b87462121cb24a28e251559e5df812",
+ "fe1fed136309ba137b705dc68917864f9bf878a2",
[]
],
"executorselenium.py": [
@@ -482953,7 +483638,7 @@
[]
],
"executorwebdriver.py": [
- "f985d4867591cf13a02a17b5f58e3033628fce3f",
+ "20ae4a42118d19d0b34395a920025d7a6dd2a281",
[]
],
"executorwktr.py": [
@@ -482961,7 +483646,7 @@
[]
],
"process.py": [
- "4a2c01372e0bdfb06cdd9fefca50ed275e2974d0",
+ "b90e45d36780f0a89b0f8bc9ff2b29a221bdf839",
[]
],
"protocol.py": [
@@ -483112,11 +483797,11 @@
[]
],
"testloader.py": [
- "098e443b5ce412e26f01438d64cae2f9253a5d13",
+ "c7cdee6887ec51e25fdbaa95210afe3568d45bf4",
[]
],
"testrunner.py": [
- "93e19fa47ba0360923dc5ac6c1d5a2d221ad8051",
+ "0a5dfb1fd1864f9456769e4a99c95c61747a89c3",
[]
],
"tests": {
@@ -483134,7 +483819,7 @@
[]
],
"test_base.py": [
- "b5e40e3f8df1a1c69b0bc946c2b26901bd4d4b45",
+ "a3d804336e12ebc214c452c3c449fb75836c6d45",
[]
],
"test_sauce.py": [
@@ -486405,7 +487090,7 @@
},
"browsing_context": {
"__init__.py": [
- "91899eb50df49b1ab47e55ab52c2b49bd2a4fe0e",
+ "a60940d370fdd7f5e1b25fbdd6bbbc504c8669c1",
[]
],
"activate": {
@@ -486635,7 +487320,7 @@
},
"network": {
"__init__.py": [
- "c1b4c1dd54bf0879259a7c1983f6ee9d697016cc",
+ "319d90d3defe97af3a358a3444e651fca3bc2df0",
[]
],
"add_intercept": {
@@ -487364,7 +488049,7 @@
[]
],
"fixtures_bidi.py": [
- "a9cefd004b14f622fcec8cca8cb2315d138698b9",
+ "3e97cfe3ce4c9c321dfe45b1244aa5ea02bdfb20",
[]
],
"fixtures_http.py": [
@@ -492857,7 +493542,7 @@
]
],
"Blob-constructor.any.js": [
- "6dc44e8e156cce3c3b6bcdb9afe9d32a727da793",
+ "57a85624340e56c933676615fa8994bbb8b6b0c9",
[
"FileAPI/blob/Blob-constructor.any.html",
{
@@ -506064,7 +506749,7 @@
]
},
"getRandomValues.any.js": [
- "2b82b9bedb9082876a7f47b8e3e0b33766c04144",
+ "0437857f2faabc39c037d51b9f0d3ff39b9b7ddf",
[
"WebCryptoAPI/getRandomValues.any.html",
{}
@@ -517898,7 +518583,7 @@
]
],
"decompression-buffersource.tentative.any.js": [
- "abb51751c8b4a3f7b3800731def8a8e902678a57",
+ "f4316ba1fc876ec4c332690a66cf224681ce37be",
[
"compression/decompression-buffersource.tentative.any.html",
{
@@ -528435,7 +529120,7 @@
]
],
"fedcm-use-other-account-button-flow.tentative.https.html": [
- "3b90782713f5829e87f753fbf349c2a700862443",
+ "7a3f266b24b937fae03c9886184ada6e8b27c960",
[
null,
{
@@ -528444,7 +529129,7 @@
]
],
"fedcm-use-other-account.tentative.https.html": [
- "96006cce68c802c7df7addfc7040d00e71f63b99",
+ "66311740124a2dd6aff0c8f90aff68f289724cd6",
[
null,
{
@@ -528454,7 +529139,7 @@
]
},
"fedcm-client-metadata-not-cached.https.html": [
- "b802369256ab44c793f8c6c340660954de54d078",
+ "79171bf6343287fa42c0aaa1c53a2d4e69899425",
[
null,
{
@@ -528490,7 +529175,7 @@
]
],
"fedcm-disconnect-errors.https.html": [
- "dbf42c4083bbb2601de44eca4877eea7ed0b9df1",
+ "4d5fb0a457c7acd0d5c23818f4623826324f7336",
[
null,
{
@@ -528535,7 +529220,7 @@
]
],
"fedcm-error-basic.https.html": [
- "fd902bcf9042ba4234bcd25b7c62d1a09e7f7c0e",
+ "8a2d39cabaaa37a95f050cc84af2fe2c786ec825",
[
null,
{
@@ -528786,7 +529471,7 @@
]
],
"fedcm-too-many-disconnect-calls.https.html": [
- "cb5dfa615f34bc7de4ecdd9ab4c4a11b3ce0eb2d",
+ "eb87c2377a916b68e1ebf189a0de7d8af1c191df",
[
null,
{
@@ -537495,28 +538180,30 @@
]
]
},
- "reading-order": {
- "reading-order-items-computed.html": [
- "a8280337665d7779f59dac55d342d8224d262b94",
- [
- null,
- {}
- ]
- ],
- "reading-order-items-invalid.html": [
- "eff5846e316cafce44f3c876c6a1ad9056a2d939",
- [
- null,
- {}
- ]
- ],
- "reading-order-items-valid.html": [
- "d1ac7de64eb869dc585680f5bdde06839453c448",
- [
- null,
- {}
+ "reading-flow": {
+ "tentative": {
+ "reading-flow-computed.html": [
+ "65ef90f5a50b792b1da4eef61352109b17fd4968",
+ [
+ null,
+ {}
+ ]
+ ],
+ "reading-flow-invalid.html": [
+ "1d489b795640d4a9ebbb5bf113ef014e96dd565a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "reading-flow-valid.html": [
+ "3d650c53063db6baa455d6a42d7604fdd63c6830",
+ [
+ null,
+ {}
+ ]
]
- ]
+ }
},
"textarea-display.html": [
"44634e3c3bdb7187f14c24b922d098ee273f995d",
@@ -544675,6 +545362,13 @@
{}
]
],
+ "grid-template-important.html": [
+ "c9b9bd83f5e2a24a7f49912c4b85c37e1fdd7188",
+ [
+ null,
+ {}
+ ]
+ ],
"grid-template-node-not-connected.html": [
"89bee03a11bcae62448a088889398ba32e6f25bb",
[
@@ -563040,7 +563734,7 @@
]
],
"revert-in-fallback.html": [
- "ae99e5192fd2587332c23b6a0ff604956a845e17",
+ "956965ab7abb1dc67713ad90ce6b5bff1284e14d",
[
null,
{}
@@ -563391,8 +564085,15 @@
{}
]
],
+ "hit-test-pseudo-element-element-from-point.html": [
+ "9bc1f5751fc61dd69e7fc7805d113fdac64c848f",
+ [
+ null,
+ {}
+ ]
+ ],
"hit-test-unpainted-element-from-point.html": [
- "b34d2b11df558327fbdd87dc3b4ded2b362bff14",
+ "c950cc126e016f1c80321b0ffd2790ce5b149ee3",
[
null,
{}
@@ -566636,6 +567337,20 @@
{}
]
],
+ "scrollIntoView-multiple-nested.html": [
+ "630cd21b6137c2150bb6a3363c4654b885f5e20a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "scrollIntoView-multiple.html": [
+ "e6ddd1818f2ab861017c25b112725b448c2b1c09",
+ [
+ null,
+ {}
+ ]
+ ],
"scrollIntoView-scrollMargin.html": [
"930702aa8792506df50120feaca86d3f76bc1a02",
[
@@ -566686,7 +567401,7 @@
]
],
"scrollIntoView-smooth.html": [
- "ddfa31076c2bff7711ed493dbaec0943fd03ff87",
+ "324e51d7388a04fdc3b53e26542284e4aa6a6792",
[
null,
{}
@@ -566797,6 +567512,22 @@
{}
]
],
+ "smooth-scrollIntoView-with-smooth-fragment-scroll.html": [
+ "72ecdf15e5511532944aa24d05c84f37ce04a6ce",
+ [
+ null,
+ {}
+ ]
+ ],
+ "smooth-scrollIntoView-with-unrelated-gesture-scroll.html": [
+ "f42fcb298570ccc6d56d63657982cabeb874b559",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"subpixel-sizes-and-offsets.tentative.html": [
"d198b9dde60c8cac16241c412d3e55f772166010",
[
@@ -570886,7 +571617,7 @@
},
"digital-credentials": {
"identity-get.tentative.https.html": [
- "ba5212e433b42eb6a19e5a137aaedcc7869e75eb",
+ "850533cd262fe9eb9ffa4a129f60a9986662cec1",
[
null,
{
@@ -572504,7 +573235,7 @@
]
],
"scrollend-event-fired-for-scrollIntoView.html": [
- "8782b1dfee623741dd2830d538684ecffe767f18",
+ "40aa77f4764b6c4301b8aba7221e1e42e768505d",
[
null,
{
@@ -575050,14 +575781,14 @@
},
"parts": {
"basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html": [
- "b2782dbfa9bcd95007cc1855521e2e4d1c464c7a",
+ "932c0a392a36a5c61ae9da72a99855549e7bc882",
[
null,
{}
]
],
"basic-dom-part-declarative-brace-syntax.tentative.html": [
- "3a4370387373a364a8ac818aee6cbb0e97fe0c6d",
+ "70fc471bc61204f8dadf1370654f35f121f2348f",
[
null,
{}
@@ -576023,7 +576754,7 @@
]
],
"edit-context-input.tentative.html": [
- "762ec59547599f68aec3dc0ba8f2955d753f12d9",
+ "45fd1613faccb8b34f55f1a2783e9db35596d2d1",
[
null,
{
@@ -614925,6 +615656,41 @@
}
]
],
+ "get-interest-group-auction-data.https.window.js": [
+ "29f58ebe9b1fd61e64ece49387114f9916f60ff6",
+ [
+ "fledge/tentative/get-interest-group-auction-data.https.window.html?1-4",
+ {
+ "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"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"insecure-context.window.js": [
"9016277b73139d050e3d688c3f21cb40048464e2",
[
@@ -623430,6 +624196,15 @@
{}
]
],
+ "permission.tentative.https.html": [
+ "34758660b77a97783e07bfa73258e46edace020c",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"promises-reject.html": [
"4385b1646d65128d053c8dcded532997c8ed0557",
[
@@ -623863,6 +624638,24 @@
{}
]
],
+ "tojson.https.window.js": [
+ "f8cef07a7f0d4325914fbf07bc34c681804b9d51",
+ [
+ "geolocation/tojson.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ]
+ ]
+ }
+ ]
+ ],
"watchPosition_TypeError.https.html": [
"4ae7a8903716dd792337de245fd85b313456611a",
[
@@ -627945,6 +628738,40 @@
]
},
"remote-context-helper-tests": {
+ "addEmbed.window.js": [
+ "c389410d5d323bcd45e4e9206c4b310d880d5309",
+ [
+ "html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "RemoteContextWrapper addEmbed"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/test-helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
"addFrame.window.js": [
"4c3c2eebe171685c44796842fe70efb0aa9df8b9",
[
@@ -628115,6 +628942,40 @@
}
]
],
+ "addObject.window.js": [
+ "1d83d9a463d581b936d613f1e31bd0e5194dafec",
+ [
+ "html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "RemoteContextWrapper addObject"
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/test-helper.js"
+ ]
+ ]
+ }
+ ]
+ ],
"addScripts.window.js": [
"01cf06c65d52ec6d6208dce339dcf6cf07e89680",
[
@@ -628813,6 +629674,13 @@
"timeout": "long"
}
]
+ ],
+ "target-pseudo-after-reinsertion.html": [
+ "3e46c28104ca1864b97422c8c671d033e4f38602",
+ [
+ null,
+ {}
+ ]
]
},
"unloading-documents": {
@@ -632689,14 +633557,14 @@
]
],
"2d.canvas.context.extraargs.cache.html": [
- "f4db40815dcc518a75f1568ab1cfc21ba0cf9db5",
+ "236f17e6d57b4d6d96a8c6c4dd414e2cb335a4d2",
[
null,
{}
]
],
"2d.canvas.context.extraargs.create.html": [
- "6ae7f787c6adeceabc3dfe37a981cf07eb46de2e",
+ "b0b00ddd78ea6deb6b53283fe9ec5f4b734fe0a1",
[
null,
{}
@@ -632710,7 +633578,7 @@
]
],
"2d.canvas.context.prototype.html": [
- "5d5edc6864bc994a0b60a1fb80535598857fad40",
+ "18a37a185dd907ed69907003b343124c0b6031ec",
[
null,
{}
@@ -632760,6 +633628,13 @@
]
},
"canvas-host": {
+ "2d.canvas.host.initial.color.html": [
+ "795804a4d21cc5b9c8e88f6f86625bfa2bbfdf36",
+ [
+ null,
+ {}
+ ]
+ ],
"2d.canvas.host.initial.reset.2dstate.html": [
"e1940011989c98b352a690f5218d349b56697747",
[
@@ -632767,15 +633642,85 @@
{}
]
],
+ "2d.canvas.host.initial.reset.clip.html": [
+ "86da296dc01510e48d96a0f0ff9d9cab5fa09444",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.initial.reset.different.html": [
+ "b95527083b0fbc4dedd728ca3b87a57fed2d7bdb",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.initial.reset.gradient.html": [
+ "de0f19c13c119d0c86dec66f06030c27c9456f83",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.initial.reset.path.html": [
+ "6eda186dcbc606c70b39d60bfe26282d488334bf",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.initial.reset.pattern.html": [
+ "3cb45257a0fef51030ef6427751ed9ee308f4c9b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.initial.reset.same.html": [
+ "6e2d912af58c5764ec952376804b16a8f59036b0",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.initial.reset.transform.html": [
+ "d285785ed2fb6525b2ff751af5db5f5c0e561b28",
+ [
+ null,
+ {}
+ ]
+ ],
"2d.canvas.host.readonly.html": [
- "cbbf32f2e2bd77ab112d6f80b6d2d578a9da0fc0",
+ "44d922933448701fe715e36c35a82b0e4c4395f4",
[
null,
{}
]
],
"2d.canvas.host.reference.html": [
- "6a4bdb65b082180b4af66d1cbe38f85446f0a894",
+ "f7166f99d6c2a429e8a4f8cc6ef54f376bb0053e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.attributes.default.html": [
+ "c34b085a9b9d78366e02d3de42205ad5d6ec92b6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.attributes.idl.html": [
+ "38332cc575c34512c447feeaafaeaf76667c64c1",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.attributes.idl.set.zero.html": [
+ "e142ec684a484824bb9ff1cae8b7fabcb3fd2bd8",
[
null,
{}
@@ -632886,6 +633831,34 @@
{}
]
],
+ "2d.canvas.host.size.attributes.reflect.setcontent.html": [
+ "2e2abaef2a763da673386810bb9b361a78c9a847",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.attributes.reflect.setidl.html": [
+ "d017070a39e4bf97bdf402b13690d6418c4c93c4",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.attributes.reflect.setidlzero.html": [
+ "d7747e1f188674da95c04e4841520e5ec075b61e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.attributes.removed.html": [
+ "15cf17cbeadb0e8e63aec3eabb2e71c5485c0061",
+ [
+ null,
+ {}
+ ]
+ ],
"2d.canvas.host.size.attributes.setAttribute.decimal.html": [
"b6c2130bf0afec9b139d6b670c9ea2403d1e89ab",
[
@@ -632990,6 +633963,34 @@
null,
{}
]
+ ],
+ "2d.canvas.host.size.invalid.attributes.idl.html": [
+ "8711657f13c2a2ac15649fb645a456f989923c4b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.large.html": [
+ "039949cfd01369a0fae66e18dac045d037ffb5a6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.type.delete.html": [
+ "90f5c4ce9036f3bbf24d3234d46dd49d687e8f04",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.type.name.html": [
+ "c0f93876c32ad813325d5640cd05036f1f544e3f",
+ [
+ null,
+ {}
+ ]
]
},
"compositing": {
@@ -640360,47 +641361,75 @@
]
],
"2d.canvas.context.exists.html": [
- "41b5cfee311334cdb35e5721b88f4bc93a11e427",
+ "21f35515a53708c512f8e4983a14b0752d04aa3d",
[
null,
{}
]
],
"2d.canvas.context.exists.worker.js": [
- "77a43530a04636635cca71221f577df7a56e5337",
+ "f56aff7e12963f772297ceab8f4207dc8e6ba839",
[
"html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.html",
{}
]
],
"2d.canvas.context.extraargs.cache.html": [
- "2bcf34490ea9ca75d49191ccdf7188eb8797d5f5",
+ "42f29e4fe90263460fc07e45419fd149ca959d7c",
[
null,
{}
]
],
"2d.canvas.context.extraargs.cache.worker.js": [
- "14284a0a7d7c1c5931f0ff82ad6e02ca1274d7b9",
+ "f508d5262e0608a2cbe64dd894aa47e4d438e83a",
[
"html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.html",
{}
]
],
"2d.canvas.context.extraargs.create.html": [
- "029122355c9c8ccaff5e48fc50da707ff5baf236",
+ "199f5b82edf3c4fc55c1b5b54fa091d06d1b6f1f",
[
null,
{}
]
],
"2d.canvas.context.extraargs.create.worker.js": [
- "b4208edba8cffa2ffdb249b80189aae88573582c",
+ "d1bfbcc683cfcaf4223aac69a78c7296c187aaeb",
[
"html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.html",
{}
]
],
+ "2d.canvas.context.invalid.args.html": [
+ "ce71d4cf30f4d2742d41ccff028b70bcac47f104",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.context.invalid.args.worker.js": [
+ "faea21714d56f0d9843a21eb364eece9c50afd5b",
+ [
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.html",
+ {}
+ ]
+ ],
+ "2d.canvas.context.prototype.html": [
+ "17e5f08946417a83047dd2415eefdc50f1ca4279",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.context.prototype.worker.js": [
+ "dd41239d00c37c73f4833e7bcd5d28f5340bda34",
+ [
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.html",
+ {}
+ ]
+ ],
"2d.canvas.context.shared.html": [
"cb9501747eec2c5fde1a63eae5546a64154b1179",
[
@@ -640415,73 +641444,73 @@
{}
]
],
- "2d.canvas.context.unique.html": [
- "66e4a049baad4b090ca18664782f5197d842ebce",
+ "2d.canvas.context.type.exists.html": [
+ "96b35d86fa1f8dfbbe71e717d0e2e6f6f7aa24de",
[
null,
{}
]
],
- "2d.canvas.context.unique.worker.js": [
- "275e45fde64266a3b8d7474f93e8af615eec1ed9",
+ "2d.canvas.context.type.exists.worker.js": [
+ "239c3e902eacb61428c776e95d9f13c287ea0244",
[
- "html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.html",
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.html",
{}
]
],
- "2d.canvas.context.unrecognised.badname.html": [
- "4313f408437e360a08c5d5264b87a46036b2a9ca",
+ "2d.canvas.context.type.extend.html": [
+ "a3f720c7462f79948e2286daf8d45eb8c39b703a",
[
null,
{}
]
],
- "2d.canvas.context.unrecognised.badname.worker.js": [
- "dd16f2fbe1108751f07d1d7a0d05064ffc849995",
+ "2d.canvas.context.type.extend.worker.js": [
+ "9832c5ca77f0559a93e67d122d1f3fc779d0a8ec",
[
- "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.html",
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.html",
{}
]
],
- "2d.canvas.context.unrecognised.badsuffix.html": [
- "c00afa686edd563972620ec5717f252cc57dd347",
+ "2d.canvas.context.type.prototype.html": [
+ "d08193c0def5f8ce82795dacd24e3cfb77385801",
[
null,
{}
]
],
- "2d.canvas.context.unrecognised.badsuffix.worker.js": [
- "5e684c92c72acd87b4c84d48ec6778dbd3553a62",
+ "2d.canvas.context.type.prototype.worker.js": [
+ "459975d32d2c7be264ee1b70206d9ac452ee37fd",
[
- "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.html",
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.html",
{}
]
],
- "2d.canvas.context.unrecognised.nullsuffix.html": [
- "0ce3d4195e0d19cd882e2019ec1455e83d01613f",
+ "2d.canvas.context.type.replace.html": [
+ "69b22412fa5f628e4bd562bbde99a7484e89b190",
[
null,
{}
]
],
- "2d.canvas.context.unrecognised.nullsuffix.worker.js": [
- "2886010fb644a69ea5e3c96050560a450cb500f2",
+ "2d.canvas.context.type.replace.worker.js": [
+ "e6793d1bf56d94fd4cb1aaecfe059d3b5f19e4bb",
[
- "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.html",
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.html",
{}
]
],
- "2d.canvas.context.unrecognised.unicode.html": [
- "316123675ad75e31a85c0286760d374c7f316e90",
+ "2d.canvas.context.unique.html": [
+ "828817bfbf444c69d45264d02fdfb2e261e23810",
[
null,
{}
]
],
- "2d.canvas.context.unrecognised.unicode.worker.js": [
- "46e562dd486835e28b41c6215273ebc8f8d4c21e",
+ "2d.canvas.context.unique.worker.js": [
+ "90687bfd07e6fff5936132b2f255f3dbfbc260c4",
[
- "html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.html",
+ "html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.html",
{}
]
],
@@ -640625,14 +641654,14 @@
]
],
"2d.canvas.host.readonly.html": [
- "0e7e10cd242adf6d09ea41e0ca6df4f39d3182a9",
+ "93262a6cc87c709610e579274506728f0b5d93ce",
[
null,
{}
]
],
"2d.canvas.host.readonly.worker.js": [
- "bbe50dcf61f461ceb3d7e1887d0c4049bf3292ae",
+ "5baef1b374057326c91b25030a88756cf3119728",
[
"html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.html",
{}
@@ -640667,7 +641696,7 @@
]
],
"2d.canvas.host.size.attributes.idl.html": [
- "7030103524caeb33d53d717624de77515924bfa1",
+ "b8ce99afdfd7203ad215d1638225d1e7d2fe5eb7",
[
null,
{}
@@ -640688,7 +641717,7 @@
]
],
"2d.canvas.host.size.attributes.idl.worker.js": [
- "a00201f18cc59687e75881b3763e1869b14c8ee8",
+ "42002e8355fd5f53a64b66ec60b8370d92059552",
[
"html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.html",
{}
@@ -640932,6 +641961,20 @@
{}
]
],
+ "2d.canvas.host.size.invalid.attributes.idl.html": [
+ "2194de929c52b218085976552206e5e7b682ea00",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.size.invalid.attributes.idl.worker.js": [
+ "8adb7a514c542bbf3acf19be4c0922bc4d46fb4a",
+ [
+ "html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.html",
+ {}
+ ]
+ ],
"2d.canvas.host.size.large.html": [
"b220f8f2edea11803098283367b624f97ec56869",
[
@@ -640945,6 +641988,34 @@
"html/canvas/offscreen/canvas-host/2d.canvas.host.size.large.worker.html",
{}
]
+ ],
+ "2d.canvas.host.type.delete.html": [
+ "1d2a733ada7eab058e16b20795e945a11dc9db43",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.type.delete.worker.js": [
+ "409e12cd0d0d090dbef46a221e7ba96d06b17029",
+ [
+ "html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.html",
+ {}
+ ]
+ ],
+ "2d.canvas.host.type.name.html": [
+ "5f48c09eaace8064a10e0ef5349824c2f5ebda73",
+ [
+ null,
+ {}
+ ]
+ ],
+ "2d.canvas.host.type.name.worker.js": [
+ "ea50e4f7f0c4266db762be78fbeda58095c71c1e",
+ [
+ "html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.html",
+ {}
+ ]
]
},
"compositing": {
@@ -657717,6 +658788,13 @@
}
]
],
+ "no-secure-context.tentative.html": [
+ "a00183738e3736057bd9b35929c2b644b5a66eeb",
+ [
+ null,
+ {}
+ ]
+ ],
"shared-workers.tentative.https.html": [
"d0a186f45e7865c9f585112601f934b1861c5471",
[
@@ -662863,6 +663941,13 @@
null,
{}
]
+ ],
+ "details-display.tentative.html": [
+ "27573bcdc695f057b754c5264342b8390801fee2",
+ [
+ null,
+ {}
+ ]
]
},
"unmapped-attributes.html": [
@@ -666112,62 +667197,6 @@
{}
]
],
- "initial.colour.html": [
- "166732a57b32df8997b387b11caf2771c840998b",
- [
- null,
- {}
- ]
- ],
- "initial.reset.clip.html": [
- "ebf52bfa764a3431f11edea22ca485c6398aafb0",
- [
- null,
- {}
- ]
- ],
- "initial.reset.different.html": [
- "d55dd250c091a2a550d44ba6fc6dc791c2a13241",
- [
- null,
- {}
- ]
- ],
- "initial.reset.gradient.html": [
- "31b56ec8e9ba41510c282116e156d9091626aaff",
- [
- null,
- {}
- ]
- ],
- "initial.reset.path.html": [
- "3525377d2db6b376ce53730fb920d4a811a00db4",
- [
- null,
- {}
- ]
- ],
- "initial.reset.pattern.html": [
- "28f8306d96d3996488dae532e5e16aa7622c1327",
- [
- null,
- {}
- ]
- ],
- "initial.reset.same.html": [
- "1a0872ba2c05bdef16e0cb1e4a4ae4469496fcb5",
- [
- null,
- {}
- ]
- ],
- "initial.reset.transform.html": [
- "36284ba4984108b589014b136aa8e3c88c23357e",
- [
- null,
- {}
- ]
- ],
"security.dataURI.html": [
"93b560e82c472eaf8f9018c865d6eefd4d03db92",
[
@@ -666322,55 +667351,6 @@
{}
]
],
- "size.attributes.default.html": [
- "ecf35285a1b8e665919f94d1b98b3c4f50eee41f",
- [
- null,
- {}
- ]
- ],
- "size.attributes.idl.html": [
- "1594a1c5e59c7b0ab2d607577292ce641f366432",
- [
- null,
- {}
- ]
- ],
- "size.attributes.idl.set.zero.html": [
- "c09d5cb278a7d917ad6b38c055aa5eee82725267",
- [
- null,
- {}
- ]
- ],
- "size.attributes.reflect.setcontent.html": [
- "a25c4b784a29b16708d6a8959151b1982dc8c7d3",
- [
- null,
- {}
- ]
- ],
- "size.attributes.reflect.setidl.html": [
- "e228276da70a587a77aca253e1df17e91218ee1c",
- [
- null,
- {}
- ]
- ],
- "size.attributes.reflect.setidlzero.html": [
- "65df3f9f94e9ec98b640e8d74d5c24a3ebffda79",
- [
- null,
- {}
- ]
- ],
- "size.attributes.removed.html": [
- "c96cba7b1758fcc607ba8bcc6e082d61a94db83b",
- [
- null,
- {}
- ]
- ],
"size.attributes.style.html": [
"aeb5c7ecb2ec1a71f83a8b68c2dd3298992d1ff8",
[
@@ -666553,47 +667533,12 @@
{}
]
],
- "type.delete.html": [
- "7fd54b30d5319c7c28c6dfa0f533f16f2b240ae9",
- [
- null,
- {}
- ]
- ],
"type.exists.html": [
"26f59a1614384b69b43964c5ce586d1e347eb342",
[
null,
{}
]
- ],
- "type.extend.html": [
- "e17209f455a768c49433b6b18074cda92b435833",
- [
- null,
- {}
- ]
- ],
- "type.name.html": [
- "fdf1d1d39885c41e6389fc8fbfdd87024301a73c",
- [
- null,
- {}
- ]
- ],
- "type.prototype.html": [
- "f47f755388fb46bcac920809d5e1faac5db6b8cf",
- [
- null,
- {}
- ]
- ],
- "type.replace.html": [
- "e67fe7c4a26303197bb2d596778d8db8aae873b8",
- [
- null,
- {}
- ]
]
},
"the-embed-element": {
@@ -666811,6 +667756,20 @@
{}
]
],
+ "iframe-loading-lazy-history-pushState.html": [
+ "09af8b3693f0d7da84f62ebee1ae43356801d04b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-history-replaceState.html": [
+ "ac9117a46cecb52ffa3e08827330eaf6314067e4",
+ [
+ null,
+ {}
+ ]
+ ],
"iframe-loading-lazy-in-script-disabled-iframe.html": [
"4f191cd7842675d763079911fe9f8b80bd447506",
[
@@ -666902,6 +667861,69 @@
{}
]
],
+ "iframe-loading-lazy-nav-form-submit.html": [
+ "7f94d6021fafcd95d03d35544f3249609360bd2c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-link-click-fragment.html": [
+ "c81a01833a2a8103601829da6660fc1536c77d7b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-link-click.html": [
+ "d8d85b62a4bd624c23f9046128289b2234689321",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-location-assign.html": [
+ "88ec129fbc0da941bd5c64d81a65c494cbde8e17",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-location-replace-set-src.html": [
+ "e2f0c6dceb9348c80ffb7dc55251cc62edb7309c",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-location-replace.html": [
+ "9d3c4fbc1320cabe9fc2ff239a83e2ccad3624be",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-meta-refresh.optional.html": [
+ "0cc7e11041505519a14ba978c4e94c6e97f32df5",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-navigation-navigate.html": [
+ "1010c540b7fd59521278ece38b34f9e572e4e4a6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-nav-window-open.html": [
+ "579c079ce7025a2b20bfe928df69fb47816d6eb4",
+ [
+ null,
+ {}
+ ]
+ ],
"iframe-loading-lazy-referrerpolicy-change.sub.html": [
"68734d5708da40b7e5e533cb2ddee41c8a3d719f",
[
@@ -666909,6 +667931,20 @@
{}
]
],
+ "iframe-loading-lazy-reload-location-reload.html": [
+ "a670de1f5c5f815ecbe11cc30026a2db8490435a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "iframe-loading-lazy-reload-navigation-reload.html": [
+ "aefd6c472b5ae888e0786de8e26e8d9ad5111adb",
+ [
+ null,
+ {}
+ ]
+ ],
"iframe-loading-lazy-to-eager.html": [
"371601a8c3a167e91804945fefe6db3154483cd2",
[
@@ -683934,7 +684970,7 @@
]
],
"roles.tentative.html": [
- "a3eb850497eaeb2cf3f52da3ad20ab37d1e53735",
+ "3920f2cba9e339ac2a15d9ebe92c1615d7e59c92",
[
null,
{
@@ -683943,7 +684979,7 @@
]
],
"table-roles.html": [
- "a81caa3d3f0f77ff76185be7e351c7ef76f2fe58",
+ "8f5033ea8115cb8382783f04ee928b01b3538fbd",
[
null,
{
@@ -686069,7 +687105,7 @@
]
],
"callback-cross-realm-report-exception.html": [
- "0bec720485dc6d570a252760db4397e78c300b65",
+ "7fa979167436b934ee04eb852d37706ed742ea13",
[
null,
{}
@@ -702426,8 +703462,218 @@
}
]
],
+ "unload-allowed-embed.tentative.window.js": [
+ "5bd745db1dec5e615b30606cca9767192d2cc251",
+ [
+ "permissions-policy/experimental-features/unload-allowed-embed.tentative.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "'unload' Policy : allowed in frames when allowed in main frame."
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/unload-helper.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "unload-allowed-frameset.tentative.window.js": [
+ "fe4f55dbc75b5091be66fadce0d5a968c160d880",
+ [
+ "permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "'unload' Policy : allowed in frames when allowed in main frame."
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/unload-helper.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "unload-allowed-object.tentative.window.js": [
+ "376bb4cb1d06633a77df7b4c8248162455e3979b",
+ [
+ "permissions-policy/experimental-features/unload-allowed-object.tentative.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "'unload' Policy : allowed in frames when allowed in main frame."
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/unload-helper.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "unload-disallowed-embed.tentative.window.js": [
+ "cfdb29bc51a15e2a05cc247a5f210ab80118dc90",
+ [
+ "permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "'unload' Policy : disallowed in frames when disallowed in main frame."
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/unload-helper.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "unload-disallowed-frameset.tentative.window.js": [
+ "e64c32a21a042fca693cb960c3e3957f61768230",
+ [
+ "permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "'unload' Policy : disallowed in frames when disallowed in main frame."
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/unload-helper.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
+ "unload-disallowed-object.tentative.window.js": [
+ "33c23239e6d6fd3f7f578295da93adcdd07d9941",
+ [
+ "permissions-policy/experimental-features/unload-disallowed-object.tentative.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "'unload' Policy : disallowed in frames when disallowed in main frame."
+ ],
+ [
+ "script",
+ "/common/dispatcher/dispatcher.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+ ],
+ [
+ "script",
+ "./resources/unload-helper.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"unload-disallowed-subframe.tentative.window.js": [
- "b2fb19ae1295d5750c656834f37a2e7ab64b9f50",
+ "4d8ddbcd16e46aa09463bdcb38c2c40539279398",
[
"permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.html",
{
@@ -703697,7 +704943,7 @@
]
],
"pointerevent_after_target_removed_from_slot.html": [
- "170c1ec2f1c9b98abcfdeee51c2e43463489ce01",
+ "1d183afa61428f0c15a464220151f5608e297df8",
[
"pointerevents/pointerevent_after_target_removed_from_slot.html?mouse",
{
@@ -721498,7 +722744,7 @@
]
],
"getdisplaymedia.https.html": [
- "4558786faa1183fe4a594455788769b2a74decee",
+ "4a7c655335161afdeaf398a4e6225598de325ce9",
[
null,
{
@@ -722997,6 +724243,16 @@
{}
]
],
+ "scroll-to-text-fragment-after-DOMContentLoaded.html": [
+ "a08d75588d08797fbe6fdcc15e7f3615927de3ef",
+ [
+ null,
+ {
+ "testdriver": true,
+ "timeout": "long"
+ }
+ ]
+ ],
"scroll-to-text-fragment-api.html": [
"d644b6b64fb530fef800c5abaaf91835eda9aa83",
[
@@ -723649,6 +724905,13 @@
{}
]
],
+ "move-paragraph-cross-editing-boundary.tentative.html": [
+ "f6a558d7582e73386b9e7f6b1443d31b35efb875",
+ [
+ null,
+ {}
+ ]
+ ],
"move-selection-range-into-different-root.tentative.html": [
"d6e4ccda257212e580768fb00d26ce15c2fb9cf3",
[
@@ -723800,6 +725063,13 @@
{}
]
],
+ "selectionchange-on-shadow-dom.html": [
+ "fd246c509240c56aa9b0e3b16f8fe9db4dcf45d4",
+ [
+ null,
+ {}
+ ]
+ ],
"selectionchange.html": [
"1c4ddf2b9baad5a907bd5c186c3c892a6608644c",
[
@@ -727613,7 +728883,7 @@
]
],
"gethtml.html": [
- "ff70653477f6a9d813fb65f9fd3944b8443691f3",
+ "0477cdaf820ec55890142baad459dfc642a95569",
[
null,
{
@@ -728194,10 +729464,10 @@
}
]
],
- "reading-order": {
+ "reading-flow": {
"tentative": {
"flex-flow.html": [
- "d69f95e2afcf077a333332c13f99788a8ebd5d7c",
+ "e6998105608c99e3a3dca3de610018bebda81172",
[
null,
{
@@ -728207,7 +729477,7 @@
]
],
"flex-visual-order.html": [
- "ce91f9b3c4c7e618e493d852ca4a861c86d1d774",
+ "d8515fd928c777659f599f53a94b6d9ac5728a81",
[
null,
{
@@ -728216,7 +729486,7 @@
]
],
"grid-columns.html": [
- "f07dc63bc58b9c03b3a80ac1a0cfa6073fdfb319",
+ "ad9bd81c7a7967fbe582843e02a5c4e2749d477f",
[
null,
{
@@ -728226,7 +729496,7 @@
]
],
"grid-order-across-scopes.html": [
- "81d1b7de539596a144ad75c77f95c321090880db",
+ "9f7772b91185351da72f56ad300fd6c4e3d5d7ff",
[
null,
{
@@ -728235,7 +729505,7 @@
]
],
"grid-order-on-shadow-host.html": [
- "a48eda1b57cd26b642edeed2d890bbf01a6043fe",
+ "f5a8b3c313e5d20963233cc868b4a8ce27eaab07",
[
null,
{
@@ -728244,7 +729514,7 @@
]
],
"grid-order-with-iframe.html": [
- "87b9e0a83dfec85132859156bc54aead6914cae4",
+ "fab6a7b8a681da079d707124ee0e43ca15980212",
[
null,
{
@@ -728253,7 +729523,7 @@
]
],
"grid-order-with-nested-grids.html": [
- "15bdcf996fd4a2855ddd36995855d64f8593667e",
+ "5daabefd7ff6638fa49595406d8aadd8255ac90d",
[
null,
{
@@ -728263,7 +729533,7 @@
]
],
"grid-order-with-popover.html": [
- "c96a0c4fcf7712ae8365fd77f97b1ee9c7335a6e",
+ "822907378cb5431fdcbcd6c826414ddab2bdad72",
[
null,
{
@@ -728273,7 +729543,7 @@
]
],
"grid-order-with-slots.html": [
- "ed658b3510ae0ad983dbc53391f1ff90efb5d61a",
+ "4cfdc79fa4057eee49498bf6d57b912c4e714355",
[
null,
{
@@ -728283,7 +729553,7 @@
]
],
"grid-order.html": [
- "3ee91358fd612dc83afb10038e52163dbecd6d8b",
+ "358f5c2988c2a5fce8f3702eeb6e1de57a20753f",
[
null,
{
@@ -728293,7 +729563,7 @@
]
],
"grid-rows.html": [
- "f24427468435b47c800cfd5a1ba390d270e1d2b8",
+ "41f986c1f4b305113d3a3bdbb6098ee06be35db6",
[
null,
{
@@ -729252,6 +730522,13 @@
{}
]
],
+ "cross-origin-create-worklet-data-origin-option.tentative.https.sub.html": [
+ "8242f3d10835ca4066b7b7c7529d0b454354dae3",
+ [
+ null,
+ {}
+ ]
+ ],
"cross-origin-create-worklet-failure-false-shared-storage-cross-origin-worklet-allowed.tentative.https.sub.html": [
"db361776f638731401883e8605c5e4f9d2a28411",
[
@@ -729385,6 +730662,13 @@
{}
]
],
+ "same-origin-create-worklet-data-origin-option.tentative.https.sub.html": [
+ "c84246f65b1c182174fcf515818033a2ec1118ab",
+ [
+ null,
+ {}
+ ]
+ ],
"select-url-keep-alive.tentative.https.sub.html": [
"f3755538b9d4b23e026fec85c161cb730531d4dc",
[
@@ -743231,6 +744515,13 @@
{}
]
],
+ "use-external-reload-in-iframe.html": [
+ "ab1214d20f1e8f5e29024195c624735ed8c9dfc7",
+ [
+ null,
+ {}
+ ]
+ ],
"use-load-error-events.tentative.html": [
"2c52072e16906575679ab654b7e901a08b5541c7",
[
@@ -743840,6 +745131,13 @@
{}
]
],
+ "SVGLength-zoom.html": [
+ "5b8cb16b94f322151b1e97c2560650b8a097f50b",
+ [
+ null,
+ {}
+ ]
+ ],
"SVGLength.html": [
"7436f5940c5d7432ab318759d3bb83df597c35af",
[
@@ -744107,7 +745405,7 @@
]
],
"single-touch-vertical-rl.html": [
- "857007b1f8a5c548da2e2c306cb80bdea96bf2e5",
+ "3c34a6d9c96a052759d822397124affe3b36319c",
[
null,
{
@@ -744760,7 +746058,7 @@
]
],
"trusted-types-duplicate-names-list.html": [
- "afb2f5f7c4b7f6ddfe8da004750017e6c7f01f9a",
+ "404619b5f7a17c43a1609e4ecc9f4e48ace945f5",
[
null,
{}
@@ -755224,7 +756522,7 @@
},
"time-transformations": {
"transformed-progress.html": [
- "960e333c09268f68d23ba2d0208202f8262ec3ef",
+ "a8fae03db5a3c14dd2c060879a0e9d20f5861276",
[
null,
{}
@@ -759243,7 +760541,7 @@
]
],
"public-key-credential-creation-options-from-json.https.window.js": [
- "c0f1a08cf903b8b0f504df08e56be00c3a1e3248",
+ "fe2df1ef7fd434209c7eb2ebe09065784cc2db9e",
[
"webauthn/public-key-credential-creation-options-from-json.https.window.html",
{
@@ -759268,6 +760566,32 @@
}
]
],
+ "public-key-credential-request-options-from-json.https.window.js": [
+ "82e778b027d35733b456598c472c64ced0562e83",
+ [
+ "webauthn/public-key-credential-request-options-from-json.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/resources/utils.js"
+ ],
+ [
+ "script",
+ "helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
"public-key-credential-to-json.https.window.js": [
"2f805d3ab7a888c98ee27f867732b5c95cfcbb01",
[
@@ -763993,7 +765317,7 @@
]
],
"videoFrame-construction.any.js": [
- "9f2929aedec6c136c0738e2f96b4f4c32516f448",
+ "f49cb62c5c0468df0c9d853d7200b62b1d9ed653",
[
"webcodecs/videoFrame-construction.any.html",
{
@@ -778375,7 +779699,7 @@
]
],
"lstm.https.any.js": [
- "c7d341a9d5aa29ab9ca77f8344439c258e6092dd",
+ "2a3eaa1c20258b9e2e6177c34c651d41e11e21a5",
[
"webnn/validation_tests/lstm.https.any.html",
{
@@ -779172,7 +780496,7 @@
]
],
"triangular.https.any.js": [
- "ee8958659c7452987352931db289812679f89759",
+ "59694a426036aba9517af64e8426e6a25f51ec28",
[
"webnn/validation_tests/triangular.https.any.html",
{
@@ -780022,7 +781346,7 @@
]
],
"RTCRtpReceiver-getParameters.html": [
- "7047ce7d1f363b7d2e06ebbebea11736abcccf3e",
+ "14ec74b66a0329479c83d074e9b97b90347c9a46",
[
null,
{}
@@ -780085,6 +781409,13 @@
{}
]
],
+ "RTCRtpSender-getParameters.html": [
+ "6c47153c8365aff1a0c93740635ef87c6b589b26",
+ [
+ null,
+ {}
+ ]
+ ],
"RTCRtpSender-getStats.https.html": [
"6aeed650e58c7be225b773095b8f035cd216d5d0",
[
@@ -796562,7 +797893,7 @@
]
],
"usbDevice.https.any.js": [
- "804af2afb9db3a0d5fafbeb26aed64f89badb1b3",
+ "a716e847c415b90e3904cb5d4f60c570bd856c7c",
[
"webusb/usbDevice.https.any.html",
{
@@ -826252,7 +827583,7 @@
]
],
"user_context.py": [
- "98d6a2e2c8bfc7a9bf0600017ed9f9729d2836f3",
+ "49a8397474bb5c9f22a3fde580c17e26c6cd54aa",
[
null,
{}
@@ -826339,7 +827670,14 @@
},
"context_created": {
"context_created.py": [
- "5172b25d9971bb2538185f9c82475ac76fb2252a",
+ "63dbd3a23c58bdb8a1d989d8574faf445390fb0b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "original_opener.py": [
+ "115f9679df76880271720a8947afad97896f614b",
[
null,
{}
@@ -826449,7 +827787,7 @@
},
"handle_user_prompt": {
"handle_user_prompt.py": [
- "767305405c656cd0fe4bcf4e29c312e002c98bd0",
+ "6dbe7446b634d69ea84541f8f7797b085800f917",
[
null,
{}
@@ -826738,8 +828076,15 @@
]
},
"user_prompt_closed": {
+ "beforeunload.py": [
+ "c4c51603619d3aa9aa85f2fc4f8d9cb5a9ef2597",
+ [
+ null,
+ {}
+ ]
+ ],
"user_prompt_closed.py": [
- "68a0eed1922ea8a5520190f7babb85f315719c70",
+ "a8ab1490c4664945736afa7660480c4e1074fd6f",
[
null,
{}
@@ -826747,8 +828092,15 @@
]
},
"user_prompt_opened": {
+ "beforeunload.py": [
+ "782cc766507419568ff668648d16b63cd67a3780",
+ [
+ null,
+ {}
+ ]
+ ],
"user_prompt_opened.py": [
- "c37bb66e4e9d6a499a5e87e7338d952562649325",
+ "e4e633e4564b46f0ed07cbf9e34cdbabe02da2e8",
[
null,
{}
@@ -827090,7 +828442,7 @@
},
"before_request_sent": {
"before_request_sent.py": [
- "22588b7013a55b285e15d0ee52fa8ffe608bf02f",
+ "3ef51b2d61c171328c6d7a5435912fe4a327c014",
[
null,
{}
@@ -827263,7 +828615,7 @@
},
"response_completed": {
"response_completed.py": [
- "30b35ef7e0d03a1199bab744bf7eb0ca95cf0e85",
+ "51333a0195f41869662830cba7fbd4d18e31f691",
[
null,
{}
@@ -827279,7 +828631,7 @@
},
"response_started": {
"response_started.py": [
- "030d9168a1d8fd6692ba28827689df8e1c6f4cc9",
+ "17ec9ffe31b33f9799db722fefc12b3c9c2c7e2d",
[
null,
{}
@@ -827927,7 +829279,7 @@
},
"close_window": {
"close.py": [
- "680f471839c7125098042c7c0c44e20674a6e838",
+ "f606e957d418a70b502bf02ddeff0b7db7a74612",
[
null,
{}
@@ -827981,7 +829333,7 @@
},
"delete_session": {
"delete.py": [
- "a3032cc13475bf2980b360d9d140e2d2f58a9034",
+ "3721ea28e28e3725e24e69b22bad42eecf28dc15",
[
null,
{}
@@ -829433,6 +830785,13 @@
}
},
"interop": {
+ "beforeunload_prompt.py": [
+ "1e47f6906761bc614575cb061a8d57cc23a2cde1",
+ [
+ null,
+ {}
+ ]
+ ],
"frames.py": [
"b2cafb498703ba24dac0bfe2a158e630f6aa50d5",
[
diff --git a/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini b/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini
index 4671cc872fe..b45205c6462 100644
--- a/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini
+++ b/tests/wpt/meta/WebCryptoAPI/getRandomValues.any.js.ini
@@ -17,7 +17,7 @@
[Null arrays: BigUint64Array]
expected: FAIL
- [Float arrays]
+ [Float16 arrays]
expected: FAIL
@@ -40,5 +40,5 @@
[Null arrays: BigUint64Array]
expected: FAIL
- [Float arrays]
+ [Float16 arrays]
expected: FAIL
diff --git a/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini
new file mode 100644
index 00000000000..98d15fdb816
--- /dev/null
+++ b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-computed.html.ini
@@ -0,0 +1,18 @@
+[reading-flow-computed.html]
+ [Property reading-flow value 'normal']
+ expected: FAIL
+
+ [Property reading-flow value 'flex-visual']
+ expected: FAIL
+
+ [Property reading-flow value 'flex-flow']
+ expected: FAIL
+
+ [Property reading-flow value 'grid-rows']
+ expected: FAIL
+
+ [Property reading-flow value 'grid-columns']
+ expected: FAIL
+
+ [Property reading-flow value 'grid-order']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini
new file mode 100644
index 00000000000..9b3ebfaee3a
--- /dev/null
+++ b/tests/wpt/meta/css/css-display/reading-flow/tentative/reading-flow-valid.html.ini
@@ -0,0 +1,18 @@
+[reading-flow-valid.html]
+ [e.style['reading-flow'\] = "normal" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "flex-visual" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "flex-flow" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "grid-rows" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "grid-columns" should set the property value]
+ expected: FAIL
+
+ [e.style['reading-flow'\] = "grid-order" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini b/tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini
deleted file mode 100644
index bfbb8d57dbd..00000000000
--- a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-computed.html.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[reading-order-items-computed.html]
- [Property reading-order-items value 'normal']
- expected: FAIL
-
- [Property reading-order-items value 'flex-visual']
- expected: FAIL
-
- [Property reading-order-items value 'flex-flow']
- expected: FAIL
-
- [Property reading-order-items value 'grid-rows']
- expected: FAIL
-
- [Property reading-order-items value 'grid-columns']
- expected: FAIL
-
- [Property reading-order-items value 'grid-order']
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini b/tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini
deleted file mode 100644
index 8fa1c144a47..00000000000
--- a/tests/wpt/meta/css/css-display/reading-order/reading-order-items-valid.html.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[reading-order-items-valid.html]
- [e.style['reading-order-items'\] = "normal" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "flex-visual" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "flex-flow" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "grid-rows" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "grid-columns" should set the property value]
- expected: FAIL
-
- [e.style['reading-order-items'\] = "grid-order" should set the property value]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini b/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini
new file mode 100644
index 00000000000..58588e322c0
--- /dev/null
+++ b/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.html.ini
@@ -0,0 +1,2 @@
+[font-size-adjust-ic-height.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini b/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini
deleted file mode 100644
index 69a38ce77ee..00000000000
--- a/tests/wpt/meta/css/css-fonts/font-size-adjust-ic-height.tentative.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[font-size-adjust-ic-height.tentative.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini
new file mode 100644
index 00000000000..4d1405fd38b
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-2.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-exif-png-2.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini
new file mode 100644
index 00000000000..a5e9153e1b2
--- /dev/null
+++ b/tests/wpt/meta/css/css-images/image-orientation/image-orientation-exif-png-3.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-exif-png-3.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-lists/details-open.html.ini b/tests/wpt/meta/css/css-lists/details-open.html.ini
new file mode 100644
index 00000000000..c8587942f36
--- /dev/null
+++ b/tests/wpt/meta/css/css-lists/details-open.html.ini
@@ -0,0 +1,2 @@
+[details-open.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini b/tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini
new file mode 100644
index 00000000000..7a0dea87709
--- /dev/null
+++ b/tests/wpt/meta/css/css-lists/implicit-and-explicit-list-item-counters.html.ini
@@ -0,0 +1,2 @@
+[implicit-and-explicit-list-item-counters.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini
new file mode 100644
index 00000000000..784929fa209
--- /dev/null
+++ b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-001.html.ini
@@ -0,0 +1,2 @@
+[hyphens-vs-float-clearance-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini
new file mode 100644
index 00000000000..6214b59d4c3
--- /dev/null
+++ b/tests/wpt/meta/css/css-text/hyphens/hyphens-vs-float-clearance-002.html.ini
@@ -0,0 +1,2 @@
+[hyphens-vs-float-clearance-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini b/tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini
deleted file mode 100644
index 26435e28b09..00000000000
--- a/tests/wpt/meta/css/css-values/vh_not_refreshing_on_chrome.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[vh_not_refreshing_on_chrome.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini
new file mode 100644
index 00000000000..83e7d9ca15d
--- /dev/null
+++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple-nested.html.ini
@@ -0,0 +1,12 @@
+[scrollIntoView-multiple-nested.html]
+ [Simultaneous smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous smooth,instant scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant,smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant scrollIntoViews run to completion]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini
new file mode 100644
index 00000000000..2e26c21bf51
--- /dev/null
+++ b/tests/wpt/meta/css/cssom-view/scrollIntoView-multiple.html.ini
@@ -0,0 +1,12 @@
+[scrollIntoView-multiple.html]
+ [Simultaneous smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous smooth,instant scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant,smooth scrollIntoViews run to completion]
+ expected: FAIL
+
+ [Simultaneous instant scrollIntoViews run to completion]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini b/tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini
new file mode 100644
index 00000000000..321dc54f98d
--- /dev/null
+++ b/tests/wpt/meta/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html.ini
@@ -0,0 +1,7 @@
+[smooth-scrollIntoView-with-smooth-fragment-scroll.html]
+ expected: TIMEOUT
+ [Smooth scroll to hash fragment (on pageload) alongside smooth scrollIntoView runs to completion.]
+ expected: TIMEOUT
+
+ [Smooth scroll to hash fragment (on click) alongside smooth scrollIntoView runs to completion.]
+ expected: NOTRUN
diff --git a/tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini b/tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini
new file mode 100644
index 00000000000..51318cbb1d2
--- /dev/null
+++ b/tests/wpt/meta/css/filter-effects/backdrop-filter-edge-mirror.html.ini
@@ -0,0 +1,2 @@
+[backdrop-filter-edge-mirror.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini b/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini
index 5e6dca448af..4648085f98d 100644
--- a/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini
+++ b/tests/wpt/meta/fetch/metadata/generated/element-img-environment-change.sub.html.ini
@@ -1,7 +1,7 @@
[element-img-environment-change.sub.html]
expected: TIMEOUT
[sec-fetch-site - Not sent to non-trustworthy same-site destination, no attributes]
- expected: FAIL
+ expected: TIMEOUT
[sec-fetch-site - Not sent to non-trustworthy cross-site destination, no attributes]
expected: NOTRUN
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini
new file mode 100644
index 00000000000..518e7cde25d
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js.ini
@@ -0,0 +1,4 @@
+[addEmbed.window.html]
+ expected: TIMEOUT
+ [RemoteContextWrapper addEmbed]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini
new file mode 100644
index 00000000000..426a2fdf64e
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js.ini
@@ -0,0 +1,4 @@
+[addObject.window.html]
+ expected: TIMEOUT
+ [RemoteContextWrapper addObject]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/meta/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
deleted file mode 100644
index 7a5fcb79165..00000000000
--- a/tests/wpt/meta/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/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini
index 5c6c73a74f7..e12e364d828 100644
--- a/tests/wpt/meta-legacy-layout/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html.ini
+++ b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html.ini
@@ -1,5 +1,3 @@
-[initial.reset.path.html]
- type: testharness
+[2d.canvas.host.initial.reset.path.html]
[Resetting the canvas state resets the current path]
expected: FAIL
-
diff --git a/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini
new file mode 100644
index 00000000000..f6455f9bd76
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/element/canvas-host/2d.canvas.host.size.large.html.ini
@@ -0,0 +1,2 @@
+[2d.canvas.host.size.large.html]
+ expected: CRASH
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini
new file mode 100644
index 00000000000..b942e4f7dc2
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.invalid.args.html]
+ [Calling getContext with invalid arguments.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini
new file mode 100644
index 00000000000..cb833a67760
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.invalid.args.worker.html]
+ [Calling getContext with invalid arguments.]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini
new file mode 100644
index 00000000000..93c6d0311c2
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.prototype.html]
+ [checks OffscreenCanvasRenderingContext2D prototype]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini
new file mode 100644
index 00000000000..6fb21f3ff0b
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.prototype.worker.html]
+ [checks OffscreenCanvasRenderingContext2D prototype]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini
new file mode 100644
index 00000000000..26aad00b3ec
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.exists.html]
+ [The 2D context interface is a property of 'window']
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini
new file mode 100644
index 00000000000..d5f7ace91cf
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.exists.worker.html]
+ [The 2D context interface is a property of 'self']
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini
new file mode 100644
index 00000000000..879ed9966cf
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.extend.html]
+ [Interface methods can be added]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini
new file mode 100644
index 00000000000..3c236139ef3
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.extend.worker.html]
+ [Interface methods can be added]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini
new file mode 100644
index 00000000000..0383bffaeb4
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.prototype.html]
+ [window.CanvasRenderingContext2D.prototype are not [[Writable\]\] and not [[Configurable\]\], and its methods are [[Configurable\]\].]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini
new file mode 100644
index 00000000000..f60498b30bf
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.prototype.worker.html]
+ [window.CanvasRenderingContext2D.prototype are not [[Writable\]\] and not [[Configurable\]\], and its methods are [[Configurable\]\].]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini
new file mode 100644
index 00000000000..fe8eaedb0ae
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.replace.html]
+ [Interface methods can be overridden]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini
new file mode 100644
index 00000000000..f055817dca7
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.context.type.replace.worker.html]
+ [Interface methods can be overridden]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini
deleted file mode 100644
index 61f40bc0e2a..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badname.html]
- [getContext with unrecognised context name returns null]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini
deleted file mode 100644
index ba433ddb153..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badname.worker.html]
- [getContext with unrecognised context name returns null]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini
deleted file mode 100644
index 42e7640cc34..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badsuffix.html]
- [Context name "2d" plus a suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini
deleted file mode 100644
index 89c114b0e1d..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.badsuffix.worker.html]
- [Context name "2d" plus a suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini
deleted file mode 100644
index 8cd6b8b614c..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.nullsuffix.html]
- [Context name "2d" plus a "\\0" suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini
deleted file mode 100644
index e850767487e..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.nullsuffix.worker.html]
- [Context name "2d" plus a "\\0" suffix is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini
deleted file mode 100644
index 88eff7740fd..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.unicode.html]
- [Context name which kind of looks like "2d" is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini
deleted file mode 100644
index 7cf8fcb7e38..00000000000
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[2d.canvas.context.unrecognised.unicode.worker.html]
- [Context name which kind of looks like "2d" is unrecognised]
- expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini
index dd83740eda3..48717ac03e5 100644
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html.ini
@@ -1,3 +1,6 @@
[2d.canvas.host.readonly.html]
[canvas is readonly]
expected: FAIL
+
+ [Canvas objects are readonly]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini
index b2478bd393c..f267de666ad 100644
--- a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js.ini
@@ -1,3 +1,6 @@
[2d.canvas.host.readonly.worker.html]
[canvas is readonly]
expected: FAIL
+
+ [Canvas objects are readonly]
+ expected: FAIL
diff --git a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini
index 7a67c55bf1d..672798f3f81 100644
--- a/tests/wpt/meta-legacy-layout/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html.ini
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html.ini
@@ -1,3 +1,3 @@
-[2d.canvas.host.size.attributes.idl.html]
+[2d.canvas.host.size.invalid.attributes.idl.html]
[Getting/setting width/height IDL attributes]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini
new file mode 100644
index 00000000000..acf2210f82b
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.host.size.invalid.attributes.idl.worker.html]
+ [Getting/setting width/height IDL attributes]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini
new file mode 100644
index 00000000000..49e1b9a2259
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.host.type.delete.html]
+ [OffscreenCanvas interface object is [[Configurable\]\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini
new file mode 100644
index 00000000000..209c5fbbfd3
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.host.type.delete.worker.html]
+ [OffscreenCanvas interface object is [[Configurable\]\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini
new file mode 100644
index 00000000000..cbbdddc58e0
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html.ini
@@ -0,0 +1,3 @@
+[2d.canvas.host.type.name.html]
+ [OffscreenCanvas type and toString]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini
new file mode 100644
index 00000000000..48dd17b1b82
--- /dev/null
+++ b/tests/wpt/meta/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js.ini
@@ -0,0 +1,3 @@
+[2d.canvas.host.type.name.worker.html]
+ [OffscreenCanvas type and toString]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini
index 830aeb8ae48..fdc27d37788 100644
--- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini
+++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html.ini
@@ -1,7 +1,6 @@
[autofocus-dialog.html]
- expected: TIMEOUT
[<dialog> can contain autofocus, without stopping page autofocus content from working]
expected: FAIL
[<dialog>-contained autofocus element gets focused when the dialog is shown]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index b680c14d61c..ddd65fdcec8 100644
--- a/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/meta/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,19 +1,15 @@
[supported-elements.html]
- expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
[Host element with delegatesFocus including no focusable descendants should be skipped]
- expected: NOTRUN
+ expected: FAIL
[Element with tabindex should support autofocus]
- expected: TIMEOUT
+ expected: FAIL
[Area element should support autofocus]
- expected: NOTRUN
+ expected: FAIL
[Host element with delegatesFocus should support autofocus]
- expected: NOTRUN
-
- [Non-HTMLElement should not support autofocus]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini b/tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini
new file mode 100644
index 00000000000..06f2790b6bb
--- /dev/null
+++ b/tests/wpt/meta/html/rendering/the-details-element/details-display.tentative.html.ini
@@ -0,0 +1,15 @@
+[details-display.tentative.html]
+ [default display of first summary child of details is list-item]
+ expected: FAIL
+
+ [display of details element can be changed]
+ expected: FAIL
+
+ [display of first summary child of details can be changed]
+ expected: FAIL
+
+ [display of other summary element in details can be changed]
+ expected: FAIL
+
+ [display of summary element outside details can be changed]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini b/tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini
new file mode 100644
index 00000000000..a4978181305
--- /dev/null
+++ b/tests/wpt/meta/html/rendering/widgets/input-checkbox-zero-size.html.ini
@@ -0,0 +1,2 @@
+[input-checkbox-zero-size.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini
new file mode 100644
index 00000000000..2790024adc1
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-history-pushState.html]
+ [History state change for iframe loading='lazy' before it is loaded: history.pushState]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini
new file mode 100644
index 00000000000..72fd909874f
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-history-replaceState.html]
+ [History state change for iframe loading='lazy' before it is loaded: history.replaceState]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini
new file mode 100644
index 00000000000..ce58a9da176
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-link-click-fragment.html]
+ [Navigating iframe loading='lazy' before it is loaded: link click (fragment)]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini
new file mode 100644
index 00000000000..50155ba1c77
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-location-replace-set-src.html]
+ [Navigating iframe loading='lazy' and then setting src: location.replace]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini
new file mode 100644
index 00000000000..7cdcf205066
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-meta-refresh.optional.html]
+ [Navigating iframe loading='lazy' before it is loaded: meta refresh]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini
new file mode 100644
index 00000000000..396370a990c
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-nav-navigation-navigate.html]
+ [Navigating iframe loading='lazy' before it is loaded: navigation.navigate]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini
new file mode 100644
index 00000000000..247b8ee99a6
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-reload-location-reload.html]
+ [Reloading iframe loading='lazy' before it is loaded: location.reload]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini
new file mode 100644
index 00000000000..0c94be22223
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html.ini
@@ -0,0 +1,3 @@
+[iframe-loading-lazy-reload-navigation-reload.html]
+ [Reloading iframe loading='lazy' before it is loaded: location.reload]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index 24903b5f66f..d7e7d1b9815 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-1.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index d4b2e4435a0..7da2bc5ac80 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,3 +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
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 5799e6c26cd..e8872b3585b 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,3 +1,4 @@
[iframe_sandbox_popups_nonescaping-1.html]
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
index ccdaf8d61b2..ff6467094b8 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -1,3 +1,3 @@
[iframe_sandbox_popups_nonescaping-3.html]
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
deleted file mode 100644
index 3cdeb8ebcbc..00000000000
--- a/tests/wpt/meta/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[non-active-document.html]
- [DOMParser]
- expected: FAIL
diff --git a/tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini b/tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini
new file mode 100644
index 00000000000..54f418b142b
--- /dev/null
+++ b/tests/wpt/meta/selection/move-paragraph-cross-editing-boundary.tentative.html.ini
@@ -0,0 +1,6 @@
+[move-paragraph-cross-editing-boundary.tentative.html]
+ [cross editing boundary]
+ expected: FAIL
+
+ [not cross editing boundary]
+ expected: FAIL
diff --git a/tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini b/tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini
new file mode 100644
index 00000000000..d2480558e0a
--- /dev/null
+++ b/tests/wpt/meta/selection/textcontrols/selectionchange-on-shadow-dom.html.ini
@@ -0,0 +1,2 @@
+[selectionchange-on-shadow-dom.html]
+ expected: ERROR
diff --git a/tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini b/tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini
deleted file mode 100644
index aa6c9e5b826..00000000000
--- a/tests/wpt/meta/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html]
- expected: TIMEOUT
- [StorageKey: test 3P about:blank window opened from a 3P iframe]
- expected: TIMEOUT
diff --git a/tests/wpt/tests/.well-known/web-identity b/tests/wpt/tests/.well-known/web-identity
index 6f1260dbc37..c36f63e8138 100644
--- a/tests/wpt/tests/.well-known/web-identity
+++ b/tests/wpt/tests/.well-known/web-identity
@@ -7,7 +7,7 @@ def main(request, response):
if manifest_url is None or not len(manifest_url):
port = request.server.config.ports["https"][0]
hostname = request.url_parts.hostname
- manifest_url = "https://{0}:{1}/credential-management/support/fedcm/manifest.py".format(
+ manifest_url = "https://{0}:{1}/fedcm/support/manifest.py".format(
hostname, str(port))
else:
try:
diff --git a/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js b/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js
index 6dc44e8e156..57a85624340 100644
--- a/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js
+++ b/tests/wpt/tests/FileAPI/blob/Blob-constructor.any.js
@@ -290,16 +290,24 @@ test_blob(function() {
new Int16Array([0x4150, 0x5353]),
new Uint32Array([0x53534150]),
new Int32Array([0x53534150]),
- new Float16Array([2.65625, 58.59375]),
new Float32Array([0xD341500000])
]);
}, {
- expected: "PASSPASSPASSPASSPASSPASSPASSPASS",
+ expected: "PASSPASSPASSPASSPASSPASSPASS",
type: "",
desc: "Passing typed arrays as elements of the blobParts array should work."
});
test_blob(function() {
return new Blob([
+ new Float16Array([2.65625, 58.59375])
+ ]);
+}, {
+ expected: "PASS",
+ type: "",
+ desc: "Passing a Float16Array as element of the blobParts array should work."
+});
+test_blob(function() {
+ return new Blob([
// 0x535 3415053534150
// 0x535 = 0b010100110101 -> Sign = +, Exponent = 1333 - 1023 = 310
// 0x13415053534150 * 2**(-52)
diff --git a/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js b/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js
index 2b82b9bedb9..0437857f2fa 100644
--- a/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js
+++ b/tests/wpt/tests/WebCryptoAPI/getRandomValues.any.js
@@ -3,6 +3,14 @@ test(function() {
assert_throws_dom("TypeMismatchError", function() {
self.crypto.getRandomValues(new Float16Array(6))
}, "Float16Array")
+
+ assert_throws_dom("TypeMismatchError", function() {
+ const len = 65536 / Float16Array.BYTES_PER_ELEMENT + 1;
+ self.crypto.getRandomValues(new Float16Array(len));
+ }, "Float16Array (too long)")
+}, "Float16 arrays");
+
+test(function() {
assert_throws_dom("TypeMismatchError", function() {
self.crypto.getRandomValues(new Float32Array(6))
}, "Float32Array")
@@ -11,10 +19,6 @@ test(function() {
}, "Float64Array")
assert_throws_dom("TypeMismatchError", function() {
- const len = 65536 / Float16Array.BYTES_PER_ELEMENT + 1;
- self.crypto.getRandomValues(new Float16Array(len));
- }, "Float16Array (too long)")
- assert_throws_dom("TypeMismatchError", function() {
const len = 65536 / Float32Array.BYTES_PER_ELEMENT + 1;
self.crypto.getRandomValues(new Float32Array(len));
}, "Float32Array (too long)")
diff --git a/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js b/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js
index abb51751c8b..f4316ba1fc8 100644
--- a/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js
+++ b/tests/wpt/tests/compression/decompression-buffersource.tentative.any.js
@@ -49,7 +49,7 @@ const bufferSourceChunksForDeflate = [
},
{
name: 'Float16Array',
- value: new Float16Array(new Uint8Array(compressedBytesWithDeflate).buffer)
+ value: () => new Float16Array(new Uint8Array(compressedBytesWithDeflate).buffer)
},
{
name: 'Float32Array',
@@ -100,7 +100,7 @@ const bufferSourceChunksForGzip = [
},
{
name: 'Float16Array',
- value: new Float16Array(new Uint8Array(compressedBytesWithGzip).buffer)
+ value: () => new Float16Array(new Uint8Array(compressedBytesWithGzip).buffer)
},
{
name: 'Float32Array',
@@ -151,7 +151,7 @@ const bufferSourceChunksForDeflateRaw = [
},
{
name: 'Float16Array',
- value: new Float16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer)
+ value: () => new Float16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer)
},
{
name: 'Float32Array',
@@ -172,7 +172,7 @@ for (const chunk of bufferSourceChunksForDeflate) {
const ds = new DecompressionStream('deflate');
const reader = ds.readable.getReader();
const writer = ds.writable.getWriter();
- const writePromise = writer.write(chunk.value);
+ const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value);
writer.close();
const { value } = await reader.read();
assert_array_equals(Array.from(value), deflateExpectedChunkValue, 'value should match');
@@ -184,7 +184,7 @@ for (const chunk of bufferSourceChunksForGzip) {
const ds = new DecompressionStream('gzip');
const reader = ds.readable.getReader();
const writer = ds.writable.getWriter();
- const writePromise = writer.write(chunk.value);
+ const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value);
writer.close();
const { value } = await reader.read();
assert_array_equals(Array.from(value), gzipExpectedChunkValue, 'value should match');
@@ -196,7 +196,7 @@ for (const chunk of bufferSourceChunksForDeflateRaw) {
const ds = new DecompressionStream('deflate-raw');
const reader = ds.readable.getReader();
const writer = ds.writable.getWriter();
- const writePromise = writer.write(chunk.value);
+ const writePromise = writer.write(typeof chunk.value === 'function' ? chunk.value() : chunk.value);
writer.close();
const { value } = await reader.read();
assert_array_equals(Array.from(value), deflateRawExpectedChunkValue, 'value should match');
diff --git a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py
index 3a914379671..b025012ec8e 100644
--- a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py
+++ b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/echo-allow-csp-from.py
@@ -32,12 +32,16 @@ def main(request, response):
background-color: maroon;
}
</style>
- <script nonce="abc">
+ <script nonce="123">
var response = {};
response["id"] = "%s";
response["loaded"] = true;
window.top.postMessage(response, '*');
</script>
+ <script>
+ // Inline script which might be blocked by CSP.
+ navigator.userAgent;
+ </script>
</body>
</html>
''' % (message, message)
diff --git a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
index 7d2307ebbc9..551ad0348a7 100644
--- a/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
+++ b/tests/wpt/tests/content-security-policy/embedded-enforcement/support/testharness-helper.sub.js
@@ -110,61 +110,65 @@ function assert_iframe_with_csp(t, url, csp, shouldBlock, urlId, blockedURI,
if (csp != null)
i.csp = csp;
- var loaded = {};
- var onLoadReceived = {};
- window.addEventListener("message", function (e) {
- if (e.source != i.contentWindow)
- return;
- if (e.data["loaded"])
- loaded[e.data["id"]] = true;
- });
-
if (shouldBlock) {
// Assert iframe does not load and is inaccessible.
- window.onmessage = t.step_func(function(e) {
- if (e.source != i.contentWindow)
- return;
+ window.addEventListener("message", t.step_func(function(e) {
+ if (e.source != i.contentWindow) return;
assert_unreached('No message should be sent from the frame.');
- });
- i.onload = t.step_func(function () {
- // Delay the check until after the postMessage has a chance to execute.
- setTimeout(t.step_func_done(function () {
- assert_equals(loaded[urlId], undefined);
- }), 500);
+ }));
+ i.onload = t.step_wait_func_done(function() {
+ if (!i.contentWindow) return false;
+ try {
+ let x = i.contentWindow.location.href;
+ return false;
+ } catch (e) {
+ return true;
+ }
+ }, t.step_func(() => {
assert_throws_dom("SecurityError", () => {
- var x = i.contentWindow.location.href;
+ let x = i.contentWindow.location.href;
});
- });
- } else if (blockedURI) {
- // Assert iframe loads with an expected violation.
- window.addEventListener('message', t.step_func(e => {
- if (e.source != i.contentWindow)
- return;
- if (!e.data.securitypolicyviolation)
- return;
- assert_equals(e.data["blockedURI"], blockedURI);
- t.done();
- }));
+ }), "The error frame should be cross-origin.", 5000, 500);
} else {
- // Assert iframe loads. Wait for the load event, the postMessage from the
- // script and the img load event.
- let img_loaded = !checkImageLoaded;
- window.addEventListener('message', t.step_func(e => {
- if (e.source != i.contentWindow)
- return;
- if (e.data === "img loaded")
- img_loaded = true;
-
- if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) {
- t.done();
- }
- }));
- i.onload = t.step_func(function () {
- onLoadReceived[urlId] = true;
- if (loaded[urlId] && onLoadReceived[urlId] && img_loaded) {
- t.done();
- }
+ let successPromises = [];
+
+ let loadPromise = new Promise(resolve => {
+ i.onload = resolve;
+ });
+ successPromises.push(loadPromise);
+
+ let loadMsgPromise = new Promise(resolve => {
+ window.addEventListener("message", function (e) {
+ if (e.source != i.contentWindow) return;
+ if (e.data["loaded"] && e.data["id"] === urlId) resolve();
+ });
});
+ successPromises.push(loadMsgPromise);
+
+ if (blockedURI) {
+ let securityViolationPromise = new Promise(resolve => {
+ window.addEventListener('message', t.step_func(e => {
+ if (e.source != i.contentWindow) return;
+ if (!e.data.securitypolicyviolation) return;
+ assert_equals(e.data["blockedURI"], blockedURI);
+ resolve();
+ }));
+ });
+ successPromises.push(securityViolationPromise);
+ }
+
+ if (checkImageLoaded) {
+ let imageLoadedPromise = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ if (e.source != i.contentWindow) return;
+ if (e.data === "img loaded") resolve();
+ });
+ });
+ successPromises.push(imageLoadedPromise);
+ }
+
+ // Wait for all promises to resolve.
+ Promise.all(successPromises).then(t.step_func_done());
}
document.body.appendChild(i);
}
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
index 3b90782713f..7a3f266b24b 100644
--- 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
@@ -14,7 +14,7 @@ import {request_options_with_mediation_required,
open_and_wait_for_popup,
select_manifest} from '../support/fedcm-helper.sub.js';
-const url_path = '/credential-management/support/fedcm/'
+const url_path = '/fedcm/support/'
const url_prefix = manifest_origin + url_path;
async function set_accounts_cookie(value) {
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
index 96006cce68c..66311740124 100644
--- 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
@@ -14,7 +14,7 @@ import {request_options_with_mediation_required,
open_and_wait_for_popup,
select_manifest} from '../support/fedcm-helper.sub.js';
-const url_path = '/credential-management/support/fedcm/'
+const url_path = '/fedcm/support/'
const url_prefix = manifest_origin + url_path;
async function set_accounts_cookie(value) {
diff --git a/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html b/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html
index b802369256a..79171bf6343 100644
--- a/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html
+++ b/tests/wpt/tests/credential-management/fedcm-client-metadata-not-cached.https.html
@@ -13,7 +13,7 @@ import {request_options_with_mediation_required,
fedcm_test(async t => {
// Reset the client_metadata fetch count.
- const clear_metadata_count_path = `support/fedcm/client_metadata_clear_count.py`;
+ const clear_metadata_count_path = `/fedcm/support/client_metadata_clear_count.py`;
await fetch(clear_metadata_count_path);
// FedCM flow causes the counter of client metadata to increase by 1.
@@ -22,7 +22,7 @@ fedcm_test(async t => {
await new Promise(resolve => {
// Fetch the client metadata from a popup window.
- let popup_window = window.open('support/fedcm/client_metadata.py?skip_checks=1');
+ let popup_window = window.open('/fedcm/support/client_metadata.py?skip_checks=1');
const popup_window_load_handler = (event) => {
popup_window.removeEventListener('load', popup_window_load_handler);
popup_window.close();
diff --git a/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html b/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html
index dbf42c4083b..4d5fb0a457c 100644
--- a/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html
+++ b/tests/wpt/tests/credential-management/fedcm-disconnect-errors.https.html
@@ -25,7 +25,7 @@ fedcm_test(async t => {
const cred = await fedcm_get_and_select_first_account(t,
request_options_with_mediation_required());
const manifest = `${manifest_origin}/\
-credential-management/support/fedcm/manifest.py`;
+fedcm/support/manifest.py`;
await promise_rejects_js(t, TypeError, IdentityCredential.disconnect({
configURL: manifest,
clientId: '1'
diff --git a/tests/wpt/tests/credential-management/fedcm-error-basic.https.html b/tests/wpt/tests/credential-management/fedcm-error-basic.https.html
index fd902bcf904..8a2d39cabaa 100644
--- a/tests/wpt/tests/credential-management/fedcm-error-basic.https.html
+++ b/tests/wpt/tests/credential-management/fedcm-error-basic.https.html
@@ -15,7 +15,7 @@ import {request_options_with_mediation_required,
fedcm_error_dialog_dismiss,
fedcm_error_dialog_click_button} from './support/fedcm-helper.sub.js';
-const url_prefix = manifest_origin + '/credential-management/support/fedcm/';
+const url_prefix = manifest_origin + '/fedcm/support/';
fedcm_test(async t => {
let test_options =
diff --git a/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html b/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html
index cb5dfa615f3..eb87c2377a9 100644
--- a/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html
+++ b/tests/wpt/tests/credential-management/fedcm-too-many-disconnect-calls.https.html
@@ -23,7 +23,7 @@ fedcm_test(async t => {
// Get at least one connected account that can be disconnected.
const cred = await fedcm_get_and_select_first_account(t, request_options_with_mediation_required());
const manifest = `${manifest_origin}/\
-credential-management/support/fedcm/manifest.py`;
+fedcm/support/manifest.py`;
const options = disconnect_options("1234");
IdentityCredential.disconnect(options);
await promise_rejects_dom(t, 'NetworkError', IdentityCredential.disconnect(options));
diff --git a/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js b/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js
index 308950e1e29..17ed5ce4468 100644
--- a/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js
+++ b/tests/wpt/tests/credential-management/support/fedcm-helper.sub.js
@@ -1,7 +1,7 @@
export const manifest_origin = "https://{{host}}:{{ports[https][0]}}";
export const alt_manifest_origin = 'https://{{hosts[alt][]}}:{{ports[https][0]}}';
export const same_site_manifest_origin = 'https://{{hosts[][www1]}}:{{ports[https][0]}}';
-export const default_manifest_path = '/credential-management/support/fedcm/manifest.py';
+export const default_manifest_path = '/fedcm/support/manifest.py';
export function open_and_wait_for_popup(origin, path) {
return new Promise(resolve => {
@@ -26,6 +26,7 @@ export function open_and_wait_for_popup(origin, path) {
export function set_fedcm_cookie(host) {
if (host == undefined) {
document.cookie = 'cookie=1; SameSite=None; Path=/credential-management/support; Secure';
+ document.cookie = 'cookie=1; SameSite=None; Path=/fedcm/support; Secure';
return Promise.resolve();
} else {
return open_and_wait_for_popup(host, '/credential-management/support/set_cookie');
@@ -52,7 +53,7 @@ export function request_options_with_mediation_required(manifest_filename, origi
manifest_filename = "manifest.py";
}
const manifest_path = `${origin}/\
-credential-management/support/fedcm/${manifest_filename}`;
+fedcm/support/${manifest_filename}`;
return {
identity: {
providers: [{
@@ -87,7 +88,7 @@ export function request_options_with_context(manifest_filename, context) {
manifest_filename = "manifest.py";
}
const manifest_path = `${manifest_origin}/\
-credential-management/support/fedcm/${manifest_filename}`;
+fedcm/support/${manifest_filename}`;
return {
identity: {
providers: [{
@@ -145,7 +146,7 @@ function select_manifest_impl(manifest_url) {
return new Promise(resolve => {
const img = document.createElement('img');
- img.src = `/credential-management/support/fedcm/select_manifest_in_root_manifest.py${url_query}`;
+ img.src = `/fedcm/support/select_manifest_in_root_manifest.py${url_query}`;
img.addEventListener('error', resolve);
document.body.appendChild(img);
});
@@ -272,7 +273,7 @@ export function disconnect_options(accountHint, manifest_filename) {
manifest_filename = "manifest.py";
}
const manifest_path = `${manifest_origin}/\
-credential-management/support/fedcm/${manifest_filename}`;
+fedcm/support/${manifest_filename}`;
return {
configURL: manifest_path,
clientId: '1',
@@ -285,7 +286,7 @@ export function alt_disconnect_options(accountHint, manifest_filename) {
manifest_filename = "manifest.py";
}
const manifest_path = `${alt_manifest_origin}/\
-credential-management/support/fedcm/${manifest_filename}`;
+fedcm/support/${manifest_filename}`;
return {
configURL: manifest_path,
clientId: '1',
diff --git a/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js b/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js
index 773e38fd21b..fd0bb71a0c7 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js
+++ b/tests/wpt/tests/credential-management/support/fedcm/intercept_service_worker.js
@@ -4,7 +4,8 @@ self.addEventListener('fetch', event => {
const url = event.request.url;
if (url.indexOf('query_service_worker_intercepts.html') != -1) {
event.respondWith(new Response(num_overridden));
- } else if (url.indexOf('credential-management/support') != -1) {
+ } else if (url.indexOf('credential-management/support' ||
+ url.indexOf('fedcm/support') != -1)) {
++num_overridden;
}
});
diff --git a/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html b/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html
index 0afe279bcc5..da2cd26066a 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html
+++ b/tests/wpt/tests/credential-management/support/fedcm/pending-userinfo-iframe.html
@@ -6,7 +6,7 @@ import {alt_manifest_origin} from './../fedcm-helper.sub.js';
window.onload = async () => {
try {
const manifest_path = `${alt_manifest_origin}/\
-credential-management/support/fedcm/manifest.py`;
+fedcm/support/manifest.py`;
IdentityProvider.getUserInfo({
configURL: manifest_path,
// Approved client
diff --git a/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html b/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html
index 45a1a34ce9e..64d5cb83a08 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html
+++ b/tests/wpt/tests/credential-management/support/fedcm/userinfo-iframe.html
@@ -13,7 +13,7 @@ import {alt_manifest_origin} from './../fedcm-helper.sub.js';
window.onload = async () => {
try {
const manifest_path = `${alt_manifest_origin}/\
-credential-management/support/fedcm/manifest.py`;
+fedcm/support/manifest.py`;
const user_info = await IdentityProvider.getUserInfo({
configURL: manifest_path,
// Approved client
diff --git a/tests/wpt/tests/css/css-break/overflowing-block-004.html b/tests/wpt/tests/css/css-break/overflowing-block-004.html
new file mode 100644
index 00000000000..edf9e53439b
--- /dev/null
+++ b/tests/wpt/tests/css/css-break/overflowing-block-004.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/348445899">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="mc" style="columns:2; width:100px; column-fill:auto; gap:0; height:300px; background:red;">
+ <div style="width:50px;">
+ <div style="height:15px;">
+ <div style="height:200px; background:green;"></div>
+ </div>
+ </div>
+</div>
+<script>
+ document.body.offsetTop;
+ mc.style.height = "100px";
+</script>
diff --git a/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html b/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html
new file mode 100644
index 00000000000..ae7809016e6
--- /dev/null
+++ b/tests/wpt/tests/css/css-contain/container-queries/crashtests/chrome-bug-346264227-crash.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>Chrome crash bug 346264227</title>
+<link rel="help" href="https://crbug.com/346264227">
+<style>
+ @container (width = 0px) {
+ #inner {
+ display: none;
+ }
+ }
+</style>
+<div style="container-type: inline-size">
+ <div id="inner" style="container-type: inline-size; display: none"><span></span></div>
+</div>
+<script>
+ document.body.offsetTop;
+ document.body.style.width = 0;
+ inner.style.display = "";
+ document.body.offsetTop;
+</script>
diff --git a/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html
new file mode 100644
index 00000000000..65ef90f5a50
--- /dev/null
+++ b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-computed.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Display: getComputedStyle().readingFlow</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
+<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value('reading-flow', 'normal');
+test_computed_value('reading-flow', 'flex-visual');
+test_computed_value('reading-flow', 'flex-flow');
+test_computed_value('reading-flow', 'grid-rows');
+test_computed_value('reading-flow', 'grid-columns');
+test_computed_value('reading-flow', 'grid-order');
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html
new file mode 100644
index 00000000000..1d489b79564
--- /dev/null
+++ b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-invalid.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Display: parsing reading-flow with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
+<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<body>
+<script>
+test_invalid_value('reading-flow', 'auto');
+test_invalid_value('reading-flow', 'none');
+test_invalid_value('reading-flow', 'legacy');
+test_invalid_value('reading-flow', 'normal auto');
+test_invalid_value('reading-flow', 'flex-visual flex-flow');
+test_invalid_value('reading-flow', '100%');
+test_invalid_value('reading-flow', '10px');
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html
new file mode 100644
index 00000000000..3d650c53063
--- /dev/null
+++ b/tests/wpt/tests/css/css-display/reading-flow/tentative/reading-flow-valid.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>CSS Display: parsing reading-flow with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
+<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<body>
+<script>
+test_valid_value('reading-flow', 'normal');
+test_valid_value('reading-flow', 'flex-visual');
+test_valid_value('reading-flow', 'flex-flow');
+test_valid_value('reading-flow', 'grid-rows');
+test_valid_value('reading-flow', 'grid-columns');
+test_valid_value('reading-flow', 'grid-order');
+</script>
+</body>
diff --git a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html b/tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html
deleted file mode 100644
index a8280337665..00000000000
--- a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-computed.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Display: getComputedStyle().readingOrderItems</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
-<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/computed-testcommon.js"></script>
-<body>
-<div id="target"></div>
-<script>
-test_computed_value('reading-order-items', 'normal');
-test_computed_value('reading-order-items', 'flex-visual');
-test_computed_value('reading-order-items', 'flex-flow');
-test_computed_value('reading-order-items', 'grid-rows');
-test_computed_value('reading-order-items', 'grid-columns');
-test_computed_value('reading-order-items', 'grid-order');
-</script>
-</body>
diff --git a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html b/tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html
deleted file mode 100644
index eff5846e316..00000000000
--- a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-invalid.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Display: parsing reading-order-items with invalid values</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
-<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-<body>
-<script>
-test_invalid_value('reading-order-items', 'auto');
-test_invalid_value('reading-order-items', 'none');
-test_invalid_value('reading-order-items', 'legacy');
-test_invalid_value('reading-order-items', 'normal auto');
-test_invalid_value('reading-order-items', 'flex-visual flex-flow');
-test_invalid_value('reading-order-items', '100%');
-test_invalid_value('reading-order-items', '10px');
-</script>
-</body>
diff --git a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html b/tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html
deleted file mode 100644
index d1ac7de64eb..00000000000
--- a/tests/wpt/tests/css/css-display/reading-order/reading-order-items-valid.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Display: parsing reading-order-items with valid values</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
-<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/css/support/parsing-testcommon.js"></script>
-<body>
-<script>
-test_valid_value('reading-order-items', 'normal');
-test_valid_value('reading-order-items', 'flex-visual');
-test_valid_value('reading-order-items', 'flex-flow');
-test_valid_value('reading-order-items', 'grid-rows');
-test_valid_value('reading-order-items', 'grid-columns');
-test_valid_value('reading-order-items', 'grid-order');
-</script>
-</body>
diff --git a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html
index 2756e91774c..1b364bd6d9d 100644
--- a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html
+++ b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height-ref.html
@@ -18,10 +18,10 @@ div {
font-family: NotoSansCJK;
font-size: 200px;
}
-.notAdjustedRef {
+.fallbackRef {
font-family: Ahem;
- font-size: 100px;
+ font-size: 50px;
}
</style>
<div class="adjustedRef">水</div>
-<div class="notAdjustedRef">水</div>
+<div class="fallbackRef">水</div>
diff --git a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.tentative.html b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.html
index 85aeb2683cb..5157d76847a 100644
--- a/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.tentative.html
+++ b/tests/wpt/tests/css/css-fonts/font-size-adjust-ic-height.html
@@ -26,11 +26,11 @@ div {
Therefore, an ic-height 2.0 means a 200% scaling up. */
font-size-adjust: ic-height 2.0;
}
-.notAdjusted {
+.fallback {
font-family: Ahem;
- /* The Ahem font lacks vertical metrics, so no adjustment is applied. */
+ /* The Ahem font lacks vertical metrics, so a fallback is applied. */
font-size-adjust: ic-height 0.5;
}
</style>
<div class="adjusted">水</div>
-<div class="notAdjusted">水</div> \ No newline at end of file
+<div class="fallback">水</div>
diff --git a/tests/wpt/tests/css/css-grid/parsing/grid-template-important.html b/tests/wpt/tests/css/css-grid/parsing/grid-template-important.html
new file mode 100644
index 00000000000..c9b9bd83f5e
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/parsing/grid-template-important.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Grid Layout Test: grid-template followed by !important</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-1">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #div {
+ grid-template: "test" max-content / max-content !important;
+ }
+</style>
+<div id=div></div>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(div).gridTemplate, '"test" max-content / max-content');
+ }, 'grid-template followed by !important');
+</script>
diff --git a/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html b/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html
index fa76c0bc4e7..14ba7111dce 100644
--- a/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html
+++ b/tests/wpt/tests/css/css-highlight-api/painting/css-target-text-decoration-001.html
@@ -5,7 +5,7 @@
<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
<link rel="match" href="css-target-text-decoration-001-ref.html">
<meta name="assert" content="This test checks that text-decorations of target text are fully rendered.">
-<meta name="fuzzy" content="0-60;0-32">
+<meta name="fuzzy" content="0-60;0-38">
<script src="/common/reftest-wait.js"></script>
<style>
::target-text {
diff --git a/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html
new file mode 100644
index 00000000000..9c70b08ab81
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-2.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: late EXIF data is ignored</title>
+<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact">
+<link rel="author" title="Chris Lilley" href="https://svgees.us/">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#url-metadata">
+<link rel="help" href="https://w3c.github.io/PNG-spec/#eXIf">
+<link rel="match" href="reference/image-orientation-exif-png-ref.html">
+<img src="support/F-exif-chunk-early.png">
+<img src="support/F-exif-late.png">
diff --git a/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html
new file mode 100644
index 00000000000..536b7d2560c
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/image-orientation/image-orientation-exif-png-3.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: late EXIF data is ignored</title>
+<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact">
+<link rel="author" title="Chris Lilley" href="https://svgees.us/">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#url-metadata">
+<link rel="help" href="https://w3c.github.io/PNG-spec/#eXIf">
+<link rel="match" href="reference/image-orientation-exif-png-ref.html">
+<style>
+ div { width: 400px; height: 400px }
+ div.early { background-image: url(support/F-exif-chunk-early.png)}
+ div.late {background-image: url(support/F-exif-late.png)}
+</style>
+<div class="early"></div>
+<div class="late"></div>
diff --git a/tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.png b/tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.png
new file mode 100644
index 00000000000..24bd924e9e7
--- /dev/null
+++ b/tests/wpt/tests/css/css-images/image-orientation/support/F-exif-chunk-early.png
Binary files differ
diff --git a/tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html b/tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html
new file mode 100644
index 00000000000..306bc15aa49
--- /dev/null
+++ b/tests/wpt/tests/css/css-inline/firefox-bug-1901624-crash.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en-us">
+ <head>
+ <style>
+ :root {
+ --sidebar-width: 370px;
+ }
+
+ *,
+ ::after,
+ ::before {
+ box-sizing: inherit;
+ }
+ #sidebar {
+ max-width: var(--sidebar-width);
+ }
+ #codebox pre {
+ white-space: pre-wrap;
+ }
+ #codebox pre .copy-btn-displacement {
+ float: right;
+ height: 40px;
+ width: 40px;
+ }
+ #codebox #codebox-answer li {
+ hyphens: auto;
+ }
+ html {
+ font-size: 20px;
+ box-sizing: border-box;
+ }
+ </style>
+ </head>
+ <body>
+ <aside id="sidebar">
+ <div id="codebox">
+ <div id="codebox-answer">
+ <ol>
+ <li>
+ <pre><code><div class="copy-btn-displacement"></div><span class="token function">add_definitions</span><span class="token punctuation">d</span><span class="token punctuation">.</span><span class="token constant">GCC_COVERAGE_COMPILE_FLAGS</span></code></pre>
+ </li>
+ </ol>
+ </div>
+ </div>
+ </aside>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/css-lists/details-open-ref.html b/tests/wpt/tests/css/css-lists/details-open-ref.html
new file mode 100644
index 00000000000..88903cb8bbe
--- /dev/null
+++ b/tests/wpt/tests/css/css-lists/details-open-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference File: list-item counter with details open </title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element">
+<details open>
+ <summary>Expand me</summary>
+ <div>5. Should be numbered 5</div>
+</details>
diff --git a/tests/wpt/tests/css/css-lists/details-open.html b/tests/wpt/tests/css/css-lists/details-open.html
new file mode 100644
index 00000000000..8354d012232
--- /dev/null
+++ b/tests/wpt/tests/css/css-lists/details-open.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: list-item counter with details open </title>
+<link rel="author" href="mailto:sakhapov@chromium.org">
+<link rel="match" href="details-open-ref.html">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/grouping-content.html#the-li-element">
+<details>
+ <summary>Expand me</summary>
+ <ol style="margin: 0; padding: 0; list-style-position: inside;">
+ <li value="5">Should be numbered 5</li>
+ </ol>
+</details>
+<script>
+ document.documentElement.offsetTop;
+ document.querySelector("details").setAttribute("open", "");
+</script>
diff --git a/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html
new file mode 100644
index 00000000000..97cc7de15a3
--- /dev/null
+++ b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters-ref.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference File: implicit and explicit list-item counters</title>
+<div>1. List item 1</div>
+<div>2. List item 2</div>
+<div>
+ <div>With sub items</div>
+ <div>With sub items</div>
+</div>
+<div>3. List item 3</div>
diff --git a/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html
new file mode 100644
index 00000000000..5b7a9948165
--- /dev/null
+++ b/tests/wpt/tests/css/css-lists/implicit-and-explicit-list-item-counters.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: implicit and explicit list-item counters</title>
+<link rel="author" href="mailto:sakhapov@chromium.org">
+<link rel="match" href="implicit-and-explicit-list-item-counters-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-lists/#auto-numbering">
+<style>
+ol.with-custom-markers {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+ol.with-custom-markers li {
+ list-style: none;
+}
+ol.with-custom-markers > li::before {
+ content: counter(list-item) ". ";
+}
+</style>
+
+<ol class="with-custom-markers">
+ <li>List item 1</li>
+ <li>
+ List item 2
+ <ul style="margin: 0; padding: 0;">
+ <li>With sub items</li>
+ <li>With sub items</li>
+ </ul>
+ </li>
+ <li>List item 3</li>
+</ol>
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html
new file mode 100644
index 00000000000..72a6c087b31
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>CSS Overflow Reference: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</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 {
+ scrollbar-gutter: stable both-edges;
+}
+body {
+ margin: 0;
+}
+.box {
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="box"></div>
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html
new file mode 100644
index 00000000000..cdffebb5c7b
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-003.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>CSS Overflow Test: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</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=1901652">
+<link rel="match" href="scrollbar-gutter-fixedpos-003-ref.html">
+<style>
+:root {
+ scrollbar-gutter: stable both-edges;
+}
+body {
+ margin: 0;
+}
+.box {
+ width: 100px;
+ height: 100px;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="box" style="position: fixed; background: green"></div>
+<div class="box" style="background: red"></div>
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html
new file mode 100644
index 00000000000..fe1b96fce8a
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>CSS Overflow Reference: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</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 {
+ scrollbar-gutter: stable both-edges;
+ writing-mode: vertical-lr;
+}
+body {
+ margin: 0;
+}
+.box {
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="box"></div>
diff --git a/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html
new file mode 100644
index 00000000000..debb28d397f
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scrollbar-gutter-fixedpos-004.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>CSS Overflow Test: Root element's scrollbar-gutter is accounted for when computing hypothetical box in fixed-pos positioning</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=1901652">
+<link rel="match" href="scrollbar-gutter-fixedpos-004-ref.html">
+<style>
+:root {
+ scrollbar-gutter: stable both-edges;
+ writing-mode: vertical-lr;
+}
+body {
+ margin: 0;
+}
+.box {
+ width: 100px;
+ height: 100px;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="box" style="position: fixed; background: green"></div>
+<div class="box" style="background: red"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html
new file mode 100644
index 00000000000..e91b2377db1
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print-ref.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ .container {
+ display: grid;
+ grid-template-rows: 50px auto auto auto 50px;
+ height: 100%;
+ }
+ .outerRow {
+ display: flex;
+ align-items: center;
+ }
+ .outerRow > div:nth-child(1) { text-align: right; }
+ .outerRow > div:nth-child(2) { text-align: left; }
+ .outerRow > div:nth-child(3) { text-align: center; }
+ .outerRow > div:nth-child(4) { text-align: right; }
+ .outerRow > div:nth-child(5) { text-align: left; }
+ .outerRow > div:first-child,
+ .outerRow > div:last-child { width: 50px; }
+ .outerRow > div:nth-child(3) { margin:auto; }
+
+ .innerRow {
+ display: flex;
+ flex: 1;
+ }
+ .innerRow > div {
+ width: 50px;
+ text-align: center;
+ }
+ .innerRow > div:first-child {
+ margin-right: auto;
+ }
+ @page {
+ size: 550px 400px;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ }
+</style>
+<div style="margin:58px;">
+ Small blue letters from A to P should be seen in a clockwise manner, starting
+ with A in the top left corner.
+</div>
+
+<div style="position:absolute; inset:0; font-family:monospace; font-size:0.7em; color:blue;">
+ <div class="container">
+ <div class="outerRow">
+ <div>A</div>
+ <div>B</div>
+ <div>C</div>
+ <div>D</div>
+ <div>E</div>
+ </div>
+ <div class="innerRow" style="align-items:flex-start;">
+ <div>P</div>
+ <div>F</div>
+ </div>
+ <div class="innerRow" style="align-items:center;">
+ <div>O</div>
+ <div>G</div>
+ </div>
+ <div class="innerRow" style="align-items:flex-end;">
+ <div>N</div>
+ <div>H</div>
+ </div>
+ <div class="outerRow">
+ <div>M</div>
+ <div>L</div>
+ <div>K</div>
+ <div>J</div>
+ <div>I</div>
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html
new file mode 100644
index 00000000000..ad9c78baa6c
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/alignment-001-print.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-text-alignment">
+<meta name="assert" content="Test default vertical and horizontal alignment for all 16 margin boxes">
+<link rel="match" href="alignment-001-print-ref.html">
+<style>
+ @page {
+ font-family:monospace;
+ font-size: 0.7em;
+
+ /* This results in a page border box size that's divisible by 3, so that the
+ three boxes at a page edge get the exact same size. */
+ size: 550px 400px;
+
+ margin: 50px;
+ color: blue;
+
+ @top-left-corner { content: "A"; }
+ @top-left { content: "B"; }
+ @top-center { content: "C"; }
+ @top-right { content: "D"; }
+ @top-right-corner { content: "E"; }
+ @right-top { content: "F"; }
+ @right-middle { content: "G"; }
+ @right-bottom { content: "H"; }
+ @bottom-right-corner { content: "I"; }
+ @bottom-right { content: "J"; }
+ @bottom-center { content: "K"; }
+ @bottom-left { content: "L"; }
+ @bottom-left-corner { content: "M"; }
+ @left-bottom { content: "N"; }
+ @left-middle { content: "O"; }
+ @left-top { content: "P"; }
+ }
+</style>
+<div>
+ Small blue letters from A to P should be seen in a clockwise manner, starting
+ with A in the top left corner.
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html
new file mode 100644
index 00000000000..70f4a41ab59
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print-ref.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 400px;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 100px auto 100px;
+ grid-template-rows: 100px auto 100px;
+ height: 100vh;
+ margin: 0;
+ }
+ .square {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ }
+ body > .square {
+ margin: auto;
+ }
+ .vertical-edge {
+ display: flex;
+ justify-content: space-between;
+ }
+ .vertical-edge > .square {
+ margin: auto 0;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ justify-content: space-between;
+ }
+ .horizontal-edge > .square {
+ margin: 0 auto;
+ }
+ .pagearea {
+ border: solid;
+ padding: 8px;
+ }
+</style>
+
+<div class="square"></div>
+<div class="vertical-edge">
+ <div class="square"></div>
+ <div class="square" style="flex:1;"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
+<div class="horizontal-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="pagearea">
+ There should be 16 margin boxes around this page area. They should all be
+ squares, except for the center box at the top and the middle box on the right
+ hand side, which should take up all available main-axis space. All 16 boxes
+ should all be centered within their available cross-axis space.
+</div>
+<div class="horizontal-edge">
+ <div class="square"></div>
+ <div class="square" style="flex:1;"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
+<div class="vertical-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html
new file mode 100644
index 00000000000..cf2501385f1
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-001-print.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto margins. Auto margins not adjacent to a page edge are treated as 0.">
+<link rel="match" href="auto-margins-001-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 400px;
+ border: solid;
+ @top-left-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @top-left {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @top-center {
+ border: solid;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @top-right {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @top-right-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @right-top {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @right-middle {
+ border: solid;
+ width: 25px;
+ margin: auto;
+ content: "";
+ }
+ @right-bottom {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @bottom-right-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @bottom-right {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @bottom-center {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @bottom-left {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @bottom-left-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @left-bottom {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @left-middle {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ @left-top {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ content: "";
+ }
+ }
+</style>
+
+There should be 16 margin boxes around this page area. They should all be
+squares, except for the center box at the top and the middle box on the right
+hand side, which should take up all available main-axis space. All 16 boxes
+should all be centered within their available cross-axis space.
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html
new file mode 100644
index 00000000000..56adf2a5401
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 440px;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 100px auto 100px;
+ grid-template-rows: 100px auto 100px;
+ height: 100vh;
+ margin: 0;
+ }
+ .square {
+ box-sizing: border-box;
+ width: 100px;
+ border: solid;
+ flex: 1;
+ background: green;
+ }
+ .vertical-edge {
+ display: flex;
+ justify-content: space-between;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ justify-content: space-between;
+ }
+ .pagearea {
+ border: solid;
+ padding: 8px;
+ }
+</style>
+
+<div class="square"></div>
+<div class="vertical-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
+<div class="horizontal-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="pagearea">
+ There should be 16 margin boxes around this page area. They should take up all
+ available space, and there should be no red, only green rectangles with a
+ black border.
+</div>
+<div class="horizontal-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
+<div class="vertical-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html
new file mode 100644
index 00000000000..5b424941cad
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-002-print.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Auto margins should never resolve to something negative, but be clamped to 0.">
+<link rel="match" href="auto-margins-002-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 440px;
+ border: solid;
+ background: red;
+ @top-left-corner {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @top-left {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @top-center {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @top-right {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @top-right-corner {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @right-top {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @right-middle {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @right-bottom {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @bottom-right-corner {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @bottom-right {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @bottom-center {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @bottom-left {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @bottom-left-corner {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @left-bottom {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @left-middle {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ @left-top {
+ border: solid;
+ margin: auto;
+ content: "";
+ background: green;
+ }
+ }
+ body {
+ background: white;
+ }
+</style>
+There should be 16 margin boxes around this page area. They should take up all
+available space, and there should be no red, only green rectangles with a black
+border.
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html
new file mode 100644
index 00000000000..252633b0581
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print-ref.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 400px;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 100px auto 100px;
+ grid-template-rows: 100px auto 100px;
+ height: 100vh;
+ margin: 0;
+ }
+ .square {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ }
+ .square.left {
+ margin-left: auto;
+ }
+ .square.top {
+ margin-top: auto;
+ }
+ .vertical-edge {
+ display: flex;
+ justify-content: space-between;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ justify-content: space-between;
+ }
+ .pagearea {
+ border: solid blue;
+ padding: 8px;
+ }
+</style>
+
+<div class="square left top"></div>
+<div class="vertical-edge">
+ <div class="square top"></div>
+ <div class="square top"></div>
+ <div class="square top"></div>
+</div>
+<div class="square top"></div>
+<div class="horizontal-edge">
+ <div class="square left"></div>
+ <div class="square left"></div>
+ <div class="square left"></div>
+</div>
+<div class="pagearea">
+ There should be 16 margin boxes around this page area. They should all be
+ squares, and their borders should be flush with the blue border. They should
+ not overlap with the page area.
+</div>
+<div class="horizontal-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square left"></div>
+<div class="vertical-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html
new file mode 100644
index 00000000000..4fe7192a56f
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/auto-margins-003-print.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Auto margins adjacent to the page area should never become negative.">
+<link rel="match" href="auto-margins-003-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 400px;
+ border: solid blue;
+ @top-left-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-top: 90px;
+ margin-left: 90px;
+ content: "";
+ }
+ @top-left {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-top: 90px;
+ content: "";
+ }
+ @top-center {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-top: 90px;
+ content: "";
+ }
+ @top-right {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-top: 90px;
+ content: "";
+ }
+ @top-right-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-top: 90px;
+ margin-right: 90px;
+ content: "";
+ }
+ @right-top {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-right: 90px;
+ content: "";
+ }
+ @right-middle {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-right: 90px;
+ content: "";
+ }
+ @right-bottom {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-right: 90px;
+ content: "";
+ }
+ @bottom-right-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-right: 90px;
+ margin-bottom: 90px;
+ content: "";
+ }
+ @bottom-right {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-bottom: 90px;
+ content: "";
+ }
+ @bottom-center {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-bottom: 90px;
+ content: "";
+ }
+ @bottom-left {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-bottom: 90px;
+ content: "";
+ }
+ @bottom-left-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-left: 90px;
+ margin-bottom: 90px;
+ content: "";
+ }
+ @left-bottom {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-left: 90px;
+ content: "";
+ }
+ @left-middle {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-left: 90px;
+ content: "";
+ }
+ @left-top {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: auto;
+ margin-left: 90px;
+ content: "";
+ }
+ }
+</style>
+There should be 16 margin boxes around this page area. They should all be
+squares, and their borders should be flush with the blue border. They should not
+overlap with the page area.
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html
new file mode 100644
index 00000000000..bd3ba7e0ccf
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ size: 400px;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ }
+</style>
+<div style="margin-left:100px; float:left; width:100px; height:100px; background:hotpink;">
+ PASS
+</div>
+<div style="float:left; width:100px; height:100px; background:yellow;">
+ PASS
+</div>
+<div style="display:flow-root; clear:both;">
+ <div style="margin-top:200px; margin-left:100px; width:200px; height:100px; background:yellow;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html
new file mode 100644
index 00000000000..efaa71b8c84
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/content-001-print.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#populating-margin-boxes">
+<meta name="assert" content="Basic content property test, with just text, and various ways of expressing nothingness.">
+<link rel="match" href="content-001-print-ref.html">
+<style>
+ @page {
+ size: 400px;
+ margin: 100px;
+
+ @top-left-corner {
+ /* No content property here. */
+ width: 50px;
+ height: 50px;
+ background: red;
+ }
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ content: "PASS";
+ background: hotpink;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ content: "PA" "SS";
+ background: yellow;
+ }
+ @bottom-left {
+ /* An empty string is also content. */
+ content: "";
+ background: yellow;
+ }
+ @bottom-left-corner {
+ width: 50px;
+ height: 50px;
+ content: none; /* This is nothing. */
+ background: red;
+ }
+ @bottom-right-corner {
+ width: 50px;
+ height: 50px;
+ content: normal; /* This also nothing. */
+ background: red;
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html
new file mode 100644
index 00000000000..dca52cb8bc7
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 400px;
+ }
+ body {
+ margin: 0;
+ }
+</style>
+<div style="display:flex; margin:0 100px; height:100px; align-items:flex-end;">
+ <div style="border:solid; width:20%; height:20%;">20%</div>
+</div>
+<div style="display:flex; height:200px;">
+ <div style="display:flex; width:100px;">
+ <div style="flex:1; border:solid;">
+ auto
+ </div>
+ </div>
+ <div style="flex:1;"></div>
+ <div style="display:flex; width:100px;">
+ <div style="width:70%; height:70%; margin:auto 0; border:solid;">
+ 70%
+ </div>
+ </div>
+</div>
+<div style="margin:0 100px; height:94px; border:solid;">auto</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html
new file mode 100644
index 00000000000..20d4e3059e0
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-001-print.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Only one box per edge.">
+<link rel="match" href="dimensions-001-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 400px;
+
+ @top-left {
+ border: solid;
+ text-align: left;
+ vertical-align: top;
+ width: 20%;
+ height: 20%;
+ content: "20%";
+ }
+ @right-middle {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ width: 70%;
+ height: 70%;
+ content: "70%";
+ }
+ @bottom-right {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ content: "auto";
+ }
+ @left-bottom {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ content: "auto";
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html
new file mode 100644
index 00000000000..83e144fb336
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print-ref.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 400px;
+ }
+ body {
+ margin: 0;
+ }
+</style>
+<div style="display:flex; margin:0 100px; height:100px;">
+ <div style="border:solid; width:20%; height:20%; align-self:flex-end;">20%</div>
+ <div style="border:solid; flex:1;">auto</div>
+</div>
+<div style="display:flex; height:200px;">
+ <div style="display:flex; flex-flow:column; width:100px;">
+ <div style="width:70px; height:70px; border:solid; margin-left:auto;">70px</div>
+ <div style="flex:1; border:solid;">auto</div>
+ </div>
+ <div style="flex:1;"></div>
+ <div style="display:flex; flex-flow:column; width:100px;">
+ <div style="flex:1; border:solid;">auto</div>
+ <div style="width:70%; height:70%; border:solid;">70%</div>
+ </div>
+</div>
+<div style="display:flex; margin:0 100px; height:100px;">
+ <div style="border:solid; flex:1;">auto</div>
+ <div style="border:solid; width:70px; height:70px;">70px</div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html
new file mode 100644
index 00000000000..4637a39ed51
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-002-print.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test combinations of auto lengths, fixed lengths and percentage lengths. No corners or middle/center boxes.">
+<link rel="match" href="dimensions-002-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 400px;
+
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ width: 20%;
+ height: 20%;
+ content: "20%";
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ content: "auto";
+ }
+ @right-top {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ content: "auto";
+ }
+ @right-bottom {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ width: 70%;
+ height: 70%;
+ content: "70%";
+ }
+ @bottom-right {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ width: 70px;
+ height: 70px;
+ content: "70px";
+ }
+ @bottom-left {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ content: "auto";
+ }
+ @left-bottom {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ content: "auto";
+ }
+ @left-top {
+ text-align: left;
+ vertical-align: top;
+ border: solid;
+ width: 70px;
+ height: 70px;
+ content: "70px";
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html
new file mode 100644
index 00000000000..c491cdde98e
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print-ref.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 28em;
+ }
+ body {
+ margin: 0;
+ }
+ .grid {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ overflow: clip;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+</style>
+<div class="grid">
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="width:10em; border:solid 0.25em; padding:0.25em; margin-right:1em;">x</div>
+ <div style="width:7em; margin-left:1em; background:yellow;">x</div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html
new file mode 100644
index 00000000000..fe9f26da5d7
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-003-print.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test with auto lengths and margins/border/padding.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-003-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ /* Available size for top edge margins is 20em.
+
+ Min/max content width of top-left is
+ (left border/padding + content + right padding/border/margin)
+ is 0.25em+0.25em+1em+0.25em+0.25em+1em = 3em
+
+ Min content width of top-right is 1em + 1em = 2em
+
+ Unused space becomes 15em.
+
+ Left flex: 3
+ Right flex: 2
+ Total flex: 5
+
+ Left width: 3em + 15em * 3/5 = 12em
+ Right width: 2em + 15em * 2/5 = 8em */
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ margin-right: 1em;
+ border: solid 0.25em;
+ padding: 0.25em;
+ content: "x";
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-left: 1em;
+ background: yellow;
+ content: "x";
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html
new file mode 100644
index 00000000000..3f45190e330
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 27em;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 7em auto 5em;
+ grid-template-rows: 4em auto 8em;
+ height: 100vh;
+ margin: 0;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+ .corner {
+ border: solid thin;
+ }
+</style>
+<div class="corner">xx</div>
+<div class="vertical-edge">
+ <div style="width:5em; margin-bottom:2em; background:hotpink;">x</div>
+ <div style="width:15em; margin-top:2em; background:yellow;">xxx</div>
+</div>
+<div class="corner">xx</div>
+<div class="horizontal-edge">
+ <div style="height:9em; margin-left:4em; background:yellow;">x<br>x<br>x</div>
+ <div style="height:6em; margin-right:4em; background:hotpink;">x<br>x</div>
+</div>
+<div></div>
+<div class="horizontal-edge">
+ <div style="height:10em; margin-left:3em; background:hotpink;">x<br>x</div>
+ <div style="height:5em; margin-right:3em; background:yellow;">xxx</div>
+</div>
+<div class="corner">xxxx</div>
+<div class="vertical-edge">
+ <div style="width:17.5em; margin-top:4em; background:yellow;">x x x x</div>
+ <div style="width:2.5em; margin-bottom:4em; background:hotpink;">x</div>
+</div>
+<div class="corner">xxx</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html
new file mode 100644
index 00000000000..80bcc43fb39
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-004-print.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto lengths. Max content sizes are smaller than available size. With corners. No center/middle boxes.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-004-print-ref.html">
+<style>
+ @page {
+ margin: 4em 5em 8em 7em;
+ width: 20em;
+ height: 15em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ /* Corners just use all available size, if auto. */
+ @top-left-corner {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ content: "x\ax";
+ border: solid thin;
+ }
+ @top-right-corner {
+ text-align: left;
+ vertical-align: top;
+ content: "xx";
+ border: solid thin;
+ }
+ @bottom-right-corner {
+ text-align: left;
+ vertical-align: top;
+ content: "xxx";
+ border: solid thin;
+ }
+ @bottom-left-corner {
+ text-align: left;
+ vertical-align: top;
+ content: "xxxx";
+ border: solid thin;
+ }
+
+ /* Min/max width for top-left is 1em. For top-right it is 3em.
+ Available space is 20em. Unused space becomes 16em. This will be
+ distributed proportionally based on max widths. Left gets 1/4, right
+ gets 3/4. Final widths become 1em+16em*1/4 = 5em for left, and
+ 3em+16em*3/4 = 15em for right. */
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 2em;
+ content: "x";
+ background: hotpink;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 2em;
+ content: "xxx";
+ background: yellow;
+ }
+
+ /* Min/max height for left-top is 3em (three lines). For left-bottom it is
+ 2em (two lines). Available space is 15em. Unused space is 10em. This
+ will be distributed proportionally based on max heights. Top gets 3/5,
+ bottom gets 2/5. Final heights become 3em+10em*3/5 = 9em for top, and
+ 2em+10em*2/5 = 6em for bottom. */
+ @left-top {
+ text-align: left;
+ vertical-align: top;
+ margin-left: 4em;
+ content: "x\ax\ax\a";
+ background: yellow;
+ }
+ @left-bottom {
+ text-align: left;
+ vertical-align: top;
+ margin-right: 4em;
+ content: "x\ax\a";
+ background: hotpink;
+ }
+
+ /* Min/max height for right-top is 2em (two lines). For right-bottom it is
+ 1em (one line). Available space is 15em. Unused space is 12em. This will
+ be distributed proportionally based on max heights. Top gets 2/3, bottom
+ gets 1/3. Final heights become 2em+12em*2/3 = 10em for top, and
+ 1em+12em*1/3 = 5em for bottom. */
+ @right-top {
+ text-align: left;
+ vertical-align: top;
+ margin-left: 3em;
+ content: "x\ax\a";
+ background: hotpink;
+ }
+ @right-bottom {
+ text-align: left;
+ vertical-align: top;
+ margin-right: 3em;
+ content: "xxx";
+ background: yellow;
+ }
+
+ /* Min/max width for bottom-left is 7em. For bottom-right it is 1em.
+ Available space is 20em. Unused space becomes 12em. This will be
+ distributed proportionally based on max widths. Left gets 7/8, right
+ gets 1/8. Final widths become 7em+12em*7/8 = 17.5em for left, and
+ 1em+12em*1/8 = 2.5em for right. */
+ @bottom-left {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 4em;
+ content: "x x x x";
+ background: yellow;
+ }
+ @bottom-right {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 4em;
+ content: "x";
+ background: hotpink;
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html
new file mode 100644
index 00000000000..1749b1c7147
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 27em;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ margin: 0;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="corner"></div>
+<div class="vertical-edge">
+ <div style="width:7.5em; margin-bottom:4em; background:hotpink;">xxx</div>
+ <div style="width:5em; margin-top:2em; margin-bottom:2em; background:cyan;">xx</div>
+ <div style="width:7.5em; margin-top:4em; background:yellow;">xx</div>
+</div>
+<div class="corner"></div>
+<div class="horizontal-edge"></div>
+<div></div>
+<div class="horizontal-edge">
+ <div style="height:5.625em; margin-right:4em; background:hotpink;">x<br>x<br>x</div>
+ <div style="height:3.75em; margin-left:2em; margin-right:2em; background:cyan;">x<br>x</div>
+ <div style="height:5.625em; margin-left:4em; background:yellow;">x<br>x</div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html
new file mode 100644
index 00000000000..2823424f39a
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-005-print.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto lengths. Max content sizes are smaller than available size. With center/middle boxes. No corners.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-005-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 15em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ /* In order to preserve centering of a center/middle box, pretend that the
+ space distributed to left/top and right/bottom combined will be twice the
+ size of the one that needs the most size (this is called the AC box).
+ Then resolve center/middle by giving it the rest. Then the boxes on the
+ sides receive equal shares of AC. */
+
+ /* Min/max width for top-left is 3em. For top-center it is 2em. For
+ top-right it is 2em. Available space is 20em. Left is larger than right.
+ Double it to 6em and call this the AC box. Unused space becomes 12em
+ (20em minus center max width and double left box max width). Unused space
+ will be distributed proportionally between AC and the center box, based
+ on max widths. AC gets 6/8, center gets 2/8. AC becomes
+ 6em+12em*6/8 = 15em. Center becomes 2em+12em*2/8 = 5em. Left and right
+ each receive half of what's left after having resolved for center,
+ i.e. (20em-5em)/2 = 7.5em. */
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 4em;
+ content: "xxx";
+ background: hotpink;
+ }
+ @top-center {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 2em;
+ margin-bottom: 2em;
+ content: "xx";
+ background: cyan;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 4em;
+ content: "xx";
+ background: yellow;
+ }
+
+ /* This is the same as for the top edge, except that available space is less.
+ It is 15em here. Unused space then becomes 7em (15em minus center max
+ height and double top box max height). AC becomes 6em+7em*6/8 = 11.25em.
+ Center becomes 2em+7em*2/8 = 3.75em. Top and bottom each become
+ 11.25em / 2 = 5.625em. */
+ @right-top {
+ text-align: left;
+ vertical-align: top;
+ margin-right: 4em;
+ content: "x\ax\ax";
+ background: hotpink;
+ }
+ @right-middle {
+ text-align: left;
+ vertical-align: top;
+ margin-left: 2em;
+ margin-right: 2em;
+ content: "x\ax";
+ background: cyan;
+ }
+ @right-bottom {
+ text-align: left;
+ vertical-align: top;
+ margin-left: 4em;
+ content: "x\ax";
+ background: yellow;
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html
new file mode 100644
index 00000000000..f6aa9e60f48
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 27em;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ margin: 0;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="corner"></div>
+<div class="vertical-edge">
+ <div style="width:15.375em; margin-bottom:3em; background:hotpink;">xxx xx xx xx xxxx</div>
+ <div style="width:4.625em; margin-top:3em; background:yellow;">xx xx</div>
+</div>
+<div class="corner"></div>
+<div class="horizontal-edge">
+ <div style="writing-mode:vertical-rl; height:10.75em; background:yellow;">xxx x xx xxxx</div>
+ <div style="writing-mode:vertical-rl; height:4.25em; background:hotpink;">xx xx</div>
+</div>
+<div></div>
+<div class="horizontal-edge">
+ <div style="writing-mode:vertical-rl; height:9em; background:hotpink;">x x xxxxxx x x x x x x x x x x</div>
+ <div style="writing-mode:vertical-rl; height:6em; background:yellow;">x x x x x x x x x x x x x x x x xx</div>
+</div>
+<div class="corner"></div>
+<div class="vertical-edge">
+ <div style="width:11.25em; margin-top:1em; background:yellow;">x x xxxxxx x x x x x x x x x x x x</div>
+ <div style="width:8.75em; background:hotpink;">x x x x x x x x x x x x x x x x x x xx</div>
+</div>
+<div class="corner"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html
new file mode 100644
index 00000000000..6ea477f2c84
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-006-print.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto lengths. Max content sizes are larger than available size, but their min sizes are not. No center boxes.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-006-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 15em;
+ font: 16px/1 Ahem;
+
+ /* Left min: 4em
+ Left max: 17em
+ Right min: 2em
+ Right max: 5em
+ Min total: 4em + 2em = 6em
+ Max total: 17em + 5em = 22em
+
+ Max content sizes are larger than available size. Min content sizes are
+ smaller. Start at min size, and distribute extra space proportionally to
+ the difference between max and min.
+
+ Left flex (max - min): 13
+ Right flex (max - min): 3
+ Flex total: 16
+ Available space: 20em
+ Unused space: 20em - 6em = 14em
+
+ Width of left box: 4em + 14em * 13/16 = 15.375em
+ Width of right box: 2em + 14em * 3/16 = 4.625em */
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 3em;
+ content: "xxx xx xx xx xxxx";
+ background: hotpink;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 3em;
+ content: "xx xx";
+ background: yellow;
+ }
+
+ /* Top min: 4em
+ Top max: 13em
+ Bottom min: 2em
+ Bottom max: 5em
+ Min total: 4em + 2em = 6em
+ Max total: 13em + 5em = 18em
+
+ Max content sizes are larger than available size. Min content sizes are
+ smaller. Start at min size, and distribute extra space proportionally to
+ the difference between max and min.
+
+ Top flex (max - min): 9
+ Bottom flex (max - min): 3
+ Flex total: 12
+ Available space: 15em
+ Unused space: 15em - 6em = 9em
+
+ Height of top box: 4em + 9em * 9/12 = 10.75em
+ Height of bottom box: 2em + 9em * 3/12 = 4.25em */
+ @left-top {
+ text-align: left;
+ vertical-align: top;
+ writing-mode: vertical-rl;
+ content: "xxx x xx xxxx";
+ background: yellow;
+ }
+ @left-bottom {
+ text-align: left;
+ vertical-align: top;
+ writing-mode: vertical-rl;
+ content: "xx xx";
+ background: hotpink;
+ }
+
+ /* Top min: 6em
+ Top max: 30em
+ Bottom min: 2em
+ Bottom max: 34em
+ Min total: 6em + 2em = 8em
+ Max total: 30em + 34em = 64em
+
+ Max content sizes are larger than available size. Min content sizes are
+ smaller. Start at min size, and distribute extra space proportionally to
+ the difference between max and min.
+
+ Top flex (max - min): 24
+ Bottom flex (max - min): 32
+ Flex total: 56
+ Available space: 15em
+ Unused space: 15em - 8em = 7em
+
+ Height of top box: 6em + 7em * 24/56 = 9em
+ Height of bottom box: 2em + 7em * 32/56 = 6em */
+ @right-top {
+ text-align: left;
+ vertical-align: top;
+ writing-mode: vertical-rl;
+ content: "x x xxxxxx x x x x x x x x x x";
+ background: hotpink;
+ }
+ @right-bottom {
+ text-align: left;
+ vertical-align: top;
+ writing-mode: vertical-rl;
+ content: "x x x x x x x x x x x x x x x x xx";
+ background: yellow;
+ }
+
+ /* Left min: 6em
+ Left max: 34em
+ Right min: 2em
+ Right max: 38em
+ Min total: 6em + 2em = 8em
+ Max total: 34em + 38em = 72em
+
+ Max content sizes are larger than available size. Min content sizes are
+ smaller. Start at min size, and distribute extra space proportionally to
+ the difference between max and min.
+
+ Left flex (max - min): 28
+ Right flex (max - min): 36
+ Flex total: 64
+ Available space: 20em
+ Unused space: 20em - 8em = 12em
+
+ Width of left box: 6em + 12em * 28/64 = 11.25em
+ Width of right box: 2em + 12em * 36/64 = 8.75em */
+ @bottom-left {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 1em;
+ content: "x x xxxxxx x x x x x x x x x x x x";
+ background: yellow;
+ }
+ @bottom-right {
+ text-align: left;
+ vertical-align: top;
+ content: "x x x x x x x x x x x x x x x x x x xx";
+ background: hotpink;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html
new file mode 100644
index 00000000000..b91c086879a
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print-ref.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 27em;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 12em auto 12em;
+ height: 100vh;
+ margin: 0;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+</style>
+<div class="corner"></div>
+<div class="vertical-edge">
+ <div style="width:5.25em; height:10em; background:hotpink;">
+ x x x x x
+ </div>
+ <div style="width:9.5em; margin-top:1em; height:10em; background:cyan;">
+ x x x x x x x x x
+ </div>
+ <div style="width:5.25em; margin-top:2em; height:10em; background:yellow;">
+ x x
+ </div>
+</div>
+<div class="corner"></div>
+<div class="horizontal-edge"></div>
+<div></div>
+<div></div>
+<div class="corner"></div>
+<div class="vertical-edge">
+ <div style="width:7.5em; margin-top:2em; height:10em; background:yellow;">
+ x xx x xxx xx xx xx xx xx xx xx x xx xx xx xx xxx x
+ </div>
+ <div style="width:5em; margin-top:1em; height:10em; background:cyan;">
+ x x xxxx xxxx xxxx xx x x xxx xx xxx
+ </div>
+ <div style="width:7.5em; height:10em; background:hotpink;">
+ x x x x x xxxxxxx x x x
+ </div>
+</div>
+<div class="corner"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html
new file mode 100644
index 00000000000..cf7e5f50754
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-007-print.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto lengths. Max content sizes are larger than available size, but their min sizes are not. With center boxes.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-007-print-ref.html">
+<style>
+ @page {
+ margin: 12em 6em;
+ width: 20em;
+ height: 3em;
+ font: 16px/1 Ahem;
+
+ /* Left min: 1em
+ Left max: 9em
+ Center min: 1em
+ Center max: 17em
+ Right min: 1em
+ Right max: 3em
+ Min total: 1em + 1em + 1em = 3em
+ Max total: 9em + 17em + 3em = 29em
+
+ Max content sizes are larger than available size. Min content sizes are
+ smaller. Start at min size, and distribute extra space proportionally to
+ the difference between max and min.
+
+ First resolve the width of center, by evaluating how much space the
+ double of each side box would take up. Pick the larger (to preserve
+ centering), and subtract that from available space.
+
+ Available space: 20em
+ Center flex: 17em - 1em = 16
+
+ Left double min: 1em * 2 = 2em
+ Left double flex (max - min): (9em-1em)*2 = 16
+ Total flex left double + center: 16 + 16 = 32
+ Unused space with double left: 20em - (2em + 1em) = 17em
+ Width of double left: 2em + 17em * 16 / 32 = 10.5em
+
+ Right double min: 1em * 2 = 2em
+ Right double flex (max - min): (3em-1em)*2 = 4
+ Total flex right double + center: 4 + 16 = 20
+ Unused space with double right: 20em - (2em + 1em) = 17em
+ Width of double right: 2em + 17em * 4 / 20 = 5.4em
+
+ Width of double left (10.5em) is larger than width of double right
+ (5.4em). Pick this one and resolve center, by using those flex values.
+ Width of center: 1em + 17em * 16/32 = 9.5em.
+
+ Now give the rest in equal parts to left and right:
+ (20em - 9.5em) / 2 = 5.25em */
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 2em;
+ height: 10em;
+ content: "x x x x x";
+ background: hotpink;
+ }
+ @top-center {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 1em;
+ height: 10em;
+ content: "x x x x x x x x x";
+ background: cyan;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ height: 10em;
+ content: "x x";
+ background: yellow;
+ }
+
+ /* Left min: 3em
+ Left max: 51em
+ Center min: 4em
+ Center max: 36em
+ Right min: 7em
+ Right max: 23em
+ Min total: 3em + 4em + 7em = 14em
+ Max total: 51em + 36em + 23em = 110em
+
+ Max content sizes are larger than available size. Min content sizes are
+ smaller. Start at min size, and distribute extra space proportionally to
+ the difference between max and min.
+
+ First resolve the width of center, by evaluating how much space the
+ double of each side box would take up. Pick the larger (to preserve
+ centering), and subtract that from available space.
+
+ Available space: 20em
+ Center flex: 36em - 4em = 32
+
+ Left double min: 3em * 2 = 6em
+ Left double flex (max - min): (51em-3em)*2 = 96
+ Total flex left double + center: 96 + 32 = 128
+ Unused space with double left: 20em - (6em + 4em) = 10em
+ Width of double left: 6em + 10em * 96 / 128 = 13.5em
+
+ Right double min: 7em * 2 = 14em
+ Right double flex (max - min): (23em-7em)*2 = 32
+ Total flex right double + center: 32 + 32 = 64
+ Unused space with double right: 20em - (14em + 4em) = 2em
+ Width of double right: 14em + 2em * 32 / 64 = 15em
+
+ Width of double right (15em) is larger than width of double left (13.5em).
+ Pick this one and resolve center, by using those flex values.
+ Width of center: 4em + 2em * 32/64 = 5em.
+
+ Now give the rest in equal parts to left and right:
+ (20em - 5em) / 2 = 7.5em */
+ @bottom-left {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 2em;
+ height: 10em;
+ content: "x xx x xxx xx xx xx xx xx xx xx x xx xx xx xx xxx x";
+ background: yellow;
+ }
+ @bottom-center {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 1em;
+ height: 10em;
+ content: "x x xxxx xxxx xxxx xx x x xxx xx xxx";
+ background: cyan;
+ }
+ @bottom-right {
+ text-align: left;
+ vertical-align: top;
+ height: 10em;
+ content: "x x x x x xxxxxxx x x x";
+ background: hotpink;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html
new file mode 100644
index 00000000000..5bd141a28e1
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 28em;
+ }
+ body {
+ margin: 0;
+ }
+ .grid {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ overflow: clip;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="grid">
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="width:15em; margin-bottom:3em; background:hotpink;">
+ xxxxxxxxxxxxxxxxxx x
+ </div>
+ <div style="width:5em; margin-top:3em; background:yellow;">
+ xxxxxx xxx
+ </div>
+ </div>
+ <div class="corner"></div>
+
+ <div class="horizontal-edge">
+ <div style="height:6em; margin-right:3em; background:hotpink;">
+ x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
+ </div>
+ <div style="height:10em; margin-left:3em; background:yellow;">
+ x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
+ </div>
+ </div>
+ <div></div>
+ <div class="horizontal-edge"></div>
+
+ <div class="corner"></div>
+ <div class="vertical-edge"></div>
+ <div class="corner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html
new file mode 100644
index 00000000000..8bdf0cdac0b
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-008-print.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto lengths. Min content sizes are larger than available size. No center/middle boxes.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-008-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ /* Total min size is larger than available size. Shrink proportionally to
+ min sizes. */
+
+ /* Left margin box min: 18em
+ Right margin box min: 6em
+ Flex will be the same as min. Total flex: 18+6=24
+
+ Available space: 20em
+ Unused space: 20em - 24em = -4em
+
+ Left width: 18em + (-4em) * 18/24 = 15em
+ Right width: 6em + (-4em) * 6/24 = 5em */
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ content: "xxxxxxxxxxxxxxxxxx x";
+ margin-bottom: 3em;
+ background: hotpink;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 3em;
+ content: "xxxxxx xxx";
+ background: yellow;
+ }
+
+ /* Top margin box min: 18em (18 lines)
+ Bottom margin box min: 30em (30 lines)
+ Flex will be the same as min. Total flex: 18+30=48
+
+ Available space: 16em
+ Unused space: 16em - 48em = -32em
+
+ Top height: 18em + (-32em) * 18/48 = 6em
+ Bottom height: 30em + (-32em) * 30/48 = 10em */
+ @left-top {
+ text-align: left;
+ vertical-align: top;
+ margin-right: 3em;
+ content: "x\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\a";
+ background: hotpink;
+ }
+ @left-bottom {
+ text-align: left;
+ vertical-align: top;
+ margin-left: 3em;
+ content: "x\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\ax\a";
+ background: yellow;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html
new file mode 100644
index 00000000000..922d165efa1
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 28em;
+ }
+ body {
+ margin: 0;
+ }
+ .grid {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ overflow: clip;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="grid">
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="width:7.5em; margin-bottom:4em; background:hotpink;">
+ xxxxxxxxxxxxxxxxxx xxxxxxx
+ </div>
+ <div style="width:5em; margin-top:2em; margin-bottom:2em; background:cyan;">
+ xxxxxxxxxxxx
+ </div>
+ <div style="width:7.5em; margin-top:4em; background:yellow;">
+ xxxxxx
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html
new file mode 100644
index 00000000000..602cc5680ec
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-009-print.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test auto lengths. Min content sizes are larger than available size. With center/middle boxes.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-009-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+
+ /* Total min content size is larger than available size. Shrink
+ proportionally to min sizes. Note that max content sizes don't affect
+ sizing in this mode.
+
+ Left margin box min: 18em
+ Center margin box min: 12em
+ Right margin box min: 6em
+ Flex will be the same as min.
+
+ First resolve the width of center, by evaluating how much space the
+ double of each side box would take up. Pick the larger (to preserve
+ centering), and subtract that from available space.
+
+ Available space: 20em
+ Center flex: 12 (like min)
+
+ Left double min (and flex factor): 18em * 2 = 36em
+ Total flex left double + center: 36 + 12 = 48
+ Unused space with double left: 20em - 36em - 12em = -28em
+ Width of double left: 36em + (-28em) * 36 / 48 = 15em
+
+ Right double min (and flex factor): 6em * 2 = 12em
+ Total flex right double + center: 12 + 12 = 24
+ Unused space with double right: 20em - 12em - 12em = -4em
+ Width of double right: 12em + (-4em) * 12 / 24 = 10em
+
+ Width of double left (15em) is larger than width of double right
+ (10em). Pick this one and resolve center, by using those flex values.
+ Width of center: 12em + (-28em) * 12 / 48 = 5em.
+ Left and right will share the rest, i.e. 7.5em on each.*/
+
+ @top-left {
+ text-align: left;
+ vertical-align: top;
+ content: "xxxxxxxxxxxxxxxxxx xxxxxxx";
+ margin-bottom: 4em;
+ background: hotpink;
+ }
+ @top-center {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 2em;
+ margin-bottom: 2em;
+ content: "xxxxxxxxxxxx";
+ background: cyan;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-top: 4em;
+ content: "xxxxxx";
+ background: yellow;
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html
new file mode 100644
index 00000000000..a4c0b4702d5
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ size: 650px 500px;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ }
+ .grid {
+ display: grid;
+ grid-template-columns: 100px auto 100px;
+ grid-template-rows: 100px auto 100px;
+ height: 100vh;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="grid">
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="width:150px; background:hotpink;"></div>
+ <div style="width:150px; background:cyan;"></div>
+ <div style="width:150px; background:yellow;"></div>
+ </div>
+ <div class="corner"></div>
+ <div class="horizontal-edge">
+ <div style="height:100px; background:yellow;"></div>
+ <div style="height:100px; background:cyan;"></div>
+ <div style="height:100px; background:hotpink;"></div>
+ </div>
+ <div></div>
+ <div class="horizontal-edge">
+ <div style="height:300px; background:cyan;"></div>
+ </div>
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="width:225px; background:hotpink;"></div>
+ <div style="width:225px; background:yellow;"></div>
+ </div>
+ <div class="corner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html
new file mode 100644
index 00000000000..1ebaa6d9288
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-010-print.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Zero min/max content min/max size.">
+<link rel="match" href="dimensions-010-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 650px 500px;
+
+ @top-left {
+ background: hotpink;
+ content: "";
+ }
+ @top-center {
+ background: cyan;
+ content: "";
+ }
+ @top-right {
+ background: yellow;
+ content: "";
+ }
+
+ @left-top {
+ background: yellow;
+ content: "";
+ }
+ @left-middle {
+ background: cyan;
+ content: "";
+ }
+ @left-bottom {
+ background: hotpink;
+ content: "";
+ }
+
+ @right-top {
+ background: red;
+ content: "";
+ }
+ @right-middle {
+ background: cyan;
+ content: "\a0";
+ }
+ @right-bottom {
+ background: red;
+ content: "";
+ }
+
+ @bottom-left {
+ background: hotpink;
+ content: "\a0";
+ }
+ @bottom-center {
+ background: red;
+ content: "";
+ }
+ /* Since there's a center box here, although it doesn't require any space,
+ it will be there right in the center, meaning that the hotpink box, which
+ *does* require space, can only receive everything to the left of the
+ center box. */
+ @bottom-right {
+ background: yellow;
+ content: "";
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html
new file mode 100644
index 00000000000..54983175e3d
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ size: 32em 28em;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ }
+ .grid {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="grid">
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="margin-top:20px; margin-bottom:auto; width:4em; background:hotpink;">x</div>
+ <div style="margin-top:40px; margin-bottom:auto; width:12em; background:cyan;">xxxxx</div>
+ <div style="margin-top:60px; margin-bottom:auto; width:4em; background:yellow;">x</div>
+ </div>
+ <div class="corner"></div>
+ <div class="horizontal-edge"></div>
+ <div></div>
+ <div class="horizontal-edge"></div>
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ <div style="margin-top:20px; margin-bottom:auto; width:7.5em; background:yellow;">xxxxxx</div>
+ <div style="margin-top:40px; margin-bottom:auto; width:5em; background:cyan;">xxxx</div>
+ <div style="margin-top:60px; margin-bottom:auto; margin-left: auto; width:2em; background:hotpink;">x</div>
+ </div>
+ <div class="corner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html
new file mode 100644
index 00000000000..e51d1fbd75e
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-011-print.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Auto center/middle, one auto side, one non-auto side.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-011-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ /* The fixed-size right box is larger (4em) than left (even if stretched by
+ additional space). The left box will get this much space reserved too,
+ leaving 12em (20em - 2*4em) for center. */
+ @top-left {
+ vertical-align: top;
+ text-align: left;
+ content: "x";
+ margin-top: 20px;
+ margin-bottom: auto;
+ height: max-content;
+ background: hotpink;
+ }
+ @top-center {
+ vertical-align: top;
+ text-align: left;
+ margin-top: 40px;
+ margin-bottom: auto;
+ height: max-content;
+ content: "xxxxx";
+ background: cyan;
+ }
+ @top-right {
+ vertical-align: top;
+ text-align: left;
+ margin-top: 60px;
+ margin-bottom: auto;
+ height: max-content;
+ content: "x";
+ width: 4em;
+ background: yellow;
+ }
+
+ /* The auto-sized left box is larger than fixed-size right. Since available
+ space is 20em, and the double of left plus center is less than that,
+ unused space (4em) needs to be distributed.
+
+ Double min content width for left is 2*6em = 12em.
+ Min content width for center is 4em.
+ Unused space becomes 20em - (12em + 4em) = 4em.
+ Total flex is 12+4=16. Double left flex is 12, center flex is 4.
+
+ Double left width: 12em + 4em * 12/16 = 15em
+ Center width: 4em + 4em * 4 / 16 = 5em.
+
+ Left width: 15em / 2 = 7.5em
+ Right width will be kept as-is, since it's fixed. */
+ @bottom-left {
+ vertical-align: top;
+ text-align: left;
+ content: "xxxxxx";
+ margin-top: 20px;
+ margin-bottom: auto;
+ height: max-content;
+ background: yellow;
+ }
+ @bottom-center {
+ vertical-align: top;
+ text-align: left;
+ margin-top: 40px;
+ margin-bottom: auto;
+ height: max-content;
+ content: "xxxx";
+ background: cyan;
+ }
+ @bottom-right {
+ vertical-align: top;
+ text-align: left;
+ margin-top: 60px;
+ margin-bottom: auto;
+ height: max-content;
+ content: "x";
+ width: 2em;
+ background: hotpink;
+ }
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html
new file mode 100644
index 00000000000..e62880031a1
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print-ref.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ size: 32em 28em;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ }
+ .grid {
+ display: grid;
+ grid-template-columns: 7em auto 5em;
+ grid-template-rows: 4em auto 8em;
+ height: 100vh;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="grid">
+ <div class="corner" style="margin-top:0.5em; margin-left:2em; width:3em; height:3em; background:pink;">
+ x x<br>
+ &nbsp;x<br>
+ x x<br>
+ </div>
+ <div class="vertical-edge">
+ <div style="width:4em; background:hotpink;">xxx</div>
+ <div style="margin-left:5em; margin-top:1em; margin-bottom:1em; width:6em; background:yellow;">xx</div>
+ </div>
+ <div class="corner"></div>
+ <div class="horizontal-edge"></div>
+ <div style="background:blue;"></div>
+ <div class="horizontal-edge">
+ <div style="margin-top:1em; height:3em; background:hotpink;">x<br>x</div>
+ <div style="margin-left:1.25em; margin-top:4em; width:2.5em; height:4em; background:yellow;">x</div>
+ </div>
+ <div class="corner"></div>
+ <div class="vertical-edge">
+ </div>
+ <div class="corner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html
new file mode 100644
index 00000000000..6b4ac2c28c7
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-012-print.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Margins around margin boxes.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-012-print-ref.html">
+<style>
+ @page {
+ margin: 4em 5em 8em 7em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ @top-left-corner {
+ vertical-align: top;
+ text-align: left;
+ margin: auto;
+ width: fit-content;
+ height: fit-content;
+ content: "x x\a\a0x\ax x";
+ background: pink;
+ }
+
+ /* Top-left has a min content width of 3em. Top-right has an inner min
+ content width of 2em. Additionally, it has 25% margins on each side. In
+ the horizontal direction that means 20em*0.25 = 5em on each side. Outer
+ min content width for top-right becomes 12em.
+
+ Available space is 20em. Unused space is 5em. Total flex is 15. Left flex
+ is 3. Right flex is 12.
+
+ Left outer width: 3em + 5em*3/15 = 4em
+ Right outer width: 12em + 5em*12/15 = 16em */
+ @top-left {
+ vertical-align: top;
+ text-align: left;
+ content: "xxx";
+ background: hotpink;
+ }
+ @top-right {
+ vertical-align: top;
+ text-align: left;
+ margin: 25%;
+ content: "xx";
+ background: yellow;
+ }
+
+ /* Right-top has an inner min content height of 2em. It's margin-top is 1em,
+ so the outer min content height becomes 3em. Right-bottom has an inner
+ min content height of 1em. Additionally, it has 25% margins on each side.
+ In the vertical direction that means 16em*0.25 = 4em on each side. Outer
+ min content height for right-bottom becomes 9em.
+
+ Available space is 16em. Unused space is 4em. Total flex is 12. Top flex
+ is 3. Bottom flex is 9.
+
+ Top outer height: 3em + 4em*3/12 = 4em
+ Bottom outer height: 9em + 4em*9/12 = 12em */
+ @right-top {
+ vertical-align: top;
+ text-align: left;
+ margin-top: 1em;
+ content: "x\ax";
+ background: hotpink;
+ }
+ @right-bottom {
+ vertical-align: top;
+ text-align: left;
+ margin: 25%;
+ content: "x";
+ background: yellow;
+ }
+ }
+
+ body {
+ background: blue;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html
new file mode 100644
index 00000000000..a131b564fd6
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print-ref.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<style>
+ html {
+ font: 16px/1 Ahem;
+ }
+ @page {
+ margin: 0;
+ width: 32em;
+ height: 28em;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 6em auto 6em;
+ grid-template-rows: 6em auto 6em;
+ height: 100vh;
+ margin: 0;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+</style>
+<div class="corner">xx</div>
+<div class="vertical-edge">
+ <div style="width:17.5em; margin-top:4em; background:hotpink;">xxxxxxx</div>
+ <div style="width:2.5em; margin-bottom:3em; background:yellow;">x</div>
+</div>
+<div class="corner" style="height:6em;">
+ xx<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+</div>
+<div class="horizontal-edge">
+ <div style="width:2em; height:12em; margin-left:4em; background:yellow;">
+ xxxxxxx<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ </div>
+ <div style="width:3em; height:4em; text-align:center; background:hotpink;">
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ x<br>
+ </div>
+</div>
+<div style="position:relative; z-index:-1; background:blue;"></div>
+<div class="horizontal-edge">
+ <div style="width:2em; height:4em; margin-left:2em; background:hotpink;">
+ xx<br>
+ &nbsp;x<br>
+ &nbsp;x<br>
+ </div>
+ <div style="margin:4em 0; margin-left:1.5em; width:3em; height:4em; background:yellow;">x</div>
+</div>
+<div class="corner" style="margin-top:2.5em;">
+ xxxxxxxxx<br>
+ x
+</div>
+<div class="vertical-edge">
+ <div style="width:5em; margin-top:4em; background:yellow;">x<br>x</div>
+ <div style="width:15em; margin-top:1em; background:hotpink;">xxx<br>x<br>x<br>x<br>x</div>
+</div>
+<div class="corner">x<br>x</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html
new file mode 100644
index 00000000000..4540b071906
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-013-print.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test orthogonal writing mode roots.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<link rel="match" href="dimensions-013-print-ref.html">
+<style>
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ @top-left-corner {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ content: "x\ax";
+ }
+ @top-right-corner {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ content: "x xxxxxxxxx";
+ }
+ @bottom-left-corner {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ margin-top: 2.5em;
+ content: "x\ax\ax\ax\ax\ax\ax\ax\axx";
+ }
+ @bottom-right-corner {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ content: "xx";
+ }
+
+ /* Min/max width for top-left is 7em (seven lines in an orthogonal
+ writing mode). For top-right it is 1em. Available space is 20em.
+ Unused space becomes 12em. This will be distributed proportionally based
+ on max widths. Left gets 7/8, right gets 1/8. Final widths become
+ 7em+12em*7/8 = 17.5em for left, and 1em+12em*1/8 = 2.5em for right. */
+ @top-left {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ margin-top: 4em;
+ content: "x\ax\ax\ax\ax\ax\ax\a";
+ background: hotpink;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: top;
+ margin-bottom: 50%;
+ content: "x";
+ background: yellow;
+ }
+
+ /* Min content height for left-top is 18em. Min content height for
+ left-bottom is 6em.
+
+ Available space is 16em. Unused space is 20em - (18em + 6em) = -8em.
+ Total min height is larger than what's available.
+
+ Shrink proportionally to min content heights. Top flex is 18. Bottom flex
+ is 6. Total flex is 24.
+
+ Top height: 18em + (-8em) * 18/24 = 12em
+ Bottom height: 6em + (-8em) * 6/24 = 8em */
+ @left-top {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ margin-left: 4em;
+ content: "x\ax\ax\ax\ax\ax\axxxxxxxxxxxxxxxxxx";
+ background: yellow;
+ }
+ @left-bottom {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: middle;
+ margin-block-end: auto;
+ margin-block-start: 3em;
+ content: "xxxxxx";
+ background: hotpink;
+ }
+
+ /* Max inner content height of right-top is 3em. It has auto margins, but
+ since the vertical axis is the main axis, they are treated as 0.
+ Therefore max outer content height is also 3em.
+
+ Max inner content height of right-bottom is 1em. Its margins are all 25%.
+ Available vertical space is 16em, meaning that top + bottom margin
+ becomes 50% = 8em. Max outer content height becomes 9em.
+
+ Flex for top becomes 3. Flex for bottom becomes 9. Total flex becomes 12.
+ Unused space is 4em.
+
+ Top outer height: 3em + 4em*3/12 = 4em
+ Bottom outer height: 9em + 4em*9/12 = 12em */
+ @right-top {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ margin: auto;
+ block-size: fit-content;
+ content: "xxx\ax";
+ background: hotpink;
+ }
+ @right-bottom {
+ writing-mode: vertical-rl;
+ text-align: left;
+ vertical-align: bottom;
+ margin: 25%;
+ content: "x";
+ background: yellow;
+ }
+
+ /* bottom-left gets a min-width of 1em (one line in an orthogonal writing
+ mode), bottom-right gets a min-width of 3em (three lines in an orthogonal
+ writing mode). So left gets 1/4 of the surplus, and right gets 3/4.
+ Available space is 20em. Unused space is 20em-4em = 16em.
+ Left width: 1em+16em*1/4 = 5em
+ Right width: 3em+16em*3/4 = 15em
+
+ Bottom-right has an intrinsic height (inline-size) larger than
+ available. Overconstrainedness is resolved by forcing margin-bottom to
+ auto, giving it a negative value so that the outer top of the box is
+ flush with the top of the page bottom margin area. */
+ @bottom-left {
+ writing-mode: vertical-rl;
+ vertical-align: bottom;
+ text-align: left;
+ margin-top: auto;
+ height: min-content;
+ content: "xx";
+ background: yellow;
+ }
+ @bottom-right {
+ writing-mode: vertical-rl;
+ vertical-align: bottom;
+ text-align: left;
+ margin-inline-start: 1em;
+ border-bottom: 20px solid red;
+ height: min-content;
+ content: "x\ax\axxxxxxxxx";
+ background: hotpink;
+ }
+ }
+ body {
+ background: blue;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html
new file mode 100644
index 00000000000..d126f2d0c91
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/dimensions-014-print.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="Test vertical-rl writing mode document.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+<!-- Note: Using the ref from the preceding test here. -->
+<link rel="match" href="dimensions-013-print-ref.html">
+<style>
+ html {
+ writing-mode: vertical-rl;
+ }
+ @page {
+ margin: 6em;
+ width: 20em;
+ height: 16em;
+ font: 16px/1 Ahem;
+ white-space: pre-wrap;
+
+ @top-left-corner {
+ text-align: left;
+ vertical-align: bottom;
+ content: "x\ax";
+ }
+ @top-right-corner {
+ text-align: left;
+ vertical-align: bottom;
+ content: "x xxxxxxxxx";
+ }
+ @bottom-left-corner {
+ text-align: left;
+ vertical-align: bottom;
+ margin-top: 2.5em;
+ content: "x\ax\ax\ax\ax\ax\ax\ax\axx";
+ }
+ @bottom-right-corner {
+ writing-mode: horizontal-tb;
+ text-align: left;
+ vertical-align: top;
+ content: "x\ax";
+ }
+
+ /* Min/max width for top-left is 7em (seven lines in a vertical writing
+ mode). For top-right it is 1em. Available space is 20em. Unused space
+ becomes 12em. This will be distributed proportionally based on max
+ widths. Left gets 7/8, right gets 1/8. Final widths become 7em+12em*7/8 =
+ 17.5em for left, and 1em+12em*1/8 = 2.5em for right. */
+ @top-left {
+ text-align: left;
+ vertical-align: bottom;
+ margin-top: 4em;
+ content: "x\ax\ax\ax\ax\ax\ax\a";
+ background: hotpink;
+ }
+ @top-right {
+ text-align: left;
+ vertical-align: bottom;
+ margin-bottom: 50%;
+ content: "x";
+ background: yellow;
+ }
+
+ /* Min content height for left-top is 18em. Min content height for
+ left-bottom is 6em.
+
+ Available space is 16em. Unused space is 20em - (18em + 6em) = -8em.
+ Total min height is larger than what's available.
+
+ Shrink proportionally to min content heights. Top flex is 18. Bottom flex
+ is 6. Total flex is 24.
+
+ Top height: 18em + (-8em) * 18/24 = 12em
+ Bottom height: 6em + (-8em) * 6/24 = 8em */
+ @left-top {
+ text-align: left;
+ vertical-align: bottom;
+ margin-left: 4em;
+ content: "x\ax\ax\ax\ax\ax\axxxxxxxxxxxxxxxxxx";
+ background: yellow;
+ }
+ @left-bottom {
+ text-align: left;
+ vertical-align: middle;
+ margin-block-end: auto;
+ margin-block-start: 3em;
+ content: "xxxxxx";
+ background: hotpink;
+ }
+
+ /* Max inner content height of right-top is 3em. It has auto margins, but
+ since the vertical axis is the main axis, they are treated as 0.
+ Therefore max outer content height is also 3em.
+
+ Max inner content height of right-bottom is 1em. Its margins are all 25%.
+ Available vertical space is 16em, meaning that top + bottom margin
+ becomes 50% = 8em. Max outer content height becomes 9em.
+
+ Flex for top becomes 3. Flex for bottom becomes 9. Total flex becomes 12.
+ Unused space is 4em.
+
+ Top outer height: 3em + 4em*3/12 = 4em
+ Bottom outer height: 9em + 4em*9/12 = 12em */
+ @right-top {
+ text-align: left;
+ vertical-align: bottom;
+ margin: auto;
+ block-size: fit-content;
+ content: "xxx\ax";
+ background: hotpink;
+ }
+ @right-bottom {
+ text-align: left;
+ vertical-align: bottom;
+ margin: 25%;
+ content: "x";
+ background: yellow;
+ }
+
+ /* bottom-left gets a min-width of 1em (one line in a vertical writing
+ mode), bottom-right gets a min-width of 3em (three lines in a vertical
+ writing mode). So left gets 1/4 of the surplus, and right gets 3/4.
+ Available space is 20em. Unused space is 20em-4em = 16em. Left width:
+ 1em+16em*1/4 = 5em Right width: 3em+16em*3/4 = 15em
+
+ Bottom-right has an intrinsic height (inline-size) larger than
+ available. Overconstrainedness is resolved by forcing margin-bottom to
+ auto, giving it a negative value so that the outer top of the box is
+ flush with the top of the page bottom margin area. */
+ @bottom-left {
+ vertical-align: bottom;
+ text-align: left;
+ margin-top: auto;
+ height: min-content;
+ content: "xx";
+ background: yellow;
+ }
+ @bottom-right {
+ vertical-align: bottom;
+ text-align: left;
+ margin-inline-start: 1em;
+ border-bottom: 20px solid red;
+ height: min-content;
+ content: "x\ax\axxxxxxxxx";
+ background: hotpink;
+ }
+ }
+ body {
+ background: blue;
+ }
+</style>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html
new file mode 100644
index 00000000000..157cb8effa4
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ size: 400px;
+ margin: 0;
+ }
+ body {
+ margin: 0;
+ }
+</style>
+<div style="width:100px; height:100px; background:green;">
+ Line 1<br>
+ Line 2
+</div>
+<div style="margin-left:100px; margin-right:100px;">
+ In the top left corner there should be a green square with two lines inside.
+</div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html
new file mode 100644
index 00000000000..f5f7f8ea247
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/inapplicable-properties-print.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-property-list">
+<meta name="assert" content="Test that inapplicable properties are ignored.">
+<link rel="match" href="inapplicable-properties-print-ref.html">
+<style>
+ @page {
+ size: 400px;
+ margin: 100px;
+
+ @top-left-corner {
+ text-align: left;
+ vertical-align: top;
+ white-space: pre-wrap;
+ content: "Line 1\aLine 2";
+ position: relative;
+ columns: 2;
+ column-rule: solid red;
+ orphans: 1;
+ widows: 1;
+ rotate: 45deg;
+ top: 50px;
+ left: 90px;
+ width: 100px;
+ height:100px;
+ background: green;
+ }
+ }
+ body {
+ margin: 0;
+ }
+</style>
+In the top left corner there should be a green square with two lines inside.
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html
new file mode 100644
index 00000000000..de6b55257ca
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print-ref.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 400px;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 100px auto 100px;
+ grid-template-rows: 100px auto 100px;
+ height: 100vh;
+ margin: 0;
+ }
+ .square {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ }
+ .square.left {
+ margin-left: auto;
+ }
+ .square.top {
+ margin-top: auto;
+ }
+ .vertical-edge {
+ display: flex;
+ justify-content: space-between;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ justify-content: space-between;
+ }
+ .pagearea {
+ border: solid blue;
+ padding: 8px;
+ }
+</style>
+
+<div class="square left top"></div>
+<div class="vertical-edge">
+ <div class="square top"></div>
+ <div class="square top"></div>
+ <div class="square top"></div>
+</div>
+<div class="square top"></div>
+<div class="horizontal-edge">
+ <div class="square left"></div>
+ <div class="square left"></div>
+ <div class="square left"></div>
+</div>
+<div class="pagearea">
+ There should be 16 margin boxes around this page area. Within their available
+ space, they should all be squares, and be aligned towards the center of the
+ page, with a tiny margin separating their border from the blue border.
+</div>
+<div class="horizontal-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square left"></div>
+<div class="vertical-edge">
+ <div class="square"></div>
+ <div class="square"></div>
+ <div class="square"></div>
+</div>
+<div class="square"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html
new file mode 100644
index 00000000000..549443ebc32
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/overconstrained-001-print.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#margin-dimension">
+<meta name="assert" content="In an overconstrained situation, margins facing away from the page center are treated as auto, pushing the margin boxes towards to page area">
+<link rel="match" href="overconstrained-001-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 400px;
+ border: solid blue;
+ @top-left-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @top-left {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @top-center {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @top-right {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @top-right-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @right-top {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @right-middle {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @right-bottom {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @bottom-right-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @bottom-right {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @bottom-center {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @bottom-left {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @bottom-left-corner {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @left-bottom {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @left-middle {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ @left-top {
+ border: solid;
+ width: 25px;
+ height: 25px;
+ margin: 3px;
+ content: "";
+ }
+ }
+</style>
+There should be 16 margin boxes around this page area. Within their available
+space, they should all be squares, and be aligned towards the center of the
+page, with a tiny margin separating their border from the blue border.
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html
new file mode 100644
index 00000000000..2677aee123c
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print-ref.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<style>
+ @page {
+ margin: 0;
+ size: 500px 400px;
+ }
+ body {
+ display: grid;
+ grid-template-columns: 100px auto 100px;
+ grid-template-rows: 100px auto 100px;
+ height: 100vh;
+ margin: 0;
+ }
+ .box {
+ border: solid thin;
+ flex: 1;
+ }
+ body > .box {
+ background: pink;
+ }
+ .vertical-edge {
+ display: flex;
+ }
+ .horizontal-edge {
+ display: flex;
+ flex-flow: column;
+ }
+ .vertical-edge > .box.first {
+ width: 5em;
+ margin: 5px -4em;
+ background: hotpink;
+ }
+ .vertical-edge > .box.second {
+ width: 5em;
+ flex: none;
+ margin: 10px 0;
+ background: cyan;
+ }
+ .vertical-edge > .box.third {
+ margin: 15px -4em;
+ background: yellow;
+ }
+ .horizontal-edge > .box.first {
+ height: 5em;
+ margin: -4em 5px;
+ background: hotpink;
+ }
+ .horizontal-edge > .box.second {
+ height: 5em;
+ flex: none;
+ margin: 0 10px;
+ background: cyan;
+ }
+ .horizontal-edge > .box.third {
+ margin: -4em 15px;
+ background: yellow;
+ }
+ .pagearea {
+ padding: 8px;
+ }
+</style>
+
+<div class="box" style="margin-left:20px; z-index:0;"></div>
+<div class="vertical-edge">
+ <div class="box first" style="z-index:1;"></div>
+ <div class="box second" style="z-index:2;"></div>
+ <div class="box third" style="z-index:3;"></div>
+</div>
+<div class="box" style="margin-top:20px; z-index:4;"></div>
+<div class="horizontal-edge">
+ <div class="box third" style="z-index:15;"></div>
+ <div class="box second" style="z-index:14;"></div>
+ <div class="box first" style="z-index:13;"></div>
+</div>
+<div class="pagearea">
+ Default margin box paint order should start with top-left-corner, then go
+ clockwise. Hotpink boxes should be on top of pink ones. Cyan on top of
+ hotpink. Yellow on top of cyan. No text ("FAIL") should be seen in the margin
+ boxes.
+</div>
+<div class="horizontal-edge">
+ <div class="box first" style="z-index:5;"></div>
+ <div class="box second" style="z-index:6;"></div>
+ <div class="box third" style="z-index:7;"></div>
+</div>
+<div class="box" style="margin-bottom:20px; z-index:12;"></div>
+<div class="vertical-edge">
+ <div class="box third" style="z-index:11;"></div>
+ <div class="box second" style="z-index:10;"></div>
+ <div class="box first" style="z-index:9;"></div>
+</div>
+<div class="box" style="margin-right:20px; z-index:8;"></div>
diff --git a/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html
new file mode 100644
index 00000000000..839762f0b9a
--- /dev/null
+++ b/tests/wpt/tests/css/css-page/margin-boxes/paint-order-001-print.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-page-3/#painting">
+<meta name="assert" content="Test default vertical and horizontal alignment for all 16 margin boxes">
+<link rel="match" href="paint-order-001-print-ref.html">
+<style>
+ @page {
+ margin: 100px;
+ size: 500px 400px;
+ @top-left-corner {
+ border: solid thin;
+ margin-left: 20px;
+ text-align: center;
+ vertical-align: middle;
+ content: "FAIL";
+ background: pink;
+ }
+ @top-left {
+ border: solid thin;
+ margin: 5px -4em;
+ text-align: right;
+ vertical-align: middle;
+ content: "FAIL";
+ background: hotpink;
+ }
+ @top-center {
+ border: solid thin;
+ margin: 10px 0;
+ width: 5em;
+ text-align: right;
+ vertical-align: middle;
+ content: "FAIL";
+ background: cyan;
+ }
+ @top-right {
+ border: solid thin;
+ margin: 15px -4em;
+ text-align: right;
+ vertical-align: middle;
+ content: "FAIL";
+ background: yellow;
+ }
+ @top-right-corner {
+ border: solid thin;
+ margin-top: 20px;
+ text-align: center;
+ vertical-align: bottom;
+ content: "FAIL";
+ background: pink;
+ }
+ @right-top {
+ border: solid thin;
+ margin: -4em 5px;
+ text-align: center;
+ vertical-align: bottom;
+ content: "FAIL";
+ background: hotpink;
+ }
+ @right-middle {
+ border: solid thin;
+ margin: 0 10px;
+ height: 5em;
+ text-align: center;
+ vertical-align: bottom;
+ content: "FAIL";
+ background: cyan;
+ }
+ @right-bottom {
+ border: solid thin;
+ margin: -4em 15px;
+ text-align: left;
+ vertical-align: bottom;
+ content: "FAIL";
+ background: yellow;
+ }
+ @bottom-right-corner {
+ border: solid thin;
+ margin-right: 20px;
+ text-align: left;
+ vertical-align: center;
+ content: "FAIL";
+ background: pink;
+ }
+ @bottom-right {
+ border: solid thin;
+ margin: 5px -4em;
+ text-align: left;
+ vertical-align: middle;
+ content: "FAIL";
+ background: hotpink;
+ }
+ @bottom-center {
+ border: solid thin;
+ width: 5em;
+ margin: 10px 0;
+ text-align: left;
+ vertical-align: middle;
+ content: "FAIL";
+ background: cyan;
+ }
+ @bottom-left {
+ border: solid thin;
+ margin: 15px -4em;
+ text-align: left;
+ vertical-align: top;
+ content: "FAIL";
+ background: yellow;
+ }
+ @bottom-left-corner {
+ border: solid thin;
+ margin-bottom: 20px;
+ vertical-align: top;
+ text-align: center;
+ content: "FAIL";
+ background: pink;
+ }
+ @left-bottom {
+ border: solid thin;
+ margin: -4em 5px;
+ text-align: center;
+ vertical-align: top;
+ content: "FAIL";
+ background: hotpink;
+ }
+ @left-middle {
+ border: solid thin;
+ margin: 0 10px;
+ height: 5em;
+ text-align: center;
+ vertical-align: top;
+ content: "FAIL";
+ background: cyan;
+ }
+ @left-top {
+ border: solid thin;
+ margin: -4em 15px;
+ content: "";
+ background: yellow;
+ }
+ }
+</style>
+Default margin box paint order should start with top-left-corner, then go
+clockwise. Hotpink boxes should be on top of pink ones. Cyan on top of
+hotpink. Yellow on top of cyan. No text ("FAIL") should be seen in the margin
+boxes.
diff --git a/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html b/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html
index d0decf8bf41..0eaae755eb9 100644
--- a/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html
+++ b/tests/wpt/tests/css/css-pseudo/first-letter-hi-001-ref.html
@@ -17,5 +17,5 @@ p { font: 16px test, sans-serif; }
<p><span class=fl>&#x0915;&#x094D;&#x0930;</span>&#x092E;
<p><span class=fl>&#x0915;&#x094D;&#x0937;</span>&#x0923;
<p><span class=fl>&#x0937;&#x094D;&#x0915;&#x094D;&#x0930;</span>&#x0938;
-<p><span class=fl>&#x0919;&#x094D;</span>&#x0919;&#x092E;
-<p><span class=fl>&#x0919;&#x094D;</span>&#x0915;&#x094D;&#x0930;&#x0938;
+<p><span class=fl>&#x0919;&#x094D;&#x0919;</span>&#x092E;
+<p><span class=fl>&#x0919;&#x094D;&#x0915;&#x094D;&#x0930;</span>&#x0938;
diff --git a/tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html b/tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html
new file mode 100644
index 00000000000..dd3ab2d4457
--- /dev/null
+++ b/tests/wpt/tests/css/css-ruby/reference/ruby-text-dynamic-style-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<p><ruby>base<rt>annotation</ruby></p>
diff --git a/tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html b/tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html
new file mode 100644
index 00000000000..3adade2dd3c
--- /dev/null
+++ b/tests/wpt/tests/css/css-ruby/ruby-text-dynamic-style.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="help" href="https://crbug.com/347597917"/>
+<link rel="match" href="reference/ruby-text-dynamic-style-ref.html">
+<style>
+.reftest-wait rt {
+ background-color: red;
+}
+ruby {
+ position: relative;
+}
+p {
+ position: relative;
+}
+</style>
+<p><ruby>base<rt>annotation</ruby></p>
+<script>
+requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ document.documentElement.classList.remove('reftest-wait');
+ });
+});
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html
new file mode 100644
index 00000000000..29b7c3c9fa5
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-001.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>CSS Text Test: soft-hyphen and float clearance</title>
+<link rel="match" href="reference/hyphens-vs-float-clearance-001-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#hyphens-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1902974">
+<link rel="author" href="mailto:jkew@mozilla.com">
+<style>
+.outer {
+ font: 16px/1.4 monospace;
+ width: 6ch;
+ border: 1px solid gray;
+ float: left;
+ margin: 10px;
+ hyphens: auto;
+}
+.float {
+ float: right;
+ width: 2ch;
+ background: lightblue;
+}
+.h1 {
+ height: 1em;
+}
+.h2 {
+ height: 2em;
+}
+.h3 {
+ height: 3em;
+}
+.h4 {
+ height: 4em;
+}
+</style>
+<body lang="en">
+<div class="outer"><div class="float h1"></div>hyphenate!</div>
+<div class="outer"><div class="float h2"></div>hyphenate!</div>
+<div class="outer"><div class="float h3"></div>hyphenate!</div>
+<div class="outer"><div class="float h4"></div>hyphenate!</div>
diff --git a/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html
new file mode 100644
index 00000000000..6b5b213cb71
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/hyphens/hyphens-vs-float-clearance-002.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>CSS Text Test: soft-hyphen and float clearance</title>
+<link rel="match" href="reference/hyphens-vs-float-clearance-001-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#hyphens-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1902974">
+<link rel="author" href="mailto:jkew@mozilla.com">
+<style>
+.outer {
+ font: 16px/1.4 monospace;
+ width: 6ch;
+ border: 1px solid gray;
+ float: left;
+ margin: 10px;
+ hyphens: manual;
+}
+.float {
+ float: right;
+ width: 2ch;
+ background: lightblue;
+}
+.h1 {
+ height: 1em;
+}
+.h2 {
+ height: 2em;
+}
+.h3 {
+ height: 3em;
+}
+.h4 {
+ height: 4em;
+}
+</style>
+<body lang="en">
+<div class="outer"><div class="float h1"></div>hy&shy;phen&shy;ate!</div>
+<div class="outer"><div class="float h2"></div>hy&shy;phen&shy;ate!</div>
+<div class="outer"><div class="float h3"></div>hy&shy;phen&shy;ate!</div>
+<div class="outer"><div class="float h4"></div>hy&shy;phen&shy;ate!</div>
diff --git a/tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html b/tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html
new file mode 100644
index 00000000000..1fc7b3d5210
--- /dev/null
+++ b/tests/wpt/tests/css/css-text/hyphens/reference/hyphens-vs-float-clearance-001-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>CSS Text Reference: soft-hyphen and float clearance</title>
+<link rel="author" href="mailto:jkew@mozilla.com">
+<style>
+.outer {
+ font: 16px/1.4 monospace;
+ width: 6ch;
+ border: 1px solid gray;
+ float: left;
+ margin: 10px;
+ hyphens: none;
+}
+.float {
+ float: right;
+ width: 2ch;
+ background: lightblue;
+}
+.h1 {
+ height: 1em;
+}
+.h2 {
+ height: 2em;
+}
+.h3 {
+ height: 3em;
+}
+.h4 {
+ height: 4em;
+}
+</style>
+<body lang="en">
+<div class="outer"><div class="float h1"></div>hy&#x2010;<br>phen&#x2010;<br>ate!</div>
+<div class="outer"><div class="float h2"></div>hy&#x2010;<br>phen&#x2010;<br>ate!</div>
+<div class="outer"><div class="float h3"></div>hy&#x2010;<br>phen&#x2010;<br>ate!</div>
+<div class="outer"><div class="float h4"></div>hy&#x2010;<br>phen&#x2010;<br>ate!</div>
diff --git a/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html
new file mode 100644
index 00000000000..c9d6eb720f1
--- /dev/null
+++ b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-001-ref.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: transparent accent color</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent">
+<style>
+
+div {
+ border: solid orange;
+ padding: 1ch;
+ margin: 1ch;
+ float: left;
+}
+
+#t1 input { color-scheme: light;}
+#t1 input { accent-color: white; }
+
+#t2 input { color-scheme: light;}
+#t2 input { accent-color: #7f7fff; }
+
+#t3 { background: orange;}
+#t3 input { color-scheme: light;}
+#t3 input { accent-color: #7f7fff; }
+
+</style>
+
+<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes.
+
+<div id=t1>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t2>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t3>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
diff --git a/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html
new file mode 100644
index 00000000000..819a5852460
--- /dev/null
+++ b/tests/wpt/tests/css/css-ui/reference/transparent-accent-color-002-ref.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: transparent accent color</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent">
+<style>
+
+div {
+ border: solid orange;
+ padding: 1ch;
+ margin: 1ch;
+ float: left;
+}
+
+#t1 input { color-scheme: dark;}
+#t1 input { accent-color: black; }
+
+#t2 input { color-scheme: dark;}
+#t2 input { accent-color: #00007f; }
+
+#t3 { background: orange;}
+#t3 input { color-scheme: dark;}
+#t3 input { accent-color: #00007f; }
+
+</style>
+
+<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes.
+
+<div id=t1>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t2>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t3>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
diff --git a/tests/wpt/tests/css/css-ui/transparent-accent-color-001.html b/tests/wpt/tests/css/css-ui/transparent-accent-color-001.html
new file mode 100644
index 00000000000..219e24c1689
--- /dev/null
+++ b/tests/wpt/tests/css/css-ui/transparent-accent-color-001.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: transparent accent color</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent">
+<link rel="match" href="reference/transparent-accent-color-001-ref.html">
+<meta name="assert" content="If the color supplied is partially or fully transparent, it is precomposed over white when in light mode.">
+<style>
+
+div {
+ border: solid orange;
+ padding: 1ch;
+ margin: 1ch;
+ float: left;
+}
+
+#t1 input { color-scheme: light;}
+#t1 .test { accent-color: #ff000000;}
+#t1 .ref { accent-color: white; }
+
+#t2 input { color-scheme: light;}
+#t2 .test { accent-color: #0000ff80;}
+#t2 .ref { accent-color: #7f7fff; }
+
+#t3 { background: orange;}
+#t3 input { color-scheme: light;}
+#t3 .test { accent-color: #0000ff80;}
+#t3 .ref { accent-color: #7f7fff; }
+
+</style>
+
+<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes.
+
+<div id=t1>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t2>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t3>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
diff --git a/tests/wpt/tests/css/css-ui/transparent-accent-color-002.html b/tests/wpt/tests/css/css-ui/transparent-accent-color-002.html
new file mode 100644
index 00000000000..46b9835d0c1
--- /dev/null
+++ b/tests/wpt/tests/css/css-ui/transparent-accent-color-002.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: transparent accent color</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#widget-accent">
+<link rel="match" href="reference/transparent-accent-color-002-ref.html">
+<meta name="assert" content="If the color supplied is partially or fully transparent, it is precomposed over black when in dark mode.">
+<style>
+
+div {
+ border: solid orange;
+ padding: 1ch;
+ margin: 1ch;
+ float: left;
+}
+
+#t1 input { color-scheme: dark;}
+#t1 .test { accent-color: #ff000000;}
+#t1 .ref { accent-color: black; }
+
+#t2 input { color-scheme: dark;}
+#t2 .test { accent-color: #0000ff80;}
+#t2 .ref { accent-color: #00007f; }
+
+#t3 { background: orange;}
+#t3 input { color-scheme: dark;}
+#t3 .test { accent-color: #0000ff80;}
+#t3 .ref { accent-color: #00007f; }
+
+</style>
+
+<p>Test passes if in each box bellow, you see a pair of identically colored check-boxes.
+
+<div id=t1>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t2>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
+
+<div id=t3>
+ <input class=test type=checkbox checked>
+ <input class=ref type=checkbox checked>
+</div>
diff --git a/tests/wpt/tests/css/css-variables/revert-in-fallback.html b/tests/wpt/tests/css/css-variables/revert-in-fallback.html
index ae99e5192fd..956965ab7ab 100644
--- a/tests/wpt/tests/css/css-variables/revert-in-fallback.html
+++ b/tests/wpt/tests/css/css-variables/revert-in-fallback.html
@@ -28,15 +28,15 @@
test((t) => {
assert_equals(getComputedStyle(document.body).getPropertyValue('margin'), body_ua_margin);
- }, 'var(--unknown, revert-layer) in shorthand');
+ }, 'var(--unknown, revert) in shorthand');
test((x) => {
assert_equals(getComputedStyle(document.body).getPropertyValue('margin-left'), body_ua_margin);
- }, 'var(--unknown, revert-layer) in shorthand observed via longhand');
+ }, 'var(--unknown, revert) in shorthand observed via longhand');
test((t) => {
assert_equals(getComputedStyle(document.body).getPropertyValue('display'), body_ua_display);
- }, 'var(--unknown, revert-layer) in longhand');
+ }, 'var(--unknown, revert) in longhand');
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html
new file mode 100644
index 00000000000..1e22d6f66d7
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>View transitions: view-transition-name element, when captured escapes its clips even if it has an abspos child (ref)</title>
+<link rel="help" href="https://www.w3.org/TR/css-transitions-1/">
+<link rel="author" href="mailto:vmpstr@chromium.org">
+
+<style>
+#target {
+ width: 100px;
+ height: 100px;
+ background: lightblue;
+}
+#abspos {
+ position: absolute;
+ left: 0;
+ width: 50px;
+ height: 50px;
+ background: pink;
+}
+
+body { background: rebeccapurple }
+</style>
+
+
+<div id=target>
+ <div id=abspos></div>
+</div>
+
diff --git a/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html
new file mode 100644
index 00000000000..b16b02bd632
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/element-escapes-clip-with-abspos-child.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>View transitions: view-transition-name element, when captured escapes its clips even if it has an abspos child</title>
+<link rel="help" href="https://www.w3.org/TR/css-transitions-1/">
+<link rel="author" href="mailto:vmpstr@chromium.org">
+<link rel="match" href="element-escapes-clip-with-abspos-child-ref.html">
+<script src="/common/reftest-wait.js"></script>
+
+<style>
+#clipper {
+ border-radius: 20px;
+ overflow: hidden;
+ width: max-content;
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background: lightblue;
+ view-transition-name: target;
+}
+#abspos {
+ position: absolute;
+ left: 0;
+ width: 50px;
+ height: 50px;
+ background: pink;
+}
+
+:root { view-transition-name: none }
+
+::view-transition {
+ background: rebeccapurple;
+}
+
+::view-transition-old(*) {
+ animation: unset;
+ opacity: 1;
+}
+::view-transition-new(*) {
+ animation: unset;
+ opacity: 0;
+}
+::view-transition-group(*) {
+ animation-play-state: paused;
+}
+</style>
+
+
+<div id=clipper>
+ <div id=target>
+ <div id=abspos></div>
+ </div>
+</div>
+
+<script>
+function runTest() {
+ document.startViewTransition().ready.then(takeScreenshot);
+}
+
+requestAnimationFrame(() => requestAnimationFrame(() => {
+ requestAnimationFrame(runTest);
+}));
+</script>
diff --git a/tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html b/tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html
new file mode 100644
index 00000000000..9bc1f5751fc
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/hit-test-pseudo-element-element-from-point.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<title>View transitions: hit testing the pseudo-elements should always return the document element</title>
+<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
+<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+html { view-transition-name: none; }
+
+body { margin: 0; }
+
+#target {
+ width: 100px;
+ height: 100vh;
+ view-transition-name: target;
+}
+
+::view-transition {
+ background-color: green;
+}
+
+::view-transition,
+::view-transition-group(target),
+::view-transition-image-pair(target) {
+ height: 100%;
+ padding-left: 100px;
+}
+
+::view-transition-group(target) {
+ animation-duration: 30s;
+ background-color: lightgreen;
+}
+
+::view-transition-image-pair(target) {
+ height: 100%;
+ background-color: skyblue;
+ animation: none;
+ margin-left: 100px;
+}
+
+::view-transition-old(target) {
+ height: 100%;
+ width: 100px;
+ animation: none;
+ background-color: navy;
+}
+::view-transition-new(target) {
+ height: 100%;
+ width: 100px;
+ margin-left: 100px;
+ animation: none;
+ background-color: purple;
+}
+</style>
+
+<div id=target></div>
+
+<script>
+async_test(t => {
+ assert_implements(document.startViewTransition, "Missing document.startViewTransition");
+ document.startViewTransition(() => {
+ requestAnimationFrame(async () => {
+ // ::view-transition-group
+ t.step(() => assert_equals(document.elementFromPoint(20, 20), document.documentElement));
+ // ::view-transition-image-pair
+ t.step(() => assert_equals(document.elementFromPoint(120, 20), document.documentElement));
+ // ::view-transition-old
+ t.step(() => assert_equals(document.elementFromPoint(220, 20), document.documentElement));
+ // ::view-transition-new
+ t.step(() => assert_equals(document.elementFromPoint(320, 20), document.documentElement));
+ // ::view-transition
+ t.step(() => assert_equals(document.elementFromPoint(420, 20), document.documentElement));
+ t.done();
+ });
+ });
+}, "Hit-testing view transition pseudo-elements should always return the document element");
+</script>
diff --git a/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html b/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html
index b34d2b11df5..c950cc126e0 100644
--- a/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html
+++ b/tests/wpt/tests/css/css-view-transitions/hit-test-unpainted-element-from-point.html
@@ -63,9 +63,9 @@ async_test(t => {
target.classList.toggle("before");
target.classList.toggle("after");
requestAnimationFrame(async () => {
- // Check the old location of the element, we should get body.
+ // Check the location of the element, we should get body.
t.step(() => assert_equals(document.elementFromPoint(20, 20), document.body));
- // Check the new location of the pseudo element, we should get documentElement,
+ // Check the location of the pseudo element for the old snapshot, we should get documentElement,
// which is the originating element for the pseudo element.
t.step(() => assert_equals(document.elementFromPoint(220, 20), document.documentElement));
// Check the spot that used to be covered by the element but now has
diff --git a/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html
new file mode 100644
index 00000000000..b6e89e28d5a
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform-ref.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html style="reftest-wait">
+<head>
+ <style>
+ #target {
+ width: 100px;
+ height: 100px;
+ background: green;
+ margin: 300px;
+ }
+ </style>
+</head>
+<body>
+ <div id="target"></div>
+ <div style="height: 1000px"></div>
+ <script>
+ function scrollBy(y) {
+ return new Promise(resolve => {
+ addEventListener("scroll", () => {
+ requestAnimationFrame(() => {
+ requestAnimationFrame(resolve);
+ });
+ }, { once: true, capture: true });
+ document.documentElement.scrollBy({
+ top: y,
+ behavior: "instant"
+ });
+ });
+ }
+ addEventListener("load", async () => {
+ await scrollBy(200);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html
new file mode 100644
index 00000000000..8ff0780bbd3
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/transformed-element-scroll-transform.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html style="reftest-wait">
+<head>
+ <title>Scroll position transform should be the last one to be applied</title>
+ <link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+ <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
+ <link rel="match" href="transformed-element-scroll-transform-ref.html">
+ <style>
+ :root {
+ view-transition-name: none;
+ }
+
+ ::view-transition-group(*) {
+ animation-duration: 10s;
+ }
+
+ #target {
+ width: 100px;
+ height: 100px;
+ background: green;
+ margin: 300px;
+ view-transition-name: target;
+ rotate: 90deg;
+ }
+ </style>
+</head>
+<body>
+ <div id="target"></div>
+ <div style="height: 1000px"></div>
+ <script>
+ function scrollBy(y) {
+ return new Promise(resolve => {
+ addEventListener("scroll", () => {
+ requestAnimationFrame(() => {
+ requestAnimationFrame(resolve);
+ });
+ }, { once: true, capture: true });
+ document.documentElement.scrollBy({
+ top: y,
+ behavior: "instant"
+ });
+ });
+ }
+ addEventListener("load", async () => {
+ await scrollBy(200);
+ const transition = document.startViewTransition();
+ await transition.ready;
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ });
+ });
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js b/tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js
new file mode 100644
index 00000000000..f3d02d2598d
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/resources/simultaneousScrollIntoViews.js
@@ -0,0 +1,51 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+async function reset(t, scrollers) {
+ for (const scroller of scrollers) {
+ await waitForScrollReset(t, scroller);
+ }
+}
+
+/**
+ * This tests executing scrollIntoView on multiple scroll containers at the same
+ * time. It assumes and verifies vertical scrolling.
+ */
+async function simultaneousScrollIntoViewsTest(test,
+ behaviors,
+ targets,
+ scrollers,
+ target_offsets) {
+ assert_equals(targets.length, behaviors.length,
+ "equal numbers of targets and behaviors provided");
+ assert_equals(scrollers.length, target_offsets.length,
+ "equal numbers of scrollers and target_offsets provided");
+ await reset(test, scrollers);
+ await waitForCompositorCommit();
+
+ // All scrollers should be at an offset of 0.
+ for (const scroller of scrollers) {
+ assert_equals(scroller.scrollTop, 0, `${scroller.id}'s scrollTop is reset`);
+ }
+
+ const scrollend_promises = Array.from(scrollers, (scroller) => {
+ return waitForScrollEnd(scroller);
+ });
+
+ // Scroll all targets into view.
+ for (let idx = 0; idx < targets.length; idx++) {
+ targets[idx].scrollIntoView({
+ block: "start",
+ behavior: behaviors[idx]
+ });
+ }
+ await Promise.all(scrollend_promises);
+
+ // Verify the expected positions os all scrollers.
+ for (let idx = 0; idx < scrollers.length; idx++) {
+ assert_approx_equals(scrollers[idx].scrollTop, target_offsets[idx], 1,
+ `scrollIntoView finished executing on ${scrollers[idx].id}`
+ );
+ }
+}
diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html
new file mode 100644
index 00000000000..630cd21b613
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple-nested.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CSSOM View - Simultaneous scrollIntoViews</title>
+ <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="/css/css-scroll-snap/support/common.js"></script>
+ <script src="resources/simultaneousScrollIntoViews.js"></script>
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ background-color: teal;
+ border: solid 1px black;
+ position: relative;
+ resize: both;
+ display: inline-block;
+ }
+ .scroller.outer {
+ height: 400px;
+ width: 400px;
+ }
+ .scroller.inner {
+ height: 200px;
+ width: 200px;
+ position: absolute;
+ top: 150%;
+ }
+ .space {
+ height: 200vh;
+ width: 200vw;
+ }
+ .box {
+ height: 50px;
+ width: 50px;
+ background-color: purple;
+ }
+ .target {
+ position: absolute;
+ top: 150%;
+ }
+ </style>
+ <div id="outerscroller1" class="outer scroller">
+ <div class="space"></div>
+ <div id="innerscroller1" class="inner scroller">
+ <div class="space"></div>
+ <div class="box target" id="target1"></div>
+ </div>
+ </div>
+ <div id="outerscroller2" class="outer scroller">
+ <div class="space"></div>
+ <div id="innerscroller2" class="inner scroller">
+ <div class="space"></div>
+ <div class="box target" id="target2"></div>
+ </div>
+ </div>
+ <script>
+ const outerscroller1 = document.getElementById("outerscroller1");
+ const outerscroller2 = document.getElementById("outerscroller2");
+ const innerscroller1 = document.getElementById("innerscroller1");
+ const innerscroller2 = document.getElementById("innerscroller2");
+ const target1 = document.getElementById("target1");
+ const target2 = document.getElementById("target2");
+
+ const scrollers = [ outerscroller1,
+ outerscroller2,
+ innerscroller1,
+ innerscroller2 ];
+ // Expect the outer scrollers to scroll to the inner scrollers
+ // and the inner scrollers to scroll to their respective targets.
+ const target_offsets = [ innerscroller1.offsetTop,
+ innerscroller2.offsetTop,
+ target1.offsetTop,
+ target2.offsetTop ];
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["smooth", "smooth"], [target1, target2], scrollers, target_offsets);
+ }, "Simultaneous smooth scrollIntoViews run to completion");
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["smooth", "instant"], [target1, target2], scrollers, target_offsets);
+ }, "Simultaneous smooth,instant scrollIntoViews run to completion");
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["instant", "smooth"], [target1, target2], scrollers, target_offsets);
+ }, "Simultaneous instant,smooth scrollIntoViews run to completion");
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["instant", "instant"], [target1, target2], scrollers, target_offsets);
+ }, "Simultaneous instant scrollIntoViews run to completion");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html
new file mode 100644
index 00000000000..e6ddd1818f2
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-multiple.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CSSOM View - Simultaneous scrollIntoViews</title>
+ <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ <script src="/css/css-scroll-snap/support/common.js"></script>
+ <script src="resources/simultaneousScrollIntoViews.js"></script>
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ height: 200px;
+ width: 200px;
+ background-color: teal;
+ border: solid 1px black;
+ position: relative;
+ display: inline-block;
+ }
+ .space {
+ height: 200vh;
+ width: 200vw;
+ }
+ .box {
+ height: 50px;
+ width: 50px;
+ background-color: purple;
+ }
+ .target {
+ position: absolute;
+ top: 150%;
+ }
+ </style>
+ <div id="scroller1" class="scroller">
+ <div class="space"></div>
+ <div class="box target" id="target1"></div>
+ </div>
+ <div id="scroller2" class="scroller">
+ <div class="space"></div>
+ <div class="box target" id="target2"></div>
+ </div>
+ <script>
+ const scroller1 = document.getElementById("scroller1");
+ const scroller2 = document.getElementById("scroller2");
+ const target1 = document.getElementById("target1");
+ const target2 = document.getElementById("target2");
+
+ const targets = [target1, target2];
+ const scrollers = [scroller1, scroller2];
+ const target_offsets = [target1.offsetTop, target2.offsetTop];
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["smooth", "smooth"],
+ targets,
+ scrollers,
+ target_offsets);
+ }, "Simultaneous smooth scrollIntoViews run to completion");
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["smooth", "instant"],
+ targets,
+ scrollers,
+ target_offsets);
+ }, "Simultaneous smooth,instant scrollIntoViews run to completion");
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["instant", "smooth"],
+ targets,
+ scrollers,
+ target_offsets);
+ }, "Simultaneous instant,smooth scrollIntoViews run to completion");
+
+ promise_test(async (t) => {
+ await simultaneousScrollIntoViewsTest(t,
+ ["instant", "instant"],
+ targets,
+ scrollers,
+ target_offsets);
+ }, "Simultaneous instant scrollIntoViews run to completion");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html b/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html
index ddfa31076c2..324e51d7388 100644
--- a/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html
+++ b/tests/wpt/tests/css/cssom-view/scrollIntoView-smooth.html
@@ -1,6 +1,8 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/css/css-scroll-snap/support/common.js"></script>
+<script src="/dom/events/scrolling/scroll_support.js"></script>
<title>Check End Position of smooth scrollIntoView</title>
<div id="container" style="height: 2500px; width: 2500px;">
<div id="content" style="height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px;background-color: red">
@@ -15,93 +17,63 @@ var window_width = document.documentElement.clientWidth;
var content = document.getElementById("content");
add_completion_callback(() => document.getElementById("container").remove());
-function waitForScrollEnd() {
- var wait_for_scroll_start = performance.now();
- var last_changed_timestamp = wait_for_scroll_start;
- var last_changed_frame = 0;
- var last_x = window.scrollX;
- var last_y = window.scrollY;
- return new Promise((resolve, reject) => {
- function tick(frames, timestamp) {
- // We requestAnimationFrame until at least 200ms have elapsed and at least
- // 5 animation frames have run since the last change to the scroll
- // offset, timing out after 8 seconds.
- if (window.scrollX != last_x || window.scrollY != last_y) {
- last_changed_timestamp = timestamp;
- last_changed_frame = frames;
- last_x = window.scrollX;
- last_y = window.scrollY;
- }
- if (timestamp - last_changed_timestamp > 200 &&
- frames - last_changed_frame > 4) {
- resolve();
- } else if (timestamp - wait_for_scroll_start > 8000) {
- reject();
- } else {
- requestAnimationFrame(tick.bind(null, frames + 1));
- }
- }
- tick(last_changed_frame, wait_for_scroll_start);
- });
-}
-
// When testing manually, we need an additional frame at beginning
// to trigger the effect.
requestAnimationFrame(() => {
-promise_test(t => {
- window.scrollTo(0, 0);
+promise_test(async (t) => {
+ await waitForScrollReset(t, document.scrollingElement);
var expected_x = content.offsetLeft + content_width - window_width;
var expected_y = content.offsetTop + content_height - window_height;
assert_not_equals(window.scrollX, expected_x, "scrollX");
assert_not_equals(window.scrollY, expected_y, "scrollY");
+ const scrollend_promise = waitForScrollEnd(document);
content.scrollIntoView({behavior: "smooth", block: "nearest", inline:
"nearest"});
- return waitForScrollEnd().then(() => {
- assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
- assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
- });
+ await scrollend_promise;
+ assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
+ assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
}, "Smooth scrollIntoView should scroll the element to the 'nearest' position");
-promise_test(t => {
- window.scrollTo(0, 0);
+promise_test(async (t) => {
+ await waitForScrollReset(t, document.scrollingElement);
var expected_x = content.offsetLeft;
var expected_y = content.offsetTop;
assert_not_equals(window.scrollX, expected_x, "scrollX");
assert_not_equals(window.scrollY, expected_y, "scrollY");
+ const scrollend_promise = waitForScrollEnd(document);
content.scrollIntoView({behavior: "smooth", block: "start", inline:
"start"});
- return waitForScrollEnd().then(() => {
- assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
- assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
- });
+ await scrollend_promise;
+ assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
+ assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
}, "Smooth scrollIntoView should scroll the element to the 'start' position");
-promise_test(t => {
- window.scrollTo(0, 0);
+promise_test(async (t) => {
+ await waitForScrollReset(t, document.scrollingElement);
var expected_x = content.offsetLeft + (content_width - window_width) / 2;
var expected_y = content.offsetTop + (content_height - window_height) / 2;
assert_not_equals(window.scrollX, expected_x, "scrollX");
assert_not_equals(window.scrollY, expected_y, "scrollY");
+ const scrollend_promise = waitForScrollEnd(document);
content.scrollIntoView({behavior: "smooth", block: "center", inline:
"center"});
- return waitForScrollEnd().then(() => {
- assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
- assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
- });
+ await scrollend_promise;
+ assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
+ assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
}, "Smooth scrollIntoView should scroll the element to the 'center' position");
-promise_test(t => {
- window.scrollTo(0, 0);
+promise_test(async (t) => {
+ await waitForScrollReset(t, document.scrollingElement);
var expected_x = content.offsetLeft + content_width - window_width;
var expected_y = content.offsetTop + content_height - window_height;
assert_not_equals(window.scrollX, expected_x, "scrollX");
assert_not_equals(window.scrollY, expected_y, "scrollY");
+ const scrollend_promise = waitForScrollEnd(document);
content.scrollIntoView({behavior: "smooth", block: "end", inline:
"end"});
- return waitForScrollEnd().then(() => {
- assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
- assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
- });
+ await scrollend_promise;
+ assert_approx_equals(window.scrollX, expected_x, 1, "scrollX");
+ assert_approx_equals(window.scrollY, expected_y, 1, "scrollY");
}, "Smooth scrollIntoView should scroll the element to the 'end' position");
});
diff --git a/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html
new file mode 100644
index 00000000000..26dbdd2053a
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+ <body>
+ <style>
+ * {
+ scroll-behavior: smooth;
+ }
+ .scroller {
+ overflow-y: scroll;
+ height: 200px;
+ width: 200px;
+ background-color: teal;
+ border: solid 1px black;
+ position: relative;
+ display: inline-block;
+ }
+ .space {
+ height: 200vh;
+ width: 200vw;
+ }
+ .box {
+ height: 50px;
+ width: 50px;
+ background-color: purple;
+ }
+ .target {
+ position: absolute;
+ top: 150%;
+ }
+ </style>
+ <div id="fragment_scroll_container" class="scroller">
+ <div class="space"></div>
+ <div class="box target" id="fragment_scroll_target">target</div>
+ </div>
+ <div id="scrollintoview_container" class="scroller">
+ <div class="space"></div>
+ <div class="box target" id="scrollintoview_target"></div>
+ </div>
+ <a id="fragment_link" href="#fragment_scroll_target">Scroll To Fragment</a>
+ </style>
+ <script>
+ const fragment_scroll_container =
+ document.getElementById("fragment_scroll_container");
+ const scrollintoview_container =
+ document.getElementById("scrollintoview_container");
+ const scrollintoview_target =
+ document.getElementById("scrollintoview_target");
+ const parent = window.parent;
+
+ // Post a message to the parent frame when the scroll ends to the test can
+ // proceed.
+ scrollintoview_container.addEventListener("scrollend", () => {
+ parent.postMessage("ready");
+ }, { once: true });
+
+ // Start a scroll on the scrollintoview container as soon as we start
+ // scrolling the fragment's container.
+ fragment_scroll_container.addEventListener("scroll", () => {
+ scrollintoview_target.scrollIntoView({ behavior: "smooth" });
+ }, { once: true });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html
new file mode 100644
index 00000000000..72ecdf15e55
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-smooth-fragment-scroll.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CSSOM View - Smooth scrollIntoView + smooth scroll to fragment</title>
+ <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ </head>
+ <body>
+ <style>
+ iframe {
+ width: 100vw;
+ height: 100vh;
+ }
+ </style>
+ <script>
+ let frame = null;
+ async function test_smooth_scrollintoview_with_smooth_fragment() {
+ return new Promise((resolve) => {
+ window.addEventListener("message", (evt) => {
+ assert_equals(evt.data, "ready");
+
+ // Check that the fragment scroll completed.
+ const fragment_scroll_container =
+ frame.contentDocument.getElementById("fragment_scroll_container");
+ const fragment_scroll_target =
+ frame.contentDocument.getElementById("fragment_scroll_target");
+ assert_approx_equals(fragment_scroll_container.scrollTop,
+ fragment_scroll_target.offsetTop, 1,
+ "scroll to fragment was completed");
+
+ // Check that the scrollIntoView completed.
+ const scrollintoview_container =
+ frame.contentDocument.getElementById("scrollintoview_container");
+ const scrollintoview_target =
+ frame.contentDocument.getElementById("scrollintoview_target");
+ assert_approx_equals(scrollintoview_container.scrollTop,
+ scrollintoview_target.offsetTop, 1,
+ "scrollIntoView was completed");
+
+ resolve();
+ });
+ });
+ }
+
+ promise_test(async (t) => {
+ frame = document.createElement("iframe");
+ let test_complete_promise =
+ test_smooth_scrollintoview_with_smooth_fragment();
+ frame.src =
+ "smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html" +
+ "#fragment_scroll_target";
+ document.documentElement.appendChild(frame);
+ await test_complete_promise;
+ frame.src = "";
+ frame.remove();
+ }, "Smooth scroll to hash fragment (on pageload) alongside smooth " +
+ "scrollIntoView runs to completion.");
+
+ promise_test(async (t) => {
+ frame = document.createElement("iframe");
+ const iframe_load_promise = new Promise((resolve) => {
+ frame.addEventListener("load", resolve);
+ });
+ const test_complete_promise =
+ test_smooth_scrollintoview_with_smooth_fragment();
+ frame.src =
+ "smooth-scrollIntoView-with-smooth-fragment-scroll-iframe.html";
+ document.documentElement.appendChild(frame);
+ await iframe_load_promise;
+ const link = frame.contentDocument.getElementById("fragment_link");
+ link.click();
+ await test_complete_promise;
+ frame.src = "";
+ frame.remove();
+ }, "Smooth scroll to hash fragment (on click) alongside smooth " +
+ "scrollIntoView runs to completion.");
+ </script>
+ </body> \ No newline at end of file
diff --git a/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html
new file mode 100644
index 00000000000..f42fcb29857
--- /dev/null
+++ b/tests/wpt/tests/css/cssom-view/smooth-scrollIntoView-with-unrelated-gesture-scroll.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CSSOM View - Unrelated scroll gesture while scrollIntoView is ongoing</title>
+ <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/testdriver.js"></script>
+ <script src="/resources/testdriver-actions.js"></script>
+ <script src="/resources/testdriver-vendor.js"></script>
+ <script src="/css/css-scroll-snap/support/common.js"></script>
+ <script src="/dom/events/scrolling/scroll_support.js"></script>
+ </head>
+ <body>
+ <style>
+ .scroller {
+ overflow-y: scroll;
+ height: 200px;
+ width: 200px;
+ background-color: teal;
+ border: solid 1px black;
+ position: relative;
+ display: inline-block;
+ }
+ .space {
+ height: 200vh;
+ width: 200vw;
+ }
+ .box {
+ height: 50px;
+ width: 50px;
+ background-color: purple;
+ }
+ .target {
+ position: absolute;
+ top: 150%;
+ }
+ </style>
+ <div id="programmatic_scroller" class="scroller">
+ <div class="space"></div>
+ <div class="box target" id="target"></div>
+ </div>
+ <div id="gesture_scroller" class="scroller">
+ <div class="space"></div>
+ </div>
+ <script>
+ const programmatic_scroller =
+ document.getElementById("programmatic_scroller");
+ const gesture_scroller = document.getElementById("gesture_scroller");
+ const target = document.getElementById("target");
+
+ promise_test(async (t) => {
+ await waitForCompositorCommit();
+
+ const scrollend_promises = [
+ waitForScrollEnd(programmatic_scroller),
+ waitForScrollEnd(gesture_scroller)
+ ]
+ // As soon as we observe a scroll event, begin a gesture scroll on the
+ // second scroll container.
+ programmatic_scroller.addEventListener("scroll", async () => {
+ await new test_driver.Actions().scroll(0, 0, 0, 100,
+ { origin: gesture_scroller })
+ .send();
+ }, { once: true });
+
+ target.scrollIntoView({ behavior: "smooth" });
+
+ await Promise.all(scrollend_promises);
+
+ assert_equals(gesture_scroller.scrollTop, 100,
+ "gesture scroll completed");
+ assert_approx_equals(programmatic_scroller.scrollTop, target.offsetTop,
+ 1, "scrollIntoView completed");
+ }, "scrollIntoView is not interrupted by unrelated gesture scroll");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html
new file mode 100644
index 00000000000..c80dcb04e5c
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>backdrop-filter: Sampled pixels beyond edge should mirror back into the content.</title>
+<link rel="author" href="mailto:flackr@chromium.org">
+
+<div class="clip">
+ <div class="filter">
+ <div class="border"></div>
+ </div>
+</div>
+<div style="position:absolute;top:100px;will-change:transform;">
+ <p>Expected above: A pure white box with a very small hint of the 1px blue border blurred inside.</p>
+</div>
+
+<style>
+.clip {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ top: 8px;
+ left: 8px;
+ overflow: clip;
+}
+.filter {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ top: 0px;
+ left: 0px;
+ filter: blur(10px);
+}
+.border {
+ position: absolute;
+ width: 302px;
+ height: 302px;
+ top: -101px;
+ left: -101px;
+ background:
+ repeating-linear-gradient(0deg, blue 0px, blue 2px, transparent 2px, transparent 100px),
+ repeating-linear-gradient(90deg, blue 0px, blue 2px, transparent 2px, transparent 100px);
+}
+</style>
diff --git a/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html
new file mode 100644
index 00000000000..c11d2f2733e
--- /dev/null
+++ b/tests/wpt/tests/css/filter-effects/backdrop-filter-edge-mirror.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name=fuzzy content="maxDifference=0-10;totalPixels=0-10000">
+<title>backdrop-filter: Sampled pixels beyond edge should mirror back into the content.</title>
+<link rel="author" href="mailto:flackr@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#backdrop-filter-operation">
+<link rel="match" href="backdrop-filter-edge-mirror-ref.html">
+
+<div class="box border"></div>
+<div class="box filter"></div>
+<div style="position:absolute;top:100px;will-change:transform;">
+ <p>Expected above: A pure white box with a very small hint of the 1px blue border blurred inside.</p>
+</div>
+
+<style>
+.box {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ top: 8px;
+ left: 8px;
+ box-sizing: border-box;
+}
+.filter {
+ backdrop-filter: blur(10px);
+}
+.border {
+ border: 1px solid blue;
+}
+</style>
diff --git a/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html b/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html
index ba5212e433b..850533cd262 100644
--- a/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html
+++ b/tests/wpt/tests/digital-credentials/identity-get.tentative.https.html
@@ -26,26 +26,6 @@ async function createIframeAndWaitForMessage(test, iframeUrl) {
return message.data;
}
-// Builds a valid navigator.identity.get() request where IdentityRequestProvider#request is an object.
-function buildValidNavigatorIdentityRequestWithRequestObject() {
- return {
- digital: {
- providers: [{
- protocol: "urn:openid.net:oid4vp",
- request: {
- // Based on https://github.com/openid/OpenID4VP/issues/125
- client_id: "client.example.org",
- client_id_scheme: "web-origin",
- nonce: "n-0S6_WzA2Mj",
- presentation_definition: {
- // Presentation Exchange request, omitted for brevity
- }
- },
- }],
- },
- };
-}
-
// 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=>{
@@ -56,13 +36,6 @@ promise_test(async t=>{
promise_test(async t => {
let request = buildValidNavigatorIdentityRequest();
- let credential = await requestIdentityWithActivation(test_driver, request);
- assert_equals("urn:openid.net:oid4vp", credential.protocol);
- assert_equals("fake_test_token", credential.data);
-}, "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, requestIdentityWithActivation(test_driver, request));
}, "navigator.identity.get() API fails if DigitalCredentialRequestOptions::providers is not specified.");
@@ -73,46 +46,6 @@ promise_test(async t => {
await promise_rejects_js(t, TypeError, requestIdentityWithActivation(test_driver, request));
}, "navigator.identity.get() API fails if there are no providers.");
-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, requestIdentityWithActivation(test_driver, request));
-}, "navigator.identity.get() API fails if there is more than one provider.");
-
-promise_test(async t => {
- const request = buildValidNavigatorIdentityRequestWithRequestObject();
- let credential = await requestIdentityWithActivation(test_driver, request);
- assert_equals("urn:openid.net:oid4vp", credential.protocol);
- assert_equals("fake_test_token", credential.data);
-}, "navigator.identity.get() API succeeds when IdentityRequestProvider#request is an object instead of stringified JSON object");
-
-promise_test(async t => {
- const request = buildValidNavigatorIdentityRequestWithRequestObject();
- const largeList = [];
- for (let i = 0; i < 1000000; ++i) {
- largeList.push("Value " + i);
- }
- request.digital.providers[0].request.random = largeList;
- await promise_rejects_js(t, TypeError, requestIdentityWithActivation(test_driver, request));
-}, "navigator.identity.get() API fails when IdentityRequestProvider#request object is too big");
-
-promise_test(async t=> {
- let abortController = new AbortController();
- let request = buildValidNavigatorIdentityRequest();
- request.signal = abortController.signal;
- let requestPromise = requestIdentityWithActivation(test_driver, request);
- abortController.abort();
- await promise_rejects_dom(t, "AbortError", requestPromise);
-}, "navigator.identity.get() promise is rejected when the page aborts the request.");
-
-promise_test(async t=> {
- const message = await createIframeAndWaitForMessage(
- t, basePath + "support/iframe.html");
- assert_equals(message.result, "Pass");
- assert_equals(message.data, "fake_test_token");
-}, "navigator.identity.get() succeeds in same-origin iframe");
-
promise_test(async t=> {
const message = await createIframeAndWaitForMessage(
t, remoteBaseURL + "support/iframe.html");
diff --git a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html
index 8782b1dfee6..40aa77f4764 100644
--- a/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html
+++ b/tests/wpt/tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html
@@ -108,10 +108,12 @@ function runTest() {
document.body.appendChild(out_div);
await waitForCompositorCommit();
- element_scrollend_arrived = false;
- document_scrollend_arrived = false;
inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" });
- await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, "Nested scrollIntoView did not receive scrollend event.");
+ const scrollend_events = [
+ waitForScrollendEventNoTimeout(out_div),
+ waitForScrollendEventNoTimeout(target_div)
+ ];
+ await Promise.all(scrollend_events);
assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft");
assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop");
assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft");
diff --git a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html
index b2782dbfa9b..932c0a392a3 100644
--- a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html
+++ b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax-innerhtml.tentative.html
@@ -13,9 +13,11 @@
</div>
<script>
+const kChildNodePartStartCommentData = "#";
+const kChildNodePartEndCommentData = "/";
function assertIsComment(node, commentText) {
assert_true(node instanceof Comment);
- // TODO(crbug.com/40271855): While developing alternative syntax, the comment might be empty or it might be "S"/"E".
+ // TODO(crbug.com/40271855): While developing alternative syntax, the comment might be empty or it might be "#" or "/".
assert_true(node.textContent === '' || node.textContent === commentText);
}
@@ -41,13 +43,13 @@ Array.from(document.querySelectorAll('#context_elements>*')).forEach(contextEl =
let expectedRootParts = [{type:'ChildNodePart',metadata:[]}];
assertEqualParts(root.getParts(),expectedRootParts,0,'declarative root missing parts');
const childPart1 = root.getParts()[0];
- assertIsComment(childPart1.previousSibling,'S');
- assertIsComment(childPart1.nextSibling,'E');
+ assertIsComment(childPart1.previousSibling,kChildNodePartStartCommentData);
+ assertIsComment(childPart1.nextSibling,kChildNodePartEndCommentData);
const expectedChild1Parts = [{type:'ChildNodePart',metadata:[]}];
assertEqualParts(childPart1.getParts(),expectedChild1Parts,0,'First level childpart should just have one child part');
const childPart2 = childPart1.getParts()[0];
- assertIsComment(childPart2.previousSibling,'S');
- assertIsComment(childPart2.nextSibling,'E');
+ assertIsComment(childPart2.previousSibling,kChildNodePartStartCommentData);
+ assertIsComment(childPart2.nextSibling,kChildNodePartEndCommentData);
const expectedChild2Parts = [{type:'NodePart',metadata:[]}];
assertEqualParts(childPart2.getParts(),expectedChild2Parts,0,'Second level childpart should have just the node part');
assert_true(childPart2.getParts()[0].node instanceof HTMLSpanElement);
diff --git a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html
index 3a437038737..70fc471bc61 100644
--- a/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html
+++ b/tests/wpt/tests/dom/parts/basic-dom-part-declarative-brace-syntax.tentative.html
@@ -55,14 +55,16 @@
function addPartsCleanup(t,partRoot) {
t.add_cleanup(() => partRoot.getParts().forEach(part => part.disconnect()));
}
+const kChildNodePartStartCommentData = "#";
+const kChildNodePartEndCommentData = "/";
+function assertIsComment(node, commentText) {
+ assert_true(node instanceof Comment);
+ // TODO(crbug.com/40271855): While developing alternative syntax, the comment might be empty or it might be "#" or "/".
+ assert_true(node.textContent === '' || node.textContent === commentText);
+}
const template = document.getElementById('declarative');
['Main Document','Template','Clone','PartClone'].forEach(testCase => {
- function assertIsComment(node,commentText) {
- assert_true(node instanceof Comment);
- assert_equals(node.textContent,commentText);
- }
-
test((t) => {
let doc,target,wrapper,cleanup;
let expectDOMParts = true;
@@ -116,13 +118,13 @@ const template = document.getElementById('declarative');
assert_equals(root.getParts()[i].node,target.querySelector(`#nodepart${i}`));
}
const childPart1 = root.getParts()[0];
- assertIsComment(childPart1.previousSibling,'');
- assertIsComment(childPart1.nextSibling,'');
+ assertIsComment(childPart1.previousSibling,kChildNodePartStartCommentData);
+ assertIsComment(childPart1.nextSibling,kChildNodePartEndCommentData);
const expectedChild1Parts = [{type:'ChildNodePart',metadata:[]}];
assertEqualParts(childPart1.getParts(),expectedChild1Parts,0,'First level childpart should just have one child part');
const childPart2 = childPart1.getParts()[0];
- assertIsComment(childPart2.previousSibling,'');
- assertIsComment(childPart2.nextSibling,'');
+ assertIsComment(childPart2.previousSibling,kChildNodePartStartCommentData);
+ assertIsComment(childPart2.nextSibling,kChildNodePartEndCommentData);
const expectedChild2Parts = [{type:'NodePart',metadata:[]},{type:'AttributePart',metadata:[]}];
assertEqualParts(childPart2.getParts(),expectedChild2Parts,0,'Second level childpart should have NodePart and AttributePart');
assert_true(childPart2.getParts()[0].node instanceof HTMLSpanElement);
diff --git a/tests/wpt/tests/dom/parts/resources/domparts-utils.js b/tests/wpt/tests/dom/parts/resources/domparts-utils.js
index f8982de50f3..d1da9fb0785 100644
--- a/tests/wpt/tests/dom/parts/resources/domparts-utils.js
+++ b/tests/wpt/tests/dom/parts/resources/domparts-utils.js
@@ -1,5 +1,6 @@
function assertEqualParts(parts,partDescriptions,expectedParts,description) {
assert_equals(parts.length,partDescriptions.length,`${description}: lengths differ`);
+ let nodePartIndx = 0, childNodePartIndx = 0;
for(let i=0;i<parts.length;++i) {
assert_true(parts[i] instanceof Part,`${description}: not a Part`);
assert_true(parts[i] instanceof window[partDescriptions[i].type],`${description}: index ${i} expected ${partDescriptions[i].type}`);
@@ -8,7 +9,20 @@ function assertEqualParts(parts,partDescriptions,expectedParts,description) {
if (expectedParts) {
// TODO(crbug.com/40271855): While developing alternative syntax, we aren't comparing equality of the Part objects:
// assert_equals(parts[i],expectedParts[i],`${description}: index ${i} object equality`);
- assert_equals(parts[i].root.getPartNode(i),parts[i].node || parts[i].previousSibling,'getPartNode() should return the same node as getParts().node/previousSibling');
+ if ('getNodePartNodes' in parts[i].root) {
+ switch (partDescriptions[i].type) {
+ case 'NodePart':
+ assert_equals(parts[i].root.getNodePartNodes()[nodePartIndx],parts[i].node,`getNodePartNodes() indx ${nodePartIndx} should match node from NodePart`);
+ nodePartIndx++;
+ break;
+ case 'ChildNodePart':
+ assert_equals(parts[i].root.getChildNodePartNodes()[childNodePartIndx],parts[i].previousSibling,`getChildNodePartNodes() indx ${childNodePartIndx} should match previousSibling from ChildNodePart`);
+ childNodePartIndx++;
+ assert_equals(parts[i].root.getChildNodePartNodes()[childNodePartIndx],parts[i].nextSibling,`getChildNodePartNodes() indx ${childNodePartIndx} should match nextSibling from ChildNodePart`);
+ childNodePartIndx++;
+ break;
+ }
+ }
}
}
}
diff --git a/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html b/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html
index 762ec595475..45fd1613fac 100644
--- a/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html
+++ b/tests/wpt/tests/editing/edit-context/edit-context-input.tentative.html
@@ -244,6 +244,22 @@
assert_true(got_textupdate_event, "Input in iframe EditContext should trigger textupdate event");
iframe.remove();
}, 'EditContext constructed outside iframe can be used in iframe');
+
+ promise_test(async function() {
+ const div = document.createElement("div");
+ const input = document.createElement("input");
+ document.body.appendChild(div);
+ document.body.appendChild(input);
+ const editContext = new EditContext();
+ div.editContext = editContext;
+ div.focus();
+ div.remove();
+ input.focus();
+ await test_driver.send_keys(input, "a");
+ assert_equals(input.value, "a", "input should have received text input");
+
+ input.remove();
+ }, 'Removing EditContext-associated element with focus doesn\'t prevent further text input on the page');
</script>
</body>
</html>
diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts.py b/tests/wpt/tests/fedcm/support/accounts.py
index 126f911a58c..126f911a58c 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/accounts.py
+++ b/tests/wpt/tests/fedcm/support/accounts.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py b/tests/wpt/tests/fedcm/support/accounts_check_same_site_strict.py
index 796ac003cbc..796ac003cbc 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/accounts_check_same_site_strict.py
+++ b/tests/wpt/tests/fedcm/support/accounts_check_same_site_strict.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/accounts_no_approved_clients.py b/tests/wpt/tests/fedcm/support/accounts_no_approved_clients.py
index faea06edc36..faea06edc36 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/accounts_no_approved_clients.py
+++ b/tests/wpt/tests/fedcm/support/accounts_no_approved_clients.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py b/tests/wpt/tests/fedcm/support/client_metadata.py
index 72ddcc5cd62..72ddcc5cd62 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py
+++ b/tests/wpt/tests/fedcm/support/client_metadata.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py.headers b/tests/wpt/tests/fedcm/support/client_metadata.py.headers
index 7164e5f8182..7164e5f8182 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/client_metadata.py.headers
+++ b/tests/wpt/tests/fedcm/support/client_metadata.py.headers
diff --git a/tests/wpt/tests/credential-management/support/fedcm/client_metadata_clear_count.py b/tests/wpt/tests/fedcm/support/client_metadata_clear_count.py
index 3c31bf5077d..0e52d99c1dd 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/client_metadata_clear_count.py
+++ b/tests/wpt/tests/fedcm/support/client_metadata_clear_count.py
@@ -3,7 +3,7 @@ import importlib
keys = importlib.import_module("credential-management.support.fedcm.keys")
def main(request, response):
- client_metadata_url = "/credential-management/support/fedcm/client_metadata.py"
+ client_metadata_url = "/fedcm/support/client_metadata.py"
counter = request.server.stash.take(keys.CLIENT_METADATA_COUNTER_KEY,
client_metadata_url)
diff --git a/tests/wpt/tests/credential-management/support/fedcm/continue_on.py b/tests/wpt/tests/fedcm/support/continue_on.py
index 2a580e0f3f4..2a580e0f3f4 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/continue_on.py
+++ b/tests/wpt/tests/fedcm/support/continue_on.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/disconnect.py b/tests/wpt/tests/fedcm/support/disconnect.py
index cf62ceda225..cf62ceda225 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/disconnect.py
+++ b/tests/wpt/tests/fedcm/support/disconnect.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/disconnect_failure.py b/tests/wpt/tests/fedcm/support/disconnect_failure.py
index f880218b2f6..f880218b2f6 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/disconnect_failure.py
+++ b/tests/wpt/tests/fedcm/support/disconnect_failure.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/error_with_code_and_url.py b/tests/wpt/tests/fedcm/support/error_with_code_and_url.py
index 71bfea00f46..71bfea00f46 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/error_with_code_and_url.py
+++ b/tests/wpt/tests/fedcm/support/error_with_code_and_url.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/login.html b/tests/wpt/tests/fedcm/support/login.html
index 78d241cda95..78d241cda95 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/login.html
+++ b/tests/wpt/tests/fedcm/support/login.html
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest-not-in-list.json b/tests/wpt/tests/fedcm/support/manifest-not-in-list.json
index 00700666675..00700666675 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest-not-in-list.json
+++ b/tests/wpt/tests/fedcm/support/manifest-not-in-list.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest-token-nocors.json b/tests/wpt/tests/fedcm/support/manifest-token-nocors.json
index 77ba1b4702b..77ba1b4702b 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest-token-nocors.json
+++ b/tests/wpt/tests/fedcm/support/manifest-token-nocors.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest.py b/tests/wpt/tests/fedcm/support/manifest.py
index a40fc100eee..a40fc100eee 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest.py
+++ b/tests/wpt/tests/fedcm/support/manifest.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_false.json b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_false.json
index 47ca63edc4f..47ca63edc4f 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_false.json
+++ b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_false.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_true.json b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_true.json
index 7d7004c3cff..7d7004c3cff 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_disclosure_shown_true.json
+++ b/tests/wpt/tests/fedcm/support/manifest_check_disclosure_shown_true.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json b/tests/wpt/tests/fedcm/support/manifest_check_same_site_strict.json
index d7304159834..d7304159834 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_check_same_site_strict.json
+++ b/tests/wpt/tests/fedcm/support/manifest_check_same_site_strict.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_id_assertion_endpoint_returns_error.json b/tests/wpt/tests/fedcm/support/manifest_id_assertion_endpoint_returns_error.json
index e098cc4511a..e098cc4511a 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_id_assertion_endpoint_returns_error.json
+++ b/tests/wpt/tests/fedcm/support/manifest_id_assertion_endpoint_returns_error.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_no_login_url.json b/tests/wpt/tests/fedcm/support/manifest_no_login_url.json
index 15a657c679d..15a657c679d 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_no_login_url.json
+++ b/tests/wpt/tests/fedcm/support/manifest_no_login_url.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_accounts.json b/tests/wpt/tests/fedcm/support/manifest_redirect_accounts.json
index 6a8972feebd..ed9b3c29692 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_accounts.json
+++ b/tests/wpt/tests/fedcm/support/manifest_redirect_accounts.json
@@ -1,5 +1,5 @@
{
- "accounts_endpoint": "/common/redirect.py?location=/credential-management/support/fedcm/accounts.py",
+ "accounts_endpoint": "/common/redirect.py?location=/fedcm/support/accounts.py",
"client_metadata_endpoint": "client_metadata.py",
"id_assertion_endpoint": "token.py",
"login_url": "login.html"
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_token.json b/tests/wpt/tests/fedcm/support/manifest_redirect_token.json
index 867b4dffb76..ba04e890770 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_redirect_token.json
+++ b/tests/wpt/tests/fedcm/support/manifest_redirect_token.json
@@ -1,7 +1,7 @@
{
"accounts_endpoint": "accounts.py",
"client_metadata_endpoint": "client_metadata.py",
- "id_assertion_endpoint": "/common/redirect.py?location=/credential-management/support/fedcm/token.py&status=308",
+ "id_assertion_endpoint": "/common/redirect.py?location=/fedcm/support/token.py&status=308",
"disconnect_endpoint": "disconnect.py",
"login_url": "login.html"
}
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_token_with_http_error.json b/tests/wpt/tests/fedcm/support/manifest_token_with_http_error.json
index 691a1e8d3a6..691a1e8d3a6 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_token_with_http_error.json
+++ b/tests/wpt/tests/fedcm/support/manifest_token_with_http_error.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_auto_selected_flag.json b/tests/wpt/tests/fedcm/support/manifest_with_auto_selected_flag.json
index 591c927153b..591c927153b 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_auto_selected_flag.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_auto_selected_flag.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_continue_on.json b/tests/wpt/tests/fedcm/support/manifest_with_continue_on.json
index d7673c7e1b1..d7673c7e1b1 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_continue_on.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_continue_on.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_cross_origin_disconnect.sub.json b/tests/wpt/tests/fedcm/support/manifest_with_cross_origin_disconnect.sub.json
index a1ad5c71ac3..77d27e33f26 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_cross_origin_disconnect.sub.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_cross_origin_disconnect.sub.json
@@ -2,6 +2,6 @@
"accounts_endpoint": "accounts.py",
"client_metadata_endpoint": "client_metadata.py",
"id_assertion_endpoint": "token.py",
- "disconnect_endpoint": "https://{{hosts[alt][]}}:{{ports[https][0]}}/credential-management/support/fedcm/disconnect.py",
+ "disconnect_endpoint": "https://{{hosts[alt][]}}:{{ports[https][0]}}/fedcm/support/disconnect.py",
"login_url": "login.html"
}
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_disconnect_failure.json b/tests/wpt/tests/fedcm/support/manifest_with_disconnect_failure.json
index 96035e7e8b3..96035e7e8b3 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_disconnect_failure.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_disconnect_failure.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_no_accounts.json b/tests/wpt/tests/fedcm/support/manifest_with_no_accounts.json
index 0d38f26d350..0d38f26d350 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_no_accounts.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_no_accounts.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_rp_mode.json b/tests/wpt/tests/fedcm/support/manifest_with_rp_mode.json
index 5692fd91905..5692fd91905 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_rp_mode.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_rp_mode.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_single_account.json b/tests/wpt/tests/fedcm/support/manifest_with_single_account.json
index 5f9b7a81b9a..5f9b7a81b9a 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_single_account.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_single_account.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_two_accounts.json b/tests/wpt/tests/fedcm/support/manifest_with_two_accounts.json
index 6310fb0a0be..6310fb0a0be 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_two_accounts.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_two_accounts.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json b/tests/wpt/tests/fedcm/support/manifest_with_variable_accounts.json
index 9e4af250045..9e4af250045 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/manifest_with_variable_accounts.json
+++ b/tests/wpt/tests/fedcm/support/manifest_with_variable_accounts.json
diff --git a/tests/wpt/tests/credential-management/support/fedcm/no_accounts.py b/tests/wpt/tests/fedcm/support/no_accounts.py
index 8767c50afb4..8767c50afb4 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/no_accounts.py
+++ b/tests/wpt/tests/fedcm/support/no_accounts.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/resolve.html b/tests/wpt/tests/fedcm/support/resolve.html
index dbdc28c3247..dbdc28c3247 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/resolve.html
+++ b/tests/wpt/tests/fedcm/support/resolve.html
diff --git a/tests/wpt/tests/credential-management/support/fedcm/select_manifest_in_root_manifest.py b/tests/wpt/tests/fedcm/support/select_manifest_in_root_manifest.py
index d4f1efff6a7..d4f1efff6a7 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/select_manifest_in_root_manifest.py
+++ b/tests/wpt/tests/fedcm/support/select_manifest_in_root_manifest.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py b/tests/wpt/tests/fedcm/support/set_accounts_cookie.py
index 15adf11324e..15adf11324e 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/set_accounts_cookie.py
+++ b/tests/wpt/tests/fedcm/support/set_accounts_cookie.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/single_account.py b/tests/wpt/tests/fedcm/support/single_account.py
index 7c8906ae7b9..7c8906ae7b9 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/single_account.py
+++ b/tests/wpt/tests/fedcm/support/single_account.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token.py b/tests/wpt/tests/fedcm/support/token.py
index 7ec81c390a9..7ec81c390a9 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token.py
+++ b/tests/wpt/tests/fedcm/support/token.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_false.py b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_false.py
index a25a14af694..a25a14af694 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_false.py
+++ b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_false.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_true.py b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_true.py
index 00b755b920c..00b755b920c 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_check_disclosure_shown_true.py
+++ b/tests/wpt/tests/fedcm/support/token_check_disclosure_shown_true.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py b/tests/wpt/tests/fedcm/support/token_check_same_site_strict.py
index 4e55bf27f61..4e55bf27f61 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_check_same_site_strict.py
+++ b/tests/wpt/tests/fedcm/support/token_check_same_site_strict.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_account_id.py b/tests/wpt/tests/fedcm/support/token_with_account_id.py
index 04e7b5b56b9..04e7b5b56b9 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_with_account_id.py
+++ b/tests/wpt/tests/fedcm/support/token_with_account_id.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_auto_selected_flag.py b/tests/wpt/tests/fedcm/support/token_with_auto_selected_flag.py
index 3e011ce788c..3e011ce788c 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_with_auto_selected_flag.py
+++ b/tests/wpt/tests/fedcm/support/token_with_auto_selected_flag.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_http_error.py b/tests/wpt/tests/fedcm/support/token_with_http_error.py
index 05b9945ba80..05b9945ba80 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_with_http_error.py
+++ b/tests/wpt/tests/fedcm/support/token_with_http_error.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/token_with_rp_mode.py b/tests/wpt/tests/fedcm/support/token_with_rp_mode.py
index add634c99bb..add634c99bb 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/token_with_rp_mode.py
+++ b/tests/wpt/tests/fedcm/support/token_with_rp_mode.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/two_accounts.py b/tests/wpt/tests/fedcm/support/two_accounts.py
index 4022561ff78..4022561ff78 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/two_accounts.py
+++ b/tests/wpt/tests/fedcm/support/two_accounts.py
diff --git a/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py b/tests/wpt/tests/fedcm/support/variable_accounts.py
index fc4446acc49..fc4446acc49 100644
--- a/tests/wpt/tests/credential-management/support/fedcm/variable_accounts.py
+++ b/tests/wpt/tests/fedcm/support/variable_accounts.py
diff --git a/tests/wpt/tests/fenced-frame/resources/utils.js b/tests/wpt/tests/fenced-frame/resources/utils.js
index 218ac281f65..c4807c58aee 100644
--- a/tests/wpt/tests/fenced-frame/resources/utils.js
+++ b/tests/wpt/tests/fenced-frame/resources/utils.js
@@ -211,7 +211,7 @@ function generateRemoteContextURL(headers, origin) {
// Transform the headers into the expected format.
// https://web-platform-tests.org/writing-tests/server-pipes.html#headers
function escape(s) {
- return s.replace('(', '\\(').replace(')', '\\)');
+ return s.replace('(', '\\(').replace(')', '\\)').replace(',', '\\,');
}
const formatted_headers = headers.map((header) => {
return `header(${escape(header[0])}, ${escape(header[1])})`;
diff --git a/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js
new file mode 100644
index 00000000000..29f58ebe9b1
--- /dev/null
+++ b/tests/wpt/tests/fledge/tentative/get-interest-group-auction-data.https.window.js
@@ -0,0 +1,23 @@
+// META: script=/resources/testdriver.js
+// META: script=/common/utils.js
+// META: script=resources/fledge-util.sub.js
+// META: script=/common/subset-tests.js
+// META: timeout=long
+// META: variant=?1-4
+
+// These tests focus on the navigator.getInterestGroupAdAuctionData() method.
+
+subsetTest(promise_test, async test => {
+ const result = await navigator.getInterestGroupAdAuctionData({ seller: window.location.origin });
+ assert_true(result.requestId !== null);
+ assert_true(result.request.length === 0);
+}, 'getInterestGroupAdAuctionData() with no interest groups returns a zero length result.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(test, uuid);
+
+ const result = await navigator.getInterestGroupAdAuctionData({ seller: window.location.origin });
+ assert_true(result.requestId !== null);
+ assert_true(result.request.length > 0);
+}, 'getInterestGroupAdAuctionData() with one interest group returns a non-zero length result.');
diff --git a/tests/wpt/tests/fullscreen/api/permission.tentative.https.html b/tests/wpt/tests/fullscreen/api/permission.tentative.https.html
new file mode 100644
index 00000000000..34758660b77
--- /dev/null
+++ b/tests/wpt/tests/fullscreen/api/permission.tentative.https.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Permissions API query support for "fullscreen"</title>
+<link rel="help" href="https://github.com/explainers-by-googlers/html-fullscreen-without-a-gesture">
+<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>
+ promise_test(async (test) => {
+ let allowWithoutGestureCalled = false;
+ const status = await navigator.permissions.query({
+ name: "fullscreen",
+ get allowWithoutGesture() {
+ allowWithoutGestureCalled = true;
+ return true;
+ },
+ });
+ assert_true(status instanceof PermissionStatus);
+ assert_equals(status.name, "fullscreen", `name should be "fullscreen"`);
+ assert_true(allowWithoutGestureCalled, `allowWithoutGesture should be checked`);
+ }, `Querying "fullscreen" permission checks "allowWithoutGesture" option`);
+
+ promise_test(async (test) => {
+ const descriptor = { name: "fullscreen", allowWithoutGesture: true };
+ await test_driver.set_permission(descriptor, "granted");
+ const status = await navigator.permissions.query(descriptor);
+ assert_true(status instanceof PermissionStatus);
+ assert_equals(status.name, "fullscreen", `name should be "fullscreen"`);
+ assert_equals(status.state, "granted", `state should be "granted", as set`);
+ }, `Set and query "fullscreen" permission with "allowWithoutGesture" true`);
+
+ promise_test((test) => {
+ const descriptor = { name: "fullscreen", allowWithoutGesture: false };
+ return promise_rejects_js(test, TypeError, navigator.permissions.query(descriptor));
+ }, `Querying "fullscreen" permission with "allowWithoutGesture" false is unsupported`);
+
+</script>
diff --git a/tests/wpt/tests/geolocation/tojson.https.window.js b/tests/wpt/tests/geolocation/tojson.https.window.js
new file mode 100644
index 00000000000..f8cef07a7f0
--- /dev/null
+++ b/tests/wpt/tests/geolocation/tojson.https.window.js
@@ -0,0 +1,51 @@
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+'use strict';
+
+function check_coords(original, json, prefix) {
+ for (const key of [
+ 'accuracy',
+ 'latitude',
+ 'longitude',
+ 'altitude',
+ 'altitudeAccuracy',
+ 'heading',
+ 'speed',
+ 'coords',
+ 'timestamp',
+ ]) {
+ assert_equals(original[key], json[key], `${prefix} ${key} entry does not match its toJSON value`);
+ }
+}
+
+promise_setup(async () => {
+ await test_driver.set_permission({ name: "geolocation" }, "granted");
+
+ if (document.readyState != 'complete') {
+ await new Promise(resolve => {
+ window.addEventListener('load', resolve, {once: true});
+ });
+ }
+}, 'Grant permission and wait for the document to be fully active.');
+
+promise_test(async (t) => {
+ const position = await new Promise((resolve, reject) => {
+ navigator.geolocation.getCurrentPosition(
+ t.step_func((position) => {
+ resolve(position);
+ }),
+ t.step_func((error) => {
+ reject(error.message);
+ }),
+ );
+ });
+
+ assert_equals(typeof(position.toJSON), 'function');
+
+ const json = position.toJSON();
+ assert_equals(position.timestamp, json.timestamp, 'GeolocationPosition timestamp entry does not match its toJSON value');
+ check_coords(position.coords, json.coords, 'GeolocationPosition coords');
+
+ assert_equals(typeof(position.coords.toJSON), 'function');
+ check_coords(position.coords, position.coords.toJSON(), 'GeolocationCoordinates');
+}, 'Test toJSON() in GeolocationPosition and GeolocationCoordinates.');
diff --git a/tests/wpt/tests/html-aam/roles.tentative.html b/tests/wpt/tests/html-aam/roles.tentative.html
index a3eb850497e..3920f2cba9e 100644
--- a/tests/wpt/tests/html-aam/roles.tentative.html
+++ b/tests/wpt/tests/html-aam/roles.tentative.html
@@ -18,6 +18,39 @@
<input type="checkbox" switch data-testname="el-input-checkbox-switch" data-expectedrole="switch" class="ex">
+<!--
+ These thead, tbody, and tfoot role tests are pending spec discussion.
+ See https://github.com/w3c/html-aam/issues/474
+-->
+<table>
+ <thead data-testname="el-thead" data-expectedrole="rowgroup" class="ex">
+ <tr>
+ <th>a</th>
+ <th>b</th>
+ <th>c</th>
+ </tr>
+ </thead>
+ <tbody data-testname="el-tbody" data-expectedrole="rowgroup" class="ex">
+ <tr>
+ <th>1</th>
+ <td>2</td>
+ <td>3</td>
+ </tr>
+ <tr>
+ <th>4</th>
+ <td>5</td>
+ <td>6</td>
+ </tr>
+ </tbody>
+ <tfoot data-testname="el-tfoot" data-expectedrole="rowgroup" class="ex">
+ <tr>
+ <th>x</th>
+ <th>y</th>
+ <th>z</th>
+ </tr>
+ </tfoot>
+</table>
+
<script>
AriaUtils.verifyRolesBySelector(".ex");
</script>
diff --git a/tests/wpt/tests/html-aam/table-roles.html b/tests/wpt/tests/html-aam/table-roles.html
index a81caa3d3f0..8f5033ea811 100644
--- a/tests/wpt/tests/html-aam/table-roles.html
+++ b/tests/wpt/tests/html-aam/table-roles.html
@@ -17,14 +17,14 @@
<table data-testname="el-table" data-expectedrole="table" class="ex">
<caption data-testname="el-caption" data-expectedrole="caption" class="ex">caption</caption>
- <thead data-testname="el-thead" data-expectedrole="rowgroup" class="ex">
+ <thead>
<tr data-testname="el-tr-thead" data-expectedrole="row" class="ex">
<th data-testname="el-th" data-expectedrole="columnheader" class="ex">a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
- <tbody data-testname="el-tbody" data-expectedrole="rowgroup" class="ex">
+ <tbody>
<tr data-testname="el-tr-tbody" data-expectedrole="row" class="ex">
<th data-testname="el-th-in-row" data-expectedrole="rowheader" class="ex">1</th>
<td data-testname="el-td" data-expectedrole="cell" class="ex">2</td>
@@ -36,7 +36,7 @@
<td>6</td>
</tr>
</tbody>
- <tfoot data-testname="el-tfoot" data-expectedrole="rowgroup" class="ex">
+ <tfoot>
<tr>
<th>x</th>
<th>y</th>
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js
new file mode 100644
index 00000000000..c389410d5d3
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addEmbed.window.js
@@ -0,0 +1,40 @@
+// META: title=RemoteContextWrapper addEmbed
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+ // Precondition: Test was loaded from the HTTP_ORIGIN.
+ assert_equals(
+ location.origin, get_host_info()['HTTP_ORIGIN'],
+ 'test window was loaded on HTTP_ORIGIN');
+
+ const rcHelper = new RemoteContextHelper();
+
+ const main = await rcHelper.addWindow();
+
+ const headerName = 'x-wpt-test-header';
+ const headerValue = 'test-escaping()';
+ const iframe = await main.addEmbed(
+ /*extraConfig=*/ {
+ origin: 'HTTP_REMOTE_ORIGIN',
+ scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+ headers: [[headerName, headerValue]],
+ },
+ /*attributes=*/ {id: 'test-id'},
+ );
+
+ await assertSimplestScriptRuns(iframe);
+ await assertFunctionRuns(iframe, () => testFunction(), 'testFunction exists');
+ await assertOriginIsAsExpected(iframe, get_host_info()['HTTP_REMOTE_ORIGIN']);
+ await assertHeaderIsAsExpected(iframe, headerName, headerValue);
+
+ assert_equals(
+ await main.executeScript(() => document.getElementById('test-id').id),
+ 'test-id', 'verify id');
+});
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js
new file mode 100644
index 00000000000..1d83d9a463d
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper-tests/addObject.window.js
@@ -0,0 +1,40 @@
+// META: title=RemoteContextWrapper addObject
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+ // Precondition: Test was loaded from the HTTP_ORIGIN.
+ assert_equals(
+ location.origin, get_host_info()['HTTP_ORIGIN'],
+ 'test window was loaded on HTTP_ORIGIN');
+
+ const rcHelper = new RemoteContextHelper();
+
+ const main = await rcHelper.addWindow();
+
+ const headerName = 'x-wpt-test-header';
+ const headerValue = 'test-escaping()';
+ const iframe = await main.addObject(
+ /*extraConfig=*/ {
+ origin: 'HTTP_REMOTE_ORIGIN',
+ scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+ headers: [[headerName, headerValue]],
+ },
+ /*attributes=*/ {id: 'test-id'},
+ );
+
+ await assertSimplestScriptRuns(iframe);
+ await assertFunctionRuns(iframe, () => testFunction(), 'testFunction exists');
+ await assertOriginIsAsExpected(iframe, get_host_info()['HTTP_REMOTE_ORIGIN']);
+ await assertHeaderIsAsExpected(iframe, headerName, headerValue);
+
+ assert_equals(
+ await main.executeScript(() => document.getElementById('test-id').id),
+ 'test-id', 'verify id');
+});
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
index a7202656c86..fc04f950d28 100644
--- a/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
@@ -271,7 +271,7 @@
*/
function addHeaders(url, headers) {
function escape(s) {
- return s.replace('(', '\\(').replace(')', '\\)');
+ return s.replace('(', '\\(').replace(')', '\\)').replace(',', '\\,');
}
const formattedHeaders = headers.map((header) => {
return `header(${escape(header[0])}, ${escape(header[1])})`;
@@ -288,15 +288,22 @@
function elementExecutorCreator(
remoteContextWrapper, elementName, attributes) {
return url => {
- return remoteContextWrapper.executeScript((url, elementName, attributes) => {
- const el = document.createElement(elementName);
- for (const attribute in attributes) {
- el.setAttribute(attribute, attributes[attribute]);
- }
- el.src = url;
- const parent = elementName == "frame" ? findOrCreateFrameset() : document.body;
- parent.appendChild(el);
- }, [url, elementName, attributes]);
+ return remoteContextWrapper.executeScript(
+ (url, elementName, attributes) => {
+ const el = document.createElement(elementName);
+ for (const attribute in attributes) {
+ el.setAttribute(attribute, attributes[attribute]);
+ }
+ if (elementName == 'object') {
+ el.data = url;
+ } else {
+ el.src = url;
+ }
+ const parent =
+ elementName == 'frame' ? findOrCreateFrameset() : document.body;
+ parent.appendChild(el);
+ },
+ [url, elementName, attributes]);
};
}
@@ -406,7 +413,7 @@
* `frameset` element.
* @param {RemoteContextConfig} [extraConfig]
* @param {[string, string][]} [attributes] A list of pairs of strings
- * of attribute name and value these will be set on the iframe element
+ * of attribute name and value these will be set on the frame element
* when added to the document.
* @returns {Promise<RemoteContextWrapper>} The remote context.
*/
@@ -416,6 +423,37 @@
extraConfig,
});
}
+
+ /**
+ * Adds an `embed` with `src` attribute to the current document.
+ * @param {RemoteContextConfig} [extraConfig]
+ * @param {[string, string][]} [attributes] A list of pairs of strings
+ * of attribute name and value these will be set on the embed element
+ * when added to the document.
+ * @returns {Promise<RemoteContextWrapper>} The remote context.
+ */
+ addEmbed(extraConfig, attributes = {}) {
+ return this.helper.createContext({
+ executorCreator: elementExecutorCreator(this, 'embed', attributes),
+ extraConfig,
+ });
+ }
+
+ /**
+ * Adds an `object` with `data` attribute to the current document.
+ * @param {RemoteContextConfig} [extraConfig]
+ * @param {[string, string][]} [attributes] A list of pairs of strings
+ * of attribute name and value these will be set on the object element
+ * when added to the document.
+ * @returns {Promise<RemoteContextWrapper>} The remote context.
+ */
+ addObject(extraConfig, attributes = {}) {
+ return this.helper.createContext({
+ executorCreator: elementExecutorCreator(this, 'object', attributes),
+ extraConfig,
+ });
+ }
+
/**
* Adds an iframe with `srcdoc` attribute to the current document
* @param {RemoteContextConfig} [extraConfig]
diff --git a/tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html b/tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html
new file mode 100644
index 00000000000..3e46c28104c
--- /dev/null
+++ b/tests/wpt/tests/html/browsers/browsing-the-web/scroll-to-fragid/target-pseudo-after-reinsertion.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=1252507">
+<link rel=help href="https://html.spec.whatwg.org/multipage/browsing-the-web.html#target-element">
+<link rel=help href="https://github.com/whatwg/html/issues/10029">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id=target>target</div>
+
+<script>
+test(() => {
+ const target = document.getElementById('target');
+ window.location.href = '#target';
+ assert_equals(document.querySelector(':target'), target,
+ ':target should match before reinsertion.');
+
+ target.remove();
+ document.body.appendChild(target);
+ assert_equals(document.querySelector(':target'), target,
+ ':target should match after reinsertion.');
+}, ':target should match the target element even after it is removed and reinserted.');
+</script>
diff --git a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html
index f4db40815dc..236f17e6d57 100644
--- a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.cache.html
@@ -19,9 +19,9 @@
var t = async_test("The 2D context doesn't throw with extra getContext arguments (cached)");
_addTest(function(canvas, ctx) {
- _assertDifferent(canvas.getContext('2d', false, {}, [], 1, "2"), null, "canvas.getContext('2d', false, {}, [], 1, \"2\")", "null");
+ _assertDifferent(canvas.getContext('2d', false, {}, [], 1, '2'), null, "canvas.getContext('2d', false, {}, [], 1, '2')", "null");
_assertDifferent(canvas.getContext('2d', 123), null, "canvas.getContext('2d', 123)", "null");
- _assertDifferent(canvas.getContext('2d', "test"), null, "canvas.getContext('2d', \"test\")", "null");
+ _assertDifferent(canvas.getContext('2d', 'test'), null, "canvas.getContext('2d', 'test')", "null");
_assertDifferent(canvas.getContext('2d', undefined), null, "canvas.getContext('2d', undefined)", "null");
_assertDifferent(canvas.getContext('2d', null), null, "canvas.getContext('2d', null)", "null");
_assertDifferent(canvas.getContext('2d', Symbol.hasInstance), null, "canvas.getContext('2d', Symbol.hasInstance)", "null");
diff --git a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html
index 6ae7f787c6a..b0b00ddd78e 100644
--- a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.extraargs.create.html
@@ -19,12 +19,12 @@
var t = async_test("The 2D context doesn't throw with extra getContext arguments (new context)");
_addTest(function(canvas, ctx) {
- _assertDifferent(document.createElement("canvas").getContext('2d', false, {}, [], 1, "2"), null, "document.createElement(\"canvas\").getContext('2d', false, {}, [], 1, \"2\")", "null");
- _assertDifferent(document.createElement("canvas").getContext('2d', 123), null, "document.createElement(\"canvas\").getContext('2d', 123)", "null");
- _assertDifferent(document.createElement("canvas").getContext('2d', "test"), null, "document.createElement(\"canvas\").getContext('2d', \"test\")", "null");
- _assertDifferent(document.createElement("canvas").getContext('2d', undefined), null, "document.createElement(\"canvas\").getContext('2d', undefined)", "null");
- _assertDifferent(document.createElement("canvas").getContext('2d', null), null, "document.createElement(\"canvas\").getContext('2d', null)", "null");
- _assertDifferent(document.createElement("canvas").getContext('2d', Symbol.hasInstance), null, "document.createElement(\"canvas\").getContext('2d', Symbol.hasInstance)", "null");
+ _assertDifferent(document.createElement('canvas').getContext('2d', false, {}, [], 1, "2"), null, "document.createElement('canvas').getContext('2d', false, {}, [], 1, \"2\")", "null");
+ _assertDifferent(document.createElement('canvas').getContext('2d', 123), null, "document.createElement('canvas').getContext('2d', 123)", "null");
+ _assertDifferent(document.createElement('canvas').getContext('2d', "test"), null, "document.createElement('canvas').getContext('2d', \"test\")", "null");
+ _assertDifferent(document.createElement('canvas').getContext('2d', undefined), null, "document.createElement('canvas').getContext('2d', undefined)", "null");
+ _assertDifferent(document.createElement('canvas').getContext('2d', null), null, "document.createElement('canvas').getContext('2d', null)", "null");
+ _assertDifferent(document.createElement('canvas').getContext('2d', Symbol.hasInstance), null, "document.createElement('canvas').getContext('2d', Symbol.hasInstance)", "null");
});
</script>
diff --git a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html
index 5d5edc6864b..18a37a185dd 100644
--- a/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-context/2d.canvas.context.prototype.html
@@ -21,7 +21,6 @@ _addTest(function(canvas, ctx) {
_assertSame(Object.getPrototypeOf(CanvasRenderingContext2D.prototype), Object.prototype, "Object.getPrototypeOf(CanvasRenderingContext2D.prototype)", "Object.prototype");
_assertSame(Object.getPrototypeOf(ctx), CanvasRenderingContext2D.prototype, "Object.getPrototypeOf(ctx)", "CanvasRenderingContext2D.prototype");
- t.done();
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.color.html
index 166732a57b3..795804a4d21 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.color.html
@@ -1,29 +1,26 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.colour</title>
+<title>Canvas test: 2d.canvas.host.initial.color</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>initial.colour</h1>
+<h1>2d.canvas.host.initial.color</h1>
<p class="desc">Initial state is transparent black</p>
-<p class="notes">Output should be transparent black (not transparent anything-else), but manual
-verification can only confirm that it's transparent - it's not possible to make
-the actual blackness visible.
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="initial.colour.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Initial state is transparent black");
_addTest(function(canvas, ctx) {
-_assertPixel(canvas, 20,20, 0,0,0,0);
-
+ _assertPixel(canvas, 20,20, 0,0,0,0);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.clip.html
index ebf52bfa764..86da296dc01 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.clip.html
@@ -1,32 +1,32 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.clip</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.clip</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>initial.reset.clip</h1>
+<h1>2d.canvas.host.initial.reset.clip</h1>
<p class="desc">Resetting the canvas state resets the current clip region</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Resetting the canvas state resets the current clip region");
_addTest(function(canvas, ctx) {
-canvas.width = 100;
-ctx.rect(0, 0, 1, 1);
-ctx.clip();
-canvas.width = 100;
-ctx.fillStyle = '#0f0';
-ctx.fillRect(0, 0, 100, 50);
-_assertPixel(canvas, 20,20, 0,255,0,255);
-
+ canvas.width = 100;
+ ctx.rect(0, 0, 1, 1);
+ ctx.clip();
+ canvas.width = 100;
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 100, 50);
+ _assertPixel(canvas, 20,20, 0,255,0,255);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.different.html
index d55dd250c09..b95527083b0 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.different.html
@@ -1,30 +1,30 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.different</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.different</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>initial.reset.different</h1>
+<h1>2d.canvas.host.initial.reset.different</h1>
<p class="desc">Changing size resets canvas to transparent black</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="initial.reset.different.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Changing size resets canvas to transparent black");
_addTest(function(canvas, ctx) {
-ctx.fillStyle = '#f00';
-ctx.fillRect(0, 0, 50, 50);
-_assertPixel(canvas, 20,20, 255,0,0,255);
-canvas.width = 50;
-_assertPixel(canvas, 20,20, 0,0,0,0);
-
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 50, 50);
+ _assertPixel(canvas, 20,20, 255,0,0,255);
+ canvas.width = 50;
+ _assertPixel(canvas, 20,20, 0,0,0,0);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.gradient.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.gradient.html
index 31b56ec8e9b..de0f19c13c1 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.gradient.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.gradient.html
@@ -1,35 +1,35 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.gradient</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.gradient</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>initial.reset.gradient</h1>
+<h1>2d.canvas.host.initial.reset.gradient</h1>
<p class="desc">Resetting the canvas state does not invalidate any existing gradients</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Resetting the canvas state does not invalidate any existing gradients");
_addTest(function(canvas, ctx) {
-canvas.width = 50;
-var g = ctx.createLinearGradient(0, 0, 100, 0);
-g.addColorStop(0, '#0f0');
-g.addColorStop(1, '#0f0');
-canvas.width = 100;
-ctx.fillStyle = '#f00';
-ctx.fillRect(0, 0, 100, 50);
-ctx.fillStyle = g;
-ctx.fillRect(0, 0, 100, 50);
-_assertPixel(canvas, 50,25, 0,255,0,255);
-
+ canvas.width = 50;
+ var g = ctx.createLinearGradient(0, 0, 100, 0);
+ g.addColorStop(0, '#0f0');
+ g.addColorStop(1, '#0f0');
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.fillStyle = g;
+ ctx.fillRect(0, 0, 100, 50);
+ _assertPixel(canvas, 50,25, 0,255,0,255);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html
index 3525377d2db..6eda186dcbc 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.path.html
@@ -1,31 +1,31 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.path</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.path</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>initial.reset.path</h1>
+<h1>2d.canvas.host.initial.reset.path</h1>
<p class="desc">Resetting the canvas state resets the current path</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="initial.reset.path.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Resetting the canvas state resets the current path");
_addTest(function(canvas, ctx) {
-canvas.width = 100;
-ctx.rect(0, 0, 100, 50);
-canvas.width = 100;
-ctx.fillStyle = '#f00';
-ctx.fill();
-_assertPixel(canvas, 20,20, 0,0,0,0);
-
+ canvas.width = 100;
+ ctx.rect(0, 0, 100, 50);
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fill();
+ _assertPixel(canvas, 20,20, 0,0,0,0);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.pattern.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.pattern.html
index 28f8306d96d..3cb45257a0f 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.pattern.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.pattern.html
@@ -1,35 +1,35 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.pattern</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.pattern</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>initial.reset.pattern</h1>
+<h1>2d.canvas.host.initial.reset.pattern</h1>
<p class="desc">Resetting the canvas state does not invalidate any existing patterns</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Resetting the canvas state does not invalidate any existing patterns");
_addTest(function(canvas, ctx) {
-canvas.width = 30;
-ctx.fillStyle = '#0f0';
-ctx.fillRect(0, 0, 30, 50);
-var p = ctx.createPattern(canvas, 'repeat-x');
-canvas.width = 100;
-ctx.fillStyle = '#f00';
-ctx.fillRect(0, 0, 100, 50);
-ctx.fillStyle = p;
-ctx.fillRect(0, 0, 100, 50);
-_assertPixel(canvas, 50,25, 0,255,0,255);
-
+ canvas.width = 30;
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 30, 50);
+ var p = ctx.createPattern(canvas, 'repeat-x');
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.fillStyle = p;
+ ctx.fillRect(0, 0, 100, 50);
+ _assertPixel(canvas, 50,25, 0,255,0,255);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.same.html
index 1a0872ba2c0..6e2d912af58 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.same.html
@@ -1,31 +1,31 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.same</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.same</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>initial.reset.same</h1>
+<h1>2d.canvas.host.initial.reset.same</h1>
<p class="desc">Setting size (not changing the value) resets canvas to transparent black</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="initial.reset.same.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Setting size (not changing the value) resets canvas to transparent black");
_addTest(function(canvas, ctx) {
-canvas.width = 100;
-ctx.fillStyle = '#f00';
-ctx.fillRect(0, 0, 50, 50);
-_assertPixel(canvas, 20,20, 255,0,0,255);
-canvas.width = 100;
-_assertPixel(canvas, 20,20, 0,0,0,0);
-
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 50, 50);
+ _assertPixel(canvas, 20,20, 255,0,0,255);
+ canvas.width = 100;
+ _assertPixel(canvas, 20,20, 0,0,0,0);
});
</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.transform.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.transform.html
index 36284ba4984..d285785ed2f 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.transform.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.initial.reset.transform.html
@@ -1,31 +1,31 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: initial.reset.transform</title>
+<title>Canvas test: 2d.canvas.host.initial.reset.transform</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>initial.reset.transform</h1>
+<h1>2d.canvas.host.initial.reset.transform</h1>
<p class="desc">Resetting the canvas state resets the current transformation matrix</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Resetting the canvas state resets the current transformation matrix");
_addTest(function(canvas, ctx) {
-canvas.width = 100;
-ctx.scale(0.1, 0.1);
-canvas.width = 100;
-ctx.fillStyle = '#0f0';
-ctx.fillRect(0, 0, 100, 50);
-_assertPixel(canvas, 20,20, 0,255,0,255);
-
+ canvas.width = 100;
+ ctx.scale(0.1, 0.1);
+ canvas.width = 100;
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 100, 50);
+ _assertPixel(canvas, 20,20, 0,255,0,255);
});
</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html
index cbbf32f2e2b..44d92293344 100644
--- a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.readonly.html
@@ -8,7 +8,7 @@
<body class="show_output">
<h1>2d.canvas.host.readonly</h1>
-<p class="desc">CanvasRenderingContext2D.canvas is readonly</p>
+<p class="desc">Canvas objects are readonly</p>
<p class="output">Actual output:</p>
@@ -16,13 +16,13 @@
<ul id="d"></ul>
<script>
-var t = async_test("CanvasRenderingContext2D.canvas is readonly");
+var t = async_test("Canvas objects are readonly");
_addTest(function(canvas, ctx) {
- var c = document.createElement('canvas');
+ var canvas2 = document.createElement('canvas');
var d = ctx.canvas;
- _assertDifferent(c, d, "c", "d");
- ctx.canvas = c;
+ _assertDifferent(canvas2, d, "canvas2", "d");
+ ctx.canvas = canvas2;
_assertSame(ctx.canvas, d, "ctx.canvas", "d");
});
diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html
index 6a4bdb65b08..f7166f99d6c 100644
--- a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.reference.html
@@ -8,7 +8,7 @@
<body class="show_output">
<h1>2d.canvas.host.reference</h1>
-<p class="desc">CanvasRenderingContext2D.canvas refers back to its canvas</p>
+<p class="desc">canvas refers back to its canvas</p>
<p class="output">Actual output:</p>
@@ -16,7 +16,7 @@
<ul id="d"></ul>
<script>
-var t = async_test("CanvasRenderingContext2D.canvas refers back to its canvas");
+var t = async_test("canvas refers back to its canvas");
_addTest(function(canvas, ctx) {
_assertSame(ctx.canvas, canvas, "ctx.canvas", "canvas");
diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html
index acf3f9c7b34..930432a39fe 100644
--- a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.scaled-manual.html
@@ -12,7 +12,7 @@
<p class="output">Actual output:</p>
-<canvas id="c" class="output" width="50" height="25" style="width: 100px; height: 50px"><p class="fallback">FAIL (fallback content)</p></canvas>
+<canvas id="c" class="output" width="50" height="25"style="width: 100px; height: 50px"><p class="fallback">FAIL (fallback content)</p></canvas>
<p class="output expectedtext">Expected output:<p><img src="2d.canvas.host.scaled.png" class="output expected" id="expected" alt="">
<ul id="d"></ul>
<script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.extend.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.default.html
index e17209f455a..c34b085a9b9 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.extend.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.default.html
@@ -1,27 +1,26 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: type.extend</title>
+<title>Canvas test: 2d.canvas.host.size.attributes.default</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>type.extend</h1>
-<p class="desc">HTMLCanvasElement methods can be added, and the new methods used by canvases</p>
+<h1>2d.canvas.host.size.attributes.default</h1>
+<p class="desc">Default width/height when attributes are missing</p>
+
-<p class="notes">Defined in "Web IDL" (draft)
<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("HTMLCanvasElement methods can be added, and the new methods used by canvases");
+var t = async_test("Default width/height when attributes are missing");
_addTest(function(canvas, ctx) {
-window.HTMLCanvasElement.prototype.getZero = function () { return 0; };
-_assertSame(canvas.getZero(), 0, "canvas.getZero()", "0");
-
+ _assertSame(canvas.width, 100, "canvas.width", "100");
+ _assertSame(canvas.height, 50, "canvas.height", "50");
});
</script>
diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.html
new file mode 100644
index 00000000000..38332cc575c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.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.canvas.host.size.attributes.idl</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.canvas.host.size.attributes.idl</h1>
+<p class="desc">Getting/setting width/height IDL attributes</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("Getting/setting width/height IDL attributes");
+_addTest(function(canvas, ctx) {
+
+ canvas.width = '100';
+ canvas.height = '100';
+ _assertSame(canvas.width, 100, "canvas.width", "100");
+ _assertSame(canvas.height, 100, "canvas.height", "100");
+ canvas.width = 301.999;
+ canvas.height = 301.001;
+ _assertSame(canvas.width, 301, "canvas.width", "301");
+ _assertSame(canvas.height, 301, "canvas.height", "301");
+ canvas.width = "+1.5e2";
+ canvas.height = "0x96";
+ _assertSame(canvas.width, 150, "canvas.width", "150");
+ _assertSame(canvas.height, 150, "canvas.height", "150");
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.set.zero.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.set.zero.html
index c09d5cb278a..e142ec684a4 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.set.zero.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.idl.set.zero.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.idl.set.zero</title>
+<title>Canvas test: 2d.canvas.host.size.attributes.idl.set.zero</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>size.attributes.idl.set.zero</h1>
+<h1>2d.canvas.host.size.attributes.idl.set.zero</h1>
<p class="desc">Setting width/height IDL attributes to 0</p>
@@ -19,11 +19,10 @@
var t = async_test("Setting width/height IDL attributes to 0");
_addTest(function(canvas, ctx) {
-canvas.width = 0;
-canvas.height = 0;
-_assertSame(canvas.width, 0, "canvas.width", "0");
-_assertSame(canvas.height, 0, "canvas.height", "0");
-
+ canvas.width = 0;
+ canvas.height = 0;
+ _assertSame(canvas.width, 0, "canvas.width", "0");
+ _assertSame(canvas.height, 0, "canvas.height", "0");
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setcontent.html
index a25c4b784a2..2e2abaef2a7 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setcontent.html
@@ -1,31 +1,30 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.reflect.setcontent</title>
+<title>Canvas test: 2d.canvas.host.size.attributes.reflect.setcontent</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>size.attributes.reflect.setcontent</h1>
+<h1>2d.canvas.host.size.attributes.reflect.setcontent</h1>
<p class="desc">Setting content attributes updates IDL and content attributes</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="size.attributes.reflect.setcontent.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Setting content attributes updates IDL and content attributes");
_addTest(function(canvas, ctx) {
-canvas.setAttribute('width', '120');
-canvas.setAttribute('height', '60');
-_assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'");
-_assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'");
-_assertSame(canvas.width, 120, "canvas.width", "120");
-_assertSame(canvas.height, 60, "canvas.height", "60");
-
+ canvas.setAttribute('width', '120');
+ canvas.setAttribute('height', '60');
+ _assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'");
+ _assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'");
+ _assertSame(canvas.width, 120, "canvas.width", "120");
+ _assertSame(canvas.height, 60, "canvas.height", "60");
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidl.html
index e228276da70..d017070a39e 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidl.html
@@ -1,31 +1,30 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.reflect.setidl</title>
+<title>Canvas test: 2d.canvas.host.size.attributes.reflect.setidl</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>size.attributes.reflect.setidl</h1>
+<h1>2d.canvas.host.size.attributes.reflect.setidl</h1>
<p class="desc">Setting IDL attributes updates IDL and content attributes</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="size.attributes.reflect.setidl.png" class="output expected" id="expected" alt="">
+
<ul id="d"></ul>
<script>
var t = async_test("Setting IDL attributes updates IDL and content attributes");
_addTest(function(canvas, ctx) {
-canvas.width = 120;
-canvas.height = 60;
-_assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'");
-_assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'");
-_assertSame(canvas.width, 120, "canvas.width", "120");
-_assertSame(canvas.height, 60, "canvas.height", "60");
-
+ canvas.width = 120;
+ canvas.height = 60;
+ _assertSame(canvas.width, 120, "canvas.width", "120");
+ _assertSame(canvas.height, 60, "canvas.height", "60");
+ _assertSame(canvas.getAttribute('width'), '120', "canvas.getAttribute('width')", "'120'");
+ _assertSame(canvas.getAttribute('height'), '60', "canvas.getAttribute('height')", "'60'");
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidlzero.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidlzero.html
index 65df3f9f94e..d7747e1f188 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidlzero.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.reflect.setidlzero.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.reflect.setidlzero</title>
+<title>Canvas test: 2d.canvas.host.size.attributes.reflect.setidlzero</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>size.attributes.reflect.setidlzero</h1>
+<h1>2d.canvas.host.size.attributes.reflect.setidlzero</h1>
<p class="desc">Setting IDL attributes to 0 updates IDL and content attributes</p>
@@ -19,13 +19,12 @@
var t = async_test("Setting IDL attributes to 0 updates IDL and content attributes");
_addTest(function(canvas, ctx) {
-canvas.width = 0;
-canvas.height = 0;
-_assertSame(canvas.getAttribute('width'), '0', "canvas.getAttribute('width')", "'0'");
-_assertSame(canvas.getAttribute('height'), '0', "canvas.getAttribute('height')", "'0'");
-_assertSame(canvas.width, 0, "canvas.width", "0");
-_assertSame(canvas.height, 0, "canvas.height", "0");
-
+ canvas.width = 0;
+ canvas.height = 0;
+ _assertSame(canvas.getAttribute('width'), '0', "canvas.getAttribute('width')", "'0'");
+ _assertSame(canvas.getAttribute('height'), '0', "canvas.getAttribute('height')", "'0'");
+ _assertSame(canvas.width, 0, "canvas.width", "0");
+ _assertSame(canvas.height, 0, "canvas.height", "0");
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.removed.html
index c96cba7b175..15cf17cbead 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.attributes.removed.html
@@ -1,28 +1,27 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.removed</title>
+<title>Canvas test: 2d.canvas.host.size.attributes.removed</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>size.attributes.removed</h1>
+<h1>2d.canvas.host.size.attributes.removed</h1>
<p class="desc">Removing content attributes reverts to default size</p>
<p class="output">Actual output:</p>
-<canvas id="c" class="output" width="120" height="60"><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="size.attributes.removed.png" class="output expected" id="expected" alt="">
+<canvas id="c" class="output" width="120" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
<ul id="d"></ul>
<script>
var t = async_test("Removing content attributes reverts to default size");
_addTest(function(canvas, ctx) {
-_assertSame(canvas.width, 120, "canvas.width", "120");
-canvas.removeAttribute('width');
-_assertSame(canvas.width, 300, "canvas.width", "300");
-
+ _assertSame(canvas.width, 120, "canvas.width", "120");
+ canvas.removeAttribute('width');
+ _assertSame(canvas.width, 300, "canvas.width", "300");
});
</script>
diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html
new file mode 100644
index 00000000000..8711657f13c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.canvas.host.size.invalid.attributes.idl</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.canvas.host.size.invalid.attributes.idl</h1>
+<p class="desc">Getting/setting width/height IDL attributes</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("Getting/setting width/height IDL attributes");
+_addTest(function(canvas, ctx) {
+
+ canvas.width = 200 - Math.pow(2, 32);
+ canvas.height = 200 - Math.pow(2, 32);
+ _assertSame(canvas.width, 200, "canvas.width", "200");
+ _assertSame(canvas.height, 200, "canvas.height", "200");
+ canvas.width = '400x';
+ canvas.height = 'foo';
+ _assertSame(canvas.width, 0, "canvas.width", "0");
+ _assertSame(canvas.height, 0, "canvas.height", "0");
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html
new file mode 100644
index 00000000000..039949cfd01
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.size.large.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.canvas.host.size.large</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.canvas.host.size.large</h1>
+<p class="desc"></p>
+
+<p class="notes">Not sure how reasonable this is, but the spec doesn't say there's an upper limit on the size.
+<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("");
+_addTest(function(canvas, ctx) {
+
+ var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long"
+ canvas.width = n;
+ canvas.height = n;
+ _assertSame(canvas.width, n, "canvas.width", "n");
+ _assertSame(canvas.height, n, "canvas.height", "n");
+
+});
+</script>
+
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.delete.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.delete.html
index 7fd54b30d53..90f5c4ce903 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.delete.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.delete.html
@@ -1,16 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: type.delete</title>
+<title>Canvas test: 2d.canvas.host.type.delete</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>type.delete</h1>
+<h1>2d.canvas.host.type.delete</h1>
<p class="desc">window.HTMLCanvasElement interface object is [[Configurable]]</p>
-<p class="notes">Defined in "Web IDL" (draft)
+
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
@@ -19,9 +19,8 @@
var t = async_test("window.HTMLCanvasElement interface object is [[Configurable]]");
_addTest(function(canvas, ctx) {
-_assertSame(delete window.HTMLCanvasElement, true, "delete window.HTMLCanvasElement", "true");
-_assertSame(window.HTMLCanvasElement, undefined, "window.HTMLCanvasElement", "undefined");
-
+ _assertSame(delete window.HTMLCanvasElement, true, "delete window.HTMLCanvasElement", "true");
+ _assertSame(window.HTMLCanvasElement, undefined, "window.HTMLCanvasElement", "undefined");
});
</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.name.html b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.name.html
index fdf1d1d3988..c0f93876c32 100644
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.name.html
+++ b/tests/wpt/tests/html/canvas/element/canvas-host/2d.canvas.host.type.name.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: type.name</title>
+<title>Canvas test: 2d.canvas.host.type.name</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>type.name</h1>
+<h1>2d.canvas.host.type.name</h1>
<p class="desc">HTMLCanvasElement type and toString</p>
@@ -19,8 +19,7 @@
var t = async_test("HTMLCanvasElement type and toString");
_addTest(function(canvas, ctx) {
-_assertSame(Object.prototype.toString.call(canvas), '[object HTMLCanvasElement]', "Object.prototype.toString.call(canvas)", "'[object HTMLCanvasElement]'");
-
+ _assertSame(Object.prototype.toString.call(canvas), '[object HTMLCanvasElement]', "Object.prototype.toString.call(canvas)", "'[object HTMLCanvasElement]'");
});
</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html
index 41b5cfee311..21f35515a53 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.html
@@ -20,8 +20,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- _assertDifferent(offscreenCanvas2.getContext('2d'), null, "offscreenCanvas2.getContext('2d')", "null");
+ _assertDifferent(canvas.getContext('2d'), null, "canvas.getContext('2d')", "null");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js
index 77a43530a04..f56aff7e129 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.exists.worker.js
@@ -16,8 +16,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- _assertDifferent(offscreenCanvas2.getContext('2d'), null, "offscreenCanvas2.getContext('2d')", "null");
+ _assertDifferent(canvas.getContext('2d'), null, "canvas.getContext('2d')", "null");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html
index 2bcf34490ea..42f29e4fe90 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.html
@@ -20,9 +20,9 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- _assertDifferent(canvas.getContext('2d', false, {}, [], 1, "2"), null, "canvas.getContext('2d', false, {}, [], 1, \"2\")", "null");
+ _assertDifferent(canvas.getContext('2d', false, {}, [], 1, '2'), null, "canvas.getContext('2d', false, {}, [], 1, '2')", "null");
_assertDifferent(canvas.getContext('2d', 123), null, "canvas.getContext('2d', 123)", "null");
- _assertDifferent(canvas.getContext('2d', "test"), null, "canvas.getContext('2d', \"test\")", "null");
+ _assertDifferent(canvas.getContext('2d', 'test'), null, "canvas.getContext('2d', 'test')", "null");
_assertDifferent(canvas.getContext('2d', undefined), null, "canvas.getContext('2d', undefined)", "null");
_assertDifferent(canvas.getContext('2d', null), null, "canvas.getContext('2d', null)", "null");
_assertDifferent(canvas.getContext('2d', Symbol.hasInstance), null, "canvas.getContext('2d', Symbol.hasInstance)", "null");
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js
index 14284a0a7d7..f508d5262e0 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.cache.worker.js
@@ -16,9 +16,9 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- _assertDifferent(canvas.getContext('2d', false, {}, [], 1, "2"), null, "canvas.getContext('2d', false, {}, [], 1, \"2\")", "null");
+ _assertDifferent(canvas.getContext('2d', false, {}, [], 1, '2'), null, "canvas.getContext('2d', false, {}, [], 1, '2')", "null");
_assertDifferent(canvas.getContext('2d', 123), null, "canvas.getContext('2d', 123)", "null");
- _assertDifferent(canvas.getContext('2d', "test"), null, "canvas.getContext('2d', \"test\")", "null");
+ _assertDifferent(canvas.getContext('2d', 'test'), null, "canvas.getContext('2d', 'test')", "null");
_assertDifferent(canvas.getContext('2d', undefined), null, "canvas.getContext('2d', undefined)", "null");
_assertDifferent(canvas.getContext('2d', null), null, "canvas.getContext('2d', null)", "null");
_assertDifferent(canvas.getContext('2d', Symbol.hasInstance), null, "canvas.getContext('2d', Symbol.hasInstance)", "null");
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html
index 029122355c9..199f5b82edf 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.html
@@ -20,12 +20,12 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, \"2\")", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', 123), null, "(new OffscreenCanvas(100, 50)).getContext('2d', 123)", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', "test"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', \"test\")", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', undefined), null, "(new OffscreenCanvas(100, 50)).getContext('2d', undefined)", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', null), null, "(new OffscreenCanvas(100, 50)).getContext('2d', null)", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance), null, "(new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, "2"), null, "new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, \"2\")", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', 123), null, "new OffscreenCanvas(100, 50).getContext('2d', 123)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', "test"), null, "new OffscreenCanvas(100, 50).getContext('2d', \"test\")", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', undefined), null, "new OffscreenCanvas(100, 50).getContext('2d', undefined)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', null), null, "new OffscreenCanvas(100, 50).getContext('2d', null)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance), null, "new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance)", "null");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js
index b4208edba8c..d1bfbcc683c 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.extraargs.create.worker.js
@@ -16,12 +16,12 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, \"2\")", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', 123), null, "(new OffscreenCanvas(100, 50)).getContext('2d', 123)", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', "test"), null, "(new OffscreenCanvas(100, 50)).getContext('2d', \"test\")", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', undefined), null, "(new OffscreenCanvas(100, 50)).getContext('2d', undefined)", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', null), null, "(new OffscreenCanvas(100, 50)).getContext('2d', null)", "null");
- _assertDifferent((new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance), null, "(new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, "2"), null, "new OffscreenCanvas(100, 50).getContext('2d', false, {}, [], 1, \"2\")", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', 123), null, "new OffscreenCanvas(100, 50).getContext('2d', 123)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', "test"), null, "new OffscreenCanvas(100, 50).getContext('2d', \"test\")", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', undefined), null, "new OffscreenCanvas(100, 50).getContext('2d', undefined)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', null), null, "new OffscreenCanvas(100, 50).getContext('2d', null)", "null");
+ _assertDifferent(new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance), null, "new OffscreenCanvas(100, 50).getContext('2d', Symbol.hasInstance)", "null");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html
new file mode 100644
index 00000000000..ce71d4cf30f
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.canvas.context.invalid.args</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.canvas.context.invalid.args</h1>
+<p class="desc">Calling getContext with invalid arguments.</p>
+
+
+<script>
+var t = async_test("Calling getContext with invalid arguments.");
+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() { canvas.getContext(''); });
+ assert_throws_js(TypeError, function() { canvas.getContext('This is not an implemented context in any real browser'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2d#'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2d\0'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2\uFF44'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2D'); });
+ assert_throws_js(TypeError, function() { canvas.getContext(); });
+ assert_throws_js(TypeError, function() { canvas.getContext('null'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('undefined'); });
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js
new file mode 100644
index 00000000000..faea21714d5
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.invalid.args.worker.js
@@ -0,0 +1,30 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.canvas.context.invalid.args
+// Description:Calling getContext with invalid arguments.
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Calling getContext with invalid arguments.");
+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() { canvas.getContext(''); });
+ assert_throws_js(TypeError, function() { canvas.getContext('This is not an implemented context in any real browser'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2d#'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2d\0'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2\uFF44'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('2D'); });
+ assert_throws_js(TypeError, function() { canvas.getContext(); });
+ assert_throws_js(TypeError, function() { canvas.getContext('null'); });
+ assert_throws_js(TypeError, function() { canvas.getContext('undefined'); });
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html
new file mode 100644
index 00000000000..17e5f089464
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.canvas.context.prototype</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.canvas.context.prototype</h1>
+<p class="desc">checks OffscreenCanvasRenderingContext2D prototype</p>
+
+
+<script>
+var t = async_test("checks OffscreenCanvasRenderingContext2D prototype");
+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');
+
+ _assertSame(Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype), Object.prototype, "Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype)", "Object.prototype");
+ _assertSame(Object.getPrototypeOf(ctx), OffscreenCanvasRenderingContext2D.prototype, "Object.getPrototypeOf(ctx)", "OffscreenCanvasRenderingContext2D.prototype");
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js
new file mode 100644
index 00000000000..dd41239d00c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.prototype.worker.js
@@ -0,0 +1,23 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.canvas.context.prototype
+// Description:checks OffscreenCanvasRenderingContext2D prototype
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("checks OffscreenCanvasRenderingContext2D prototype");
+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');
+
+ _assertSame(Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype), Object.prototype, "Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype)", "Object.prototype");
+ _assertSame(Object.getPrototypeOf(ctx), OffscreenCanvasRenderingContext2D.prototype, "Object.getPrototypeOf(ctx)", "OffscreenCanvasRenderingContext2D.prototype");
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html
index 0ce3d4195e0..96b35d86fa1 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.html
@@ -1,16 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.nullsuffix</title>
+<title>OffscreenCanvas test: 2d.canvas.context.type.exists</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/html/canvas/resources/canvas-tests.js"></script>
-<h1>2d.canvas.context.unrecognised.nullsuffix</h1>
-<p class="desc">Context name "2d" plus a "\0" suffix is unrecognised</p>
-
+<h1>2d.canvas.context.type.exists</h1>
+<p class="desc">The 2D context interface is a property of 'window'</p>
+<p class="notes">Defined in "Web IDL" (draft)
<script>
-var t = async_test("Context name \"2d\" plus a \"\\0\" suffix is unrecognised");
+var t = async_test("The 2D context interface is a property of 'window'");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -20,8 +20,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d\0"); });
+ _assert(window.OffscreenCanvasRenderingContext2D, "window.OffscreenCanvasRenderingContext2D");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.worker.js
index 46e562dd486..239c3e902ea 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.exists.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.canvas.context.unrecognised.unicode
-// Description:Context name which kind of looks like "2d" is unrecognised
-// Note:
+// OffscreenCanvas test in a worker:2d.canvas.context.type.exists
+// Description:The 2D context interface is a property of 'self'
+// Note:<p class="notes">Defined in "Web IDL" (draft)
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
-var t = async_test("Context name which kind of looks like \"2d\" is unrecognised");
+var t = async_test("The 2D context interface is a property of 'self'");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -16,8 +16,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2\uFF44"); });
+ _assert(self.OffscreenCanvasRenderingContext2D, "self.OffscreenCanvasRenderingContext2D");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html
new file mode 100644
index 00000000000..a3f720c7462
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.canvas.context.type.extend</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.canvas.context.type.extend</h1>
+<p class="desc">Interface methods can be added</p>
+
+<p class="notes">Defined in "Web IDL" (draft)
+<script>
+var t = async_test("Interface methods can be added");
+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');
+
+ window.OffscreenCanvasRenderingContext2D.prototype.fillRectGreen = function (x, y, w, h)
+ {
+ this.fillStyle = '#0f0';
+ this.fillRect(x, y, w, h);
+ };
+ ctx.fillStyle = '#f00';
+ ctx.fillRectGreen(0, 0, 100, 50);
+ _assertPixel(canvas, 50,25, 0,255,0,255);
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js
new file mode 100644
index 00000000000..9832c5ca77f
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.extend.worker.js
@@ -0,0 +1,29 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.canvas.context.type.extend
+// Description:Interface methods can be added
+// Note:<p class="notes">Defined in "Web IDL" (draft)
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Interface methods can be added");
+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');
+
+ self.OffscreenCanvasRenderingContext2D.prototype.fillRectGreen = function (x, y, w, h)
+ {
+ this.fillStyle = '#0f0';
+ this.fillRect(x, y, w, h);
+ };
+ ctx.fillStyle = '#f00';
+ ctx.fillRectGreen(0, 0, 100, 50);
+ _assertPixel(canvas, 50,25, 0,255,0,255);
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html
new file mode 100644
index 00000000000..d08193c0def
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.canvas.context.type.prototype</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.canvas.context.type.prototype</h1>
+<p class="desc">window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]].</p>
+
+<p class="notes">Defined in "Web IDL" (draft)
+<script>
+var t = async_test("window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]].");
+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(window.OffscreenCanvasRenderingContext2D.prototype, "window.OffscreenCanvasRenderingContext2D.prototype");
+ _assert(window.OffscreenCanvasRenderingContext2D.prototype.fill, "window.OffscreenCanvasRenderingContext2D.prototype.fill");
+ window.OffscreenCanvasRenderingContext2D.prototype = null;
+ _assert(window.OffscreenCanvasRenderingContext2D.prototype, "window.OffscreenCanvasRenderingContext2D.prototype");
+ delete window.OffscreenCanvasRenderingContext2D.prototype;
+ _assert(window.OffscreenCanvasRenderingContext2D.prototype, "window.OffscreenCanvasRenderingContext2D.prototype");
+ window.OffscreenCanvasRenderingContext2D.prototype.fill = 1;
+ _assertSame(window.OffscreenCanvasRenderingContext2D.prototype.fill, 1, "window.OffscreenCanvasRenderingContext2D.prototype.fill", "1");
+ delete window.OffscreenCanvasRenderingContext2D.prototype.fill;
+ _assertSame(window.OffscreenCanvasRenderingContext2D.prototype.fill, undefined, "window.OffscreenCanvasRenderingContext2D.prototype.fill", "undefined");
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js
new file mode 100644
index 00000000000..459975d32d2
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.prototype.worker.js
@@ -0,0 +1,31 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.canvas.context.type.prototype
+// Description:window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]].
+// Note:<p class="notes">Defined in "Web IDL" (draft)
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]], and its methods are [[Configurable]].");
+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(self.OffscreenCanvasRenderingContext2D.prototype, "self.OffscreenCanvasRenderingContext2D.prototype");
+ _assert(self.OffscreenCanvasRenderingContext2D.prototype.fill, "self.OffscreenCanvasRenderingContext2D.prototype.fill");
+ self.OffscreenCanvasRenderingContext2D.prototype = null;
+ _assert(self.OffscreenCanvasRenderingContext2D.prototype, "self.OffscreenCanvasRenderingContext2D.prototype");
+ delete self.OffscreenCanvasRenderingContext2D.prototype;
+ _assert(self.OffscreenCanvasRenderingContext2D.prototype, "self.OffscreenCanvasRenderingContext2D.prototype");
+ self.OffscreenCanvasRenderingContext2D.prototype.fill = 1;
+ _assertSame(self.OffscreenCanvasRenderingContext2D.prototype.fill, 1, "self.OffscreenCanvasRenderingContext2D.prototype.fill", "1");
+ delete self.OffscreenCanvasRenderingContext2D.prototype.fill;
+ _assertSame(self.OffscreenCanvasRenderingContext2D.prototype.fill, undefined, "self.OffscreenCanvasRenderingContext2D.prototype.fill", "undefined");
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html
new file mode 100644
index 00000000000..69b22412fa5
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.canvas.context.type.replace</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.canvas.context.type.replace</h1>
+<p class="desc">Interface methods can be overridden</p>
+
+<p class="notes">Defined in "Web IDL" (draft)
+<script>
+var t = async_test("Interface methods can be overridden");
+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');
+
+ var fillRect = window.OffscreenCanvasRenderingContext2D.prototype.fillRect;
+ window.OffscreenCanvasRenderingContext2D.prototype.fillRect = function (x, y, w, h)
+ {
+ this.fillStyle = '#0f0';
+ fillRect.call(this, x, y, w, h);
+ };
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ _assertPixel(canvas, 50,25, 0,255,0,255);
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js
new file mode 100644
index 00000000000..e6793d1bf56
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.type.replace.worker.js
@@ -0,0 +1,30 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.canvas.context.type.replace
+// Description:Interface methods can be overridden
+// Note:<p class="notes">Defined in "Web IDL" (draft)
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Interface methods can be overridden");
+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');
+
+ var fillRect = self.OffscreenCanvasRenderingContext2D.prototype.fillRect;
+ self.OffscreenCanvasRenderingContext2D.prototype.fillRect = function (x, y, w, h)
+ {
+ this.fillStyle = '#0f0';
+ fillRect.call(this, x, y, w, h);
+ };
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ _assertPixel(canvas, 50,25, 0,255,0,255);
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html
index 66e4a049baa..828817bfbf4 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.html
@@ -20,8 +20,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- _assertSame(offscreenCanvas2.getContext('2d'), offscreenCanvas2.getContext('2d'), "offscreenCanvas2.getContext('2d')", "offscreenCanvas2.getContext('2d')");
+ _assertSame(canvas.getContext('2d'), canvas.getContext('2d'), "canvas.getContext('2d')", "canvas.getContext('2d')");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js
index 275e45fde64..90687bfd07e 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unique.worker.js
@@ -16,8 +16,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- _assertSame(offscreenCanvas2.getContext('2d'), offscreenCanvas2.getContext('2d'), "offscreenCanvas2.getContext('2d')", "offscreenCanvas2.getContext('2d')");
+ _assertSame(canvas.getContext('2d'), canvas.getContext('2d'), "canvas.getContext('2d')", "canvas.getContext('2d')");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html
deleted file mode 100644
index 4313f408437..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.badname</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/html/canvas/resources/canvas-tests.js"></script>
-
-<h1>2d.canvas.context.unrecognised.badname</h1>
-<p class="desc">getContext with unrecognised context name returns null</p>
-
-
-<script>
-var t = async_test("getContext with unrecognised context name returns null");
-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');
-
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext('This is not an implemented context in any real browser'); });
- t.done();
-
-});
-</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js
deleted file mode 100644
index dd16f2fbe11..00000000000
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badname.worker.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
-// OffscreenCanvas test in a worker:2d.canvas.context.unrecognised.badname
-// Description:getContext with unrecognised context name returns null
-// Note:
-
-importScripts("/resources/testharness.js");
-importScripts("/html/canvas/resources/canvas-tests.js");
-
-var t = async_test("getContext with unrecognised context name returns null");
-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');
-
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext('This is not an implemented context in any real browser'); });
- t.done();
-});
-done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html
index 0e7e10cd242..93262a6cc87 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.html
@@ -6,11 +6,11 @@
<script src="/html/canvas/resources/canvas-tests.js"></script>
<h1>2d.canvas.host.readonly</h1>
-<p class="desc">canvas is readonly</p>
+<p class="desc">Canvas objects are readonly</p>
<script>
-var t = async_test("canvas is readonly");
+var t = async_test("Canvas objects are readonly");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -20,10 +20,10 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
+ var canvas2 = new OffscreenCanvas(100, 50);
var d = ctx.canvas;
- _assertDifferent(offscreenCanvas2, d, "offscreenCanvas2", "d");
- ctx.canvas = offscreenCanvas2;
+ _assertDifferent(canvas2, d, "canvas2", "d");
+ ctx.canvas = canvas2;
_assertSame(ctx.canvas, d, "ctx.canvas", "d");
t.done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js
index bbe50dcf61f..5baef1b3740 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.readonly.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.canvas.host.readonly
-// Description:canvas is readonly
+// Description:Canvas objects are readonly
// Note:
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
-var t = async_test("canvas is readonly");
+var t = async_test("Canvas objects are readonly");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -16,10 +16,10 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
+ var canvas2 = new OffscreenCanvas(100, 50);
var d = ctx.canvas;
- _assertDifferent(offscreenCanvas2, d, "offscreenCanvas2", "d");
- ctx.canvas = offscreenCanvas2;
+ _assertDifferent(canvas2, d, "canvas2", "d");
+ ctx.canvas = canvas2;
_assertSame(ctx.canvas, d, "ctx.canvas", "d");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html
index 7030103524c..b8ce99afdfd 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.html
@@ -20,22 +20,18 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- canvas.width = "100";
- canvas.height = "100";
+ canvas.width = '100';
+ canvas.height = '100';
_assertSame(canvas.width, 100, "canvas.width", "100");
_assertSame(canvas.height, 100, "canvas.height", "100");
- canvas.width = "+1.5e2";
- canvas.height = "0x96";
- _assertSame(canvas.width, 150, "canvas.width", "150");
- _assertSame(canvas.height, 150, "canvas.height", "150");
canvas.width = 301.999;
canvas.height = 301.001;
_assertSame(canvas.width, 301, "canvas.width", "301");
_assertSame(canvas.height, 301, "canvas.height", "301");
- assert_throws_js(TypeError, function() { canvas.width = "400x"; });
- assert_throws_js(TypeError, function() { canvas.height = "foo"; });
- _assertSame(canvas.width, 301, "canvas.width", "301");
- _assertSame(canvas.height, 301, "canvas.height", "301");
+ canvas.width = "+1.5e2";
+ canvas.height = "0x96";
+ _assertSame(canvas.width, 150, "canvas.width", "150");
+ _assertSame(canvas.height, 150, "canvas.height", "150");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js
index a00201f18cc..42002e8355f 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.attributes.idl.worker.js
@@ -16,22 +16,18 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- canvas.width = "100";
- canvas.height = "100";
+ canvas.width = '100';
+ canvas.height = '100';
_assertSame(canvas.width, 100, "canvas.width", "100");
_assertSame(canvas.height, 100, "canvas.height", "100");
- canvas.width = "+1.5e2";
- canvas.height = "0x96";
- _assertSame(canvas.width, 150, "canvas.width", "150");
- _assertSame(canvas.height, 150, "canvas.height", "150");
canvas.width = 301.999;
canvas.height = 301.001;
_assertSame(canvas.width, 301, "canvas.width", "301");
_assertSame(canvas.height, 301, "canvas.height", "301");
- assert_throws_js(TypeError, function() { canvas.width = "400x"; });
- assert_throws_js(TypeError, function() { canvas.height = "foo"; });
- _assertSame(canvas.width, 301, "canvas.width", "301");
- _assertSame(canvas.height, 301, "canvas.height", "301");
+ canvas.width = "+1.5e2";
+ canvas.height = "0x96";
+ _assertSame(canvas.width, 150, "canvas.width", "150");
+ _assertSame(canvas.height, 150, "canvas.height", "150");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html
new file mode 100644
index 00000000000..2194de929c5
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.canvas.host.size.invalid.attributes.idl</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.canvas.host.size.invalid.attributes.idl</h1>
+<p class="desc">Getting/setting width/height IDL attributes</p>
+
+
+<script>
+var t = async_test("Getting/setting width/height IDL attributes");
+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() { canvas.width = 200 - Math.pow(2, 32); });
+ assert_throws_js(TypeError, function() { canvas.height = 200 - Math.pow(2, 32); });
+ assert_throws_js(TypeError, function() { canvas.width = '400x'; });
+ assert_throws_js(TypeError, function() { canvas.height = 'foo'; });
+ t.done();
+
+});
+</script>
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js
new file mode 100644
index 00000000000..8adb7a514c5
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.size.invalid.attributes.idl.worker.js
@@ -0,0 +1,25 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.canvas.host.size.invalid.attributes.idl
+// Description:Getting/setting width/height IDL attributes
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("Getting/setting width/height IDL attributes");
+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() { canvas.width = 200 - Math.pow(2, 32); });
+ assert_throws_js(TypeError, function() { canvas.height = 200 - Math.pow(2, 32); });
+ assert_throws_js(TypeError, function() { canvas.width = '400x'; });
+ assert_throws_js(TypeError, function() { canvas.height = 'foo'; });
+ t.done();
+});
+done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html
index 316123675ad..1d2a733ada7 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.unicode.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.html
@@ -1,16 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.unicode</title>
+<title>OffscreenCanvas test: 2d.canvas.host.type.delete</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/html/canvas/resources/canvas-tests.js"></script>
-<h1>2d.canvas.context.unrecognised.unicode</h1>
-<p class="desc">Context name which kind of looks like "2d" is unrecognised</p>
+<h1>2d.canvas.host.type.delete</h1>
+<p class="desc">OffscreenCanvas interface object is [[Configurable]]</p>
<script>
-var t = async_test("Context name which kind of looks like \"2d\" is unrecognised");
+var t = async_test("OffscreenCanvas interface object is [[Configurable]]");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -20,8 +20,8 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2\uFF44"); });
+ _assertSame(delete window.OffscreenCanvas, true, "delete window.OffscreenCanvas", "true");
+ _assertSame(window.OffscreenCanvas, undefined, "window.OffscreenCanvas", "undefined");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.worker.js
index 2886010fb64..409e12cd0d0 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.nullsuffix.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.delete.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.canvas.context.unrecognised.nullsuffix
-// Description:Context name "2d" plus a "\0" suffix is unrecognised
+// OffscreenCanvas test in a worker:2d.canvas.host.type.delete
+// Description:OffscreenCanvas interface object is [[Configurable]]
// Note:
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
-var t = async_test("Context name \"2d\" plus a \"\\0\" suffix is unrecognised");
+var t = async_test("OffscreenCanvas interface object is [[Configurable]]");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -16,8 +16,8 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d\0"); });
+ _assertSame(delete self.OffscreenCanvas, true, "delete self.OffscreenCanvas", "true");
+ _assertSame(self.OffscreenCanvas, undefined, "self.OffscreenCanvas", "undefined");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html
index c00afa686ed..5f48c09eaac 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.html
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.html
@@ -1,16 +1,16 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>OffscreenCanvas test: 2d.canvas.context.unrecognised.badsuffix</title>
+<title>OffscreenCanvas test: 2d.canvas.host.type.name</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/html/canvas/resources/canvas-tests.js"></script>
-<h1>2d.canvas.context.unrecognised.badsuffix</h1>
-<p class="desc">Context name "2d" plus a suffix is unrecognised</p>
+<h1>2d.canvas.host.type.name</h1>
+<p class="desc">OffscreenCanvas type and toString</p>
<script>
-var t = async_test("Context name \"2d\" plus a suffix is unrecognised");
+var t = async_test("OffscreenCanvas type and toString");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -20,8 +20,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d#"); });
+ _assertSame(Object.prototype.toString.call(canvas), '[object OffscreenCanvas]', "Object.prototype.toString.call(canvas)", "'[object OffscreenCanvas]'");
t.done();
});
diff --git a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.worker.js
index 5e684c92c72..ea50e4f7f0c 100644
--- a/tests/wpt/tests/html/canvas/offscreen/canvas-context/2d.canvas.context.unrecognised.badsuffix.worker.js
+++ b/tests/wpt/tests/html/canvas/offscreen/canvas-host/2d.canvas.host.type.name.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.canvas.context.unrecognised.badsuffix
-// Description:Context name "2d" plus a suffix is unrecognised
+// OffscreenCanvas test in a worker:2d.canvas.host.type.name
+// Description:OffscreenCanvas type and toString
// Note:
importScripts("/resources/testharness.js");
importScripts("/html/canvas/resources/canvas-tests.js");
-var t = async_test("Context name \"2d\" plus a suffix is unrecognised");
+var t = async_test("OffscreenCanvas type and toString");
var t_pass = t.done.bind(t);
var t_fail = t.step_func(function(reason) {
throw reason;
@@ -16,8 +16,7 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- assert_throws_js(TypeError, function() { offscreenCanvas2.getContext("2d#"); });
+ _assertSame(Object.prototype.toString.call(canvas), '[object OffscreenCanvas]', "Object.prototype.toString.call(canvas)", "'[object OffscreenCanvas]'");
t.done();
});
done();
diff --git a/tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml b/tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml
new file mode 100644
index 00000000000..4153b8e2dfb
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/tools/yaml-new/the-canvas.yaml
@@ -0,0 +1,416 @@
+- name: 2d.canvas.host.reference
+ desc: canvas refers back to its canvas
+ code: |
+ @assert ctx.canvas === canvas;
+
+- name: 2d.canvas.host.readonly
+ desc: Canvas objects are readonly
+ code: |
+ var canvas2 = {{ new_canvas }};
+ var d = ctx.canvas;
+ @assert canvas2 !== d;
+ ctx.canvas = canvas2;
+ @assert ctx.canvas === d;
+ variants: &new-canvas-definition
+ - HtmlCanvas:
+ append_variants_to_name: false
+ canvas_types: ['HtmlCanvas']
+ new_canvas: |-
+ document.createElement('canvas')
+ OffscreenCanvas:
+ append_variants_to_name: false
+ canvas_types: ['OffscreenCanvas', 'Worker']
+ new_canvas: |-
+ new OffscreenCanvas(100, 50)
+
+- name: 2d.canvas.host.type.delete
+ canvas_types: ['HtmlCanvas']
+ desc: window.HTMLCanvasElement interface object is [[Configurable]]
+ code: |
+ @assert delete window.HTMLCanvasElement === true;
+ @assert window.HTMLCanvasElement === undefined;
+
+- name: 2d.canvas.host.type.delete
+ canvas_types: ['OffscreenCanvas', 'Worker']
+ desc: OffscreenCanvas interface object is [[Configurable]]
+ code: |
+ {% set root = 'self' if canvas_type == 'Worker' else 'window' %}
+ @assert delete {{ root }}.OffscreenCanvas === true;
+ @assert {{ root }}.OffscreenCanvas === undefined;
+
+- name: 2d.canvas.host.type.name
+ canvas_types: ['HtmlCanvas']
+ desc: HTMLCanvasElement type and toString
+ code: |
+ @assert Object.prototype.toString.call(canvas) === '[object HTMLCanvasElement]';
+
+- name: 2d.canvas.host.type.name
+ canvas_types: ['OffscreenCanvas', 'Worker']
+ desc: OffscreenCanvas type and toString
+ code: |
+ @assert Object.prototype.toString.call(canvas) === '[object OffscreenCanvas]';
+
+- name: 2d.canvas.context.exists
+ desc: The 2D context is implemented
+ code: |
+ @assert canvas.getContext('2d') !== null;
+
+- name: 2d.canvas.context.extraargs.create
+ desc: The 2D context doesn't throw with extra getContext arguments (new context)
+ code: |
+ @assert {{ new_canvas }}.getContext('2d', false, {}, [], 1, "2") !== null;
+ @assert {{ new_canvas }}.getContext('2d', 123) !== null;
+ @assert {{ new_canvas }}.getContext('2d', "test") !== null;
+ @assert {{ new_canvas }}.getContext('2d', undefined) !== null;
+ @assert {{ new_canvas }}.getContext('2d', null) !== null;
+ @assert {{ new_canvas }}.getContext('2d', Symbol.hasInstance) !== null;
+ variants: *new-canvas-definition
+
+- name: 2d.canvas.context.invalid.args
+ desc: Calling getContext with invalid arguments.
+ canvas_types: ['HtmlCanvas']
+ code: |
+ @assert canvas.getContext('') === null;
+ @assert canvas.getContext('2d#') === null;
+ @assert canvas.getContext('This is clearly not a valid context name.') === null;
+ @assert canvas.getContext('2d\0') === null;
+ @assert canvas.getContext('2\uFF44') === null;
+ @assert canvas.getContext('2D') === null;
+ @assert throws TypeError canvas.getContext();
+ @assert canvas.getContext('null') === null;
+ @assert canvas.getContext('undefined') === null;
+
+- name: 2d.canvas.context.invalid.args
+ desc: Calling getContext with invalid arguments.
+ canvas_types: ['OffscreenCanvas', 'Worker']
+ code: |
+ @assert throws TypeError canvas.getContext('');
+ @assert throws TypeError canvas.getContext('This is not an implemented context in any real browser');
+ @assert throws TypeError canvas.getContext('2d#');
+ @assert throws TypeError canvas.getContext('2d\0');
+ @assert throws TypeError canvas.getContext('2\uFF44');
+ @assert throws TypeError canvas.getContext('2D');
+ @assert throws TypeError canvas.getContext();
+ @assert throws TypeError canvas.getContext('null');
+ @assert throws TypeError canvas.getContext('undefined');
+
+
+- name: 2d.canvas.context.extraargs.cache
+ desc: The 2D context doesn't throw with extra getContext arguments (cached)
+ code: |
+ @assert canvas.getContext('2d', false, {}, [], 1, '2') !== null;
+ @assert canvas.getContext('2d', 123) !== null;
+ @assert canvas.getContext('2d', 'test') !== null;
+ @assert canvas.getContext('2d', undefined) !== null;
+ @assert canvas.getContext('2d', null) !== null;
+ @assert canvas.getContext('2d', Symbol.hasInstance) !== null;
+
+- name: 2d.canvas.context.unique
+ desc: getContext('2d') returns the same object
+ code: |
+ @assert canvas.getContext('2d') === canvas.getContext('2d');
+
+- name: 2d.canvas.context.shared
+ desc: getContext('2d') returns objects which share canvas state
+ code: |
+ var ctx2 = canvas.getContext('2d');
+ ctx.fillStyle = '#f00';
+ ctx2.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 100, 50);
+ @assert pixel 50,25 == 0,255,0,255;
+ expected: green
+
+- name: 2d.canvas.host.initial.color
+ desc: Initial state is transparent black
+ code: |
+ @assert pixel 20,20 == 0,0,0,0;
+
+- name: 2d.canvas.host.initial.reset.different
+ desc: Changing size resets canvas to transparent black
+ code: |
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 50, 50);
+ @assert pixel 20,20 == 255,0,0,255;
+ canvas.width = 50;
+ @assert pixel 20,20 == 0,0,0,0;
+
+- name: 2d.canvas.host.initial.reset.same
+ desc: Setting size (not changing the value) resets canvas to transparent black
+ code: |
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 50, 50);
+ @assert pixel 20,20 == 255,0,0,255;
+ canvas.width = 100;
+ @assert pixel 20,20 == 0,0,0,0;
+
+
+- name: 2d.canvas.host.initial.reset.path
+ desc: Resetting the canvas state resets the current path
+ code: |
+ canvas.width = 100;
+ ctx.rect(0, 0, 100, 50);
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fill();
+ @assert pixel 20,20 == 0,0,0,0;
+
+- name: 2d.canvas.host.initial.reset.clip
+ desc: Resetting the canvas state resets the current clip region
+ code: |
+ canvas.width = 100;
+ ctx.rect(0, 0, 1, 1);
+ ctx.clip();
+ canvas.width = 100;
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 100, 50);
+ @assert pixel 20,20 == 0,255,0,255;
+
+- name: 2d.canvas.host.initial.reset.transform
+ desc: Resetting the canvas state resets the current transformation matrix
+ code: |
+ canvas.width = 100;
+ ctx.scale(0.1, 0.1);
+ canvas.width = 100;
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 100, 50);
+ @assert pixel 20,20 == 0,255,0,255;
+
+- name: 2d.canvas.host.initial.reset.gradient
+ desc: Resetting the canvas state does not invalidate any existing gradients
+ code: |
+ canvas.width = 50;
+ var g = ctx.createLinearGradient(0, 0, 100, 0);
+ g.addColorStop(0, '#0f0');
+ g.addColorStop(1, '#0f0');
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.fillStyle = g;
+ ctx.fillRect(0, 0, 100, 50);
+ @assert pixel 50,25 == 0,255,0,255;
+
+- name: 2d.canvas.host.initial.reset.pattern
+ desc: Resetting the canvas state does not invalidate any existing patterns
+ code: |
+ canvas.width = 30;
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, 30, 50);
+ var p = ctx.createPattern(canvas, 'repeat-x');
+ canvas.width = 100;
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ ctx.fillStyle = p;
+ ctx.fillRect(0, 0, 100, 50);
+ @assert pixel 50,25 == 0,255,0,255;
+
+- name: 2d.canvas.host.size.attributes.idl.set.zero
+ desc: Setting width/height IDL attributes to 0
+ code: |
+ canvas.width = 0;
+ canvas.height = 0;
+ @assert canvas.width === 0;
+ @assert canvas.height === 0;
+
+- name: 2d.canvas.host.size.attributes.idl
+ desc: Getting/setting width/height IDL attributes
+ code: |
+ canvas.width = '100';
+ canvas.height = '100';
+ @assert canvas.width === 100;
+ @assert canvas.height === 100;
+ canvas.width = 301.999;
+ canvas.height = 301.001;
+ @assert canvas.width === 301;
+ @assert canvas.height === 301;
+ canvas.width = "+1.5e2";
+ canvas.height = "0x96";
+ @assert canvas.width === 150;
+ @assert canvas.height === 150;
+
+- name: 2d.canvas.host.size.invalid.attributes.idl
+ canvas_types: ['OffscreenCanvas', 'Worker']
+ desc: Getting/setting width/height IDL attributes
+ code: |
+ @assert throws TypeError canvas.width = 200 - Math.pow(2, 32);
+ @assert throws TypeError canvas.height = 200 - Math.pow(2, 32);
+ @assert throws TypeError canvas.width = '400x';
+ @assert throws TypeError canvas.height = 'foo';
+
+- name: 2d.canvas.host.size.invalid.attributes.idl
+ canvas_types: ['HtmlCanvas']
+ desc: Getting/setting width/height IDL attributes
+ code: |
+ canvas.width = 200 - Math.pow(2, 32);
+ canvas.height = 200 - Math.pow(2, 32);
+ @assert canvas.width === 200;
+ @assert canvas.height === 200;
+ canvas.width = '400x';
+ canvas.height = 'foo';
+ @assert canvas.width === 0;
+ @assert canvas.height === 0;
+
+- name: 2d.canvas.host.size.attributes.default
+ desc: Default width/height when attributes are missing
+ code: |
+ @assert canvas.width === 100;
+ @assert canvas.height === 50;
+
+- name: 2d.canvas.host.size.attributes.removed
+ size: [120, 50]
+ canvas_types: ['HtmlCanvas']
+ desc: Removing content attributes reverts to default size
+ code: |
+ @assert canvas.width === 120;
+ canvas.removeAttribute('width');
+ @assert canvas.width === 300;
+
+
+- name: 2d.canvas.host.size.attributes.reflect.setidl
+ desc: Setting IDL attributes updates IDL and content attributes
+ code: |
+ canvas.width = 120;
+ canvas.height = 60;
+ @assert canvas.width === 120;
+ @assert canvas.height === 60;
+ {% if canvas_type == 'HtmlCanvas' %}
+ @assert canvas.getAttribute('width') === '120';
+ @assert canvas.getAttribute('height') === '60';
+ {% endif %}
+
+- name: 2d.canvas.host.size.attributes.reflect.setidlzero
+ desc: Setting IDL attributes to 0 updates IDL and content attributes
+ code: |
+ canvas.width = 0;
+ canvas.height = 0;
+ {% if canvas_type == 'HtmlCanvas' %}
+ _assertSame(canvas.getAttribute('width'), '0', "canvas.getAttribute('width')", "'0'");
+ _assertSame(canvas.getAttribute('height'), '0', "canvas.getAttribute('height')", "'0'");
+ {% endif %}
+ @assert canvas.width === 0;
+ @assert canvas.height === 0;
+
+- name: 2d.canvas.host.size.attributes.reflect.setcontent
+ canvas_types: ['HtmlCanvas']
+ desc: Setting content attributes updates IDL and content attributes
+ code: |
+ canvas.setAttribute('width', '120');
+ canvas.setAttribute('height', '60');
+ @assert canvas.getAttribute('width') === '120';
+ @assert canvas.getAttribute('height') === '60';
+ @assert canvas.width === 120;
+ @assert canvas.height === 60;
+
+- name: 2d.canvas.host.size.large
+ notes: Not sure how reasonable this is, but the spec doesn't say there's an upper
+ limit on the size.
+ code: |
+ var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long"
+ canvas.width = n;
+ canvas.height = n;
+ @assert canvas.width === n;
+ @assert canvas.height === n;
+
+- name: 2d.canvas.context.prototype
+ desc: checks CanvasRenderingContext2D prototype
+ canvas_types: ['HtmlCanvas']
+ code: |
+ @assert Object.getPrototypeOf(CanvasRenderingContext2D.prototype) === Object.prototype;
+ @assert Object.getPrototypeOf(ctx) === CanvasRenderingContext2D.prototype;
+
+- name: 2d.canvas.context.prototype
+ desc: checks OffscreenCanvasRenderingContext2D prototype
+ canvas_types: ['OffscreenCanvas', 'Worker']
+ code: |
+ @assert Object.getPrototypeOf(OffscreenCanvasRenderingContext2D.prototype) === Object.prototype;
+ @assert Object.getPrototypeOf(ctx) === OffscreenCanvasRenderingContext2D.prototype;
+
+- name: 2d.canvas.host.scaled
+ desc: CSS-scaled canvases get drawn correctly
+ canvas_types: ['HtmlCanvas']
+ size: [50, 25]
+ canvas: 'style="width: 100px; height: 50px"'
+ manual:
+ code: |
+ ctx.fillStyle = '#00f';
+ ctx.fillRect(0, 0, 50, 25);
+ ctx.fillStyle = '#0ff';
+ ctx.fillRect(0, 0, 25, 10);
+ expected: |
+ size 100 50
+ cr.set_source_rgb(0, 0, 1)
+ cr.rectangle(0, 0, 100, 50)
+ cr.fill()
+ cr.set_source_rgb(0, 1, 1)
+ cr.rectangle(0, 0, 50, 20)
+ cr.fill()
+
+- name: 2d.canvas.context.type.exists
+ desc: The 2D context interface is a property of '{{ root }}'
+ notes: &bindings Defined in "Web IDL" (draft)
+ code: |
+ @assert {{ root }}.{{ context_object }};
+ variants: &get-context-definition
+ - HtmlCanvas:
+ append_variants_to_name: false
+ canvas_types: ['HtmlCanvas']
+ root: window
+ context_object: CanvasRenderingContext2D
+ OffscreenCanvas:
+ append_variants_to_name: false
+ canvas_types: ['OffscreenCanvas']
+ root: window
+ context_object: OffscreenCanvasRenderingContext2D
+ Worker:
+ append_variants_to_name: false
+ canvas_types: ['Worker']
+ root: self
+ context_object: OffscreenCanvasRenderingContext2D
+
+- name: 2d.canvas.context.type.extend
+ desc: Interface methods can be added
+ notes: *bindings
+ code: |
+ {{ root }}.{{ context_object }}.prototype.fillRectGreen = function (x, y, w, h)
+ {
+ this.fillStyle = '#0f0';
+ this.fillRect(x, y, w, h);
+ };
+ ctx.fillStyle = '#f00';
+ ctx.fillRectGreen(0, 0, 100, 50);
+ @assert pixel 50,25 == 0,255,0,255;
+ expected: green
+ variants: *get-context-definition
+
+- name: 2d.canvas.context.type.replace
+ desc: Interface methods can be overridden
+ notes: *bindings
+ code: |
+ var fillRect = {{ root }}.{{ context_object }}.prototype.fillRect;
+ {{ root }}.{{ context_object }}.prototype.fillRect = function (x, y, w, h)
+ {
+ this.fillStyle = '#0f0';
+ fillRect.call(this, x, y, w, h);
+ };
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+ @assert pixel 50,25 == 0,255,0,255;
+ expected: green
+ variants: *get-context-definition
+
+- name: 2d.canvas.context.type.prototype
+ desc: window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]],
+ and its methods are [[Configurable]].
+ notes: *bindings
+ code: |
+ @assert {{ root }}.{{ context_object }}.prototype;
+ @assert {{ root }}.{{ context_object }}.prototype.fill;
+ {{ root }}.{{ context_object }}.prototype = null;
+ @assert {{ root }}.{{ context_object }}.prototype;
+ delete {{ root }}.{{ context_object }}.prototype;
+ @assert {{ root }}.{{ context_object }}.prototype;
+ {{ root }}.{{ context_object }}.prototype.fill = 1;
+ @assert {{ root }}.{{ context_object }}.prototype.fill === 1;
+ delete {{ root }}.{{ context_object }}.prototype.fill;
+ @assert {{ root }}.{{ context_object }}.prototype.fill === undefined;
+ variants: *get-context-definition
diff --git a/tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml b/tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml
deleted file mode 100644
index 1ecf8ccdbf1..00000000000
--- a/tests/wpt/tests/html/canvas/tools/yaml/element/the-canvas-element.yaml
+++ /dev/null
@@ -1,143 +0,0 @@
-- name: 2d.canvas.context.exists
- desc: The 2D context is implemented
- code: |
- @assert canvas.getContext('2d') !== null;
-
-- name: 2d.canvas.context.invalid.args
- desc: Calling getContext with invalid arguments.
- code: |
- @assert canvas.getContext('') === null;
- @assert canvas.getContext('2d#') === null;
- @assert canvas.getContext('This is clearly not a valid context name.') === null;
- @assert canvas.getContext('2d\0') === null;
- @assert canvas.getContext('2\uFF44') === null;
- @assert canvas.getContext('2D') === null;
- @assert throws TypeError canvas.getContext();
- @assert canvas.getContext('null') === null;
- @assert canvas.getContext('undefined') === null;
-
-- name: 2d.canvas.context.extraargs.create
- desc: The 2D context doesn't throw with extra getContext arguments (new context)
- code: |
- @assert document.createElement("canvas").getContext('2d', false, {}, [], 1, "2") !== null;
- @assert document.createElement("canvas").getContext('2d', 123) !== null;
- @assert document.createElement("canvas").getContext('2d', "test") !== null;
- @assert document.createElement("canvas").getContext('2d', undefined) !== null;
- @assert document.createElement("canvas").getContext('2d', null) !== null;
- @assert document.createElement("canvas").getContext('2d', Symbol.hasInstance) !== null;
-
-- name: 2d.canvas.context.extraargs.cache
- desc: The 2D context doesn't throw with extra getContext arguments (cached)
- code: |
- @assert canvas.getContext('2d', false, {}, [], 1, "2") !== null;
- @assert canvas.getContext('2d', 123) !== null;
- @assert canvas.getContext('2d', "test") !== null;
- @assert canvas.getContext('2d', undefined) !== null;
- @assert canvas.getContext('2d', null) !== null;
- @assert canvas.getContext('2d', Symbol.hasInstance) !== null;
-
-- name: 2d.canvas.context.type.exists
- desc: The 2D context interface is a property of 'window'
- notes: &bindings Defined in "Web IDL" (draft)
- code: |
- @assert window.CanvasRenderingContext2D;
-
-- name: 2d.canvas.context.type.prototype
- desc: window.CanvasRenderingContext2D.prototype are not [[Writable]] and not [[Configurable]],
- and its methods are [[Configurable]].
- notes: *bindings
- code: |
- @assert window.CanvasRenderingContext2D.prototype;
- @assert window.CanvasRenderingContext2D.prototype.fill;
- window.CanvasRenderingContext2D.prototype = null;
- @assert window.CanvasRenderingContext2D.prototype;
- delete window.CanvasRenderingContext2D.prototype;
- @assert window.CanvasRenderingContext2D.prototype;
- window.CanvasRenderingContext2D.prototype.fill = 1;
- @assert window.CanvasRenderingContext2D.prototype.fill === 1;
- delete window.CanvasRenderingContext2D.prototype.fill;
- @assert window.CanvasRenderingContext2D.prototype.fill === undefined;
-
-- name: 2d.canvas.context.type.replace
- desc: Interface methods can be overridden
- notes: *bindings
- code: |
- var fillRect = window.CanvasRenderingContext2D.prototype.fillRect;
- window.CanvasRenderingContext2D.prototype.fillRect = function (x, y, w, h)
- {
- this.fillStyle = '#0f0';
- fillRect.call(this, x, y, w, h);
- };
- ctx.fillStyle = '#f00';
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 50,25 == 0,255,0,255;
- expected: green
-
-- name: 2d.canvas.context.type.extend
- desc: Interface methods can be added
- notes: *bindings
- code: |
- window.CanvasRenderingContext2D.prototype.fillRectGreen = function (x, y, w, h)
- {
- this.fillStyle = '#0f0';
- this.fillRect(x, y, w, h);
- };
- ctx.fillStyle = '#f00';
- ctx.fillRectGreen(0, 0, 100, 50);
- @assert pixel 50,25 == 0,255,0,255;
- expected: green
-
-- name: 2d.canvas.context.unique
- desc: getContext('2d') returns the same object
- code: |
- @assert canvas.getContext('2d') === canvas.getContext('2d');
-
-- name: 2d.canvas.context.shared
- desc: getContext('2d') returns objects which share canvas state
- code: |
- var ctx2 = canvas.getContext('2d');
- ctx.fillStyle = '#f00';
- ctx2.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 50,25 == 0,255,0,255;
- expected: green
-
-- name: 2d.canvas.host.scaled
- desc: CSS-scaled canvases get drawn correctly
- size: 50, 25
- canvas: 'style="width: 100px; height: 50px"'
- manual:
- code: |
- ctx.fillStyle = '#00f';
- ctx.fillRect(0, 0, 50, 25);
- ctx.fillStyle = '#0ff';
- ctx.fillRect(0, 0, 25, 10);
- expected: |
- size 100 50
- cr.set_source_rgb(0, 0, 1)
- cr.rectangle(0, 0, 100, 50)
- cr.fill()
- cr.set_source_rgb(0, 1, 1)
- cr.rectangle(0, 0, 50, 20)
- cr.fill()
-
-- name: 2d.canvas.host.reference
- desc: CanvasRenderingContext2D.canvas refers back to its canvas
- code: |
- @assert ctx.canvas === canvas;
-
-- name: 2d.canvas.host.readonly
- desc: CanvasRenderingContext2D.canvas is readonly
- code: |
- var c = document.createElement('canvas');
- var d = ctx.canvas;
- @assert c !== d;
- ctx.canvas = c;
- @assert ctx.canvas === d;
-
-- name: 2d.canvas.context.prototype
- desc: checks CanvasRenderingContext2D prototype
- code: |
- @assert Object.getPrototypeOf(CanvasRenderingContext2D.prototype) === Object.prototype;
- @assert Object.getPrototypeOf(ctx) === CanvasRenderingContext2D.prototype;
- t.done();
diff --git a/tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml b/tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml
deleted file mode 100644
index ccabe094b8a..00000000000
--- a/tests/wpt/tests/html/canvas/tools/yaml/offscreen/the-offscreen-canvas.yaml
+++ /dev/null
@@ -1,269 +0,0 @@
-- name: 2d.canvas.host.reference
- desc: canvas refers back to its canvas
- code: |
- @assert ctx.canvas === canvas;
- t.done();
-
-- name: 2d.canvas.host.readonly
- desc: canvas is readonly
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- var d = ctx.canvas;
- @assert offscreenCanvas2 !== d;
- ctx.canvas = offscreenCanvas2;
- @assert ctx.canvas === d;
- t.done();
-
-- name: 2d.canvas.context.exists
- desc: The 2D context is implemented
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert offscreenCanvas2.getContext('2d') !== null;
- t.done();
-
-- name: 2d.canvas.context.extraargs.create
- desc: The 2D context doesn't throw with extra getContext arguments (new context)
- code: |
- @assert (new OffscreenCanvas(100, 50)).getContext('2d', false, {}, [], 1, "2") !== null;
- @assert (new OffscreenCanvas(100, 50)).getContext('2d', 123) !== null;
- @assert (new OffscreenCanvas(100, 50)).getContext('2d', "test") !== null;
- @assert (new OffscreenCanvas(100, 50)).getContext('2d', undefined) !== null;
- @assert (new OffscreenCanvas(100, 50)).getContext('2d', null) !== null;
- @assert (new OffscreenCanvas(100, 50)).getContext('2d', Symbol.hasInstance) !== null;
- t.done();
-
-- name: 2d.canvas.context.extraargs.cache
- desc: The 2D context doesn't throw with extra getContext arguments (cached)
- code: |
- @assert canvas.getContext('2d', false, {}, [], 1, "2") !== null;
- @assert canvas.getContext('2d', 123) !== null;
- @assert canvas.getContext('2d', "test") !== null;
- @assert canvas.getContext('2d', undefined) !== null;
- @assert canvas.getContext('2d', null) !== null;
- @assert canvas.getContext('2d', Symbol.hasInstance) !== null;
- t.done();
-
-- name: 2d.canvas.context.unique
- desc: getContext('2d') returns the same object
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert offscreenCanvas2.getContext('2d') === offscreenCanvas2.getContext('2d');
- t.done();
-
-- name: 2d.canvas.context.shared
- desc: getContext('2d') returns objects which share canvas state
- code: |
- var ctx2 = canvas.getContext('2d');
- ctx.fillStyle = '#f00';
- ctx2.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 50,25 == 0,255,0,255;
- t.done();
-
-- name: 2d.canvas.context.emptystring
- desc: getContext with empty string returns null
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext("");
- t.done();
-
-- name: 2d.canvas.context.unrecognised.badname
- desc: getContext with unrecognised context name returns null
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext('This is not an implemented context in any real browser');
- t.done();
-
-- name: 2d.canvas.context.unrecognised.badsuffix
- desc: Context name "2d" plus a suffix is unrecognised
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext("2d#");
- t.done();
-
-- name: 2d.canvas.context.unrecognised.nullsuffix
- desc: Context name "2d" plus a "\0" suffix is unrecognised
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext("2d\0");
- t.done();
-
-- name: 2d.canvas.context.unrecognised.unicode
- desc: Context name which kind of looks like "2d" is unrecognised
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext("2\uFF44");
- t.done();
-
-- name: 2d.canvas.context.casesensitive
- desc: Context name "2D" is unrecognised; matching is case sensitive
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext('2D');
- t.done();
-
-- name: 2d.canvas.context.arguments.missing
- code: |
- var offscreenCanvas2 = new OffscreenCanvas(100, 50);
- @assert throws TypeError offscreenCanvas2.getContext(); @moz-todo
- t.done();
-
-
-- name: 2d.canvas.host.initial.color
- desc: Initial state is transparent black
- code: |
- @assert pixel 20,20 == 0,0,0,0;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.different
- desc: Changing size resets canvas to transparent black
- code: |
- ctx.fillStyle = '#f00';
- ctx.fillRect(0, 0, 50, 50);
- @assert pixel 20,20 == 255,0,0,255;
- canvas.width = 50;
- @assert pixel 20,20 == 0,0,0,0;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.same
- desc: Setting size (not changing the value) resets canvas to transparent black
- code: |
- canvas.width = 100;
- ctx.fillStyle = '#f00';
- ctx.fillRect(0, 0, 50, 50);
- @assert pixel 20,20 == 255,0,0,255;
- canvas.width = 100;
- @assert pixel 20,20 == 0,0,0,0;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.path
- desc: Resetting the canvas state resets the current path
- code: |
- canvas.width = 100;
- ctx.rect(0, 0, 100, 50);
- canvas.width = 100;
- ctx.fillStyle = '#f00';
- ctx.fill();
- @assert pixel 20,20 == 0,0,0,0;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.clip
- desc: Resetting the canvas state resets the current clip region
- code: |
- canvas.width = 100;
- ctx.rect(0, 0, 1, 1);
- ctx.clip();
- canvas.width = 100;
- ctx.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 20,20 == 0,255,0,255;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.transform
- desc: Resetting the canvas state resets the current transformation matrix
- code: |
- canvas.width = 100;
- ctx.scale(0.1, 0.1);
- canvas.width = 100;
- ctx.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 20,20 == 0,255,0,255;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.gradient
- desc: Resetting the canvas state does not invalidate any existing gradients
- code: |
- canvas.width = 50;
- var g = ctx.createLinearGradient(0, 0, 100, 0);
- g.addColorStop(0, '#0f0');
- g.addColorStop(1, '#0f0');
- canvas.width = 100;
- ctx.fillStyle = '#f00';
- ctx.fillRect(0, 0, 100, 50);
- ctx.fillStyle = g;
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 50,25 == 0,255,0,255;
- t.done();
-
-- name: 2d.canvas.host.initial.reset.pattern
- desc: Resetting the canvas state does not invalidate any existing patterns
- code: |
- canvas.width = 30;
- ctx.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 30, 50);
- var p = ctx.createPattern(canvas, 'repeat-x');
- canvas.width = 100;
- ctx.fillStyle = '#f00';
- ctx.fillRect(0, 0, 100, 50);
- ctx.fillStyle = p;
- ctx.fillRect(0, 0, 100, 50);
- @assert pixel 50,25 == 0,255,0,255;
- t.done();
-
-- name: 2d.canvas.host.size.attributes.idl.set.zero
- desc: Setting width/height IDL attributes to 0
- code: |
- canvas.width = 0;
- canvas.height = 0;
- @assert canvas.width === 0;
- @assert canvas.height === 0;
- t.done();
-
-- name: 2d.canvas.host.size.attributes.idl
- desc: Getting/setting width/height IDL attributes
- webidl:
- - es-unsigned-long
- code: |
- canvas.width = "100";
- canvas.height = "100";
- @assert canvas.width === 100;
- @assert canvas.height === 100;
- canvas.width = "+1.5e2";
- canvas.height = "0x96";
- @assert canvas.width === 150;
- @assert canvas.height === 150;
- canvas.width = 301.999;
- canvas.height = 301.001;
- @assert canvas.width === 301;
- @assert canvas.height === 301;
- @assert throws TypeError canvas.width = "400x";
- @assert throws TypeError canvas.height = "foo";
- @assert canvas.width === 301;
- @assert canvas.height === 301;
- t.done();
-
-- name: 2d.canvas.host.size.attributes.default
- desc: Default width/height when attributes are missing
- code: |
- @assert canvas.width === 100;
- @assert canvas.height === 50;
- t.done();
-
-- name: 2d.canvas.host.size.attributes.reflect.setidl
- desc: Setting IDL attributes updates IDL and content attributes
- code: |
- canvas.width = 120;
- canvas.height = 60;
- @assert canvas.width === 120;
- @assert canvas.height === 60;
- t.done();
-
-- name: 2d.canvas.host.size.attributes.reflect.setidlzero
- desc: Setting IDL attributes to 0 updates IDL and content attributes
- code: |
- canvas.width = 0;
- canvas.height = 0;
- @assert canvas.width === 0;
- @assert canvas.height === 0;
- t.done();
-
-- name: 2d.canvas.host.size.large
- notes: Not sure how reasonable this is, but the spec doesn't say there's an upper
- limit on the size.
- code: |
- var n = 2147483647; // 2^31 - 1, which should be supported by any sensible definition of "long"
- canvas.width = n;
- canvas.height = n;
- @assert canvas.width === n;
- @assert canvas.height === n;
- t.done();
diff --git a/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html
new file mode 100644
index 00000000000..a00183738e3
--- /dev/null
+++ b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<div id=log></div>
+<script>
+promise_test(async t => {
+ const response = await fetch(get_host_info().HTTPS_REMOTE_ORIGIN+"/html/document-isolation-policy/resources/nothing-no-corp.js", {mode: "no-cors"});
+ assert_equals(response.type, "opaque");
+}, "DIP requires a secure context");
+</script>
diff --git a/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers
new file mode 100644
index 00000000000..bcc6f0734d5
--- /dev/null
+++ b/tests/wpt/tests/html/document-isolation-policy/no-secure-context.tentative.html.headers
@@ -0,0 +1 @@
+Document-Isolation-Policy: isolate-and-require-corp
diff --git a/tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html b/tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html
new file mode 100644
index 00000000000..27573bcdc69
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/the-details-element/details-display.tentative.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<meta charset=UTF-8>
+<title>CSS Test: default display of details and summary elements</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-details-and-summary-elements">
+<link rel="help" href="https://github.com/whatwg/html/pull/10265">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+
+<details id="a">
+ <summary id="b">This is the real summary.</summary>
+
+ <p>This is the rest of the details.</p>
+ <summary id="c">This summary is not special.</summary>
+</details>
+
+<summary id="d">This summary is not special.</summary>
+
+<script>
+
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("a")).display, "block");
+ }, "default display of details element is block");
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("b")).display, "list-item");
+ }, "default display of first summary child of details is list-item");
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("c")).display, "block");
+ }, "default display of other summary element in details is block");
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("d")).display, "block");
+ }, "default display of summary element outside details is block");
+
+ let new_styles = `
+ details { display: grid }
+ summary { display: flex }
+ `;
+ let new_style_element = document.createElement("style");
+ new_style_element.append(document.createTextNode(new_styles));
+ document.head.append(new_style_element);
+
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("a")).display, "grid");
+ }, "display of details element can be changed");
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("b")).display, "flex");
+ }, "display of first summary child of details can be changed");
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("c")).display, "flex");
+ }, "display of other summary element in details can be changed");
+ test(() => {
+ assert_equals(getComputedStyle(document.getElementById("d")).display, "flex");
+ }, "display of summary element outside details can be changed");
+
+
+</script>
diff --git a/tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html b/tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html
new file mode 100644
index 00000000000..406f7da9547
--- /dev/null
+++ b/tests/wpt/tests/html/rendering/widgets/input-checkbox-zero-size.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<meta charset="utf-8">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1903191">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvare">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="match" href="/css/reference/blank.html">
+<style>
+ input { width: 0; height: 0 }
+</style>
+<input type=checkbox>
+<input type=radio>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.png
deleted file mode 100644
index eeedd0ff058..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.colour.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.png
deleted file mode 100644
index d83fdd55b15..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.different.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.png
deleted file mode 100644
index eeedd0ff058..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.path.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.png
deleted file mode 100644
index eeedd0ff058..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/initial.reset.same.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html
deleted file mode 100644
index ecf35285a1b..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.default</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>size.attributes.default</h1>
-<p class="desc">Default width/height when attributes are missing</p>
-
-
-<p class="output">Actual output:</p>
-<canvas id="c" class="output" ><p class="fallback">FAIL (fallback content)</p></canvas>
-<p class="output expectedtext">Expected output:<p><img src="size.attributes.default.png" class="output expected" id="expected" alt="">
-<ul id="d"></ul>
-<script>
-var t = async_test("Default width/height when attributes are missing");
-_addTest(function(canvas, ctx) {
-
-_assertSame(canvas.width, 300, "canvas.width", "300");
-_assertSame(canvas.height, 150, "canvas.height", "150");
-_assert(!canvas.hasAttribute('width'), "!canvas.hasAttribute('width')");
-_assert(!canvas.hasAttribute('height'), "!canvas.hasAttribute('height')");
-
-
-});
-</script>
-
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.png
deleted file mode 100644
index a72d047556a..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.default.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.png
deleted file mode 100644
index 47830c83ea9..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.get.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html
deleted file mode 100644
index 1594a1c5e59..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.idl.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: size.attributes.idl</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>size.attributes.idl</h1>
-<p class="desc">Getting/setting width/height IDL attributes</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("Getting/setting width/height IDL attributes");
-_addTest(function(canvas, ctx) {
-
-canvas.width = "100";
-canvas.height = "100";
-_assertSame(canvas.width, 100, "canvas.width", "100");
-_assertSame(canvas.height, 100, "canvas.height", "100");
-
-canvas.width = "+1.5e2";
-canvas.height = "0x96";
-_assertSame(canvas.width, 150, "canvas.width", "150");
-_assertSame(canvas.height, 150, "canvas.height", "150");
-
-canvas.width = 200 - Math.pow(2, 32);
-canvas.height = 200 - Math.pow(2, 32);
-_assertSame(canvas.width, 200, "canvas.width", "200");
-_assertSame(canvas.height, 200, "canvas.height", "200");
-
-canvas.width = 301.999;
-canvas.height = 301.001;
-_assertSame(canvas.width, 301, "canvas.width", "301");
-_assertSame(canvas.height, 301, "canvas.height", "301");
-
-canvas.width = "400x";
-canvas.height = "foo";
-_assertSame(canvas.width, 0, "canvas.width", "0");
-_assertSame(canvas.height, 0, "canvas.height", "0");
-
-
-});
-</script>
-
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.png
deleted file mode 100644
index 47830c83ea9..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setcontent.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.png
deleted file mode 100644
index 47830c83ea9..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.reflect.setidl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.png
deleted file mode 100644
index 1ebf30d8aaa..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.removed.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.png b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.png
deleted file mode 100644
index 47830c83ea9..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/size.attributes.set.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html
deleted file mode 100644
index f47f755388f..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.prototype.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: type.prototype</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>type.prototype</h1>
-<p class="desc">window.HTMLCanvasElement has prototype, which is { ReadOnly, DontDelete }. prototype has getContext, which is not</p>
-
-<p class="notes">Defined in "Web IDL" (draft)
-<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("window.HTMLCanvasElement has prototype, which is { ReadOnly, DontDelete }. prototype has getContext, which is not");
-_addTest(function(canvas, ctx) {
-
-_assert(window.HTMLCanvasElement.prototype, "window.HTMLCanvasElement.prototype");
-_assert(window.HTMLCanvasElement.prototype.getContext, "window.HTMLCanvasElement.prototype.getContext");
-window.HTMLCanvasElement.prototype = null;
-_assert(window.HTMLCanvasElement.prototype, "window.HTMLCanvasElement.prototype");
-delete window.HTMLCanvasElement.prototype;
-_assert(window.HTMLCanvasElement.prototype, "window.HTMLCanvasElement.prototype");
-window.HTMLCanvasElement.prototype.getContext = 1;
-_assertSame(window.HTMLCanvasElement.prototype.getContext, 1, "window.HTMLCanvasElement.prototype.getContext", "1");
-delete window.HTMLCanvasElement.prototype.getContext;
-_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined");
-
-
-});
-</script>
-
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html b/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html
deleted file mode 100644
index e67fe7c4a26..00000000000
--- a/tests/wpt/tests/html/semantics/embedded-content/the-canvas-element/type.replace.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
-<title>Canvas test: type.replace</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>type.replace</h1>
-<p class="desc">HTMLCanvasElement methods can be replaced, and the replacement methods used by canvases</p>
-
-<p class="notes">Defined in "Web IDL" (draft)
-<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("HTMLCanvasElement methods can be replaced, and the replacement methods used by canvases");
-_addTest(function(canvas, ctx) {
-
-window.HTMLCanvasElement.prototype.getContext = function (name) { return 0; };
-_assertSame(canvas.getContext('2d'), 0, "canvas.getContext('2d')", "0");
-
-
-});
-</script>
-
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html
new file mode 100644
index 00000000000..09af8b3693f
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-pushState.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>History state change for iframe loading='lazy' before it is loaded: history.pushState</title>
+<iframe data-src="about:blank#push" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+let pushStateSuccess = true;
+try {
+ // Should have no effect on lazy-loading.
+ // Per https://html.spec.whatwg.org/C#can-have-its-url-rewritten
+ // only the fragment can be changed for about: URLs.
+ iframe.contentWindow.history.pushState(null, "", iframe.dataset.src);
+} catch(ex) {
+ pushStateSuccess = false;
+}
+const locationAfterPushState = iframe.contentWindow.location.href;
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+assert_true(pushStateSuccess);
+assert_equals(locationAfterPushState, new URL("about:blank#push", location.href).href);
+iframeLoaded.then(() => {
+ // No timeout needed in this test because history.pushState() doesn't navigate.
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href);
+ done();
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html
new file mode 100644
index 00000000000..ac9117a46ce
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-history-replaceState.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>History state change for iframe loading='lazy' before it is loaded: history.replaceState</title>
+<iframe data-src="about:blank#replace" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+let replaceStateSuccess = true;
+try {
+ // Should have no effect on lazy-loading.
+ // Per https://html.spec.whatwg.org/C#can-have-its-url-rewritten
+ // only the fragment can be changed for about: URLs.
+ iframe.contentWindow.history.replaceState(null, "", iframe.dataset.src);
+} catch(ex) {
+ replaceStateSuccess = false;
+}
+const locationAfterReplaceState = iframe.contentWindow.location.href;
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+assert_true(replaceStateSuccess);
+assert_equals(locationAfterReplaceState, new URL("about:blank#replace", location.href).href);
+iframeLoaded.then(() => {
+ // No timeout needed in this test because history.replaceState() doesn't navigate.
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href);
+ done();
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html
new file mode 100644
index 00000000000..7f94d6021fa
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: form submit</title>
+<iframe name="iframe" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<form action="support/blank.htm" target="iframe"></form>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+const form = document.querySelector('form');
+form.submit();
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ // The "?" in the URL is there because the default method is "GET"
+ // and the form data (empty here) is populated into the query.
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html
new file mode 100644
index 00000000000..c81a01833a2
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: link click (fragment)</title>
+<iframe name="iframe" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<a href="about:blank#fragment" target="iframe"></a>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+const a = document.querySelector('a');
+a.click();
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, "about:blank#fragment");
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html
new file mode 100644
index 00000000000..d8d85b62a4b
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: link click</title>
+<iframe name="iframe" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<a href="support/blank.htm?nav" target="iframe"></a>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+const a = document.querySelector('a');
+a.click();
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html
new file mode 100644
index 00000000000..88ec129fbc0
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-assign.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: location.assign</title>
+<iframe data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+iframe.contentWindow.location.assign(iframe.dataset.src);
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html
new file mode 100644
index 00000000000..e2f0c6dceb9
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace-set-src.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' and then setting src: location.replace</title>
+<iframe data-src="support/blank.htm?nav" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+iframe.contentWindow.location.replace(iframe.dataset.src);
+// Setting src invokes https://html.spec.whatwg.org/C#process-the-iframe-attributes
+iframe.src = 'support/blank.htm?src';
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html
new file mode 100644
index 00000000000..9d3c4fbc132
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-location-replace.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: location.replace</title>
+<iframe data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+iframe.contentWindow.location.replace(iframe.dataset.src);
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html
new file mode 100644
index 00000000000..0cc7e110415
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: meta refresh</title>
+<!-- This test is optional because the spec allows delaying or doing nothing for meta refresh. -->
+<iframe src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+const meta = iframe.contentDocument.createElement('meta');
+meta.httpEquiv = 'Refresh';
+meta.content = '0; url=support/blank.htm?nav';
+iframe.contentDocument.head.append(meta);
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html
new file mode 100644
index 00000000000..1010c540b7f
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-navigation-navigate.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: navigation.navigate</title>
+<iframe data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+iframe.contentWindow.navigation.navigate(iframe.dataset.src);
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ assert_true("navigation" in window, "Navigation API is supported");
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html
new file mode 100644
index 00000000000..579c079ce70
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-window-open.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Navigating iframe loading='lazy' before it is loaded: location.replace</title>
+<iframe name="iframe" data-src="support/blank.htm?nav" src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+window.open(iframe.dataset.src, 'iframe');
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?nav", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html
new file mode 100644
index 00000000000..a670de1f5c5
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>Reloading iframe loading='lazy' before it is loaded: location.reload</title>
+<iframe src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+// Should have no effect on lazy-loading
+iframe.contentWindow.location.reload();
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html
new file mode 100644
index 00000000000..aefd6c472b5
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Reloading iframe loading='lazy' before it is loaded: location.reload</title>
+<iframe src="support/blank.htm?src" loading="lazy" hidden></iframe>
+<script>
+const iframe = document.querySelector('iframe');
+const iframeLoaded = new Promise(resolve => {
+ iframe.onload = resolve;
+});
+// Should have no effect on lazy-loading
+iframe.contentWindow.navigation.reload();
+iframe.hidden = false;
+</script>
+<!-- Loading testharness.js here is intentional to reproduce a bug in WebKit. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({single_test: true});
+iframeLoaded.then(() => {
+ // Need a timeout to detect failure when there are two navigations.
+ step_timeout(() => {
+ assert_true("navigation" in window, "Navigation API is supported");
+ assert_equals(iframe.contentWindow.location.href, new URL("support/blank.htm?src", location.href).href);
+ done();
+ }, 1000);
+});
+</script>
diff --git a/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html b/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html
index 0bec720485d..7fa97916743 100644
--- a/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html
+++ b/tests/wpt/tests/intersection-observer/callback-cross-realm-report-exception.html
@@ -24,7 +24,7 @@ async_test(t => {
t.step_timeout(() => {
assert_array_equals(onerrorCalls, ["frame1"]);
t.done();
- }, 25);
+ }, 100);
});
});
</script>
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js
new file mode 100644
index 00000000000..5bd745db1de
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-embed.tentative.window.js
@@ -0,0 +1,25 @@
+// META: title='unload' Policy : allowed in frames when allowed in main frame.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/unload-helper.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper({
+ scripts: ['./resources/unload-helper.js'],
+ });
+ // In the same browsing context group to ensure BFCache is not used.
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=self']]},
+ );
+
+ const subframe = await main.addEmbed(
+ /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]},
+ /*attributes=*/ {});
+ await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: true});
+
+ await assertWindowRunsUnload(main, 'main', {shouldRunUnload: true});
+});
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js
new file mode 100644
index 00000000000..fe4f55dbc75
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-frameset.tentative.window.js
@@ -0,0 +1,25 @@
+// META: title='unload' Policy : allowed in frames when allowed in main frame.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/unload-helper.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper({
+ scripts: ['./resources/unload-helper.js'],
+ });
+ // In the same browsing context group to ensure BFCache is not used.
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=self']]},
+ );
+
+ const subframe = await main.addFrame(
+ /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]},
+ /*attributes=*/ {});
+ await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: true});
+
+ await assertWindowRunsUnload(main, 'main', {shouldRunUnload: true});
+});
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js
new file mode 100644
index 00000000000..376bb4cb1d0
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-allowed-object.tentative.window.js
@@ -0,0 +1,25 @@
+// META: title='unload' Policy : allowed in frames when allowed in main frame.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/unload-helper.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper({
+ scripts: ['./resources/unload-helper.js'],
+ });
+ // In the same browsing context group to ensure BFCache is not used.
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=self']]},
+ );
+
+ const subframe = await main.addObject(
+ /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]},
+ /*attributes=*/ {});
+ await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: true});
+
+ await assertWindowRunsUnload(main, 'main', {shouldRunUnload: true});
+});
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js
new file mode 100644
index 00000000000..cfdb29bc51a
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-embed.tentative.window.js
@@ -0,0 +1,25 @@
+// META: title='unload' Policy : disallowed in frames when disallowed in main frame.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/unload-helper.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper({
+ scripts: ['./resources/unload-helper.js'],
+ });
+ // In the same browsing context group to ensure BFCache is not used.
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=()']]},
+ );
+
+ const subframe = await main.addEmbed(
+ /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]},
+ /*attributes=*/ {});
+ await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false});
+
+ await assertWindowRunsUnload(main, 'main', {shouldRunUnload: false});
+});
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js
new file mode 100644
index 00000000000..e64c32a21a0
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-frameset.tentative.window.js
@@ -0,0 +1,25 @@
+// META: title='unload' Policy : disallowed in frames when disallowed in main frame.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/unload-helper.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper({
+ scripts: ['./resources/unload-helper.js'],
+ });
+ // In the same browsing context group to ensure BFCache is not used.
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=()']]},
+ );
+
+ const subframe = await main.addFrame(
+ /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]},
+ /*attributes=*/ {});
+ await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false});
+
+ await assertWindowRunsUnload(main, 'main', {shouldRunUnload: false});
+});
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js
new file mode 100644
index 00000000000..33c23239e6d
--- /dev/null
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-object.tentative.window.js
@@ -0,0 +1,25 @@
+// META: title='unload' Policy : disallowed in frames when disallowed in main frame.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/unload-helper.js
+// META: timeout=long
+
+'use strict';
+
+promise_test(async t => {
+ const rcHelper = new RemoteContextHelper({
+ scripts: ['./resources/unload-helper.js'],
+ });
+ // In the same browsing context group to ensure BFCache is not used.
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=()']]},
+ );
+
+ const subframe = await main.addObject(
+ /*extraConfig=*/ {headers: [['Permissions-Policy', 'unload=self']]},
+ /*attributes=*/ {});
+ await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false});
+
+ await assertWindowRunsUnload(main, 'main', {shouldRunUnload: false});
+});
diff --git a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js
index b2fb19ae129..4d8ddbcd16e 100644
--- a/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js
+++ b/tests/wpt/tests/permissions-policy/experimental-features/unload-disallowed-subframe.tentative.window.js
@@ -13,7 +13,9 @@ promise_test(async t => {
const rcHelper =
new RemoteContextHelper({scripts: ['./resources/unload-helper.js']});
// In the same browsing context group to ensure BFCache is not used.
- const main = await rcHelper.addWindow();
+ const main = await rcHelper.addWindow(
+ {headers: [['Permissions-Policy', 'unload=*']]},
+ );
const subframe =
await main.addIframe({headers: [['Permissions-Policy', 'unload=()']]});
await assertWindowRunsUnload(subframe, 'subframe', {shouldRunUnload: false});
diff --git a/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html b/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html
index 170c1ec2f1c..1d183afa614 100644
--- a/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html
+++ b/tests/wpt/tests/pointerevents/pointerevent_after_target_removed_from_slot.html
@@ -142,10 +142,10 @@
"pointerover@child",
"pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child",
"pointerdown@child", "(child-removed)",
- "pointerout@child", "pointerleave@child",
- "pointerover@parent", "pointerup@parent",
- "pointerdown@parent", "pointerup@parent",
- "pointerout@parent", "pointerleave@parent"
+ "pointerover@parent", "pointerup@parent", "pointerup@host",
+ "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host",
+ "pointerout@parent",
+ "pointerleave@parent", "pointerleave@host"
]
);
addPromiseTest(
@@ -155,9 +155,10 @@
"pointerover@child",
"pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child",
"pointerdown@child", "(child-removed)",
- "pointerleave@slot", "pointerover@parent", "pointerup@parent",
- "pointerdown@parent", "pointerup@parent",
- "pointerout@parent", "pointerleave@parent"
+ "pointerleave@slot", "pointerover@parent", "pointerup@parent", "pointerup@host",
+ "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host",
+ "pointerout@parent",
+ "pointerleave@parent", "pointerleave@host"
]
);
addPromiseTest(
@@ -167,9 +168,10 @@
"pointerover@child",
"pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child",
"pointerdown@child", "pointerup@child", "(child-removed)",
- "pointerout@child", "pointerleave@child",
- "pointerover@parent", "pointerdown@parent", "pointerup@parent",
- "pointerout@parent", "pointerleave@parent"
+ "pointerover@parent",
+ "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host",
+ "pointerout@parent",
+ "pointerleave@parent", "pointerleave@host"
]
);
addPromiseTest(
@@ -179,8 +181,10 @@
"pointerover@child",
"pointerenter@host", "pointerenter@parent", "pointerenter@slot", "pointerenter@child",
"pointerdown@child", "pointerup@child", "(child-removed)",
- "pointerleave@slot", "pointerover@parent", "pointerdown@parent", "pointerup@parent",
- "pointerout@parent", "pointerleave@parent"
+ "pointerleave@slot", "pointerover@parent",
+ "pointerdown@parent", "pointerdown@host", "pointerup@parent", "pointerup@host",
+ "pointerout@parent",
+ "pointerleave@parent", "pointerleave@host"
]
);
</script>
diff --git a/tests/wpt/tests/screen-capture/getdisplaymedia.https.html b/tests/wpt/tests/screen-capture/getdisplaymedia.https.html
index 4558786faa1..4a7c6553351 100644
--- a/tests/wpt/tests/screen-capture/getdisplaymedia.https.html
+++ b/tests/wpt/tests/screen-capture/getdisplaymedia.https.html
@@ -59,7 +59,6 @@ promise_test(t => {
{video: {height: {exact: 240}}},
{video: {frameRate: {min: 4}}},
{video: {frameRate: {exact: 4}}},
- {video: false, audio: true},
].forEach(constraints => promise_test(async t => {
await test_driver.bless('getDisplayMedia()');
const p = navigator.mediaDevices.getDisplayMedia(constraints);
diff --git a/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html
new file mode 100644
index 00000000000..b7d517a7f6b
--- /dev/null
+++ b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded-target.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>
+ Navigating to a text fragment which is only available after `DOMContentLoaded`
+</title>
+<script src="stash.js"></script>
+<script>
+function checkScroll() {
+ const results = {hasScrolled: window.scrollY != 0};
+ let key = (new URL(document.location)).searchParams.get("key");
+ stashResultsThenClose(key, results);
+};
+window.onload = () => {
+ window.requestAnimationFrame(function() {
+ window.requestAnimationFrame(checkScroll);
+ })
+}
+</script>
+<body>
+<script>
+document.addEventListener("DOMContentLoaded", () => {
+ document.body.innerHTML = `<div style="margin-top: 200vh">After DOMContentLoaded</div>`;
+});
+
+</script>
+</body>
diff --git a/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html
new file mode 100644
index 00000000000..a08d75588d0
--- /dev/null
+++ b/tests/wpt/tests/scroll-to-text-fragment/scroll-to-text-fragment-after-DOMContentLoaded.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>Navigating to a text fragment directive</title>
+<meta charset=utf-8>
+<link rel="help" href="https://wicg.github.io/ScrollToTextFragment/">
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/common/utils.js"></script>
+<script src="stash.js"></script>
+
+<script>
+ promise_test(t => new Promise((resolve, reject) => {
+ let key = token();
+ test_driver.bless('Open a URL with a text fragment directive', () => {
+ window.open(`scroll-to-text-fragment-after-DOMContentLoaded-target.html?key=${key}#:~:text=DOMContentLoaded`, "_blank", "noopener");
+
+ fetchResults(key, resolve, reject);
+ })
+ }).then(data => {
+ assert_true(data.hasScrolled, "Expected text directive to be scrolled to.");
+ })
+ );
+</script>
diff --git a/tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html b/tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html
new file mode 100644
index 00000000000..f6a558d7582
--- /dev/null
+++ b/tests/wpt/tests/selection/move-paragraph-cross-editing-boundary.tentative.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta charset="utf-8">
+<link rel="author" title="Peng Zhou" href="mailto:zhoupeng.1996@bytedance.com">
+<link rel="help" href="https://github.com/w3c/selection-api/issues/173">
+<link rel="help" href="https://issues.chromium.org/issues/326554272">
+<title>Selection.modify(): move by paragraph cross editing boundary</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div contenteditable style="width: 140px; font-size: 14px;">
+ <p>P1</p>
+ <p>
+ Line 1: Hello World
+ Line 2: <span contenteditable="false">Hello</span> <span id="end">World</span>
+ </p>
+</div>
+<script>
+const selection = getSelection();
+const end = document.querySelector('#end');
+function runTest() {
+ selection.collapse(end.childNodes[0], 5);
+ selection.modify('move', 'backward', 'paragraph');
+ assert_equals(selection.anchorNode.nodeValue, 'P1');
+ assert_equals(selection.anchorOffset, 2);
+}
+
+test(() => {
+ runTest();
+}, 'cross editing boundary');
+
+test(() => {
+ const editable = document.querySelector('span[contenteditable=false]');
+ editable.setAttribute('contenteditable', true);
+ runTest();
+}, 'not cross editing boundary');
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html b/tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html
new file mode 100644
index 00000000000..fd246c50924
--- /dev/null
+++ b/tests/wpt/tests/selection/textcontrols/selectionchange-on-shadow-dom.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test selectionchange events fired on shadow dom</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="root"></div>
+
+<script>
+ let root = document.getElementById('root');
+ let shadow = root.attachShadow({ mode: 'open' });
+ let input = document.createElement('input');
+ input.value = 'something to do 0';
+ shadow.append(input);
+
+ let events_on_document = [];
+ document.addEventListener("selectionchange", ev => {
+ events_on_document.push(ev);
+});
+
+promise_test(async () => {
+ input.focus();
+ events_on_document.length = 0;
+ input.setSelectionRange(0, 1);
+ await new Promise(resolve => step_timeout(resolve, 0));
+ assert_equals(events_on_document.length, 1);
+}, "selectionchange event fired on a shadow dom bubble to the document");
+</script> \ No newline at end of file
diff --git a/tests/wpt/tests/shadow-dom/declarative/gethtml.html b/tests/wpt/tests/shadow-dom/declarative/gethtml.html
index ff70653477f..0477cdaf820 100644
--- a/tests/wpt/tests/shadow-dom/declarative/gethtml.html
+++ b/tests/wpt/tests/shadow-dom/declarative/gethtml.html
@@ -12,7 +12,7 @@
<script>
function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot,
lightDOMContent, declarativeShadowDom, mode, delegatesFocus,
- serializable, clonable) {
+ serializable, clonable, emptyShadowTree) {
const t = test(t => {
// Create and attach element
let wrapper;
@@ -63,15 +63,17 @@ function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot,
if (allowsShadowDom) {
const correctShadowHtml = `<template shadowrootmode="${mode}"` +
- `${delegatesAttr}${serializableAttr}${clonableAttr}><slot></slot>` +
- `</template>`;
+ `${delegatesAttr}${serializableAttr}${clonableAttr}>` +
+ (emptyShadowTree ? `` : `<slot></slot>`) + `</template>`;
const correctHtml = `<${elementType}>${correctShadowHtml}` +
`${lightDOMContent}</${elementType}>`;
assert_equals(shadowRoot.mode,mode);
assert_equals(shadowRoot.delegatesFocus,delegatesFocus);
assert_equals(shadowRoot.serializable,expectedSerializable);
assert_equals(shadowRoot.clonable,clonable);
- shadowRoot.appendChild(document.createElement('slot'));
+ if (!emptyShadowTree) {
+ shadowRoot.appendChild(document.createElement('slot'));
+ }
const emptyElement = `<${elementType}>${lightDOMContent}</${elementType}>`;
if (expectedSerializable) {
assert_equals(wrapper.getHTML({serializableShadowRoots: true}),
@@ -104,7 +106,8 @@ function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot,
`<${elementType}>${lightDOMContent}${allowsShadowDom ?
`, with ${declarativeShadowDom ? 'declarative' : 'imperative'} shadow, ` +
`mode=${mode}, delegatesFocus=${delegatesFocus}, ` +
- `serializable=${serializable}, clonable=${clonable}.` : ''}`);
+ `serializable=${serializable}, clonable=${clonable},` : ''}` +
+ ` with${emptyShadowTree ? `out` : ``} shadow tree contents.`);
}
function runAllTests() {
@@ -120,9 +123,12 @@ function runAllTests() {
for (const clonable of [false, true]) {
for (const mode of ['open', 'closed']) {
for (const serializable of [undefined, 'false', 'true']) {
- testElementType(true, elementName, runGetHTMLOnShadowRoot,
- lightDOMContent, declarativeShadowDom, mode,
- delegatesFocus, serializable, clonable);
+ for (const emptyShadowTree of [false, true]) {
+ testElementType(true, elementName, runGetHTMLOnShadowRoot,
+ lightDOMContent, declarativeShadowDom, mode,
+ delegatesFocus, serializable, clonable,
+ emptyShadowTree);
+ }
}
}
}
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-flow.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-flow.html
index d69f95e2afc..e6998105608 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-flow.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-flow.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value flex-flow</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value flex-flow</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -20,12 +20,12 @@
.wrapper {
display: flex;
flex-wrap: wrap;
- reading-order-items: flex-flow;
+ reading-flow: flex-flow;
}
</style>
<div class="test-case" data-expect="C1,A1,B1,D1,E1"
- data-description="Flex items in flexbox should follow flex-flow reading order">
+ data-description="Flex items in flexbox should follow flex-flow reading flow">
<div class="wrapper" style="width: 200px">
<button id="A1">Item A</button>
<button id="B1">Item B</button>
@@ -36,7 +36,7 @@
</div>
<div class="test-case" data-expect="C2,A2,B2,D2,E2"
- data-description="Flex items in rtl flexbox should follow flex-flow reading order">
+ data-description="Flex items in rtl flexbox should follow flex-flow reading flow">
<div class="wrapper" style="width: 200px; direction: rtl">
<button id="A2">Item A</button>
<button id="B2">Item B</button>
@@ -47,7 +47,7 @@
</div>
<div class="test-case" data-expect="C3,A3,B3,D3,E3"
- data-description="Flex items in vertical-lr flexbox should follow flex-flow reading order">
+ data-description="Flex items in vertical-lr flexbox should follow flex-flow reading flow">
<div class="wrapper" style="height: 200px; writing-mode: vertical-lr">
<button id="A3">Item A</button>
<button id="B3">Item B</button>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-visual-order.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-visual-order.html
index ce91f9b3c4c..d8515fd928c 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/flex-visual-order.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/flex-visual-order.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Display: reading-order-items with value flex-visual</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value flex-visual</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -14,12 +14,12 @@
<style>
.wrapper {
display: flex;
- reading-order-items: flex-visual;
+ reading-flow: flex-visual;
}
</style>
<div class="test-case" data-expect="A,B,C"
- data-description="Flex items in flexbox should follow flex-visual reading order">
+ data-description="Flex items in flexbox should follow flex-visual reading flow">
<div class="wrapper">
<button id="A">A</button>
<button id="B">B</button>
@@ -28,7 +28,7 @@
</div>
<div class="test-case" data-expect="C1,B1,A1"
- data-description="Flex items in row-reverse flexbox should follow flex-visual reading order">
+ data-description="Flex items in row-reverse flexbox should follow flex-visual reading flow">
<div class="wrapper" style="flex-direction: row-reverse">
<button id="A1">A</button>
<button id="B1">B</button>
@@ -37,7 +37,7 @@
</div>
<div class="test-case" data-expect="C2,B2,A2"
- data-description="Flex items in row-reverse rtl flexbox should follow flex-visual reading order">
+ data-description="Flex items in row-reverse rtl flexbox should follow flex-visual reading flow">
<div class="wrapper" style="flex-direction: row-reverse; direction: rtl">
<button id="A2">A</button>
<button id="B2">B</button>
@@ -46,7 +46,7 @@
</div>
<div class="test-case" data-expect="C3,B3,A3"
- data-description="Flex items in row-reverse and vertical-lr flexbox should follow flex-visual reading order">
+ data-description="Flex items in row-reverse and vertical-lr flexbox should follow flex-visual reading flow">
<div class="wrapper" style="flex-direction: row-reverse; writing-mode: vertical-lr;">
<button id="A3">A</button>
<button id="B3">B</button>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-columns.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-columns.html
index f07dc63bc58..ad9bd81c7a7 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-columns.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-columns.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value grid-columns</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-columns</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -18,7 +18,7 @@
grid-template-columns: repeat(3, 150px);
grid-template-areas: "d b b"
"c c a";
- reading-order-items: grid-columns;
+ reading-flow: grid-columns;
}
.a { grid-area: a; }
@@ -29,7 +29,7 @@
</style>
<div class="test-case" data-expect="d1,c1,b1,a1"
- data-description="Grid items in grid template columns should follow grid-columns reading order">
+ data-description="Grid items in grid template columns should follow grid-columns reading flow">
<div class="wrapper">
<button class="a" id="a1">Item A</button>
<button class="b" id="b1">Item B</button>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-across-scopes.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-across-scopes.html
index 81d1b7de539..9f7772b9118 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-across-scopes.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-across-scopes.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Display: reading-order-items with value grid-order on shadow host</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order on shadow host</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -14,7 +14,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-on-shadow-host.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-on-shadow-host.html
index a48eda1b57c..f5a8b3c313e 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-on-shadow-host.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-on-shadow-host.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Display: reading-order-items with value grid-order on shadow host</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order on shadow host</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -14,7 +14,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-iframe.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-iframe.html
index 87b9e0a83df..fab6a7b8a68 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-iframe.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-iframe.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Display: reading-order-items with value grid-order on iframe</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order on iframe</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -14,7 +14,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-nested-grids.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-nested-grids.html
index 15bdcf996fd..5daabefd7ff 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-nested-grids.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-nested-grids.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value grid-order in nested grids</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order in nested grids</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -15,7 +15,7 @@
<style>
.box {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
border-radius: 5px;
padding: 20px;
border-style: dashed;
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-popover.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-popover.html
index c96a0c4fcf7..822907378cb 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-popover.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-popover.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value grid-order</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -15,7 +15,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
.popover {
inset:auto;
@@ -48,7 +48,7 @@ promise_test(async () => {
'a',
];
await assert_focus_navigation_forward(elements);
-}, `Popover in reading-order-items: grid-order container.`);
+}, `Popover in reading-flow: grid-order container.`);
promise_test(async () => {
P.classList.add("wrapper");
@@ -61,5 +61,5 @@ promise_test(async () => {
'a',
];
await assert_focus_navigation_forward(elements);
-}, `Popover in container and itself with reading-order-items: grid-order.`);
+}, `Popover in container and itself with reading-flow: grid-order.`);
</script> \ No newline at end of file
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-slots.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-slots.html
index ed658b3510a..4cfdc79fa40 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order-with-slots.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order-with-slots.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value grid-order in Shadow DOM</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order in Shadow DOM</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -15,17 +15,17 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<span id="root1" class="test-case" data-expect="b1,a1,c1"
- data-description="Slot assigned element is a grid with reading-order-items.">
+ data-description="Slot assigned element is a grid with reading-flow.">
<template shadowrootmode="open">
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<slot></slot>
@@ -39,12 +39,12 @@
<br>
<span id="root2" class="test-case" data-expect="b2,a2,c2"
- data-description="Slot is a grid with reading-order-items.">
+ data-description="Slot is a grid with reading-flow.">
<template shadowrootmode="open">
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<slot class="wrapper"></slot>
@@ -56,12 +56,12 @@
<br>
<span id="root3" class="test-case" data-expect="root3/o2,root3/o4,o1,o3,o5"
- data-description="Slot is inside a grid container with reading-order-items.">
+ data-description="Slot is inside a grid container with reading-flow.">
<template shadowrootmode="open">
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<div class="wrapper">
@@ -78,12 +78,12 @@
<span id="root4" class="test-case"
data-expect="root4/after,root4/before,b4,a4,d42,d41,d43,c4"
- data-description="Slot is a grid with reading-order-items inside a grid container with reading-order-items.">
+ data-description="Slot is a grid with reading-flow inside a grid container with reading-flow.">
<template shadowrootmode="open">
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<div class="wrapper">
@@ -126,7 +126,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<div class="wrapper">
@@ -146,7 +146,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
<div class="wrapper">
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order.html
index 3ee91358fd6..358f5c2988c 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-order.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-order.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value grid-order</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-order</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -15,7 +15,7 @@
<style>
.wrapper {
display: grid;
- reading-order-items: grid-order;
+ reading-flow: grid-order;
}
</style>
diff --git a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-rows.html b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-rows.html
index f2442746843..41f986c1f4b 100644
--- a/tests/wpt/tests/shadow-dom/focus-navigation/reading-order/tentative/grid-rows.html
+++ b/tests/wpt/tests/shadow-dom/focus-navigation/reading-flow/tentative/grid-rows.html
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
-<title>CSS Display: reading-order-items with value grid-rows</title>
-<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-order-items">
+<title>CSS Display: reading-flow with value grid-rows</title>
+<link rel="help" href="https://drafts.csswg.org/css-display-4/#reading-flow">
<link rel="author" title="Di Zhang" href="mailto:dizhangg@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
@@ -18,7 +18,7 @@
grid-template-columns: repeat(3, 150px);
grid-template-areas: "d b b"
"c c a";
- reading-order-items: grid-rows;
+ reading-flow: grid-rows;
writing-mode: vertical-lr;
}
@@ -30,7 +30,7 @@
</style>
<div class="test-case" data-expect="d1,b1,c1,a1"
- data-description="Grid items in grid template columns should follow grid-rows reading order">
+ data-description="Grid items in grid template columns should follow grid-rows reading flow">
<div class="wrapper">
<button class="a" id="a1">Item A</button>
<button class="b" id="b1">Item B</button>
diff --git a/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html b/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html
new file mode 100644
index 00000000000..8242f3d1083
--- /dev/null
+++ b/tests/wpt/tests/shared-storage/cross-origin-create-worklet-data-origin-option.tentative.https.sub.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/shared-storage/resources/util.sub.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+async_test(t => {
+ testCreateWorkletWithDataOption(
+ t, "context-origin", "key0", "value0", /*is_same_origin_script=*/false,
+ /*expect_success=*/true);
+}, 'For cross-origin createWorklet with dataOrigin option "context-origin", '
+ + 'there is no error.');
+
+async_test(t => {
+ testCreateWorkletWithDataOption(
+ t, "script-origin", "key0", "value0", /*is_same_origin_script=*/false,
+ /*expect_success=*/true);
+}, 'For cross-origin createWorklet with dataOrigin option "script-origin", '
+ + 'there is no error.');
+
+async_test(t => {
+ testCreateWorkletWithDataOption(
+ t, "invalid", "key0", "value0", /*is_same_origin_script=*/false,
+ /*expect_success=*/false);
+}, 'For cross-origin createWorklet with dataOrigin option "invalid", '
+ + 'there is a TypeError thrown.');
+
+</script>
+</body>
diff --git a/tests/wpt/tests/shared-storage/resources/util.sub.js b/tests/wpt/tests/shared-storage/resources/util.sub.js
index 37b440da52a..dc1ec780a24 100644
--- a/tests/wpt/tests/shared-storage/resources/util.sub.js
+++ b/tests/wpt/tests/shared-storage/resources/util.sub.js
@@ -117,3 +117,45 @@ async function loadNestedSharedStorageFrameInNewFrame(data) {
await windowPromise;
return {frame: frame, nestedFrame: nestedFrame, nestedFrameUrl: nestedSrc};
}
+
+async function testCreateWorkletWithDataOption(
+ test, data_origin, key, value, is_same_origin_script, expect_success) {
+ const sameOrigin = location.origin;
+ const crossOrigin = 'https://{{domains[www]}}:{{ports[https][0]}}';
+ const sameOriginScriptUrl = `/shared-storage/resources/simple-module.js`;
+ const scriptOrigin = is_same_origin_script ? sameOrigin : crossOrigin;
+ const scriptUrl = is_same_origin_script ? sameOriginScriptUrl :
+ crossOrigin + sameOriginScriptUrl;
+
+ try {
+ // Currently the `dataOrigin` option is not hooked up.
+ const worklet = await sharedStorage.createWorklet(
+ scriptUrl, {credentials: 'omit', dataOrigin: data_origin});
+
+ const ancestor_key = token();
+ let url0 =
+ generateURL('/shared-storage/resources/frame0.html', [ancestor_key]);
+
+ let select_url_result =
+ await worklet.selectURL('test-url-selection-operation', [{url: url0}], {
+ data: {'mockResult': 0, 'setKey': key, 'setValue': value},
+ resolveToConfig: true,
+ keepAlive: true
+ });
+
+ assert_true(validateSelectURLResult(select_url_result, true));
+ attachFencedFrame(select_url_result, 'opaque-ads');
+ const result0 = await nextValueFromServer(ancestor_key);
+ assert_equals(result0, 'frame0_loaded');
+
+ await verifyKeyValueForOrigin(key, value, scriptOrigin);
+ await deleteKeyForOrigin(key, scriptOrigin);
+ assert_true(expect_success, 'no error caught even though one was expected');
+ } catch (e) {
+ assert_false(
+ expect_success, 'expected success but error thrown: ' + e.toString());
+ assert_equals(e.name, 'TypeError');
+ } finally {
+ test.done();
+ }
+}
diff --git a/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html b/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html
new file mode 100644
index 00000000000..c84246f65b1
--- /dev/null
+++ b/tests/wpt/tests/shared-storage/same-origin-create-worklet-data-origin-option.tentative.https.sub.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/shared-storage/resources/util.sub.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+async_test(t => {
+ testCreateWorkletWithDataOption(
+ t, "context-origin", "key0", "value0", /*is_same_origin_script=*/true,
+ /*expect_success=*/true);
+}, 'For same-origin createWorklet with dataOrigin option "context-origin", '
+ + 'there is no error.');
+
+async_test(t => {
+ testCreateWorkletWithDataOption(
+ t, "script-origin", "key0", "value0", /*is_same_origin_script=*/true,
+ /*expect_success=*/true);
+}, 'For same-origin createWorklet with dataOrigin option "script-origin", '
+ + 'there is no error.');
+
+async_test(t => {
+ testCreateWorkletWithDataOption(
+ t, "invalid", "key0", "value0", /*is_same_origin_script=*/true,
+ /*expect_success=*/false);
+}, 'For same-origin createWorklet with dataOrigin option "invalid", '
+ + 'there is a TypeError thrown.');
+
+</script>
+</body>
diff --git a/tests/wpt/tests/svg/animations/conditional-processing-01.html b/tests/wpt/tests/svg/animations/conditional-processing-01.html
new file mode 100644
index 00000000000..fe3958f71f3
--- /dev/null
+++ b/tests/wpt/tests/svg/animations/conditional-processing-01.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html class="reftest-wait">
+<title>Test animation as children of failed conditional processing test elements</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/rendering-utils.js"></script>
+<script>
+function test() {
+ document.getElementsByTagName('svg')[0].setCurrentTime(2);
+ waitForAtLeastOneFrame().then(takeScreenshot);
+}
+</script>
+<svg onload="test()">
+ <g systemLanguage="x-xl">
+ <set xlink:href="#test" attributeName="width" begin="2s" to="0" />
+ </g>
+ <rect id="test" width="100" height="100" fill="green"/>
+</svg>
diff --git a/tests/wpt/tests/svg/animations/switch-animation-01.html b/tests/wpt/tests/svg/animations/switch-animation-01.html
new file mode 100644
index 00000000000..f33becbb655
--- /dev/null
+++ b/tests/wpt/tests/svg/animations/switch-animation-01.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html class="reftest-wait">
+<title>Test animation as children of switch elements</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/rendering-utils.js"></script>
+<script>
+function test() {
+ document.getElementsByTagName('svg')[0].setCurrentTime(2);
+ waitForAtLeastOneFrame().then(takeScreenshot);
+}
+</script>
+<svg onload="test()">
+ <switch>
+ <set systemLanguage="x-xl" xlink:href="#test" attributeName="width" begin="2s" to="0" />
+ <set xlink:href="#test" attributeName="height" begin="2s" to="100" />
+ </switch>
+ <rect id="test" width="100" height="0" fill="green"/>
+</svg>
diff --git a/tests/wpt/tests/svg/animations/switch-animation-02.html b/tests/wpt/tests/svg/animations/switch-animation-02.html
new file mode 100644
index 00000000000..c0b97a2cd2a
--- /dev/null
+++ b/tests/wpt/tests/svg/animations/switch-animation-02.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<html class="reftest-wait">
+<title>Test animation as children of switch elements</title>
+<link rel="match" href="../struct/reftests/reference/green-100x100.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/rendering-utils.js"></script>
+<script>
+function test() {
+ document.getElementsByTagName('svg')[0].setCurrentTime(2);
+ waitForAtLeastOneFrame().then(takeScreenshot);
+}
+</script>
+<svg onload="test()">
+ <switch>
+ <g systemLanguage="x-xl">
+ <set xlink:href="#test" attributeName="width" begin="2s" to="0" />
+ </g>
+ <g>
+ <set xlink:href="#test" attributeName="height" begin="2s" to="100" />
+ </g>
+ </switch>
+ <rect id="test" width="100" height="0" fill="green"/>
+</svg>
diff --git a/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html
new file mode 100644
index 00000000000..f027f5151fe
--- /dev/null
+++ b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-child.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<svg width="100" height="100">
+ <use href="use-external-reload-in-iframe-resource.svg#blue"/>
+</svg>
diff --git a/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg
new file mode 100644
index 00000000000..8bc72975282
--- /dev/null
+++ b/tests/wpt/tests/svg/struct/scripted/support/use-external-reload-in-iframe-resource.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <symbol viewBox="0 0 16 16" id="blue">
+ <rect width="16" height="16" fill="blue"/>
+ </symbol>
+</svg>
diff --git a/tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html b/tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html
new file mode 100644
index 00000000000..ab1214d20f1
--- /dev/null
+++ b/tests/wpt/tests/svg/struct/scripted/use-external-reload-in-iframe.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>&lt;use> with external resource in reloaded iframe</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe src="support/use-external-reload-in-iframe-child.html"></iframe>
+<script>
+ async_test(t => {
+ window.onload = t.step_func(() => {
+ const iframe = document.querySelector('iframe');
+ iframe.onload = t.step_func_done();
+ iframe.contentWindow.location.reload();
+ });
+ });
+</script>
diff --git a/tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html b/tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html
new file mode 100644
index 00000000000..5b8cb16b94f
--- /dev/null
+++ b/tests/wpt/tests/svg/types/scripted/SVGLength-zoom.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<title>SVGLength in zoomed div</title>
+<link rel="help" href="https://www.w3.org/TR/SVG/types.html#InterfaceSVGLength">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div style="zoom: 2;">
+<svg>
+ <rect id="rect" width="100" height="100"/>
+</svg>
+</div>
+<script>
+ const rect = document.getElementById("rect");
+
+ test(() => {
+ assert_approx_equals(rect.width.baseVal.value, 100, 0.1);
+ }, "SVGLength in zoomed div should be unchanged");
+</script>
diff --git a/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt b/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt
index 8e178d1d2c4..cd3e785aa47 100644
--- a/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt
+++ b/tests/wpt/tests/tools/ci/requirements_macos_color_profile.txt
@@ -1,4 +1,4 @@
-pyobjc-core==10.2
+pyobjc-core==10.3.1
pyobjc-framework-Cocoa==9.2
pyobjc-framework-ColorSync==9.2
pyobjc-framework-Quartz==9.2
diff --git a/tests/wpt/tests/tools/ci/requirements_tc.txt b/tests/wpt/tests/tools/ci/requirements_tc.txt
index b3c1c51f129..a9128c02eb9 100644
--- a/tests/wpt/tests/tools/ci/requirements_tc.txt
+++ b/tests/wpt/tests/tools/ci/requirements_tc.txt
@@ -1,4 +1,4 @@
pygithub==2.3.0
pyyaml==6.0.1
-requests==2.31.0
+requests==2.32.3
taskcluster==64.2.8
diff --git a/tests/wpt/tests/tools/docker/requirements.txt b/tests/wpt/tests/tools/docker/requirements.txt
index 6451b3a8004..b275ccfd8f1 100644
--- a/tests/wpt/tests/tools/docker/requirements.txt
+++ b/tests/wpt/tests/tools/docker/requirements.txt
@@ -1,2 +1,2 @@
pyyaml==6.0.1
-requests==2.32.2
+requests==2.32.3
diff --git a/tests/wpt/tests/tools/requirements_mypy.txt b/tests/wpt/tests/tools/requirements_mypy.txt
index 3b1d3b03d64..2addbba3b22 100644
--- a/tests/wpt/tests/tools/requirements_mypy.txt
+++ b/tests/wpt/tests/tools/requirements_mypy.txt
@@ -6,9 +6,9 @@ typed-ast==1.5.5
types-atomicwrites==1.4.5.1
types-python-dateutil==2.9.0.20240316
types-PyYAML==6.0.12.12
-types-requests==2.31.0.20231231
+types-requests==2.32.0.20240602
types-setuptools==69.5.0.20240423
types-six==1.16.21.20240425
types-ujson==5.9.0.0
types-urllib3==1.26.25.14
-typing_extensions==4.7.1
+typing_extensions==4.12.2
diff --git a/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py b/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py
index 9d89b47c69b..e02e2ccf28f 100644
--- a/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py
+++ b/tests/wpt/tests/tools/third_party/pywebsocket3/pywebsocket3/request_handler.py
@@ -219,6 +219,7 @@ class WebSocketRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler):
self._logger.info('Request basic authentication')
return False
+ whole_path = self.path
host, port, resource = http_header_util.parse_uri(self.path)
if resource is None:
self._logger.info('Invalid URI: %r', self.path)
@@ -247,7 +248,7 @@ class WebSocketRequestHandler(CGIHTTPServer.CGIHTTPRequestHandler):
# Fallback to default http handler for request paths for which
# we don't have request handlers.
if not self._options.dispatcher.get_handler_suite(self.path):
- self._logger.info('No handler for resource: %r', self.path)
+ self._logger.info('No handler for resource: %r', whole_path)
self._logger.info('Fallback to CGIHTTPRequestHandler')
return True
except dispatch.DispatchException as e:
diff --git a/tests/wpt/tests/tools/webdriver/webdriver/transport.py b/tests/wpt/tests/tools/webdriver/webdriver/transport.py
index ca1ff74ef96..e5ed3473ed4 100644
--- a/tests/wpt/tests/tools/webdriver/webdriver/transport.py
+++ b/tests/wpt/tests/tools/webdriver/webdriver/transport.py
@@ -204,6 +204,8 @@ class HTTPWireProtocol:
``json.JSONEncoder`` unless specified.
:param decoder: JSON decoder class, which defaults to
``json.JSONDecoder`` unless specified.
+ :param timeout: Optional timeout for the underlying socket. `None` will
+ retain the existing timeout.
:param codec_kwargs: Surplus arguments passed on to `encoder`
and `decoder` on construction.
@@ -231,7 +233,7 @@ class HTTPWireProtocol:
# runner thread. We use the boolean below to check for that and restart
# the connection in that case.
self._last_request_is_blocked = True
- response = self._request(method, uri, payload, headers, timeout=None)
+ response = self._request(method, uri, payload, headers, timeout=timeout)
self._last_request_is_blocked = False
return Response.from_http(response, decoder=decoder, **codec_kwargs)
diff --git a/tests/wpt/tests/tools/wpt/browser.py b/tests/wpt/tests/tools/wpt/browser.py
index 4c42ffa4e82..ba716cd14f6 100644
--- a/tests/wpt/tests/tools/wpt/browser.py
+++ b/tests/wpt/tests/tools/wpt/browser.py
@@ -9,6 +9,7 @@ import tempfile
from abc import ABCMeta, abstractmethod
from datetime import datetime, timedelta, timezone
from shutil import which
+from typing import Optional
from urllib.parse import urlsplit
import html5lib
@@ -583,7 +584,7 @@ class ChromeChromiumBase(Browser):
see https://web-platform-tests.org/running-tests/chrome-chromium-installation-detection.html
"""
- requirements = "requirements_chromium.txt"
+ requirements: Optional[str] = "requirements_chromium.txt"
platform = {
"Linux": "Linux",
"Windows": "Win",
@@ -703,12 +704,12 @@ class ChromeChromiumBase(Browser):
try:
# MojoJS version url must match the browser binary version exactly.
- url = ("https://storage.googleapis.com/chrome-wpt-mojom/"
- f"{chrome_version}/linux64/mojojs.zip")
+ url = ("https://storage.googleapis.com/chrome-for-testing-public/"
+ f"{chrome_version}/mojojs.zip")
# Check the status without downloading the content (this is a streaming request).
get(url)
except requests.RequestException:
- # If a valid matching version cannot be found in the wpt archive,
+ # If a valid matching version cannot be found in the CfT archive,
# download from Chromium snapshots bucket. However,
# MojoJS is only bundled with Linux from Chromium snapshots.
if self.platform == "Linux":
@@ -1392,14 +1393,17 @@ class Chrome(ChromeChromiumBase):
return m.group(1)
-class ContentShell(Browser):
- """Interface for the Chromium content shell.
+class HeadlessShell(ChromeChromiumBase):
+ """Interface for the Chromium headless shell [0].
+
+ [0]: https://chromium.googlesource.com/chromium/src/+/HEAD/headless/README.md
"""
- product = "content_shell"
+ product = "headless_shell"
requirements = None
def download(self, dest=None, channel=None, rename=None):
+ # TODO(crbug.com/344669542): Download binaries via CfT.
raise NotImplementedError
def install(self, dest=None, channel=None):
@@ -1409,17 +1413,16 @@ class ContentShell(Browser):
raise NotImplementedError
def find_binary(self, venv_path=None, channel=None):
- if uname[0] == "Darwin":
- return which("Content Shell.app/Contents/MacOS/Content Shell")
- return which("content_shell") # .exe is added automatically for Windows
-
- def find_webdriver(self, venv_path=None, channel=None):
- return None
+ # `which()` adds `.exe` extension automatically for Windows.
+ # Chromium builds an executable named `headless_shell`, whereas CfT
+ # ships under the name `chrome-headless-shell`.
+ return which("headless_shell") or which("chrome-headless-shell")
def version(self, binary=None, webdriver_binary=None):
- # content_shell does not return version information.
+ # TODO(crbug.com/327767951): Support `headless_shell --version`.
return "N/A"
+
class ChromeAndroidBase(Browser):
"""A base class for ChromeAndroid and AndroidWebView.
diff --git a/tests/wpt/tests/tools/wpt/requirements.txt b/tests/wpt/tests/tools/wpt/requirements.txt
index 2c24336eb31..d80d9fc2a3a 100644
--- a/tests/wpt/tests/tools/wpt/requirements.txt
+++ b/tests/wpt/tests/tools/wpt/requirements.txt
@@ -1 +1 @@
-requests==2.31.0
+requests==2.32.3
diff --git a/tests/wpt/tests/tools/wpt/run.py b/tests/wpt/tests/tools/wpt/run.py
index 2fb7f97f498..9c6acbc2a46 100644
--- a/tests/wpt/tests/tools/wpt/run.py
+++ b/tests/wpt/tests/tools/wpt/run.py
@@ -112,7 +112,7 @@ otherwise install OpenSSL and ensure that it's on your $PATH.""")
def check_environ(product):
if product not in ("android_webview", "chrome", "chrome_android", "chrome_ios",
- "content_shell", "edge", "firefox", "firefox_android",
+ "edge", "firefox", "firefox_android", "headless_shell",
"ladybird", "servo", "wktr"):
config_builder = serve.build_config(os.path.join(wpt_root, "config.json"))
# Override the ports to avoid looking for free ports
@@ -521,9 +521,9 @@ class Chrome(BrowserSetup):
kwargs["binary_args"].append("--no-sandbox")
-class ContentShell(BrowserSetup):
- name = "content_shell"
- browser_cls = browser.ContentShell
+class HeadlessShell(BrowserSetup):
+ name = "headless_shell"
+ browser_cls = browser.HeadlessShell
experimental_channels = ("dev", "canary", "nightly")
def setup_kwargs(self, kwargs):
@@ -533,7 +533,7 @@ class ContentShell(BrowserSetup):
if binary:
kwargs["binary"] = binary
else:
- raise WptrunError(f"Unable to locate {self.name.capitalize()} binary")
+ raise WptrunError(f"Unable to locate {self.name!r} binary")
if kwargs["mojojs_path"]:
kwargs["enable_mojojs"] = True
@@ -544,7 +544,13 @@ class ContentShell(BrowserSetup):
"Provide '--mojojs-path' explicitly instead.")
logger.warning("MojoJS is disabled for this run.")
- kwargs["enable_webtransport_h3"] = True
+ # Never pause after test, since headless shell is not interactive.
+ kwargs["pause_after_test"] = False
+ # Don't add a `--headless` switch.
+ kwargs["headless"] = False
+
+ if kwargs["enable_webtransport_h3"] is None:
+ kwargs["enable_webtransport_h3"] = True
class Chromium(Chrome):
@@ -867,8 +873,8 @@ product_setup = {
"chrome_android": ChromeAndroid,
"chrome_ios": ChromeiOS,
"chromium": Chromium,
- "content_shell": ContentShell,
"edge": Edge,
+ "headless_shell": HeadlessShell,
"safari": Safari,
"servo": Servo,
"servodriver": ServoWebDriver,
diff --git a/tests/wpt/tests/tools/wptrunner/requirements.txt b/tests/wpt/tests/tools/wptrunner/requirements.txt
index fba8e42ebe2..ae71bbbad6d 100644
--- a/tests/wpt/tests/tools/wptrunner/requirements.txt
+++ b/tests/wpt/tests/tools/wptrunner/requirements.txt
@@ -5,6 +5,6 @@ mozlog==8.0.0
mozprocess==1.3.1
packaging==24.0
pillow==10.3.0
-requests==2.31.0
+requests==2.32.3
six==1.16.0
urllib3==2.2.1
diff --git a/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt b/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt
index 806352e87e2..f6f1581d858 100644
--- a/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt
+++ b/tests/wpt/tests/tools/wptrunner/requirements_sauce.txt
@@ -1,2 +1,2 @@
selenium==4.20.0
-requests==2.31.0
+requests==2.32.3
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py
index d54a9be9430..aaf91a1dc86 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/__init__.py
@@ -27,10 +27,10 @@ product_list = ["android_webview",
"chrome_android",
"chrome_ios",
"chromium",
- "content_shell",
"edge",
"firefox",
"firefox_android",
+ "headless_shell",
"safari",
"sauce",
"servo",
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py
index dd4fc314fc0..fee8895ef3a 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/base.py
@@ -3,6 +3,8 @@ import errno
import os
import platform
import socket
+import time
+import traceback
from abc import ABCMeta, abstractmethod
from typing import cast, Any, List, Mapping, Optional, Tuple, Type
@@ -10,6 +12,7 @@ import mozprocess
from mozdebug import DebuggerInfo
from mozlog.structuredlog import StructuredLogger
+from ..environment import wait_for_service
from ..testloader import GroupMetadata
from ..wptcommandline import require_arg # noqa: F401
from ..wpttest import Test
@@ -107,6 +110,10 @@ class Browser:
"""Used for browser-specific setup that happens at the start of a test run"""
pass
+ def restart_on_test_type_change(self, new_test_type: str, old_test_type: str) -> bool:
+ """Determines if a restart is needed when there is a test type switch."""
+ return True
+
def settings(self, test: Test) -> BrowserSettings:
"""Dictionary of metadata that is constant for a specific launch of a browser.
@@ -316,6 +323,7 @@ class WebDriverBrowser(Browser):
self.env = os.environ.copy() if env is None else env
self.webdriver_args = webdriver_args if webdriver_args is not None else []
+ self.init_deadline: Optional[float] = None
self._output_handler: Optional[OutputHandler] = None
self._cmd = None
self._proc: Optional[mozprocess.ProcessHandler] = None
@@ -326,6 +334,7 @@ class WebDriverBrowser(Browser):
return [self.webdriver_binary] + self.webdriver_args
def start(self, group_metadata: GroupMetadata, **kwargs: Any) -> None:
+ self.init_deadline = time.time() + self.init_timeout
try:
self._run_server(group_metadata, **kwargs)
except KeyboardInterrupt:
@@ -340,6 +349,7 @@ class WebDriverBrowser(Browser):
return OutputHandler(self.logger, cmd)
def _run_server(self, group_metadata: GroupMetadata, **kwargs: Any) -> None:
+ assert self.init_deadline is not None
cmd = self.make_command()
self._output_handler = self.create_output_handler(cmd)
@@ -349,7 +359,7 @@ class WebDriverBrowser(Browser):
env=self.env,
storeOutput=False)
- self.logger.debug("Starting WebDriver: %s" % ' '.join(cmd))
+ self.logger.info("Starting WebDriver: %s" % ' '.join(cmd))
try:
self._proc.run()
except OSError as e:
@@ -359,8 +369,21 @@ class WebDriverBrowser(Browser):
raise
self._output_handler.after_process_start(self._proc.pid)
- self._output_handler.start(group_metadata=group_metadata, **kwargs)
- self.logger.debug("_run complete")
+ try:
+ wait_for_service(
+ self.logger,
+ self.host,
+ self.port,
+ timeout=self.init_deadline - time.time(),
+ server_process=self._proc,
+ )
+ except Exception:
+ self.logger.error(f"WebDriver was not accessible within {self.init_timeout} seconds.")
+ self.logger.error(traceback.format_exc())
+ raise
+ finally:
+ self._output_handler.start(group_metadata=group_metadata, **kwargs)
+ self.logger.info("Webdriver started successfully.")
def stop(self, force: bool = False) -> bool:
self.logger.debug("Stopping WebDriver")
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
index c0a176743de..3b1bd6411e2 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -6,12 +6,12 @@ from .base import NullBrowser # noqa: F401
from .base import get_timeout_multiplier # noqa: F401
from .base import cmd_arg
from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorwebdriver import WebDriverCrashtestExecutor # noqa: F401
from ..executors.base import WdspecExecutor # noqa: F401
from ..executors.executorchrome import ( # noqa: F401
ChromeDriverPrintRefTestExecutor,
ChromeDriverRefTestExecutor,
ChromeDriverTestharnessExecutor,
+ ChromeDriverCrashTestExecutor
)
@@ -22,7 +22,7 @@ __wptrunner__ = {"product": "chrome",
"reftest": "ChromeDriverRefTestExecutor",
"print-reftest": "ChromeDriverPrintRefTestExecutor",
"wdspec": "WdspecExecutor",
- "crashtest": "WebDriverCrashtestExecutor"},
+ "crashtest": "ChromeDriverCrashTestExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
@@ -194,6 +194,13 @@ def update_properties():
class ChromeBrowser(WebDriverBrowser):
+ def restart_on_test_type_change(self, new_test_type: str, old_test_type: str) -> bool:
+ # Restart the test runner when switch from/to wdspec tests. Wdspec test
+ # is using a different protocol class so a restart is always needed.
+ if "wdspec" in [old_test_type, new_test_type]:
+ return True
+ return False
+
def make_command(self):
return [self.webdriver_binary,
cmd_arg("port", str(self.port)),
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py
index db81b91957b..e559a5d7573 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/chrome_ios.py
@@ -1,9 +1,7 @@
# mypy: allow-untyped-defs
-import traceback
from .base import WebDriverBrowser, require_arg
from .base import get_timeout_multiplier # noqa: F401
-from ..environment import wait_for_service
from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.base import WdspecExecutor # noqa: F401
from ..executors.executorwebdriver import (WebDriverCrashtestExecutor, # noqa: F401
@@ -60,19 +58,3 @@ class ChromeiOSBrowser(WebDriverBrowser):
def make_command(self):
return ([self.webdriver_binary, f"--port={self.port}"] +
self.webdriver_args)
-
- def start(self, group_metadata, **kwargs):
- super().start(group_metadata, **kwargs)
- try:
- wait_for_service(
- self.logger,
- self.host,
- self.port,
- timeout=self.init_timeout,
- server_process=self._proc,
- )
- except Exception:
- self.logger.error(
- "WebDriver was not accessible "
- f"within the timeout:\n{traceback.format_exc()}")
- raise
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py
deleted file mode 100644
index 6df8671e0ac..00000000000
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/content_shell.py
+++ /dev/null
@@ -1,134 +0,0 @@
-# mypy: allow-untyped-defs
-
-from . import chrome_spki_certs
-from .base import cmd_arg, require_arg
-from .base import get_timeout_multiplier # noqa: F401
-from .chrome import ChromeBrowser, debug_args
-from ..executors import executor_kwargs as base_executor_kwargs
-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'
-DISABLE_THREADED_ANIMATION_FLAG = '--disable-threaded-animation'
-
-
-__wptrunner__ = {"product": "content_shell",
- "check_args": "check_args",
- "browser": "ContentShellBrowser",
- "executor": {
- "crashtest": "WebDriverCrashtestExecutor",
- "print-reftest": "ChromeDriverPrintRefTestExecutor",
- "reftest": "ChromeDriverRefTestExecutor",
- "testharness": "ChromeDriverTestharnessExecutor",
- "wdspec": "WdspecExecutor",
- },
- "browser_kwargs": "browser_kwargs",
- "executor_kwargs": "executor_kwargs",
- "env_extras": "env_extras",
- "env_options": "env_options",
- "update_properties": "update_properties",
- "timeout_multiplier": "get_timeout_multiplier",}
-
-
-def check_args(**kwargs):
- 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 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.
- chrome_options["args"].append("--webtransport-developer-mode")
- chrome_options["args"].append("--enable-blink-test-features")
-
- # always run in headful mode for content_shell
-
- if kwargs["debug_info"]:
- chrome_options["args"].extend(debug_args(kwargs["debug_info"]))
-
- for arg in kwargs.get("binary_args", []):
- # 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
- # 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 chrome_options["args"]:
- chrome_options["args"].append(arg)
-
- executor_kwargs["capabilities"] = capabilities
-
- return executor_kwargs
-
-
-def env_extras(**kwargs):
- return []
-
-
-def env_options():
- return {"server_host": "127.0.0.1",
- "supports_debugger": True}
-
-
-def update_properties():
- return (["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]})
-
-
-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/browsers/firefox.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
index d22da8568ad..d977930a289 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -910,7 +910,6 @@ class FirefoxWdSpecBrowser(WebDriverBrowser):
self.binary = binary
self.package_name = package_name
self.webdriver_binary = webdriver_binary
- self.init_deadline = None
self.stackfix_dir = stackfix_dir
self.symbols_path = symbols_path
@@ -959,7 +958,6 @@ class FirefoxWdSpecBrowser(WebDriverBrowser):
def start(self, group_metadata, **kwargs):
self.leak_report_file = setup_leak_report(self.leak_check, self.profile, self.env)
- self.init_deadline = time.time() + self.init_timeout
super().start(group_metadata, **kwargs)
def stop(self, force=False):
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py
new file mode 100644
index 00000000000..e7da3e64548
--- /dev/null
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/browsers/headless_shell.py
@@ -0,0 +1,62 @@
+# mypy: allow-untyped-defs
+
+from .base import cmd_arg, require_arg
+from .base import get_timeout_multiplier # noqa: F401
+from .chrome import ChromeBrowser, debug_args, executor_kwargs # noqa: F401
+from ..executors.base import WdspecExecutor # noqa: F401
+from ..executors.executorchrome import ( # noqa: F401
+ ChromeDriverCrashTestExecutor,
+ ChromeDriverPrintRefTestExecutor,
+ ChromeDriverRefTestExecutor,
+ ChromeDriverTestharnessExecutor,
+)
+
+
+__wptrunner__ = {"product": "headless_shell",
+ "check_args": "check_args",
+ "browser": "HeadlessShellBrowser",
+ "executor": {
+ "crashtest": "ChromeDriverCrashTestExecutor",
+ "print-reftest": "ChromeDriverPrintRefTestExecutor",
+ "reftest": "ChromeDriverRefTestExecutor",
+ "testharness": "ChromeDriverTestharnessExecutor",
+ "wdspec": "WdspecExecutor",
+ },
+ "browser_kwargs": "browser_kwargs",
+ "executor_kwargs": "executor_kwargs",
+ "env_extras": "env_extras",
+ "env_options": "env_options",
+ "update_properties": "update_properties",
+ "timeout_multiplier": "get_timeout_multiplier",}
+
+
+def check_args(**kwargs):
+ 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 env_extras(**kwargs):
+ return []
+
+
+def env_options():
+ return {"server_host": "127.0.0.1",
+ "supports_debugger": True}
+
+
+def update_properties():
+ return (["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]})
+
+
+class HeadlessShellBrowser(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/base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py
index 20bddaa4bc9..f0264173b18 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/base.py
@@ -286,13 +286,17 @@ class TestExecutor:
"prefs": {}}
self.protocol = None # This must be set in subclasses
- def setup(self, runner):
+ def setup(self, runner, protocol=None):
"""Run steps needed before tests can be started e.g. connecting to
browser instance
- :param runner: TestRunner instance that is going to run the tests"""
+ :param runner: TestRunner instance that is going to run the tests.
+ :param protocol: protocol connection to reuse if not None"""
self.runner = runner
- if self.protocol is not None:
+ if protocol is not None:
+ assert isinstance(protocol, self.protocol_cls)
+ self.protocol = protocol
+ elif self.protocol is not None:
self.protocol.setup(runner)
def teardown(self):
@@ -630,7 +634,8 @@ class WdspecExecutor(TestExecutor):
self.binary = binary
self.binary_args = binary_args
- def setup(self, runner):
+ def setup(self, runner, protocol=None):
+ assert protocol is None, "Switch executor not allowed for wdspec tests."
self.protocol = self.protocol_cls(self, self.browser)
super().setup(runner)
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py
index 46d38f14c55..d972a0eea5f 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorchrome.py
@@ -215,6 +215,10 @@ class ChromeDriverProtocol(WebDriverProtocol):
vendor_prefix = "goog"
+class ChromeDriverCrashTestExecutor(WebDriverCrashtestExecutor):
+ protocol_cls = ChromeDriverProtocol
+
+
class ChromeDriverRefTestExecutor(WebDriverRefTestExecutor, _SanitizerMixin): # type: ignore
protocol_cls = ChromeDriverProtocol
@@ -226,8 +230,8 @@ class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMi
super().__init__(*args, **kwargs)
self.protocol.reuse_window = reuse_window
- def setup(self, runner):
- super().setup(runner)
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
# Chromium requires the `background-sync` permission for reporting APIs
# to work. Not all embedders (notably, `chrome --headless=old`) grant
# `background-sync` by default, so this CDP call ensures the permission
@@ -248,8 +252,8 @@ class ChromeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMi
class ChromeDriverPrintRefTestExecutor(ChromeDriverRefTestExecutor):
protocol_cls = ChromeDriverProtocol
- def setup(self, runner):
- super().setup(runner)
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
self.protocol.pdf_print.load_runner()
self.has_window = False
with open(os.path.join(here, "reftest.js")) as f:
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py
index ad546b7e840..75a3313c55c 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executoredge.py
@@ -38,8 +38,8 @@ class EdgeDriverTestharnessExecutor(WebDriverTestharnessExecutor, _SanitizerMixi
class EdgeDriverPrintRefTestExecutor(EdgeDriverRefTestExecutor):
protocol_cls = EdgeDriverProtocol
- def setup(self, runner):
- super().setup(runner)
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
self.protocol.pdf_print.load_runner()
self.has_window = False
with open(os.path.join(here, "reftest.js")) as f:
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 05a9fc1ae4b..fe1fed13630 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -952,8 +952,8 @@ class MarionetteTestharnessExecutor(TestharnessExecutor):
if marionette is None:
do_delayed_imports()
- def setup(self, runner):
- super().setup(runner)
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
for extension_path in self.install_extensions:
self.logger.info("Installing extension from %s" % extension_path)
addons = Addons(self.protocol.marionette)
@@ -1081,8 +1081,8 @@ class MarionetteRefTestExecutor(RefTestExecutor):
return (InternalRefTestImplementation if reftest_internal
else RefTestImplementation)(self)
- def setup(self, runner):
- super().setup(runner)
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
for extension_path in self.install_extensions:
self.logger.info("Installing extension from %s" % extension_path)
addons = Addons(self.protocol.marionette)
@@ -1335,8 +1335,8 @@ class MarionettePrintRefTestExecutor(MarionetteRefTestExecutor):
debug=debug,
**kwargs)
- def setup(self, runner):
- super().setup(runner)
+ def setup(self, runner, protocol=None):
+ super().setup(runner, protocol)
if not isinstance(self.implementation, InternalRefTestImplementation):
self.protocol.pdf_print.load_runner()
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index f985d486759..20ae4a42118 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -509,7 +509,9 @@ class WebDriverProtocol(Protocol):
self.logger.debug(message)
self.webdriver = None
- def is_alive(self):
+ def is_alive(self) -> bool:
+ if not self.webdriver:
+ return False
try:
# Get a simple property over the connection, with 2 seconds of timeout
# that should be more than enough to check if the WebDriver its
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py
index 4a2c01372e0..b90e45d3678 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/process.py
@@ -10,7 +10,7 @@ class ProcessTestExecutor(TestExecutor):
self.interactive = (False if self.debug_info is None
else self.debug_info.interactive)
- def setup(self, runner):
+ def setup(self, runner, protocol=None):
self.runner = runner
self.runner.send_message("init_succeeded")
return True
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py
index 098e443b5ce..c7cdee6887e 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testloader.py
@@ -553,13 +553,14 @@ class TestQueueBuilder:
processes = self.process_count(self.kwargs["processes"], len(groups))
if processes > 1:
groups.sort(key=lambda group: (
- # Place groups of the same test type together to minimize
- # browser restarts.
+ # Place groups of the same subsuite, test type together to
+ # minimize browser restarts.
+ group.subsuite,
group.test_type,
# Next, run larger groups first to avoid straggler runners. Use
# timeout to give slow tests greater relative weight.
- -sum(test.timeout for test in group.group),
- ))
+ sum(test.timeout for test in group.group),
+ ), reverse=True)
for item in groups:
test_queue.put(item)
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py
index 93e19fa47ba..0a5dfb1fd18 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testrunner.py
@@ -30,6 +30,11 @@ TestImplementation = namedtuple('TestImplementation',
'browser_cls', 'browser_kwargs'])
+ExecutorImplementation = namedtuple('ExecutorImplementation',
+ ['executor_cls', 'executor_kwargs',
+ 'executor_browser_cls', 'executor_browser_kwargs'])
+
+
class StopFlag:
"""Synchronization for coordinating a graceful exit."""
@@ -75,11 +80,13 @@ class TestRunner:
parent TestRunnerManager process
:param executor: TestExecutor object that will actually run a test.
"""
- def __init__(self, logger, command_queue, result_queue, executor, recording):
+ def __init__(self, logger, command_queue, result_queue, executor_implementation, recording):
self.command_queue = command_queue
self.result_queue = result_queue
-
- self.executor = executor
+ browser = executor_implementation.executor_browser_cls(
+ **executor_implementation.executor_browser_kwargs)
+ self.executor = executor_implementation.executor_cls(
+ logger, browser, **executor_implementation.executor_kwargs)
self.name = mpcontext.get_context().current_process().name
self.logger = logger
self.recording = recording
@@ -108,6 +115,28 @@ class TestRunner:
self.command_queue = None
self.browser = None
+ def switch_executor(self, executor_implementation):
+ assert self.executor is not None
+ # reuse the current protocol connection
+ protocol = self.executor.protocol
+ self.executor.protocol = None
+ self.executor.teardown()
+ browser = executor_implementation.executor_browser_cls(
+ **executor_implementation.executor_browser_kwargs)
+ self.executor = executor_implementation.executor_cls(
+ self.logger, browser, **executor_implementation.executor_kwargs)
+ if type(self.executor.protocol) is not type(protocol):
+ self.send_message("switch_executor_failed")
+ self.logger.error("Protocol type does not match, switch executor failed.")
+ return
+ try:
+ self.executor.setup(self, protocol)
+ except Exception:
+ self.send_message("switch_executor_failed")
+ else:
+ self.send_message("switch_executor_succeeded")
+ self.logger.debug("Switch Executor done")
+
def run(self):
"""Main loop accepting commands over the pipe and triggering
the associated methods"""
@@ -118,6 +147,7 @@ class TestRunner:
traceback.format_exc())
raise
commands = {"run_test": self.run_test,
+ "switch_executor": self.switch_executor,
"reset": self.reset,
"stop": self.stop,
"wait": self.wait}
@@ -157,9 +187,8 @@ class TestRunner:
def start_runner(runner_command_queue, runner_result_queue,
- executor_cls, executor_kwargs,
- executor_browser_cls, executor_browser_kwargs,
- capture_stdio, stop_flag, recording):
+ executor_implementation, capture_stdio,
+ stop_flag, recording):
"""Launch a TestRunner in a new process"""
def send_message(command, *args):
@@ -179,9 +208,11 @@ def start_runner(runner_command_queue, runner_result_queue,
with capture.CaptureIO(logger, capture_stdio):
try:
- browser = executor_browser_cls(**executor_browser_kwargs)
- executor = executor_cls(logger, browser, **executor_kwargs)
- with TestRunner(logger, runner_command_queue, runner_result_queue, executor, recording) as runner:
+ with TestRunner(logger,
+ runner_command_queue,
+ runner_result_queue,
+ executor_implementation,
+ recording) as runner:
try:
runner.run()
except KeyboardInterrupt:
@@ -301,6 +332,8 @@ class _RunnerManagerState:
running = namedtuple("running", ["subsuite", "test_type", "test", "test_group", "group_metadata"])
restarting = namedtuple("restarting", ["subsuite", "test_type", "test", "test_group",
"group_metadata", "force_stop"])
+ switching_executor = namedtuple("switching_executor",
+ ["subsuite", "test_type", "test", "test_group", "group_metadata"])
error = namedtuple("error", [])
stop = namedtuple("stop", ["force_stop"])
@@ -482,6 +515,11 @@ class TestRunnerManager(threading.Thread):
"test_ended": self.test_ended,
"wait_finished": self.wait_finished,
},
+ RunnerManagerState.switching_executor:
+ {
+ "switch_executor_succeeded": self.switch_executor_succeeded,
+ "switch_executor_failed": self.switch_executor_failed,
+ },
RunnerManagerState.restarting: {},
RunnerManagerState.error: {},
RunnerManagerState.stop: {},
@@ -589,18 +627,11 @@ class TestRunnerManager(threading.Thread):
assert self.remote_queue is not None
self.logger.info("Starting runner")
impl = self.test_implementations[(self.state.subsuite, self.state.test_type)]
- self.executor_cls = impl.executor_cls
- self.executor_kwargs = impl.executor_kwargs
- self.executor_kwargs["group_metadata"] = self.state.group_metadata
- self.executor_kwargs["browser_settings"] = self.browser.browser_settings
- executor_browser_cls, executor_browser_kwargs = self.browser.browser.executor_browser()
+ self.executor_implementation = self.get_executor_implementation(impl)
args = (self.remote_queue,
self.command_queue,
- self.executor_cls,
- self.executor_kwargs,
- executor_browser_cls,
- executor_browser_kwargs,
+ self.executor_implementation,
self.capture_stdio,
self.child_stop_flag,
self.recording)
@@ -613,6 +644,16 @@ class TestRunnerManager(threading.Thread):
self.logger.debug("Test runner started")
# Now we wait for either an init_succeeded event or an init_failed event
+ def get_executor_implementation(self, impl):
+ executor_kwargs = impl.executor_kwargs
+ executor_kwargs["group_metadata"] = self.state.group_metadata
+ executor_kwargs["browser_settings"] = self.browser.browser_settings
+ executor_browser_cls, executor_browser_kwargs = self.browser.browser.executor_browser()
+ return ExecutorImplementation(impl.executor_cls,
+ executor_kwargs,
+ executor_browser_cls,
+ executor_browser_kwargs)
+
def init_succeeded(self):
assert isinstance(self.state, RunnerManagerState.initializing)
self.browser.after_init()
@@ -671,8 +712,9 @@ class TestRunnerManager(threading.Thread):
# Factor of 3 on the extra timeout here is based on allowing the executor
# at least test.timeout + 2 * extra_timeout to complete,
# which in turn is based on having several layers of timeout inside the executor
- wait_timeout = (self.state.test.timeout * self.executor_kwargs['timeout_multiplier'] +
- 3 * self.executor_cls.extra_timeout)
+ timeout_multiplier = self.executor_implementation.executor_kwargs['timeout_multiplier']
+ wait_timeout = (self.state.test.timeout * timeout_multiplier +
+ 3 * self.executor_implementation.executor_cls.extra_timeout)
self.timer = threading.Timer(wait_timeout, self._timeout)
self.timer.name = f"{self.name}-timeout"
@@ -796,7 +838,8 @@ class TestRunnerManager(threading.Thread):
test.min_assertion_count,
test.max_assertion_count)
- file_result.extra["test_timeout"] = test.timeout * self.executor_kwargs['timeout_multiplier']
+ timeout_multiplier = self.executor_implementation.executor_kwargs['timeout_multiplier']
+ file_result.extra["test_timeout"] = test.timeout * timeout_multiplier
if self.browser.browser_pid:
file_result.extra["browser_pid"] = self.browser.browser_pid
@@ -832,6 +875,23 @@ class TestRunnerManager(threading.Thread):
# post-stop processing
return self.after_test_end(self.state.test, not rerun, force_rerun=rerun)
+ def switch_executor_succeeded(self):
+ assert isinstance(self.state, RunnerManagerState.switching_executor)
+ return RunnerManagerState.running(self.state.subsuite,
+ self.state.test_type,
+ self.state.test,
+ self.state.test_group,
+ self.state.group_metadata)
+
+ def switch_executor_failed(self):
+ assert isinstance(self.state, RunnerManagerState.switching_executor)
+ return RunnerManagerState.restarting(self.state.subsuite,
+ self.state.test_type,
+ self.state.test,
+ self.state.test_group,
+ self.state.group_metadata,
+ False)
+
def after_test_end(self, test, restart, force_rerun=False, force_stop=False):
assert isinstance(self.state, RunnerManagerState.running)
# Mixing manual reruns and automatic reruns is confusing; we currently assume
@@ -844,12 +904,20 @@ class TestRunnerManager(threading.Thread):
if subsuite != self.state.subsuite:
self.logger.info(f"Restarting browser for new subsuite:{subsuite}")
restart = True
- elif test_type != self.state.test_type:
- self.logger.info(f"Restarting browser for new test type:{test_type}")
- restart = True
elif self.restart_on_new_group and test_group is not self.state.test_group:
self.logger.info("Restarting browser for new test group")
restart = True
+ elif test_type != self.state.test_type:
+ if self.browser.browser.restart_on_test_type_change(test_type, self.state.test_type):
+ self.logger.info(f"Restarting browser for new test type:{test_type}")
+ restart = True
+ else:
+ self.logger.info(f"Switching executor for new test type: {self.state.test_type} => {test_type}")
+ impl = self.test_implementations[subsuite, test_type]
+ self.executor_implementation = self.get_executor_implementation(impl)
+ self.send_message("switch_executor", self.executor_implementation)
+ return RunnerManagerState.switching_executor(
+ subsuite, test_type, test, test_group, group_metadata)
else:
subsuite = self.state.subsuite
test_type = self.state.test_type
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py
index b5e40e3f8df..a3d804336e1 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/tests/browsers/test_base.py
@@ -2,6 +2,7 @@
import sys
from os.path import dirname, join
+from unittest import mock
import pytest
@@ -29,14 +30,19 @@ def test_logging_immediate_exit():
handler = MozLogTestHandler()
logger.add_handler(handler)
- browser = base.WebDriverBrowser(
- logger, webdriver_binary="echo", webdriver_args=["sample output"]
- )
- try:
- browser.start(group_metadata={})
- finally:
- # Ensure the `echo` process actually exits
- browser._proc.wait()
+ class CustomException(Exception):
+ pass
+
+ with mock.patch.object(base, "wait_for_service", side_effect=CustomException):
+ browser = base.WebDriverBrowser(
+ logger, webdriver_binary="echo", webdriver_args=["sample output"]
+ )
+ try:
+ with pytest.raises(CustomException):
+ browser.start(group_metadata={})
+ finally:
+ # Ensure the `echo` process actually exits
+ browser._proc.wait()
process_output_actions = [
data for data in handler.items if data["action"] == "process_output"
diff --git a/tests/wpt/tests/touch-events/single-touch-vertical-rl.html b/tests/wpt/tests/touch-events/single-touch-vertical-rl.html
index 857007b1f8a..3c34a6d9c96 100644
--- a/tests/wpt/tests/touch-events/single-touch-vertical-rl.html
+++ b/tests/wpt/tests/touch-events/single-touch-vertical-rl.html
@@ -33,7 +33,7 @@
.pointerMove(10, 20)
.pointerDown()
.pointerUp();
- actions.send();
+ await actions.send();
}
</script>
<style>
diff --git a/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html b/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html
index afb2f5f7c4b..404619b5f7a 100644
--- a/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html
+++ b/tests/wpt/tests/trusted-types/trusted-types-duplicate-names-list.html
@@ -2,7 +2,7 @@
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <meta http-equiv="Content-Security-Policy" content="trusted-types a b c*">
+ <meta http-equiv="Content-Security-Policy" content="trusted-types a b c">
</head>
<body>
<script>
diff --git a/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html b/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html
index 960e333c092..a8fae03db5a 100644
--- a/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html
+++ b/tests/wpt/tests/web-animations/timing-model/time-transformations/transformed-progress.html
@@ -53,6 +53,19 @@ const gStepTimingFunctionTests = [
]
},
{
+ description: 'Test start bounds of step-start easing with no delay',
+ effect: {
+ delay: 0,
+ duration: 1000,
+ fill: 'backwards',
+ easing: 'steps(1, start)'
+ },
+ conditions: [
+ { currentTime: -1, progress: 0 },
+ { currentTime: 0, progress: 1 }
+ ]
+ },
+ {
description: 'Test bounds point of step-start easing with reverse direction',
effect: {
delay: 1000,
@@ -387,5 +400,30 @@ for (const options of gStepTimingFunctionTests) {
}, options.description);
}
+test(t => {
+ const target = createDiv(t);
+ const anim = target.animate(
+ [
+ { easing: 'steps(1, start)', opacity: 0 },
+ { opacity: 1 }
+ ],
+ { easing: 'linear(-2, 2)', duration: 1000, fill: 'both' });
+
+ anim.currentTime = 0;
+ assert_equals(anim.effect.getComputedTiming().progress, -2);
+ // Input < 0 ==> output = 0.
+ assert_equals(getComputedStyle(target).opacity, "0");
+ anim.currentTime = 500;
+ assert_equals(anim.effect.getComputedTiming().progress, 0);
+ // Input = 0 & before flag = false ==> output = 1.
+ assert_equals(getComputedStyle(target).opacity, "1");
+ anim.currentTime = 1000;
+ // Input > 0 & before flag = false ==> output = 1.
+ assert_equals(anim.effect.getComputedTiming().progress, 2);
+ assert_equals(getComputedStyle(target).opacity, "1");
+
+}, 'Test global timing function with values outside [0,1] with a step ' +
+ 'timing function on the keyframe');
+
</script>
</body>
diff --git a/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js b/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js
index c0f1a08cf90..fe2df1ef7fd 100644
--- a/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js
+++ b/tests/wpt/tests/webauthn/public-key-credential-creation-options-from-json.https.window.js
@@ -98,21 +98,17 @@ test(() => {
},
],
extensions: {
- appid: "app id",
- appidExclude: "app id exclude",
- hamcCreateSecret: true,
- uvm: true,
- credentialProtectionPolicy: "cred protect",
+ appidExclude: "https://example.com/appid",
+ hmacCreateSecret: true,
+ credentialProtectionPolicy: "userVerificationRequired",
enforceCredentialProtectionPolicy: true,
minPinLength: true,
credProps: true,
largeBlob: {
- support: "large blob support",
- read: true,
+ support: "required",
write: test_b64,
},
credBlob: test_b64,
- getCredBlob: true,
supplementalPubKeys: {
scopes: ["spk scope"],
attestation: "directest",
@@ -150,21 +146,17 @@ test(() => {
},
],
extensions: {
- appid: "app id",
- appidExclude: "app id exclude",
- hamcCreateSecret: true,
- uvm: true,
- credentialProtectionPolicy: "cred protect",
+ appidExclude: "https://example.com/appid",
+ hmacCreateSecret: true,
+ credentialProtectionPolicy: "userVerificationRequired",
enforceCredentialProtectionPolicy: true,
minPinLength: true,
credProps: true,
largeBlob: {
- support: "large blob support",
- read: true,
+ support: "required",
write: test_bytes,
},
credBlob: test_bytes,
- getCredBlob: true,
supplementalPubKeys: {
scopes: ["spk scope"],
attestation: "directest",
@@ -188,22 +180,15 @@ test(() => {
},
};
- assert_equals(actual.extensions.appid, expected.extensions.appid);
assert_equals(actual.extensions.appidExclude, expected.extensions.appidExclude);
assert_equals(actual.extensions.hmacCreateSecret, expected.extensions.hmacCreateSecret);
- assert_equals(actual.extensions.uvm, expected.extensions.uvm);
assert_equals(actual.extensions.credentialProtectionPolicy, expected.extensions.credentialProtectionPolicy);
assert_equals(actual.extensions.enforceCredentialProtectionPolicy, expected.extensions.enforceCredentialProtectionPolicy);
assert_equals(actual.extensions.minPinLength, expected.extensions.minPinLength);
assert_equals(actual.extensions.credProps, expected.extensions.credProps);
- assert_equals(actual.extensions.largeBlob.support, expected.extensions.largeBlob.support, "X");
- assert_equals(actual.extensions.largeBlob.read, expected.extensions.largeBlob.read);
-
- assert_true(bytesEqual(actual.extensions.largeBlob.write, expected.extensions.largeBlob.write), "XX");
-
- assert_true(bytesEqual(actual.extensions.credBlob, expected.extensions.credBlob), "XXX");
-
- assert_equals(actual.extensions.getCredBlob, expected.extensions.getCredBlob);
+ assert_equals(actual.extensions.largeBlob.support, expected.extensions.largeBlob.support);
+ assert_true(bytesEqual(actual.extensions.largeBlob.write, expected.extensions.largeBlob.write));
+ assert_true(bytesEqual(actual.extensions.credBlob, expected.extensions.credBlob));
assertJsonEquals(actual.extensions.supplementalPubKeys, expected.extensions.supplementalPubKeys);
let prfValuesEquals = (a, b) => {
return bytesEqual(a.first, b.first) && bytesEqual(a.second, b.second);
diff --git a/tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js b/tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js
new file mode 100644
index 00000000000..82e778b027d
--- /dev/null
+++ b/tests/wpt/tests/webauthn/public-key-credential-request-options-from-json.https.window.js
@@ -0,0 +1,107 @@
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+// META: script=/resources/utils.js
+// META: script=helpers.js
+
+// The string "test" as ASCII bytes and base64url-encoded.
+const test_bytes = new Uint8Array([0x74, 0x65, 0x73, 0x74]);
+const test_b64 = "dGVzdA";
+
+test(() => {
+ let actual = PublicKeyCredential.parseRequestOptionsFromJSON({
+ challenge: test_b64,
+ timeout: 60000,
+ rpId: "example.com",
+ allowCredentials: [
+ { type: "public-key", id: test_b64 },
+ ],
+ userVerification: "required",
+ hints: ["hybrid", "security-key"],
+ });
+ let expected = {
+ challenge: test_bytes,
+ timeout: 60000,
+ rpId: "example.com",
+ allowCredentials: [
+ { type: "public-key", id: test_bytes },
+ ],
+ userVerification: "required",
+ hints: ["hybrid", "security-key"],
+ };
+
+ assert_equals(actual.rpId, expected.rpId);
+ assert_true(bytesEqual(actual.challenge, expected.challenge));
+ assert_equals(actual.timeout, expected.timeout);
+ assert_equals(actual.allowCredentials.length, expected.allowCredentials.length);
+ assert_equals(actual.allowCredentials[0].type, expected.allowCredentials[0].type);
+ assert_true(bytesEqual(actual.allowCredentials[0].id, expected.allowCredentials[0].id));
+ assert_equals(actual.userVerification, expected.userVerification);
+ assertJsonEquals(actual.hints, expected.hints);
+}, "parseRequestOptionsFromJSON()");
+
+test(() => {
+ let actual = PublicKeyCredential.parseRequestOptionsFromJSON({
+ challenge: test_b64,
+ extensions: {
+ appid: "app id",
+ largeBlob: {
+ read: true,
+ },
+ getCredBlob: true,
+ supplementalPubKeys: {
+ scopes: ["spk scope"],
+ attestation: "directest",
+ attestationFormats: ["asn2"],
+ },
+ prf: {
+ eval: {
+ first: test_b64,
+ second: test_b64,
+ },
+ evalByCredential: {
+ "test cred": {
+ first: test_b64,
+ second: test_b64,
+ },
+ },
+ },
+ },
+ });
+ let expected = {
+ challenge: test_b64,
+ extensions: {
+ appid: "app id",
+ largeBlob: {
+ read: true,
+ },
+ getCredBlob: true,
+ supplementalPubKeys: {
+ scopes: ["spk scope"],
+ attestation: "directest",
+ attestationFormats: ["asn2"],
+ },
+ prf: {
+ eval: {
+ first: test_bytes,
+ second: test_bytes,
+ },
+ evalByCredential: {
+ "test cred": {
+ first: test_bytes,
+ second: test_bytes,
+ },
+ },
+ },
+ },
+ };
+
+ assert_equals(actual.extensions.appid, expected.extensions.appid);
+ assert_equals(actual.extensions.largeBlob.read, expected.extensions.largeBlob.read);
+ assert_equals(actual.extensions.getCredBlob, expected.extensions.getCredBlob);
+ assertJsonEquals(actual.extensions.supplementalPubKeys, expected.extensions.supplementalPubKeys);
+ let prfValuesEquals = (a, b) => {
+ return bytesEqual(a.first, b.first) && bytesEqual(a.second, b.second);
+ };
+ assert_true(prfValuesEquals(actual.extensions.prf.eval, expected.extensions.prf.eval), "prf eval");
+ assert_true(prfValuesEquals(actual.extensions.prf.evalByCredential["test cred"], expected.extensions.prf.evalByCredential["test cred"]), "prf ebc");
+}, "parseRequestOptionsFromJSON() with extensions");
diff --git a/tests/wpt/tests/webcodecs/videoFrame-construction.any.js b/tests/wpt/tests/webcodecs/videoFrame-construction.any.js
index 9f2929aedec..f49cb62c5c0 100644
--- a/tests/wpt/tests/webcodecs/videoFrame-construction.any.js
+++ b/tests/wpt/tests/webcodecs/videoFrame-construction.any.js
@@ -751,3 +751,260 @@ test(t => {
frame.close();
}, 'Test a VideoFrame constructed from canvas can drop the alpha channel.');
+function testAllYUVPixelFormats() {
+ const YUVs = [
+ {
+ init: {
+ format: 'I420',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 1 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, // u
+ 1, 2, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I420P10',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, // u
+ 1, 2, 3, 4, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I420P12',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, // u
+ 1, 2, 3, 4, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I420A',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 1 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, // u
+ 1, 2, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, // a
+ ])
+ },
+ {
+ init: {
+ format: 'I420AP10',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, // u
+ 1, 2, 3, 4, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a
+ ])
+ },
+ {
+ init: {
+ format: 'I420AP12',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, // u
+ 1, 2, 3, 4, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a
+ ])
+ },
+ {
+ init: {
+ format: 'I422',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 1 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, 3, 4, // u
+ 1, 2, 3, 4, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I422P10',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I422P12',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I422A',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 1 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, 3, 4, // u
+ 1, 2, 3, 4, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, // a
+ ])
+ },
+ {
+ init: {
+ format: 'I422AP10',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a
+
+ ])
+ },
+ {
+ init: {
+ format: 'I422AP12',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a
+
+ ])
+ },
+ {
+ init: {
+ format: 'I444',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 1 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I444P10',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I444P12',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v
+ ])
+ },
+ {
+ init: {
+ format: 'I444A',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 1 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, // a
+ ])
+ },
+ {
+ init: {
+ format: 'I444AP10',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a
+ ])
+ },
+ {
+ init: {
+ format: 'I444AP12',
+ timestamp: 1234,
+ codedWidth: 4,
+ codedHeight: 2
+ },
+ data: new Uint8Array([ // 2 byte per sample
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // y
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // u
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // v
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, // a
+ ])
+ },
+ ];
+
+ for (let yuv of YUVs) {
+ test(t => {
+ const frame = new VideoFrame(yuv.data, yuv.init);
+ frame.close();
+ }, `Test we can construct a ${yuv.init.format} VideoFrame`);
+ }
+}
+testAllYUVPixelFormats();
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py b/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py
index 98d6a2e2c8b..49a8397474b 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browser/remove_user_context/user_context.py
@@ -1,10 +1,13 @@
import pytest
-from tests.support.sync import AsyncPoll
import webdriver.bidi.error as error
+from webdriver.error import TimeoutException
+from tests.support.sync import AsyncPoll
from .. import get_user_context_ids
+USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
+
@pytest.mark.asyncio
async def test_remove_context(bidi_session, create_user_context):
@@ -19,9 +22,8 @@ async def test_remove_context(bidi_session, create_user_context):
@pytest.mark.parametrize("type_hint", ["tab", "window"])
@pytest.mark.asyncio
async def test_remove_context_closes_contexts(
- bidi_session, subscribe_events, wait_for_event, create_user_context, type_hint
+ bidi_session, subscribe_events, create_user_context, type_hint
):
- # Subscribe to all browsing context events
await subscribe_events(events=["browsingContext.contextDestroyed"])
user_context_1 = await create_user_context()
@@ -73,3 +75,40 @@ async def test_remove_context_closes_contexts(
assert context_4["context"] in destroyed_contexts
remove_listener()
+
+
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+@pytest.mark.asyncio
+async def test_remove_context_skips_beforeunload_prompt(
+ bidi_session,
+ subscribe_events,
+ create_user_context,
+ setup_beforeunload_page,
+ type_hint,
+):
+ await subscribe_events(events=[USER_PROMPT_OPENED_EVENT])
+
+ events = []
+
+ async def on_event(method, data):
+ if data["type"] == "beforeunload":
+ events.append(method)
+
+ remove_listener = bidi_session.add_event_listener(
+ USER_PROMPT_OPENED_EVENT, on_event)
+
+ user_context = await create_user_context()
+
+ context = await bidi_session.browsing_context.create(
+ user_context=user_context, type_hint=type_hint
+ )
+
+ await setup_beforeunload_page(context)
+
+ await bidi_session.browser.remove_user_context(user_context=user_context)
+
+ wait = AsyncPoll(bidi_session, timeout=0.5)
+ with pytest.raises(TimeoutException):
+ await wait.until(lambda _: len(events) > 0)
+
+ remove_listener()
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
index 91899eb50df..a60940d370f 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/__init__.py
@@ -18,6 +18,7 @@ def assert_browsing_context(
parent=None,
url=None,
user_context="default",
+ original_opener=None
):
assert "children" in info
if children is not None:
@@ -51,6 +52,7 @@ def assert_browsing_context(
assert isinstance(info["url"], str)
assert info["url"] == url
assert info["userContext"] == user_context
+ assert info["originalOpener"] == original_opener
async def assert_document_status(bidi_session, context, visible, focused):
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
index 5172b25d997..63dbd3a23c5 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/context_created.py
@@ -67,6 +67,7 @@ async def test_evaluate_window_open_without_url(bidi_session, subscribe_events,
children=None,
url="about:blank",
parent=None,
+ original_opener=top_context["context"]
)
@@ -89,6 +90,7 @@ async def test_evaluate_window_open_with_url(bidi_session, subscribe_events, wai
children=None,
url="about:blank",
parent=None,
+ original_opener=top_context["context"]
)
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py
new file mode 100644
index 00000000000..115f9679df7
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/context_created/original_opener.py
@@ -0,0 +1,65 @@
+import pytest
+from webdriver.bidi.modules.script import ContextTarget
+
+from .. import assert_browsing_context
+
+pytestmark = pytest.mark.asyncio
+
+CONTEXT_CREATED_EVENT = "browsingContext.contextCreated"
+
+
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+async def test_original_opener_context_create(bidi_session, wait_for_event, wait_for_future_safe, subscribe_events, type_hint):
+
+ await subscribe_events([CONTEXT_CREATED_EVENT])
+ on_entry = wait_for_event(CONTEXT_CREATED_EVENT)
+
+ top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint)
+
+ context_info = await wait_for_future_safe(on_entry)
+
+ assert_browsing_context(
+ context_info,
+ context=top_level_context["context"],
+ original_opener=None,
+ url="about:blank",
+ )
+
+
+@pytest.mark.parametrize("type_hint", ["tab", "window"])
+@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"])
+@pytest.mark.parametrize("features, returns_window", [
+ ("", True),
+ ("popup", True),
+ ("noopener", False),
+ ("noreferrer", False)
+]
+)
+async def test_original_opener_window_open(bidi_session, wait_for_event, wait_for_future_safe, subscribe_events, inline,
+ type_hint, domain, features, returns_window):
+
+ top_level_context = await bidi_session.browsing_context.create(type_hint=type_hint)
+
+ await subscribe_events([CONTEXT_CREATED_EVENT])
+ on_entry = wait_for_event(CONTEXT_CREATED_EVENT)
+
+ url = inline("", domain=domain)
+
+ result = await bidi_session.script.evaluate(
+ expression=f"""window.open("{url}", "_blank", "{features}");""",
+ target=ContextTarget(top_level_context["context"]),
+ await_promise=False)
+
+ context_info = await wait_for_future_safe(on_entry)
+
+ # We use None here as evaluate not always returns value.
+ context = None
+ if returns_window:
+ context = result["value"]["context"]
+
+ assert_browsing_context(
+ context_info,
+ context=context,
+ original_opener=top_level_context["context"],
+ url="about:blank",
+ )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py
index 767305405c6..6dbe7446b63 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/handle_user_prompt/handle_user_prompt.py
@@ -3,13 +3,18 @@ import pytest
import webdriver.bidi.error as error
from webdriver.bidi.modules.script import ContextTarget
+from webdriver.error import TimeoutException
+
pytestmark = pytest.mark.asyncio
+USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed"
USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
-async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_context, subscribe_events):
+async def test_alert(
+ bidi_session, wait_for_event, wait_for_future_safe, new_tab, subscribe_events
+):
await subscribe_events([USER_PROMPT_OPENED_EVENT])
on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
@@ -17,7 +22,7 @@ async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_con
task = asyncio.create_task(
bidi_session.script.evaluate(
expression="window.alert('test')",
- target=ContextTarget(top_context["context"]),
+ target=ContextTarget(new_tab["context"]),
await_promise=False,
)
)
@@ -25,9 +30,7 @@ async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_con
# Wait for prompt to appear.
await wait_for_future_safe(on_entry)
- await bidi_session.browsing_context.handle_user_prompt(
- context=top_context["context"]
- )
+ await bidi_session.browsing_context.handle_user_prompt(context=new_tab["context"])
# Make sure that script returned.
result = await task
@@ -37,7 +40,12 @@ async def test_alert(bidi_session, wait_for_event, wait_for_future_safe, top_con
@pytest.mark.parametrize("accept", [True, False])
async def test_confirm(
- bidi_session, wait_for_event, wait_for_future_safe, top_context, subscribe_events, accept
+ bidi_session,
+ wait_for_event,
+ wait_for_future_safe,
+ new_tab,
+ subscribe_events,
+ accept,
):
await subscribe_events([USER_PROMPT_OPENED_EVENT])
on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
@@ -46,7 +54,7 @@ async def test_confirm(
task = asyncio.create_task(
bidi_session.script.evaluate(
expression="window.confirm('test')",
- target=ContextTarget(top_context["context"]),
+ target=ContextTarget(new_tab["context"]),
await_promise=False,
)
)
@@ -55,7 +63,7 @@ async def test_confirm(
await wait_for_future_safe(on_entry)
await bidi_session.browsing_context.handle_user_prompt(
- context=top_context["context"], accept=accept
+ context=new_tab["context"], accept=accept
)
# Check that return result of confirm is correct.
@@ -66,7 +74,12 @@ async def test_confirm(
@pytest.mark.parametrize("accept", [True, False])
async def test_prompt(
- bidi_session, wait_for_event, wait_for_future_safe, top_context, subscribe_events, accept
+ bidi_session,
+ wait_for_event,
+ wait_for_future_safe,
+ new_tab,
+ subscribe_events,
+ accept,
):
await subscribe_events([USER_PROMPT_OPENED_EVENT])
on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
@@ -75,7 +88,7 @@ async def test_prompt(
task = asyncio.create_task(
bidi_session.script.evaluate(
expression="window.prompt('Enter Your Name: ')",
- target=ContextTarget(top_context["context"]),
+ target=ContextTarget(new_tab["context"]),
await_promise=False,
)
)
@@ -85,7 +98,7 @@ async def test_prompt(
test_user_text = "Test"
await bidi_session.browsing_context.handle_user_prompt(
- context=top_context["context"], accept=accept, user_text=test_user_text
+ context=new_tab["context"], accept=accept, user_text=test_user_text
)
# Check that return result of prompt is correct.
@@ -97,10 +110,69 @@ async def test_prompt(
assert result == {"type": "null"}
+@pytest.mark.parametrize("accept", [True, False])
+async def test_beforeunload(
+ bidi_session,
+ subscribe_events,
+ url,
+ new_tab,
+ setup_beforeunload_page,
+ wait_for_event,
+ wait_for_future_safe,
+ accept,
+):
+ await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
+
+ on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
+
+ await setup_beforeunload_page(new_tab)
+
+ page_target = url("/webdriver/tests/support/html/default.html")
+ navigated_future = await bidi_session.send_command(
+ "browsingContext.navigate",
+ {
+ "context": new_tab["context"],
+ "url": page_target,
+ "wait": "complete",
+ },
+ )
+
+ # Wait for the prompt to open.
+ event = await wait_for_future_safe(on_entry)
+
+ on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT)
+
+ await bidi_session.browsing_context.handle_user_prompt(
+ context=new_tab["context"], accept=accept
+ )
+
+ # Wait for the prompt to be closed.
+ event = await wait_for_future_safe(on_prompt_closed)
+
+ if accept:
+ # Check navigation to the target page.
+ navigated = await wait_for_future_safe(navigated_future)
+ assert navigated["url"] == page_target
+ else:
+ # If the beforeunload prompt was dismissed no navigation takes place.
+ with pytest.raises(TimeoutException):
+ await wait_for_future_safe(navigated_future, timeout=0.5)
+
+ contexts = await bidi_session.browsing_context.get_tree(
+ root=new_tab["context"], max_depth=0
+ )
+ assert contexts[0]["url"] != page_target
+
+
@pytest.mark.parametrize("type_hint", ["tab", "window"])
async def test_two_top_level_contexts(
- bidi_session, top_context, inline, subscribe_events, wait_for_event,
- wait_for_future_safe, type_hint
+ bidi_session,
+ new_tab,
+ inline,
+ subscribe_events,
+ wait_for_event,
+ wait_for_future_safe,
+ type_hint,
):
new_context = await bidi_session.browsing_context.create(type_hint=type_hint)
@@ -118,7 +190,7 @@ async def test_two_top_level_contexts(
# Try to close the prompt in another context.
with pytest.raises(error.NoSuchAlertException):
await bidi_session.browsing_context.handle_user_prompt(
- context=top_context["context"]
+ context=new_tab["context"]
)
# Close the prompt in the correct context
@@ -131,7 +203,7 @@ async def test_two_top_level_contexts(
async def test_multiple_frames(
bidi_session,
- top_context,
+ new_tab,
inline,
test_page_multiple_frames,
subscribe_events,
@@ -142,12 +214,12 @@ async def test_multiple_frames(
on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
await bidi_session.browsing_context.navigate(
- context=top_context["context"],
+ context=new_tab["context"],
url=test_page_multiple_frames,
wait="complete",
)
- contexts = await bidi_session.browsing_context.get_tree(root=top_context["context"])
+ contexts = await bidi_session.browsing_context.get_tree(root=new_tab["context"])
assert len(contexts) == 1
assert len(contexts[0]["children"]) == 2
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py
new file mode 100644
index 00000000000..c4c51603619
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/beforeunload.py
@@ -0,0 +1,47 @@
+import pytest
+
+pytestmark = pytest.mark.asyncio
+
+USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed"
+USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
+
+
+@pytest.mark.parametrize("accept", [False, True])
+async def test_beforeunload(
+ bidi_session,
+ url,
+ new_tab,
+ subscribe_events,
+ setup_beforeunload_page,
+ wait_for_event,
+ wait_for_future_safe,
+ accept,
+):
+ await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
+ await setup_beforeunload_page(new_tab)
+
+ on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
+
+ await bidi_session.send_command(
+ "browsingContext.navigate",
+ {
+ "context": new_tab["context"],
+ "url": url("/webdriver/tests/support/html/default.html"),
+ },
+ )
+
+ # Wait for prompt to appear.
+ await wait_for_future_safe(on_entry)
+
+ on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT)
+
+ await bidi_session.browsing_context.handle_user_prompt(
+ context=new_tab["context"], accept=accept
+ )
+
+ # Just make sure the prompt is closed.
+ event = await wait_for_future_safe(on_prompt_closed)
+ assert event == {
+ "context": new_tab["context"],
+ "accepted": accept,
+ }
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
index 68a0eed1922..a8ab1490c46 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
@@ -8,7 +8,9 @@ USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed"
USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
-async def test_unsubscribe(bidi_session, inline, new_tab, wait_for_event, wait_for_future_safe):
+async def test_unsubscribe(
+ bidi_session, inline, new_tab, wait_for_event, wait_for_future_safe
+):
await bidi_session.session.subscribe(
events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT]
)
@@ -43,8 +45,13 @@ async def test_unsubscribe(bidi_session, inline, new_tab, wait_for_event, wait_f
remove_listener()
-async def test_subscribe_with_alert(
- bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe
+async def test_prompt_type_alert(
+ bidi_session,
+ subscribe_events,
+ inline,
+ new_tab,
+ wait_for_event,
+ wait_for_future_safe,
):
await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
@@ -64,12 +71,21 @@ async def test_subscribe_with_alert(
event = await wait_for_future_safe(on_prompt_closed)
- assert event == {"context": new_tab["context"], "accepted": True}
+ assert event == {
+ "context": new_tab["context"],
+ "accepted": True,
+ }
@pytest.mark.parametrize("accept", [True, False])
-async def test_subscribe_with_confirm(
- bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe, accept
+async def test_prompt_type_confirm(
+ bidi_session,
+ subscribe_events,
+ inline,
+ new_tab,
+ wait_for_event,
+ wait_for_future_safe,
+ accept,
):
await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
@@ -91,12 +107,21 @@ async def test_subscribe_with_confirm(
event = await wait_for_future_safe(on_prompt_closed)
- assert event == {"context": new_tab["context"], "accepted": accept}
+ assert event == {
+ "context": new_tab["context"],
+ "accepted": accept,
+ }
@pytest.mark.parametrize("accept", [True, False])
-async def test_subscribe_with_prompt(
- bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe, accept
+async def test_prompt_type_prompt(
+ bidi_session,
+ subscribe_events,
+ inline,
+ new_tab,
+ wait_for_event,
+ wait_for_future_safe,
+ accept,
):
await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
@@ -126,11 +151,19 @@ async def test_subscribe_with_prompt(
"userText": test_user_text,
}
else:
- assert event == {"context": new_tab["context"], "accepted": accept}
+ assert event == {
+ "context": new_tab["context"],
+ "accepted": accept,
+ }
-async def test_subscribe_with_prompt_with_defaults(
- bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe
+async def test_prompt_with_defaults(
+ bidi_session,
+ subscribe_events,
+ inline,
+ new_tab,
+ wait_for_event,
+ wait_for_future_safe,
):
await subscribe_events(events=[USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
@@ -146,18 +179,24 @@ async def test_subscribe_with_prompt_with_defaults(
on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT)
- await bidi_session.browsing_context.handle_user_prompt(
- context=new_tab["context"]
- )
+ await bidi_session.browsing_context.handle_user_prompt(context=new_tab["context"])
event = await wait_for_future_safe(on_prompt_closed)
- assert event == {"context": new_tab["context"], "accepted": True}
+ assert event == {
+ "context": new_tab["context"],
+ "accepted": True,
+ }
@pytest.mark.parametrize("type_hint", ["tab", "window"])
async def test_subscribe_to_one_context(
- bidi_session, subscribe_events, inline, wait_for_event, wait_for_future_safe, type_hint
+ bidi_session,
+ subscribe_events,
+ inline,
+ wait_for_event,
+ wait_for_future_safe,
+ type_hint,
):
new_context = await bidi_session.browsing_context.create(type_hint=type_hint)
@@ -261,10 +300,11 @@ async def test_iframe(
await wait_for_future_safe(on_prompt_opened)
- await bidi_session.browsing_context.handle_user_prompt(
- context=frame["context"]
- )
+ await bidi_session.browsing_context.handle_user_prompt(context=frame["context"])
event = await wait_for_future_safe(on_prompt_closed)
- assert event == {"context": new_tab["context"], "accepted": True}
+ assert event == {
+ "context": new_tab["context"],
+ "accepted": True,
+ }
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py
new file mode 100644
index 00000000000..782cc766507
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/beforeunload.py
@@ -0,0 +1,45 @@
+import pytest
+
+from .. import (
+ any_string,
+ recursive_compare,
+)
+
+
+pytestmark = pytest.mark.asyncio
+
+USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
+
+
+async def test_beforeunload(
+ bidi_session,
+ subscribe_events,
+ url,
+ new_tab,
+ setup_beforeunload_page,
+ wait_for_event,
+ wait_for_future_safe,
+):
+ await subscribe_events(events=[USER_PROMPT_OPENED_EVENT])
+ on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
+
+ await setup_beforeunload_page(new_tab)
+
+ await bidi_session.send_command(
+ "browsingContext.navigate",
+ {
+ "context": new_tab["context"],
+ "url": url("/webdriver/tests/support/html/default.html"),
+ },
+ )
+
+ event = await wait_for_future_safe(on_entry)
+
+ recursive_compare(
+ {
+ "context": new_tab["context"],
+ "type": "beforeunload",
+ "message": any_string,
+ },
+ event,
+ )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
index c37bb66e4e9..e4e633e4564 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
@@ -2,6 +2,7 @@ import pytest
from tests.support.sync import AsyncPoll
from webdriver.error import TimeoutException
+
pytestmark = pytest.mark.asyncio
USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
@@ -35,7 +36,13 @@ async def test_unsubscribe(bidi_session, inline, new_tab):
@pytest.mark.parametrize("prompt_type", ["alert", "confirm", "prompt"])
async def test_prompt_type(
- bidi_session, subscribe_events, inline, new_tab, wait_for_event, wait_for_future_safe, prompt_type
+ bidi_session,
+ subscribe_events,
+ inline,
+ new_tab,
+ wait_for_event,
+ wait_for_future_safe,
+ prompt_type,
):
await subscribe_events(events=[USER_PROMPT_OPENED_EVENT])
on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
@@ -53,17 +60,23 @@ async def test_prompt_type(
"context": new_tab["context"],
"type": prompt_type,
"message": text,
- **({
- "defaultValue": ""
- } if prompt_type == 'prompt' else {})
+ **({"defaultValue": ""} if prompt_type == "prompt" else {}),
}
@pytest.mark.parametrize(
- "default", [None, "", "default"], ids=["undefined", "empty string", "non empty string"]
+ "default",
+ [None, "", "default"],
+ ids=["undefined", "empty string", "non empty string"],
)
async def test_prompt_default_value(
- bidi_session, inline, new_tab, subscribe_events, wait_for_event, wait_for_future_safe, default
+ bidi_session,
+ inline,
+ new_tab,
+ subscribe_events,
+ wait_for_event,
+ wait_for_future_safe,
+ default,
):
await subscribe_events(events=[USER_PROMPT_OPENED_EVENT])
on_entry = wait_for_event(USER_PROMPT_OPENED_EVENT)
@@ -98,7 +111,12 @@ async def test_prompt_default_value(
@pytest.mark.parametrize("type_hint", ["tab", "window"])
async def test_subscribe_to_one_context(
- bidi_session, subscribe_events, inline, wait_for_event, wait_for_future_safe, type_hint
+ bidi_session,
+ subscribe_events,
+ inline,
+ wait_for_event,
+ wait_for_future_safe,
+ type_hint,
):
new_context = await bidi_session.browsing_context.create(type_hint=type_hint)
await subscribe_events(
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py
index c1b4c1dd54b..319d90d3def 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/__init__.py
@@ -318,6 +318,8 @@ HTTP_STATUS_AND_STATUS_TEXT = [
(505, "HTTP Version Not Supported"),
]
+PAGE_DATA_URL_HTML = "data:text/html,<div>foo</div>"
+PAGE_DATA_URL_IMAGE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEX/TQBcNTh/AAAAAXRSTlPM0jRW/QAAAApJREFUeJxjYgAAAAYAAzY3fKgAAAAASUVORK5CYII="
PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html"
PAGE_EMPTY_IMAGE = "/webdriver/tests/bidi/network/support/empty.png"
PAGE_EMPTY_SCRIPT = "/webdriver/tests/bidi/network/support/empty.js"
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py
index 22588b7013a..3ef51b2d61c 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent.py
@@ -8,6 +8,8 @@ from tests.support.sync import AsyncPoll
from .. import (
assert_before_request_sent_event,
+ PAGE_DATA_URL_HTML,
+ PAGE_DATA_URL_IMAGE,
PAGE_EMPTY_HTML,
PAGE_EMPTY_TEXT,
PAGE_REDIRECT_HTTP_EQUIV,
@@ -459,3 +461,55 @@ async def test_url_with_fragment(
expected_request={"method": "GET", "url": fragment_url},
redirect_count=0,
)
+
+
+@pytest.mark.parametrize(
+ "page_url",
+ [PAGE_DATA_URL_HTML, PAGE_DATA_URL_IMAGE],
+ ids=["html", "image"],
+)
+@pytest.mark.asyncio
+async def test_navigate_data_url(
+ bidi_session, top_context, wait_for_event, wait_for_future_safe, setup_network_test, page_url
+):
+ network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT])
+ events = network_events[BEFORE_REQUEST_SENT_EVENT]
+
+ on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT)
+ await bidi_session.browsing_context.navigate(
+ context=top_context["context"], url=page_url, wait="complete"
+ )
+ await wait_for_future_safe(on_before_request_sent)
+
+ assert len(events) == 1
+
+ assert_before_request_sent_event(
+ events[0],
+ expected_request={"method": "GET", "url": page_url},
+ redirect_count=0,
+ )
+
+
+@pytest.mark.parametrize(
+ "fetch_url",
+ [PAGE_DATA_URL_HTML, PAGE_DATA_URL_IMAGE],
+ ids=["html", "image"],
+)
+@pytest.mark.asyncio
+async def test_fetch_data_url(
+ wait_for_event, wait_for_future_safe, fetch, setup_network_test, fetch_url
+):
+ network_events = await setup_network_test(events=[BEFORE_REQUEST_SENT_EVENT])
+ events = network_events[BEFORE_REQUEST_SENT_EVENT]
+
+ on_before_request_sent = wait_for_event(BEFORE_REQUEST_SENT_EVENT)
+ await fetch(fetch_url, method="GET")
+ await wait_for_future_safe(on_before_request_sent)
+
+ assert len(events) == 1
+
+ assert_before_request_sent_event(
+ events[0],
+ expected_request={"method": "GET", "url": fetch_url},
+ redirect_count=0,
+ )
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py
index 30b35ef7e0d..51333a0195f 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/response_completed/response_completed.py
@@ -10,6 +10,8 @@ from tests.support.sync import AsyncPoll
from .. import (
assert_response_event,
HTTP_STATUS_AND_STATUS_TEXT,
+ PAGE_DATA_URL_HTML,
+ PAGE_DATA_URL_IMAGE,
PAGE_EMPTY_HTML,
PAGE_EMPTY_IMAGE,
PAGE_EMPTY_SCRIPT,
@@ -442,3 +444,77 @@ async def test_url_with_fragment(
expected_response={"url": fragment_url},
redirect_count=0,
)
+
+
+@pytest.mark.parametrize(
+ "page_url, mimeType",
+ [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")],
+ ids=["html", "image"],
+)
+@pytest.mark.asyncio
+async def test_navigate_data_url(
+ bidi_session, top_context, wait_for_event, wait_for_future_safe, setup_network_test, page_url, mimeType
+):
+ network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT])
+ events = network_events[RESPONSE_COMPLETED_EVENT]
+
+ on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT)
+ await bidi_session.browsing_context.navigate(
+ context=top_context["context"], url=page_url, wait="complete"
+ )
+ await wait_for_future_safe(on_response_completed)
+
+ assert len(events) == 1
+
+ assert_response_event(
+ events[0],
+ expected_request={"method": "GET", "url": page_url},
+ expected_response={
+ "headers": [{
+ "name": "Content-Type",
+ "value": {"type": "string", "value": mimeType}
+ }],
+ "mimeType": mimeType,
+ "protocol": "data",
+ "status": 200,
+ "statusText": "OK",
+ "url": page_url,
+ },
+ redirect_count=0,
+ )
+
+
+@pytest.mark.parametrize(
+ "fetch_url, mimeType",
+ [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")],
+ ids=["html", "image"],
+)
+@pytest.mark.asyncio
+async def test_fetch_data_url(
+ wait_for_event, wait_for_future_safe, fetch, setup_network_test, fetch_url, mimeType
+):
+ network_events = await setup_network_test(events=[RESPONSE_COMPLETED_EVENT])
+ events = network_events[RESPONSE_COMPLETED_EVENT]
+
+ on_before_request_sent = wait_for_event(RESPONSE_COMPLETED_EVENT)
+ await fetch(fetch_url, method="GET")
+ await wait_for_future_safe(on_before_request_sent)
+
+ assert len(events) == 1
+
+ assert_response_event(
+ events[0],
+ expected_request={"method": "GET", "url": fetch_url},
+ expected_response={
+ "headers": [{
+ "name": "Content-Type",
+ "value": {"type": "string", "value": mimeType}
+ }],
+ "mimeType": mimeType,
+ "protocol": "data",
+ "status": 200,
+ "statusText": "OK",
+ "url": fetch_url,
+ },
+ redirect_count=0,
+ )
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 030d9168a1d..17ec9ffe31b 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
@@ -9,6 +9,8 @@ from tests.support.sync import AsyncPoll
from .. import (
assert_response_event,
HTTP_STATUS_AND_STATUS_TEXT,
+ PAGE_DATA_URL_HTML,
+ PAGE_DATA_URL_IMAGE,
PAGE_EMPTY_HTML,
PAGE_EMPTY_IMAGE,
PAGE_EMPTY_SCRIPT,
@@ -411,3 +413,77 @@ async def test_url_with_fragment(
expected_response={"url": fragment_url},
redirect_count=0,
)
+
+
+@pytest.mark.parametrize(
+ "page_url, mimeType",
+ [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")],
+ ids=["html", "image"],
+)
+@pytest.mark.asyncio
+async def test_navigate_data_url(
+ bidi_session, top_context, wait_for_event, wait_for_future_safe, setup_network_test, page_url, mimeType
+):
+ network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT])
+ events = network_events[RESPONSE_STARTED_EVENT]
+
+ on_response_started = wait_for_event(RESPONSE_STARTED_EVENT)
+ await bidi_session.browsing_context.navigate(
+ context=top_context["context"], url=page_url, wait="complete"
+ )
+ await wait_for_future_safe(on_response_started)
+
+ assert len(events) == 1
+
+ assert_response_event(
+ events[0],
+ expected_request={"method": "GET", "url": page_url},
+ expected_response={
+ "headers": [{
+ "name": "Content-Type",
+ "value": {"type": "string", "value": mimeType}
+ }],
+ "mimeType": mimeType,
+ "protocol": "data",
+ "status": 200,
+ "statusText": "OK",
+ "url": page_url,
+ },
+ redirect_count=0,
+ )
+
+
+@pytest.mark.parametrize(
+ "fetch_url, mimeType",
+ [(PAGE_DATA_URL_HTML, "text/html"), (PAGE_DATA_URL_IMAGE, "image/png")],
+ ids=["html", "image"],
+)
+@pytest.mark.asyncio
+async def test_fetch_data_url(
+ wait_for_event, wait_for_future_safe, fetch, setup_network_test, fetch_url, mimeType
+):
+ network_events = await setup_network_test(events=[RESPONSE_STARTED_EVENT])
+ events = network_events[RESPONSE_STARTED_EVENT]
+
+ on_response_started = wait_for_event(RESPONSE_STARTED_EVENT)
+ await fetch(fetch_url, method="GET")
+ await wait_for_future_safe(on_response_started)
+
+ assert len(events) == 1
+
+ assert_response_event(
+ events[0],
+ expected_request={"method": "GET", "url": fetch_url},
+ expected_response={
+ "headers": [{
+ "name": "Content-Type",
+ "value": {"type": "string", "value": mimeType}
+ }],
+ "mimeType": mimeType,
+ "protocol": "data",
+ "status": 200,
+ "statusText": "OK",
+ "url": fetch_url,
+ },
+ redirect_count=0,
+ )
diff --git a/tests/wpt/tests/webdriver/tests/classic/close_window/close.py b/tests/wpt/tests/webdriver/tests/classic/close_window/close.py
index 680f471839c..f606e957d41 100644
--- a/tests/wpt/tests/webdriver/tests/classic/close_window/close.py
+++ b/tests/wpt/tests/webdriver/tests/classic/close_window/close.py
@@ -45,29 +45,24 @@ def test_close_browsing_context(session):
assert new_handle not in handles
-def test_close_browsing_context_with_dismissed_beforeunload_prompt(session, inline):
+@pytest.mark.parametrize("type", ["tab", "window"])
+def test_close_browsing_context_with_accepted_beforeunload_prompt(session, url, type):
original_handles = session.handles
- new_handle = session.new_window()
+ new_handle = session.new_window(type_hint=type)
session.window_handle = new_handle
- session.url = inline("""
- <input type="text">
- <script>
- window.addEventListener("beforeunload", function (event) {
- event.preventDefault();
- });
- </script>
- """)
+ session.url = url("/webdriver/tests/support/html/beforeunload.html")
- session.find.css("input", all=False).send_keys("foo")
+ element = session.find.css("input", all=False)
+ element.send_keys("bar")
response = close(session)
handles = assert_success(response, original_handles)
assert session.handles == original_handles
assert new_handle not in handles
- # A beforeunload prompt has to be automatically dismissed
+ # A beforeunload prompt has to be automatically accepted
with pytest.raises(error.NoSuchWindowException):
session.alert.text
diff --git a/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py b/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py
index a3032cc1347..3721ea28e28 100644
--- a/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py
+++ b/tests/wpt/tests/webdriver/tests/classic/delete_session/delete.py
@@ -18,22 +18,15 @@ def test_null_response_value(session):
session.end()
-def test_dismissed_beforeunload_prompt(session, inline):
- session.url = inline("""
- <input type="text">
- <script>
- window.addEventListener("beforeunload", function (event) {
- event.preventDefault();
- });
- </script>
- """)
+def test_accepted_beforeunload_prompt(session, url):
+ session.url = url("/webdriver/tests/support/html/beforeunload.html")
session.find.css("input", all=False).send_keys("foo")
response = delete_session(session)
assert_success(response)
- # A beforeunload prompt has to be automatically dismissed, and the session deleted
+ # A beforeunload prompt has to be automatically accepted, and the session deleted
with pytest.raises(error.InvalidSessionIdException):
session.alert.text
diff --git a/tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py b/tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py
new file mode 100644
index 00000000000..1e47f690676
--- /dev/null
+++ b/tests/wpt/tests/webdriver/tests/interop/beforeunload_prompt.py
@@ -0,0 +1,117 @@
+import asyncio
+import pytest
+import pytest_asyncio
+from webdriver.error import NoSuchAlertException
+
+from tests.support.sync import AsyncPoll
+
+from ..bidi import (
+ any_string,
+ recursive_compare,
+)
+
+
+pytestmark = pytest.mark.asyncio
+
+USER_PROMPT_CLOSED_EVENT = "browsingContext.userPromptClosed"
+USER_PROMPT_OPENED_EVENT = "browsingContext.userPromptOpened"
+
+
+@pytest_asyncio.fixture
+async def check_beforeunload_not_implicitly_accepted(
+ bidi_session,
+ current_session,
+ setup_beforeunload_page,
+ subscribe_events,
+ wait_for_event,
+ wait_for_future_safe,
+ new_tab,
+ execute_as_async,
+ url,
+):
+ async def check_beforeunload_not_implicitly_accepted(accept):
+ current_session.window_handle = new_tab["context"]
+
+ page_beforeunload = await setup_beforeunload_page(new_tab)
+ page_target = url("/webdriver/tests/support/html/default.html")
+
+ on_prompt_closed = wait_for_event(USER_PROMPT_CLOSED_EVENT)
+ on_prompt_opened = wait_for_event(USER_PROMPT_OPENED_EVENT)
+
+ await subscribe_events([USER_PROMPT_CLOSED_EVENT, USER_PROMPT_OPENED_EVENT])
+
+ # Using WebDriver classic's navigation command to navigate away from
+ # the page will hang and wait for the beforeunload dialog to close.
+ # As such start the command immediately as task but await for it later
+ # when BiDi closed the prompt.
+ def sync_navigate():
+ current_session.url = page_target
+
+ task_navigate = asyncio.create_task(execute_as_async(sync_navigate))
+ opened_event = await wait_for_future_safe(on_prompt_opened)
+
+ recursive_compare(
+ {
+ "context": new_tab["context"],
+ "type": "beforeunload",
+ "message": any_string,
+ },
+ opened_event,
+ )
+
+ # Close the beforeunload prompt and wait for the navigation to finish.
+ await bidi_session.browsing_context.handle_user_prompt(
+ context=new_tab["context"], accept=accept
+ )
+ closed_event = await wait_for_future_safe(on_prompt_closed)
+ await task_navigate
+
+ # Check that the beforeunload prompt is closed and the event was sent.
+ with pytest.raises(NoSuchAlertException):
+ current_session.alert.text
+
+ recursive_compare(
+ {
+ "accepted": accept,
+ "context": new_tab["context"],
+ "type": "beforeunload",
+ },
+ closed_event,
+ )
+
+ if accept:
+ assert current_session.url == page_target
+ else:
+ assert current_session.url == page_beforeunload
+
+ return check_beforeunload_not_implicitly_accepted
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": "accept"})
+@pytest.mark.parametrize("accept", [False, True])
+async def test_accept(check_beforeunload_not_implicitly_accepted, accept):
+ await check_beforeunload_not_implicitly_accepted(accept)
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"})
+@pytest.mark.parametrize("accept", [False, True])
+async def test_accept_and_notify(check_beforeunload_not_implicitly_accepted, accept):
+ await check_beforeunload_not_implicitly_accepted(accept)
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"})
+@pytest.mark.parametrize("accept", [False, True])
+async def test_dismiss(check_beforeunload_not_implicitly_accepted, accept):
+ await check_beforeunload_not_implicitly_accepted(accept)
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"})
+@pytest.mark.parametrize("accept", [False, True])
+async def test_dismiss_and_notify(check_beforeunload_not_implicitly_accepted, accept):
+ await check_beforeunload_not_implicitly_accepted(accept)
+
+
+@pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"})
+@pytest.mark.parametrize("accept", [False, True])
+async def test_ignore(check_beforeunload_not_implicitly_accepted, accept):
+ await check_beforeunload_not_implicitly_accepted(accept)
diff --git a/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py b/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py
index a9cefd004b1..3e97cfe3ce4 100644
--- a/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py
+++ b/tests/wpt/tests/webdriver/tests/support/fixtures_bidi.py
@@ -17,6 +17,7 @@ from webdriver.bidi.error import (
UnableToSetCookieException,
UnderspecifiedStoragePartitionException
)
+from webdriver.bidi.modules.input import Actions
from webdriver.bidi.modules.script import ContextTarget
from webdriver.error import TimeoutException
@@ -46,6 +47,16 @@ async def add_preload_script(bidi_session):
@pytest_asyncio.fixture
+async def execute_as_async(bidi_session):
+ async def execute_as_async(sync_func, **kwargs):
+ # Ideally we should use asyncio.to_thread() but it's not available in
+ # Python 3.8 which wpt tests have to support.
+ return await bidi_session.event_loop.run_in_executor(None, sync_func, **kwargs)
+
+ return execute_as_async
+
+
+@pytest_asyncio.fixture
async def subscribe_events(bidi_session):
subscriptions = []
@@ -149,7 +160,7 @@ def wait_for_future_safe(configuration):
asyncio.shield(future),
timeout=timeout * configuration["timeout_multiplier"],
)
- except asyncio.exceptions.TimeoutError:
+ except asyncio.TimeoutError:
raise TimeoutException("Future did not resolve within the given timeout")
return wait_for_future_safe
@@ -573,6 +584,37 @@ def fetch(bidi_session, top_context, configuration):
@pytest_asyncio.fixture
+async def setup_beforeunload_page(bidi_session, url):
+ async def setup_beforeunload_page(context):
+ page_url = url("/webdriver/tests/support/html/beforeunload.html")
+ await bidi_session.browsing_context.navigate(
+ context=context["context"],
+ url=page_url,
+ wait="complete"
+ )
+
+ # Focus the input
+ await bidi_session.script.evaluate(
+ expression="""
+ const input = document.querySelector("input");
+ input.focus();
+ """,
+ target=ContextTarget(context["context"]),
+ await_promise=False,
+ )
+
+ actions = Actions()
+ actions.add_key().send_keys("foo")
+ await bidi_session.input.perform_actions(
+ actions=actions, context=context["context"]
+ )
+
+ return page_url
+
+ return setup_beforeunload_page
+
+
+@pytest_asyncio.fixture
async def setup_network_test(
bidi_session,
subscribe_events,
diff --git a/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js b/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js
index c7d341a9d5a..2a3eaa1c202 100644
--- a/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js
+++ b/tests/wpt/tests/webnn/validation_tests/lstm.https.any.js
@@ -113,7 +113,7 @@ const tests = [
]
},
{
- name: '[lstm] DataError is expected if hiddenSize equals to zero',
+ name: '[lstm] TypeError is expected if hiddenSize equals to zero',
input: kExampleInputDescriptor,
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -121,7 +121,7 @@ const tests = [
hiddenSize: 0
},
{
- name: '[lstm] DataError is expected if hiddenSize is too large',
+ name: '[lstm] TypeError is expected if hiddenSize is too large',
input: kExampleInputDescriptor,
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -129,7 +129,7 @@ const tests = [
hiddenSize: 4294967295,
},
{
- name: '[lstm] DataError is expected if steps equals to zero',
+ name: '[lstm] TypeError is expected if steps equals to zero',
input: kExampleInputDescriptor,
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -138,7 +138,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the data type is not one of the floating point types',
+ '[lstm] TypeError is expected if the data type is not one of the floating point types',
input: {dataType: 'uint32', dimensions: kValidInputDimensions},
weight: {dataType: 'uint32', dimensions: kValidWeightDimensions},
recurrentWeight:
@@ -147,7 +147,7 @@ const tests = [
hiddenSize: hiddenSize
},
{
- name: '[lstm] DataError is expected if the rank of input is not 3',
+ name: '[lstm] TypeError is expected if the rank of input is not 3',
input: {dataType: 'float32', dimensions: [steps, batchSize]},
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -156,7 +156,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if input.dimensions[0] is not equal to steps',
+ '[lstm] TypeError is expected if input.dimensions[0] is not equal to steps',
input: {dataType: 'float32', dimensions: [1000, batchSize, inputSize]},
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -164,7 +164,7 @@ const tests = [
hiddenSize: hiddenSize
},
{
- name: '[lstm] DataError is expected if the shape of weight is incorrect',
+ name: '[lstm] TypeError is expected if the shape of weight is incorrect',
input: kExampleInputDescriptor,
weight: {
dataType: 'float32',
@@ -176,7 +176,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the rank of recurrentWeight is not 3',
+ '[lstm] TypeError is expected if the rank of recurrentWeight is not 3',
input: kExampleInputDescriptor,
weight: kExampleWeightDescriptor,
recurrentWeight:
@@ -186,7 +186,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the size of options.activations is not 3',
+ '[lstm] TypeError is expected if the size of options.activations is not 3',
input: kExampleInputDescriptor,
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -195,7 +195,7 @@ const tests = [
options: {activations: ['sigmoid', 'tanh']}
},
{
- name: '[lstm] DataError is expected if the rank of options.bias is not 2',
+ name: '[lstm] TypeError is expected if the rank of options.bias is not 2',
input: {dataType: 'float16', dimensions: kValidInputDimensions},
weight: {dataType: 'float16', dimensions: kValidWeightDimensions},
recurrentWeight:
@@ -206,7 +206,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the shape of options.recurrentBias.dimensions is incorrect',
+ '[lstm] TypeError is expected if the shape of options.recurrentBias.dimensions is incorrect',
input: {dataType: 'float16', dimensions: kValidInputDimensions},
weight: {dataType: 'float16', dimensions: kValidWeightDimensions},
recurrentWeight:
@@ -219,7 +219,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the dataType of options.peepholeWeight is incorrect',
+ '[lstm] TypeError is expected if the dataType of options.peepholeWeight is incorrect',
input: {dataType: 'float16', dimensions: kValidInputDimensions},
weight: {dataType: 'float16', dimensions: kValidWeightDimensions},
recurrentWeight:
@@ -233,7 +233,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the dataType of options.initialHiddenState is incorrect',
+ '[lstm] TypeError is expected if the dataType of options.initialHiddenState is incorrect',
input: {dataType: 'float16', dimensions: kValidInputDimensions},
weight: {dataType: 'float16', dimensions: kValidWeightDimensions},
recurrentWeight:
@@ -249,7 +249,7 @@ const tests = [
},
{
name:
- '[lstm] DataError is expected if the shape of options.initialCellState is incorrect',
+ '[lstm] TypeError is expected if the shape of options.initialCellState is incorrect',
input: kExampleInputDescriptor,
weight: kExampleWeightDescriptor,
recurrentWeight: kExampleRecurrentWeightDescriptor,
@@ -333,8 +333,8 @@ tests.forEach(
assert_array_equals(outputs[i].shape(), test.outputs[i].dimensions);
}
} else {
- assert_throws_dom(
- 'DataError',
+ assert_throws_js(
+ TypeError,
() => builder.lstm(
input, weight, recurrentWeight, test.steps, test.hiddenSize,
options));
diff --git a/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js b/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js
index ee8958659c7..59694a42603 100644
--- a/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js
+++ b/tests/wpt/tests/webnn/validation_tests/triangular.https.any.js
@@ -12,6 +12,6 @@ promise_test(async t => {
assert_throws_js(TypeError, () => builder.triangular(input));
}
}
-}, "[triangular] DataError is expected if input's rank is less than 2");
+}, "[triangular] TypeError is expected if input's rank is less than 2");
validateInputFromAnotherBuilder('triangular');
diff --git a/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html b/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html
index 7047ce7d1f3..14ec74b66a0 100644
--- a/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html
+++ b/tests/wpt/tests/webrtc/RTCRtpReceiver-getParameters.html
@@ -4,6 +4,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="dictionary-helper.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
<script src="RTCRtpParameters-helper.js"></script>
<script>
'use strict';
@@ -70,4 +71,31 @@
assert_greater_than(param.headerExtensions.length, 0);
assert_greater_than(param.codecs.length, 0);
}, 'getParameters() with simulcast video receiver');
+
+ promise_test(async t => {
+ const stream = await getNoiseStream({video: true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ const [track] = stream.getTracks();
+ const caller = new RTCPeerConnection();
+ t.add_cleanup(() => caller.close());
+ caller.addTrack(track);
+ const callee = new RTCPeerConnection();
+ t.add_cleanup(() => callee.close());
+ callee.addTrack(track);
+ var callerReceiver = caller.getTransceivers()[0].receiver;
+ assert_equals(callerReceiver.getParameters().codecs.length, 0);
+ const offer = await caller.createOffer();
+ await caller.setLocalDescription(offer);
+ await callee.setRemoteDescription(offer);
+ var calleeReceiver = callee.getTransceivers()[0].receiver;
+ assert_equals(calleeReceiver.getParameters().codecs.length, 0);
+ const answer = await callee.createAnswer();
+ await callee.setLocalDescription(answer);
+ assert_greater_than(calleeReceiver.getParameters().codecs.length, 0,
+ "callee codecs after answer");
+ await caller.setRemoteDescription(answer);
+ assert_greater_than(callerReceiver.getParameters().codecs.length, 0,
+ "caller codecs after answer");
+ }, 'getParameters() surfaces codecs on two-way receiver at the right time');
+
</script>
diff --git a/tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html b/tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html
new file mode 100644
index 00000000000..6c47153c836
--- /dev/null
+++ b/tests/wpt/tests/webrtc/RTCRtpSender-getParameters.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpSender.prototype.getParameters</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+promise_test(async t => {
+ const stream = await getNoiseStream({video: true});
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+ const [track] = stream.getTracks();
+ const caller = new RTCPeerConnection();
+ t.add_cleanup(() => caller.close());
+ caller.addTrack(track);
+ const callee = new RTCPeerConnection();
+ t.add_cleanup(() => callee.close());
+ callee.addTrack(track);
+ var callerSender = caller.getTransceivers()[0].sender;
+ assert_equals(callerSender.getParameters().codecs.length, 0);
+ const offer = await caller.createOffer();
+ await caller.setLocalDescription(offer);
+ await callee.setRemoteDescription(offer);
+ // Check that it is a single 2-way transceiver.
+ assert_equals(callee.getTransceivers().length, 1);
+ var calleeSender = callee.getTransceivers()[0].sender;
+ assert_equals(calleeSender.getParameters().codecs.length, 0);
+ const answer = await callee.createAnswer();
+ await callee.setLocalDescription(answer);
+ assert_greater_than(calleeSender.getParameters().codecs.length, 0,
+ "callee codecs after answer");
+ await caller.setRemoteDescription(answer);
+ assert_greater_than(callerSender.getParameters().codecs.length, 0,
+ "caller codecs after answer");
+}, 'getParameters() surfaces codecs on two-way sender with addTrack at the right time');
+
+</script>
diff --git a/tests/wpt/tests/webusb/usbDevice.https.any.js b/tests/wpt/tests/webusb/usbDevice.https.any.js
index 804af2afb9d..a716e847c41 100644
--- a/tests/wpt/tests/webusb/usbDevice.https.any.js
+++ b/tests/wpt/tests/webusb/usbDevice.https.any.js
@@ -1279,28 +1279,60 @@ usb_test(async (t) => {
}, 'isochronousTransferOut rejects when packet lengths exceed buffer size');
usb_test(async (t) => {
- const PACKET_COUNT = 2;
- const PACKET_LENGTH = 8;
- const {device, fakeDevice} = await getFakeDevice();
+ const {device} = await getFakeDevice();
await device.open();
await device.selectConfiguration(2);
await device.claimInterface(0);
await device.selectAlternateInterface(0, 1);
- const packetLengths = [0xffffffff, 1];
+ const packetLengths = [33554432, 1];
await promise_rejects_dom(
t, 'DataError', device.isochronousTransferIn(1, packetLengths));
}, 'isochronousTransferIn rejects when packet lengths exceed maximum size');
usb_test(async (t) => {
- const PACKET_COUNT = 2;
- const PACKET_LENGTH = 8;
- const {device, fakeDevice} = await getFakeDevice();
+ const {device} = await getFakeDevice();
await device.open();
await device.selectConfiguration(2);
await device.claimInterface(0);
await device.selectAlternateInterface(0, 1);
- const buffer = new Uint8Array(PACKET_LENGTH * PACKET_COUNT);
- const packetLengths = [0xffffffff, 1];
+ const buffer = new Uint8Array(33554432 + 1);
+ const packetLengths = [33554432, 1];
await promise_rejects_dom(
t, 'DataError', device.isochronousTransferOut(1, buffer, packetLengths));
}, 'isochronousTransferOut rejects when packet lengths exceed maximum size');
+
+usb_test(async (t) => {
+ const {device} = await getFakeDevice();
+ await device.open();
+ await device.selectConfiguration(2);
+ await device.claimInterface(0);
+ await device.selectAlternateInterface(0, 1);
+ await promise_rejects_dom(
+ t, 'DataError', device.transferIn(1, 33554433));
+}, 'transferIn rejects when packet lengths exceed maximum size');
+
+usb_test(async (t) => {
+ const {device} = await getFakeDevice();
+ await device.open();
+ await device.selectConfiguration(2);
+ await device.claimInterface(0);
+ await device.selectAlternateInterface(0, 1);
+ await promise_rejects_dom(
+ t, 'DataError', device.transferOut(1, new ArrayBuffer(33554433)));
+}, 'transferOut rejects when packet lengths exceed maximum size');
+
+usb_test(async (t) => {
+ const {device} = await getFakeDevice();
+ await device.open();
+ await device.selectConfiguration(2);
+ await device.claimInterface(0);
+ await device.selectAlternateInterface(0, 1);
+ await promise_rejects_dom(
+ t, 'DataError', device.controlTransferOut({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, new ArrayBuffer(33554433)));
+}, 'controlTransferOut rejects when packet lengths exceed maximum size');